@burtson-labs/bandit-engine 2.0.168 → 2.1.0

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 (237) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/LICENSE +189 -31
  3. package/NOTICE +26 -0
  4. package/README.md +15 -59
  5. package/dist/aiProviderStore-DKQCCDWF.mjs +8 -0
  6. package/dist/aiProviderStore-DKQCCDWF.mjs.map +1 -0
  7. package/dist/chat-VYZFUECC.mjs +10 -0
  8. package/dist/chat-VYZFUECC.mjs.map +1 -0
  9. package/dist/{chunk-GRPTCHFN.mjs → chunk-BJT6KPUG.mjs} +309 -154
  10. package/dist/chunk-BJT6KPUG.mjs.map +1 -0
  11. package/dist/{chunk-SZJB5FLZ.mjs → chunk-FCQN3LKT.mjs} +251 -77
  12. package/dist/chunk-FCQN3LKT.mjs.map +1 -0
  13. package/dist/chunk-HD4PJNPH.mjs +29034 -0
  14. package/dist/chunk-HD4PJNPH.mjs.map +1 -0
  15. package/dist/{chunk-HNXPDIWC.mjs → chunk-NI7BKLC7.mjs} +1 -1
  16. package/dist/chunk-NI7BKLC7.mjs.map +1 -0
  17. package/dist/index.d.mts +63 -57
  18. package/dist/index.d.ts +63 -57
  19. package/dist/index.js +15415 -7570
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +16630 -142
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/{memoryUtils-HGCYEUCD.mjs → memoryUtils-UBZ33DNA.mjs} +8 -3
  24. package/dist/memoryUtils-UBZ33DNA.mjs.map +1 -0
  25. package/dist/modelStore-SEC34WRM.mjs +8 -0
  26. package/dist/modelStore-SEC34WRM.mjs.map +1 -0
  27. package/dist/{public-DJa4Db00.d.mts → public-CKQQDOoy.d.mts} +8 -8
  28. package/dist/{public-DJa4Db00.d.ts → public-CKQQDOoy.d.ts} +8 -8
  29. package/dist/public-types.d.mts +1 -1
  30. package/dist/public-types.d.ts +1 -1
  31. package/docs/00_intro.md +2 -2
  32. package/docs/05_contributing.md +2 -2
  33. package/docs/06_licensing.md +18 -0
  34. package/docs/07_custom_tools.md +233 -0
  35. package/docs/README.md +2 -1
  36. package/package.json +23 -20
  37. package/dist/aiProviderStore-HY5G4QAK.mjs +0 -8
  38. package/dist/aiProviderStore-HY5G4QAK.mjs.map +0 -1
  39. package/dist/chat-7LOFYEWE.mjs +0 -15
  40. package/dist/chat-7LOFYEWE.mjs.map +0 -1
  41. package/dist/chat-provider.js +0 -11080
  42. package/dist/chat-provider.js.map +0 -1
  43. package/dist/chat-provider.mjs +0 -16
  44. package/dist/chat-provider.mjs.map +0 -1
  45. package/dist/chunk-4SXXEGEK.mjs +0 -10690
  46. package/dist/chunk-4SXXEGEK.mjs.map +0 -1
  47. package/dist/chunk-62IYSU3I.mjs +0 -7324
  48. package/dist/chunk-62IYSU3I.mjs.map +0 -1
  49. package/dist/chunk-CABOLDNR.mjs +0 -216
  50. package/dist/chunk-CABOLDNR.mjs.map +0 -1
  51. package/dist/chunk-E5WMDLE3.mjs +0 -390
  52. package/dist/chunk-E5WMDLE3.mjs.map +0 -1
  53. package/dist/chunk-GRPTCHFN.mjs.map +0 -1
  54. package/dist/chunk-HNXPDIWC.mjs.map +0 -1
  55. package/dist/chunk-JD6C64CT.mjs +0 -516
  56. package/dist/chunk-JD6C64CT.mjs.map +0 -1
  57. package/dist/chunk-KAXUI5H7.mjs +0 -6009
  58. package/dist/chunk-KAXUI5H7.mjs.map +0 -1
  59. package/dist/chunk-ONQMRE2G.mjs +0 -26
  60. package/dist/chunk-ONQMRE2G.mjs.map +0 -1
  61. package/dist/chunk-P4C5IRM5.mjs +0 -39
  62. package/dist/chunk-P4C5IRM5.mjs.map +0 -1
  63. package/dist/chunk-QI67R5F6.mjs +0 -194
  64. package/dist/chunk-QI67R5F6.mjs.map +0 -1
  65. package/dist/chunk-R3NOM2DG.mjs +0 -2945
  66. package/dist/chunk-R3NOM2DG.mjs.map +0 -1
  67. package/dist/chunk-SZJB5FLZ.mjs.map +0 -1
  68. package/dist/chunk-YGOLNWXJ.mjs +0 -11906
  69. package/dist/chunk-YGOLNWXJ.mjs.map +0 -1
  70. package/dist/management/management.js +0 -44454
  71. package/dist/management/management.js.map +0 -1
  72. package/dist/management/management.mjs +0 -16
  73. package/dist/management/management.mjs.map +0 -1
  74. package/dist/memoryUtils-HGCYEUCD.mjs.map +0 -1
  75. package/dist/modals/chat-modal/chat-modal.js +0 -19730
  76. package/dist/modals/chat-modal/chat-modal.js.map +0 -1
  77. package/dist/modals/chat-modal/chat-modal.mjs +0 -18
  78. package/dist/modals/chat-modal/chat-modal.mjs.map +0 -1
  79. package/dist/modelStore-TFNX4GEC.mjs +0 -8
  80. package/dist/modelStore-TFNX4GEC.mjs.map +0 -1
  81. package/dist/shared/custom-element.js +0 -73
  82. package/dist/shared/custom-element.js.map +0 -1
  83. package/dist/shared/custom-element.mjs +0 -7
  84. package/dist/shared/custom-element.mjs.map +0 -1
  85. package/docs/06_busl_licensing.md +0 -25
  86. package/docs/api_reference/.nojekyll +0 -1
  87. package/docs/api_reference/assets/bandit-docs.js +0 -462
  88. package/docs/api_reference/assets/highlight.css +0 -141
  89. package/docs/api_reference/assets/icons.js +0 -18
  90. package/docs/api_reference/assets/icons.svg +0 -1
  91. package/docs/api_reference/assets/main.js +0 -61
  92. package/docs/api_reference/assets/navigation.js +0 -1
  93. package/docs/api_reference/assets/search.js +0 -1
  94. package/docs/api_reference/assets/style.css +0 -1664
  95. package/docs/api_reference/classes/DebugLogger.html +0 -29
  96. package/docs/api_reference/classes/FeatureFlagService.html +0 -28
  97. package/docs/api_reference/classes/NotificationService.html +0 -21
  98. package/docs/api_reference/classes/StreamingTTSClient.html +0 -19
  99. package/docs/api_reference/classes/VectorDatabaseService.html +0 -63
  100. package/docs/api_reference/classes/VectorMigrationService.html +0 -27
  101. package/docs/api_reference/classes/VoiceService.html +0 -4
  102. package/docs/api_reference/enums/TTSState.html +0 -6
  103. package/docs/api_reference/functions/Chat.html +0 -1
  104. package/docs/api_reference/functions/ChatModal.html +0 -29
  105. package/docs/api_reference/functions/ChatProvider.html +0 -29
  106. package/docs/api_reference/functions/FeatureFlagProvider.html +0 -30
  107. package/docs/api_reference/functions/FeedbackButton.html +0 -29
  108. package/docs/api_reference/functions/FeedbackModal.html +0 -29
  109. package/docs/api_reference/functions/InterestsEditor.html +0 -5
  110. package/docs/api_reference/functions/Management.html +0 -1
  111. package/docs/api_reference/functions/NotificationProvider.html +0 -29
  112. package/docs/api_reference/functions/SubscriptionExpiredGuard.html +0 -31
  113. package/docs/api_reference/functions/SubscriptionExpiredModal.html +0 -31
  114. package/docs/api_reference/functions/defineCustomElement.html +0 -1
  115. package/docs/api_reference/functions/getCriticalConfig.html +0 -2
  116. package/docs/api_reference/functions/getFeatureMatrix.html +0 -1
  117. package/docs/api_reference/functions/getStreamingTTSClient.html +0 -1
  118. package/docs/api_reference/functions/getSystemConstants.html +0 -2
  119. package/docs/api_reference/functions/getTTSState.html +0 -1
  120. package/docs/api_reference/functions/handleHttpError.html +0 -2
  121. package/docs/api_reference/functions/handleSubscriptionUpgrade.html +0 -1
  122. package/docs/api_reference/functions/handleValidationError.html +0 -2
  123. package/docs/api_reference/functions/initializeCoreSystem.html +0 -2
  124. package/docs/api_reference/functions/isWorkspaceAdminRole.html +0 -6
  125. package/docs/api_reference/functions/pauseTTS.html +0 -1
  126. package/docs/api_reference/functions/previewTierUpgrade.html +0 -1
  127. package/docs/api_reference/functions/resolveManagementSections.html +0 -2
  128. package/docs/api_reference/functions/resumeTTS.html +0 -1
  129. package/docs/api_reference/functions/showInfoNotification.html +0 -2
  130. package/docs/api_reference/functions/showSuccessNotification.html +0 -2
  131. package/docs/api_reference/functions/speakWithStreaming.html +0 -1
  132. package/docs/api_reference/functions/stopTTS.html +0 -1
  133. package/docs/api_reference/functions/syncSubscriptionWithAPI.html +0 -1
  134. package/docs/api_reference/functions/updateSubscriptionTier.html +0 -2
  135. package/docs/api_reference/functions/useFeatureFlag.html +0 -2
  136. package/docs/api_reference/functions/useFeatureVisibility.html +0 -2
  137. package/docs/api_reference/functions/useFeatures.html +0 -2
  138. package/docs/api_reference/functions/useGatewayHealth.html +0 -1
  139. package/docs/api_reference/functions/useGatewayMemory.html +0 -1
  140. package/docs/api_reference/functions/useGatewayModels.html +0 -1
  141. package/docs/api_reference/functions/useGlobalTTS.html +0 -2
  142. package/docs/api_reference/functions/useManagementAccess.html +0 -2
  143. package/docs/api_reference/functions/useNotification.html +0 -1
  144. package/docs/api_reference/functions/useNotificationService.html +0 -6
  145. package/docs/api_reference/functions/useTTS.html +0 -2
  146. package/docs/api_reference/functions/useVectorStore.html +0 -13
  147. package/docs/api_reference/functions/useVoiceStore.html +0 -8
  148. package/docs/api_reference/functions/useVoices.html +0 -3
  149. package/docs/api_reference/functions/validateEnvironment.html +0 -2
  150. package/docs/api_reference/functions/validateSystemIntegrity.html +0 -2
  151. package/docs/api_reference/index.html +0 -916
  152. package/docs/api_reference/interfaces/AIChatRequest.html +0 -8
  153. package/docs/api_reference/interfaces/AIChatResponse.html +0 -3
  154. package/docs/api_reference/interfaces/AIGenerateRequest.html +0 -5
  155. package/docs/api_reference/interfaces/AIGenerateResponse.html +0 -3
  156. package/docs/api_reference/interfaces/AIMessage.html +0 -4
  157. package/docs/api_reference/interfaces/AIModel.html +0 -6
  158. package/docs/api_reference/interfaces/AIProviderConfig.html +0 -12
  159. package/docs/api_reference/interfaces/ChatConfig.html +0 -5
  160. package/docs/api_reference/interfaces/ChatModalProps.html +0 -7
  161. package/docs/api_reference/interfaces/CreateMemoryOptions.html +0 -7
  162. package/docs/api_reference/interfaces/FeatureEvaluation.html +0 -14
  163. package/docs/api_reference/interfaces/FeatureFlagConfig.html +0 -18
  164. package/docs/api_reference/interfaces/FeatureFlagContextValue.html +0 -16
  165. package/docs/api_reference/interfaces/FeatureFlagProviderProps.html +0 -4
  166. package/docs/api_reference/interfaces/FeedbackButtonProps.html +0 -19
  167. package/docs/api_reference/interfaces/FeedbackCategories.html +0 -6
  168. package/docs/api_reference/interfaces/FeedbackModalProps.html +0 -4
  169. package/docs/api_reference/interfaces/FeedbackPriorities.html +0 -5
  170. package/docs/api_reference/interfaces/FeedbackRequest.html +0 -12
  171. package/docs/api_reference/interfaces/FeedbackResponse.html +0 -7
  172. package/docs/api_reference/interfaces/FileUploadResult.html +0 -4
  173. package/docs/api_reference/interfaces/GatewayChatRequest.html +0 -13
  174. package/docs/api_reference/interfaces/GatewayChatResponse.html +0 -7
  175. package/docs/api_reference/interfaces/GatewayContract.html +0 -4
  176. package/docs/api_reference/interfaces/GatewayGenerateRequest.html +0 -8
  177. package/docs/api_reference/interfaces/GatewayGenerateResponse.html +0 -12
  178. package/docs/api_reference/interfaces/GatewayHealthResponse.html +0 -5
  179. package/docs/api_reference/interfaces/GatewayMemoryRecord.html +0 -7
  180. package/docs/api_reference/interfaces/GatewayMemoryResponse.html +0 -4
  181. package/docs/api_reference/interfaces/GatewayMessage.html +0 -5
  182. package/docs/api_reference/interfaces/GatewayMessageContent.html +0 -4
  183. package/docs/api_reference/interfaces/GatewayModel.html +0 -9
  184. package/docs/api_reference/interfaces/GatewayModelsResponse.html +0 -2
  185. package/docs/api_reference/interfaces/ManagementAccess.html +0 -5
  186. package/docs/api_reference/interfaces/ManagementAccessInput.html +0 -5
  187. package/docs/api_reference/interfaces/ManagementLink.html +0 -7
  188. package/docs/api_reference/interfaces/ManagementProps.html +0 -22
  189. package/docs/api_reference/interfaces/ManagementSectionDef.html +0 -10
  190. package/docs/api_reference/interfaces/MemorySearchFilters.html +0 -5
  191. package/docs/api_reference/interfaces/MigrationProgress.html +0 -6
  192. package/docs/api_reference/interfaces/MigrationStatus.html +0 -7
  193. package/docs/api_reference/interfaces/NotificationConfig.html +0 -5
  194. package/docs/api_reference/interfaces/NotificationContextType.html +0 -6
  195. package/docs/api_reference/interfaces/NotificationProviderProps.html +0 -4
  196. package/docs/api_reference/interfaces/PackageSettings.html +0 -22
  197. package/docs/api_reference/interfaces/SearchOptions.html +0 -6
  198. package/docs/api_reference/interfaces/SearchResult.html +0 -5
  199. package/docs/api_reference/interfaces/SubscriptionExpiredGuardProps.html +0 -7
  200. package/docs/api_reference/interfaces/SubscriptionExpiredModalProps.html +0 -6
  201. package/docs/api_reference/interfaces/TTSOptions.html +0 -5
  202. package/docs/api_reference/interfaces/TTSProgress.html +0 -6
  203. package/docs/api_reference/interfaces/TrialUsage.html +0 -6
  204. package/docs/api_reference/interfaces/UploadRequest.html +0 -9
  205. package/docs/api_reference/interfaces/UseTTSReturn.html +0 -14
  206. package/docs/api_reference/interfaces/VectorDocument.html +0 -11
  207. package/docs/api_reference/interfaces/VectorMemory.html +0 -12
  208. package/docs/api_reference/interfaces/VectorMemoryMetadata.html +0 -7
  209. package/docs/api_reference/interfaces/VectorStoreStatus.html +0 -7
  210. package/docs/api_reference/interfaces/VoiceModelsResponse.html +0 -4
  211. package/docs/api_reference/interfaces/VoiceState.html +0 -12
  212. package/docs/api_reference/media/02_gateway_api.md +0 -123
  213. package/docs/api_reference/media/05_cli_quickstart.md +0 -87
  214. package/docs/api_reference/media/LICENSE +0 -43
  215. package/docs/api_reference/media/PRE-PUSH-CHECKLIST.md +0 -10
  216. package/docs/api_reference/media/PROTECTION-NOTICE.md +0 -11
  217. package/docs/api_reference/media/README.md +0 -58
  218. package/docs/api_reference/modules.html +0 -136
  219. package/docs/api_reference/types/FeatureKey.html +0 -2
  220. package/docs/api_reference/types/FeatureMatrix.html +0 -2
  221. package/docs/api_reference/types/GatewayQueryOptions.html +0 -1
  222. package/docs/api_reference/types/LogContext.html +0 -14
  223. package/docs/api_reference/types/ManagementRequest.html +0 -1
  224. package/docs/api_reference/types/ManagementSectionId.html +0 -2
  225. package/docs/api_reference/types/SubscriptionTier.html +0 -2
  226. package/docs/api_reference/variables/DEFAULT_TIER_FEATURES.html +0 -2
  227. package/docs/api_reference/variables/FeatureFlagContext.html +0 -1
  228. package/docs/api_reference/variables/MANAGEMENT_SECTIONS.html +0 -1
  229. package/docs/api_reference/variables/OSS_DEFAULT_FEATURES.html +0 -2
  230. package/docs/api_reference/variables/SYSTEM_FLAGS.html +0 -2
  231. package/docs/api_reference/variables/authenticationService.html +0 -1
  232. package/docs/api_reference/variables/debugLogger-1.html +0 -1
  233. package/docs/api_reference/variables/featureFlagService-1.html +0 -2
  234. package/docs/api_reference/variables/notificationService-1.html +0 -1
  235. package/docs/api_reference/variables/vectorDatabaseService-1.html +0 -1
  236. package/docs/api_reference/variables/vectorMigrationService-1.html +0 -1
  237. package/docs/api_reference/variables/voiceService-1.html +0 -1
@@ -1,216 +0,0 @@
1
- import {
2
- indexedDBService_default,
3
- usePackageSettingsStore
4
- } from "./chunk-SZJB5FLZ.mjs";
5
- import {
6
- authenticationService,
7
- useAIProviderStore
8
- } from "./chunk-GRPTCHFN.mjs";
9
- import {
10
- debugLogger
11
- } from "./chunk-HNXPDIWC.mjs";
12
-
13
- // src/services/ai-provider-init.service.ts
14
- var sessionTokenFactory = (label) => () => {
15
- const token = authenticationService.getToken();
16
- debugLogger.info(`AIProviderInit: ${label}`, { hasToken: !!token });
17
- return token;
18
- };
19
- var AIProviderInitService = class _AIProviderInitService {
20
- static instance;
21
- constructor() {
22
- }
23
- static getInstance() {
24
- if (!_AIProviderInitService.instance) {
25
- _AIProviderInitService.instance = new _AIProviderInitService();
26
- }
27
- return _AIProviderInitService.instance;
28
- }
29
- /**
30
- * Initialize AI provider from package settings
31
- * Provides backward compatibility with existing Ollama settings
32
- */
33
- async initializeFromSettings() {
34
- const settings = usePackageSettingsStore.getState().settings;
35
- if (!settings) {
36
- debugLogger.warn("No package settings found, cannot initialize AI provider");
37
- return;
38
- }
39
- let providerConfig;
40
- debugLogger.info("AI Provider Init: Starting initialization", {
41
- hasSettings: !!settings,
42
- hasAiProvider: !!settings.aiProvider,
43
- ollamaUrl: settings.ollamaUrl
44
- });
45
- const isPlaygroundEnvironment = settings.playgroundMode === true || settings.aiProvider?.type === "playground" /* PLAYGROUND */ || (settings.gatewayApiUrl?.toLowerCase()?.startsWith("playground://") ?? false) || typeof window !== "undefined" && window.location.pathname.includes("/playground");
46
- if (isPlaygroundEnvironment) {
47
- debugLogger.info("AI Provider Init: Playground environment detected, bypassing saved provider config");
48
- } else {
49
- try {
50
- const savedConfig = await indexedDBService_default.get(
51
- "banditConfig",
52
- 1,
53
- "config",
54
- "aiProvider",
55
- [{ name: "config", keyPath: "id" }]
56
- );
57
- if (savedConfig) {
58
- debugLogger.info("AI Provider Init: Found saved config in IndexedDB", { type: savedConfig.type });
59
- const { id: _id, ...configWithoutId } = savedConfig;
60
- providerConfig = { ...configWithoutId };
61
- if (providerConfig.type === "anthropic" /* ANTHROPIC */) {
62
- providerConfig = this.convertAnthropicConfig(providerConfig, settings?.gatewayApiUrl);
63
- }
64
- providerConfig = this.ensureTokenFactory(providerConfig);
65
- try {
66
- const { createProvider } = useAIProviderStore.getState();
67
- createProvider(providerConfig);
68
- const provider = useAIProviderStore.getState().provider;
69
- if (provider) {
70
- try {
71
- await provider.validateServiceAvailability({ timeoutMs: 5e3 });
72
- debugLogger.info(`AI Provider initialized and validated from IndexedDB: ${providerConfig.type}`);
73
- } catch (validationError) {
74
- debugLogger.warn(`AI Provider created but validation failed`, { error: validationError });
75
- }
76
- }
77
- return;
78
- } catch (error) {
79
- debugLogger.error("Failed to initialize saved provider config, falling back to package settings", { error });
80
- }
81
- }
82
- debugLogger.info("AI Provider Init: No saved config found, using package settings");
83
- } catch (error) {
84
- debugLogger.warn("AI Provider Init: Failed to load from IndexedDB, using package settings", { error });
85
- }
86
- }
87
- if (settings.aiProvider) {
88
- providerConfig = { ...settings.aiProvider };
89
- if (providerConfig.type === "anthropic" /* ANTHROPIC */) {
90
- providerConfig = this.convertAnthropicConfig(providerConfig, settings.gatewayApiUrl);
91
- }
92
- providerConfig = this.ensureTokenFactory(providerConfig);
93
- debugLogger.info("Using explicit AI provider config", providerConfig);
94
- } else {
95
- providerConfig = {
96
- type: "ollama" /* OLLAMA */,
97
- baseUrl: settings.ollamaUrl,
98
- tokenFactory: sessionTokenFactory("Token factory called")
99
- };
100
- debugLogger.info("Using legacy Ollama config", providerConfig);
101
- }
102
- try {
103
- const { createProvider } = useAIProviderStore.getState();
104
- createProvider(providerConfig);
105
- const provider = useAIProviderStore.getState().provider;
106
- if (provider) {
107
- try {
108
- await provider.validateServiceAvailability({ timeoutMs: 5e3 });
109
- debugLogger.info(`AI Provider initialized and validated: ${providerConfig.type}`);
110
- } catch (validationError) {
111
- debugLogger.warn(`AI Provider created but validation failed:`, { error: validationError });
112
- }
113
- }
114
- } catch (error) {
115
- debugLogger.error("Failed to initialize AI provider:", { error });
116
- if (providerConfig.type !== "ollama" /* OLLAMA */) {
117
- try {
118
- const fallbackConfig = {
119
- type: "ollama" /* OLLAMA */,
120
- baseUrl: settings.ollamaUrl || "http://localhost:11434",
121
- tokenFactory: sessionTokenFactory("Fallback tokenFactory")
122
- };
123
- const { createProvider } = useAIProviderStore.getState();
124
- createProvider(fallbackConfig);
125
- debugLogger.info("Fallback to Ollama provider successful");
126
- } catch (fallbackError) {
127
- debugLogger.error("Failed to initialize fallback Ollama provider:", { error: fallbackError });
128
- }
129
- } else {
130
- try {
131
- const localFallbackConfig = {
132
- type: "ollama" /* OLLAMA */,
133
- baseUrl: "http://localhost:11434",
134
- tokenFactory: sessionTokenFactory("Local fallback tokenFactory")
135
- };
136
- const { createProvider } = useAIProviderStore.getState();
137
- createProvider(localFallbackConfig);
138
- debugLogger.info("Fallback to localhost Ollama provider successful");
139
- } catch (localFallbackError) {
140
- debugLogger.error("All provider initialization attempts failed:", { error: localFallbackError });
141
- }
142
- }
143
- }
144
- }
145
- /**
146
- * Switch to a different AI provider
147
- */
148
- switchProvider(config) {
149
- try {
150
- const normalizedConfig = this.ensureTokenFactory({ ...config });
151
- const { switchProvider } = useAIProviderStore.getState();
152
- switchProvider(normalizedConfig);
153
- debugLogger.info(`Switched to AI provider: ${normalizedConfig.type}`);
154
- } catch (error) {
155
- debugLogger.error("Failed to switch AI provider:", { error });
156
- throw error;
157
- }
158
- }
159
- /**
160
- * Get the current provider type
161
- */
162
- getCurrentProviderType() {
163
- const provider = useAIProviderStore.getState().provider;
164
- return provider ? provider.getProviderType() : null;
165
- }
166
- /**
167
- * Check if a provider is initialized
168
- */
169
- isProviderInitialized() {
170
- return useAIProviderStore.getState().provider !== null;
171
- }
172
- convertAnthropicConfig(config, gatewayUrl) {
173
- if (config.type !== "anthropic" /* ANTHROPIC */) {
174
- return config;
175
- }
176
- const defaultModel = typeof config.defaultModel === "string" && config.defaultModel.trim() ? config.defaultModel.trim() : "claude-3-5-sonnet-latest";
177
- const normalized = {
178
- type: "gateway" /* GATEWAY */,
179
- gatewayUrl: gatewayUrl || config.gatewayUrl || "",
180
- provider: "anthropic",
181
- defaultModel,
182
- tokenFactory: config.tokenFactory
183
- };
184
- debugLogger.info("AI Provider Init: Converted direct Anthropic provider to gateway configuration");
185
- return normalized;
186
- }
187
- /**
188
- * Ensure providers that require auth have a token factory configured.
189
- * Handles both UI auth tokens and API key scenarios.
190
- */
191
- ensureTokenFactory(config) {
192
- if (config.type === "ollama" /* OLLAMA */ || config.type === "gateway" /* GATEWAY */) {
193
- const existingFactory = config.tokenFactory;
194
- if (existingFactory) {
195
- return config;
196
- }
197
- if (typeof config.apiKey === "string" && config.apiKey.trim() !== "") {
198
- const key = config.apiKey.trim();
199
- config.tokenFactory = () => key;
200
- debugLogger.info("AIProviderInit: Using API key for token factory", {
201
- type: config.type,
202
- hasKey: true
203
- });
204
- return config;
205
- }
206
- config.tokenFactory = sessionTokenFactory("Token factory resolved auth token");
207
- }
208
- return config;
209
- }
210
- };
211
- var aiProviderInitService = AIProviderInitService.getInstance();
212
-
213
- export {
214
- aiProviderInitService
215
- };
216
- //# sourceMappingURL=chunk-CABOLDNR.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/services/ai-provider-init.service.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 { useAIProviderStore } from \"../store/aiProviderStore\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { AIProviderConfig, AIProviderType } from \"./ai-provider/types/common.types\";\nimport { authenticationService } from \"./auth/authenticationService\";\nimport { debugLogger } from \"./logging/debugLogger\";\nimport indexedDBService from \"./indexedDB/indexedDBService\";\n\ntype StoredAIProviderConfig = AIProviderConfig & { id?: string };\n\n/**\n * The signed-in user's access token for provider calls. authenticationService\n * is the single source of truth: depending on the host it reads localStorage,\n * the in-memory session (HttpOnly-cookie web sessions) or the token restored\n * from native secure storage. Nothing here reads Web Storage directly — in\n * memory mode a token must never be looked for there.\n */\nconst sessionTokenFactory = (label: string) => (): string | null => {\n const token = authenticationService.getToken();\n debugLogger.info(`AIProviderInit: ${label}`, { hasToken: !!token });\n return token;\n};\n\n/**\n * Service to initialize AI providers based on package settings\n */\nexport class AIProviderInitService {\n private static instance: AIProviderInitService;\n\n private constructor() {}\n\n static getInstance(): AIProviderInitService {\n if (!AIProviderInitService.instance) {\n AIProviderInitService.instance = new AIProviderInitService();\n }\n return AIProviderInitService.instance;\n }\n\n /**\n * Initialize AI provider from package settings\n * Provides backward compatibility with existing Ollama settings\n */\n async initializeFromSettings(): Promise<void> {\n const settings = usePackageSettingsStore.getState().settings;\n if (!settings) {\n debugLogger.warn(\"No package settings found, cannot initialize AI provider\");\n return;\n }\n\n let providerConfig: AIProviderConfig;\n\n debugLogger.info(\"AI Provider Init: Starting initialization\", { \n hasSettings: !!settings,\n hasAiProvider: !!settings.aiProvider,\n ollamaUrl: settings.ollamaUrl\n });\n\n const isPlaygroundEnvironment =\n settings.playgroundMode === true ||\n settings.aiProvider?.type === AIProviderType.PLAYGROUND ||\n (settings.gatewayApiUrl?.toLowerCase()?.startsWith(\"playground://\") ?? false) ||\n (typeof window !== \"undefined\" && window.location.pathname.includes(\"/playground\"));\n\n // First, try to load provider configuration from IndexedDB\n if (isPlaygroundEnvironment) {\n debugLogger.info(\"AI Provider Init: Playground environment detected, bypassing saved provider config\");\n } else {\n try {\n const savedConfig = await indexedDBService.get<StoredAIProviderConfig>(\n 'banditConfig', \n 1, \n 'config', \n 'aiProvider',\n [{ name: 'config', keyPath: 'id' }]\n );\n \n if (savedConfig) {\n debugLogger.info('AI Provider Init: Found saved config in IndexedDB', { type: savedConfig.type });\n \n // Filter out the 'id' property that was added for IndexedDB storage\n const { id: _id, ...configWithoutId } = savedConfig;\n providerConfig = { ...configWithoutId };\n if (providerConfig.type === AIProviderType.ANTHROPIC) {\n providerConfig = this.convertAnthropicConfig(providerConfig, settings?.gatewayApiUrl);\n }\n\n // Ensure tokenFactory is present for providers that need it\n providerConfig = this.ensureTokenFactory(providerConfig);\n \n // Initialize the provider with saved config\n try {\n const { createProvider } = useAIProviderStore.getState();\n createProvider(providerConfig);\n \n const provider = useAIProviderStore.getState().provider;\n if (provider) {\n try {\n await provider.validateServiceAvailability({ timeoutMs: 5000 });\n debugLogger.info(`AI Provider initialized and validated from IndexedDB: ${providerConfig.type}`);\n } catch (validationError) {\n debugLogger.warn(`AI Provider created but validation failed`, { error: validationError });\n }\n }\n return; // Successfully initialized from IndexedDB\n } catch (error) {\n debugLogger.error(\"Failed to initialize saved provider config, falling back to package settings\", { error });\n }\n }\n \n debugLogger.info('AI Provider Init: No saved config found, using package settings');\n } catch (error) {\n debugLogger.warn('AI Provider Init: Failed to load from IndexedDB, using package settings', { error });\n }\n }\n\n // Fallback to package settings if no saved config found\n if (settings.aiProvider) {\n providerConfig = { ...settings.aiProvider };\n if (providerConfig.type === AIProviderType.ANTHROPIC) {\n providerConfig = this.convertAnthropicConfig(providerConfig, settings.gatewayApiUrl);\n }\n \n providerConfig = this.ensureTokenFactory(providerConfig);\n \n debugLogger.info(\"Using explicit AI provider config\", providerConfig);\n } else {\n // Fall back to legacy Ollama settings for backward compatibility\n providerConfig = {\n type: AIProviderType.OLLAMA,\n baseUrl: settings.ollamaUrl,\n tokenFactory: sessionTokenFactory(\"Token factory called\")\n };\n debugLogger.info(\"Using legacy Ollama config\", providerConfig);\n }\n\n try {\n // First validate if the service is available\n const { createProvider } = useAIProviderStore.getState();\n \n // Try to create and validate the provider\n createProvider(providerConfig);\n \n // Test provider availability\n const provider = useAIProviderStore.getState().provider;\n if (provider) {\n try {\n await provider.validateServiceAvailability({ timeoutMs: 5000 });\n debugLogger.info(`AI Provider initialized and validated: ${providerConfig.type}`);\n } catch (validationError) {\n debugLogger.warn(`AI Provider created but validation failed:`, { error: validationError });\n // Provider is created but may not be fully available - this is ok for offline scenarios\n }\n }\n } catch (error) {\n debugLogger.error(\"Failed to initialize AI provider:\", { error });\n \n // Try to fall back to default Ollama if initial provider fails\n if (providerConfig.type !== AIProviderType.OLLAMA) {\n try {\n const fallbackConfig: AIProviderConfig = {\n type: AIProviderType.OLLAMA,\n baseUrl: settings.ollamaUrl || 'http://localhost:11434',\n tokenFactory: sessionTokenFactory(\"Fallback tokenFactory\")\n };\n const { createProvider } = useAIProviderStore.getState();\n createProvider(fallbackConfig);\n debugLogger.info(\"Fallback to Ollama provider successful\");\n } catch (fallbackError) {\n debugLogger.error(\"Failed to initialize fallback Ollama provider:\", { error: fallbackError });\n }\n } else {\n // If Ollama provider fails, try localhost as ultimate fallback\n try {\n const localFallbackConfig: AIProviderConfig = {\n type: AIProviderType.OLLAMA,\n baseUrl: 'http://localhost:11434',\n tokenFactory: sessionTokenFactory(\"Local fallback tokenFactory\")\n };\n const { createProvider } = useAIProviderStore.getState();\n createProvider(localFallbackConfig);\n debugLogger.info(\"Fallback to localhost Ollama provider successful\");\n } catch (localFallbackError) {\n debugLogger.error(\"All provider initialization attempts failed:\", { error: localFallbackError });\n }\n }\n }\n }\n\n /**\n * Switch to a different AI provider\n */\n switchProvider(config: AIProviderConfig): void {\n try {\n const normalizedConfig = this.ensureTokenFactory({ ...config });\n const { switchProvider } = useAIProviderStore.getState();\n switchProvider(normalizedConfig);\n debugLogger.info(`Switched to AI provider: ${normalizedConfig.type}`);\n } catch (error) {\n debugLogger.error(\"Failed to switch AI provider:\", { error });\n throw error;\n }\n }\n\n /**\n * Get the current provider type\n */\n getCurrentProviderType(): string | null {\n const provider = useAIProviderStore.getState().provider;\n return provider ? provider.getProviderType() : null;\n }\n\n /**\n * Check if a provider is initialized\n */\n isProviderInitialized(): boolean {\n return useAIProviderStore.getState().provider !== null;\n }\n\n private convertAnthropicConfig(config: AIProviderConfig, gatewayUrl?: string | null): AIProviderConfig {\n if (config.type !== AIProviderType.ANTHROPIC) {\n return config;\n }\n\n const defaultModel = typeof config.defaultModel === 'string' && config.defaultModel.trim()\n ? config.defaultModel.trim()\n : 'claude-3-5-sonnet-latest';\n\n const normalized: AIProviderConfig = {\n type: AIProviderType.GATEWAY,\n gatewayUrl: gatewayUrl || config.gatewayUrl || '',\n provider: 'anthropic',\n defaultModel,\n tokenFactory: config.tokenFactory\n };\n\n debugLogger.info('AI Provider Init: Converted direct Anthropic provider to gateway configuration');\n return normalized;\n }\n\n /**\n * Ensure providers that require auth have a token factory configured.\n * Handles both UI auth tokens and API key scenarios.\n */\n private ensureTokenFactory(config: AIProviderConfig): AIProviderConfig {\n if (config.type === AIProviderType.OLLAMA || config.type === AIProviderType.GATEWAY) {\n const existingFactory = config.tokenFactory;\n if (existingFactory) {\n return config;\n }\n\n // Prefer explicit API key if provided\n if (typeof config.apiKey === 'string' && config.apiKey.trim() !== '') {\n const key = config.apiKey.trim();\n config.tokenFactory = () => key;\n debugLogger.info(\"AIProviderInit: Using API key for token factory\", {\n type: config.type,\n hasKey: true\n });\n return config;\n }\n\n // Fallback to the signed-in session (UI sessions)\n config.tokenFactory = sessionTokenFactory(\"Token factory resolved auth token\");\n }\n\n return config;\n }\n}\n\nexport const aiProviderInitService = AIProviderInitService.getInstance();\n"],"mappings":"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","names":[]}
@@ -1,390 +0,0 @@
1
- import {
2
- indexedDBService_default,
3
- usePackageSettingsStore
4
- } from "./chunk-SZJB5FLZ.mjs";
5
- import {
6
- authenticationService
7
- } from "./chunk-GRPTCHFN.mjs";
8
- import {
9
- debugLogger
10
- } from "./chunk-HNXPDIWC.mjs";
11
-
12
- // src/store/mcpToolsStore.ts
13
- import { create } from "zustand";
14
-
15
- // src/services/mcp/mcpServersService.ts
16
- var gatewayBase = () => {
17
- const settings = usePackageSettingsStore.getState().settings;
18
- const url = settings?.gatewayApiUrl?.replace(/\/$/, "");
19
- if (!url) throw new Error("Gateway API is not configured.");
20
- return url;
21
- };
22
- var authHeaders = () => {
23
- const headers = { "Content-Type": "application/json" };
24
- const token = authenticationService.getToken();
25
- if (token) headers["Authorization"] = `Bearer ${token}`;
26
- return headers;
27
- };
28
- var parse = async (res) => {
29
- const text = await res.text();
30
- const body = text ? JSON.parse(text) : null;
31
- if (!res.ok) {
32
- const message = body && typeof body === "object" && (body.error || body.message) || `Request failed (${res.status})`;
33
- throw new Error(String(message));
34
- }
35
- return body;
36
- };
37
- var listMcpServers = async () => parse(await fetch(`${gatewayBase()}/mcp/servers`, { headers: authHeaders() }));
38
- var addMcpServer = async (input) => parse(
39
- await fetch(`${gatewayBase()}/mcp/servers`, {
40
- method: "POST",
41
- headers: authHeaders(),
42
- body: JSON.stringify(input)
43
- })
44
- );
45
- var updateMcpServer = async (id, input) => parse(
46
- await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}`, {
47
- method: "PUT",
48
- headers: authHeaders(),
49
- body: JSON.stringify(input)
50
- })
51
- );
52
- var deleteMcpServer = async (id) => {
53
- const res = await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}`, {
54
- method: "DELETE",
55
- headers: authHeaders()
56
- });
57
- if (!res.ok && res.status !== 204) {
58
- throw new Error(`Could not remove the server (${res.status}).`);
59
- }
60
- };
61
- var discoverMcpTools = async (id) => parse(await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}/tools`, { headers: authHeaders() }));
62
-
63
- // src/store/mcpToolsStore.ts
64
- var sanitizeMcpToolName = (raw) => raw.replace(/[^a-zA-Z0-9_]/g, "_").replace(/_+/g, "_").replace(/^_|_$/g, "").slice(0, 60);
65
- var STORE_CONFIGS = [{ name: "config", keyPath: "id" }];
66
- var readChoices = (value) => {
67
- if (!value || typeof value !== "object" || Array.isArray(value)) return {};
68
- const out = {};
69
- for (const [id, on] of Object.entries(value)) {
70
- if (typeof on === "boolean") out[id] = on;
71
- }
72
- return out;
73
- };
74
- var withChoice = (tool, choices) => Object.prototype.hasOwnProperty.call(choices, tool.id) && tool.enabled !== choices[tool.id] ? { ...tool, enabled: choices[tool.id] } : tool;
75
- var healthCheckTool = {
76
- id: "health-check",
77
- name: "check_gateway_health",
78
- description: "Check the health status of the gateway API service",
79
- enabled: true,
80
- type: "function",
81
- function: {
82
- name: "check_gateway_health",
83
- description: "Check the health status of the gateway API service",
84
- parameters: {
85
- type: "object",
86
- properties: {},
87
- required: []
88
- }
89
- },
90
- endpoint: "/mcp/health",
91
- method: "GET",
92
- isBuiltIn: true
93
- };
94
- var webSearchTool = {
95
- id: "web-search",
96
- name: "web_search",
97
- description: "Search the web for current information, documentation, and facts",
98
- enabled: true,
99
- type: "function",
100
- function: {
101
- name: "web_search",
102
- 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.",
103
- parameters: {
104
- type: "object",
105
- properties: {
106
- query: { type: "string", description: "The search query \u2014 natural language or keywords" },
107
- count: { type: "number", description: "Number of results to return (1-10, default 5)" },
108
- include_answer: { type: "boolean", description: "Include a short summarized answer when available" }
109
- },
110
- required: ["query"]
111
- }
112
- },
113
- endpoint: "/mcp/web-search",
114
- method: "GET",
115
- isBuiltIn: true
116
- };
117
- var webFetchTool = {
118
- id: "web-fetch",
119
- name: "web_fetch",
120
- description: "Fetch the text content of a specific URL",
121
- enabled: true,
122
- type: "function",
123
- function: {
124
- name: "web_fetch",
125
- description: "Fetch a single public URL and return its trimmed text content. Use when you already have a specific link you need to read.",
126
- parameters: {
127
- type: "object",
128
- properties: {
129
- url: { type: "string", description: "Absolute http(s) URL to fetch" }
130
- },
131
- required: ["url"]
132
- }
133
- },
134
- endpoint: "/mcp/web-fetch",
135
- method: "GET",
136
- isBuiltIn: true
137
- };
138
- var imageGenerationTool = {
139
- id: "image-generation",
140
- name: "image_generation",
141
- description: "Generate an image from a text prompt on the Burtson Labs GPU",
142
- enabled: true,
143
- type: "function",
144
- function: {
145
- name: "image_generation",
146
- description: "Generate an image from a text prompt on the Burtson Labs GPU",
147
- parameters: {
148
- type: "object",
149
- properties: {
150
- prompt: { type: "string", description: "Text description of the image to generate" },
151
- size: { type: "string", enum: ["1024x1024", "1344x768", "768x1344"], description: "Canvas: square, landscape, or portrait" }
152
- },
153
- required: ["prompt"]
154
- }
155
- },
156
- endpoint: "/mcp/generate-image",
157
- method: "POST",
158
- isBuiltIn: true
159
- };
160
- var createFileTool = {
161
- id: "create-file",
162
- name: "create_file",
163
- description: "Create a downloadable file for the user (md, txt, csv, json, html, docx, pptx, pdf). Returns a temporary (~1 hour) download link.",
164
- enabled: true,
165
- type: "function",
166
- function: {
167
- name: "create_file",
168
- description: "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) \u2014 Chromium renders it without browser headers/footers; Markdown also works. Returns a short-lived (~1 hour) download URL \u2014 tell the user it expires.",
169
- parameters: {
170
- type: "object",
171
- properties: {
172
- content: { type: "string", description: "The file content (HTML preferred for pdf; Markdown for docx/pptx/pdf; raw text for others)." },
173
- filename: { type: "string", description: "Desired filename, e.g. 'report.pdf' or 'notes.md'." },
174
- format: {
175
- type: "string",
176
- enum: ["md", "txt", "csv", "json", "html", "xml", "yaml", "docx", "pptx", "pdf"],
177
- description: "File format. Defaults to md."
178
- }
179
- },
180
- required: ["content", "format"]
181
- }
182
- },
183
- endpoint: "/mcp/create-file",
184
- method: "POST",
185
- isBuiltIn: true
186
- };
187
- var defaultTools = [healthCheckTool, webSearchTool, webFetchTool, imageGenerationTool, createFileTool];
188
- var useMCPToolsStore = create((set, get) => {
189
- const persist = async () => {
190
- const { tools, choices } = get();
191
- const customTools = tools.filter((tool) => !tool.isBuiltIn && !tool.mcpServerId);
192
- await indexedDBService_default.put("banditConfig", 1, "config", {
193
- id: "mcpTools",
194
- tools: customTools,
195
- choices
196
- }, STORE_CONFIGS);
197
- debugLogger.debug("MCP tools saved to IndexedDB", { toolCount: customTools.length, choices: Object.keys(choices).length });
198
- };
199
- const persistQuietly = async () => {
200
- try {
201
- await persist();
202
- } catch (error) {
203
- debugLogger.error("Failed to save MCP tools to IndexedDB", { error });
204
- }
205
- };
206
- return {
207
- tools: defaultTools,
208
- isLoaded: false,
209
- choices: {},
210
- saveState: "idle",
211
- lastSavedAt: null,
212
- addTool: (toolData) => {
213
- const newTool = {
214
- ...toolData,
215
- id: `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`
216
- };
217
- set((state) => ({
218
- tools: [...state.tools, newTool]
219
- }));
220
- get().saveTools();
221
- },
222
- updateTool: (id, updates) => {
223
- set((state) => ({
224
- tools: state.tools.map(
225
- (tool) => tool.id === id ? { ...tool, ...updates } : tool
226
- )
227
- }));
228
- get().saveTools();
229
- },
230
- deleteTool: (id) => {
231
- set((state) => ({
232
- tools: state.tools.filter((tool) => tool.id !== id || tool.isBuiltIn)
233
- }));
234
- get().saveTools();
235
- },
236
- toggleTool: async (id) => {
237
- const tool = get().tools.find((t) => t.id === id);
238
- if (!tool) return false;
239
- const enabled = !tool.enabled;
240
- set((state) => ({
241
- tools: state.tools.map((t) => t.id === id ? { ...t, enabled } : t),
242
- choices: { ...state.choices, [id]: enabled }
243
- }));
244
- return get().saveTools();
245
- },
246
- getEnabledTools: () => {
247
- return get().tools.filter((tool) => tool.enabled);
248
- },
249
- loadTools: async () => {
250
- try {
251
- const data = await indexedDBService_default.get("banditConfig", 1, "config", "mcpTools", STORE_CONFIGS);
252
- if (data?.tools && Array.isArray(data.tools)) {
253
- const choices = { ...readChoices(data.choices), ...get().choices };
254
- const savedTools = data.tools;
255
- const builtInIds = defaultTools.map((t) => t.id);
256
- const customTools = savedTools.filter(
257
- (tool) => !tool.isBuiltIn && !builtInIds.includes(tool.id)
258
- );
259
- const discovered = get().tools.filter((t) => t.mcpServerId);
260
- set({
261
- tools: [...defaultTools, ...customTools, ...discovered].map((t) => withChoice(t, choices)),
262
- choices,
263
- isLoaded: true
264
- });
265
- debugLogger.info("MCP tools loaded from IndexedDB", {
266
- totalTools: defaultTools.length + customTools.length,
267
- builtInTools: defaultTools.length,
268
- customTools: customTools.length,
269
- choices: Object.keys(choices).length
270
- });
271
- } else {
272
- set({ isLoaded: true });
273
- await persistQuietly();
274
- debugLogger.info("Default MCP tools initialized");
275
- }
276
- } catch (error) {
277
- debugLogger.error("Failed to load MCP tools from IndexedDB", { error });
278
- set({ isLoaded: true });
279
- }
280
- },
281
- saveTools: async () => {
282
- set({ saveState: "saving" });
283
- try {
284
- await persist();
285
- set({ saveState: "saved", lastSavedAt: Date.now() });
286
- return true;
287
- } catch (error) {
288
- debugLogger.error("Failed to save MCP tools to IndexedDB", { error });
289
- set({ saveState: "error" });
290
- return false;
291
- }
292
- },
293
- syncControllerTools: (controllerTools) => {
294
- const { choices } = get();
295
- const next = [...get().tools];
296
- let changed = false;
297
- for (const ct of controllerTools) {
298
- const functionName = (ct.id || ct.name).replace(/[^a-zA-Z0-9_]/g, "_");
299
- const index = [
300
- next.findIndex((lt) => lt.function.name === functionName),
301
- next.findIndex((lt) => lt.function.name === ct.id),
302
- next.findIndex((lt) => lt.id === ct.id)
303
- ].find((i) => i >= 0) ?? -1;
304
- if (index < 0) {
305
- next.push({
306
- id: `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
307
- name: functionName,
308
- description: ct.description,
309
- enabled: ct.isEnabled,
310
- type: "function",
311
- function: {
312
- name: ct.id,
313
- // the controller id maps back to the tool
314
- description: ct.description,
315
- parameters: { type: "object", properties: {}, required: [] }
316
- },
317
- endpoint: `/mcp/${ct.id}`,
318
- method: "GET",
319
- isBuiltIn: false
320
- });
321
- changed = true;
322
- continue;
323
- }
324
- const local = next[index];
325
- const enabled = Object.prototype.hasOwnProperty.call(choices, local.id) ? choices[local.id] : ct.isEnabled;
326
- if (local.enabled !== enabled) {
327
- next[index] = { ...local, enabled };
328
- changed = true;
329
- }
330
- }
331
- if (!changed) return;
332
- set({ tools: next });
333
- void persistQuietly();
334
- },
335
- // Discover the user's connected MCP servers' tools from the gateway and merge
336
- // them into the tool list (so the model can call them). Replaces any prior
337
- // MCP-server tools; best-effort — a single unreachable server is skipped.
338
- loadMcpServerTools: async () => {
339
- let servers;
340
- try {
341
- servers = await listMcpServers();
342
- } catch (error) {
343
- debugLogger.warn("Could not list MCP servers", { error: String(error) });
344
- return;
345
- }
346
- const collected = [];
347
- for (const server of servers.filter((s) => s.enabled)) {
348
- try {
349
- const { tools } = await discoverMcpTools(server.id);
350
- for (const t of tools) {
351
- const fnName = sanitizeMcpToolName(`mcp_${server.name}_${t.name}`);
352
- const schema = t.inputSchema && typeof t.inputSchema === "object" && t.inputSchema.type === "object" ? t.inputSchema : { type: "object", properties: {}, required: [] };
353
- const id = `mcp-${server.id}-${t.name}`;
354
- const { choices } = get();
355
- collected.push({
356
- id,
357
- name: fnName,
358
- description: t.description || `${t.name} (via ${server.name})`,
359
- enabled: Object.prototype.hasOwnProperty.call(choices, id) ? choices[id] : true,
360
- type: "function",
361
- function: {
362
- name: fnName,
363
- description: t.description || `${t.name} \u2014 provided by the ${server.name} MCP server.`,
364
- parameters: schema
365
- },
366
- mcpServerId: server.id,
367
- mcpToolName: t.name
368
- });
369
- }
370
- } catch (error) {
371
- debugLogger.warn("Failed to discover tools for MCP server", { server: server.name, error: String(error) });
372
- }
373
- }
374
- set((state) => ({
375
- tools: [...state.tools.filter((t) => !t.mcpServerId), ...collected]
376
- }));
377
- debugLogger.info("MCP server tools loaded", { count: collected.length });
378
- }
379
- };
380
- });
381
-
382
- export {
383
- listMcpServers,
384
- addMcpServer,
385
- updateMcpServer,
386
- deleteMcpServer,
387
- discoverMcpTools,
388
- useMCPToolsStore
389
- };
390
- //# sourceMappingURL=chunk-E5WMDLE3.mjs.map