@burtson-labs/bandit-engine 2.0.167 → 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.
- package/CHANGELOG.md +31 -0
- package/LICENSE +189 -31
- package/NOTICE +26 -0
- package/README.md +15 -59
- package/dist/aiProviderStore-DKQCCDWF.mjs +8 -0
- package/dist/aiProviderStore-DKQCCDWF.mjs.map +1 -0
- package/dist/chat-VYZFUECC.mjs +10 -0
- package/dist/chat-VYZFUECC.mjs.map +1 -0
- package/dist/{chunk-GRPTCHFN.mjs → chunk-BJT6KPUG.mjs} +309 -154
- package/dist/chunk-BJT6KPUG.mjs.map +1 -0
- package/dist/{chunk-SZJB5FLZ.mjs → chunk-FCQN3LKT.mjs} +251 -77
- package/dist/chunk-FCQN3LKT.mjs.map +1 -0
- package/dist/chunk-HD4PJNPH.mjs +29034 -0
- package/dist/chunk-HD4PJNPH.mjs.map +1 -0
- package/dist/{chunk-HNXPDIWC.mjs → chunk-NI7BKLC7.mjs} +1 -1
- package/dist/chunk-NI7BKLC7.mjs.map +1 -0
- package/dist/index.d.mts +115 -57
- package/dist/index.d.ts +115 -57
- package/dist/index.js +15660 -7577
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16630 -142
- package/dist/index.mjs.map +1 -1
- package/dist/{memoryUtils-HGCYEUCD.mjs → memoryUtils-UBZ33DNA.mjs} +8 -3
- package/dist/memoryUtils-UBZ33DNA.mjs.map +1 -0
- package/dist/modelStore-SEC34WRM.mjs +8 -0
- package/dist/modelStore-SEC34WRM.mjs.map +1 -0
- package/dist/{public-DJa4Db00.d.mts → public-CKQQDOoy.d.mts} +8 -8
- package/dist/{public-DJa4Db00.d.ts → public-CKQQDOoy.d.ts} +8 -8
- package/dist/public-types.d.mts +1 -1
- package/dist/public-types.d.ts +1 -1
- package/docs/00_intro.md +2 -2
- package/docs/05_contributing.md +2 -2
- package/docs/06_licensing.md +18 -0
- package/docs/07_custom_tools.md +233 -0
- package/docs/README.md +2 -1
- package/package.json +23 -20
- package/dist/aiProviderStore-HY5G4QAK.mjs +0 -8
- package/dist/aiProviderStore-HY5G4QAK.mjs.map +0 -1
- package/dist/chat-6N5B7A7F.mjs +0 -15
- package/dist/chat-6N5B7A7F.mjs.map +0 -1
- package/dist/chat-provider.js +0 -10964
- package/dist/chat-provider.js.map +0 -1
- package/dist/chat-provider.mjs +0 -16
- package/dist/chat-provider.mjs.map +0 -1
- package/dist/chunk-46OGYEME.mjs +0 -5895
- package/dist/chunk-46OGYEME.mjs.map +0 -1
- package/dist/chunk-5BZWJQ5O.mjs +0 -516
- package/dist/chunk-5BZWJQ5O.mjs.map +0 -1
- package/dist/chunk-CABOLDNR.mjs +0 -216
- package/dist/chunk-CABOLDNR.mjs.map +0 -1
- package/dist/chunk-E5WMDLE3.mjs +0 -390
- package/dist/chunk-E5WMDLE3.mjs.map +0 -1
- package/dist/chunk-GRPTCHFN.mjs.map +0 -1
- package/dist/chunk-HNXPDIWC.mjs.map +0 -1
- package/dist/chunk-KDIL5WUL.mjs +0 -7323
- package/dist/chunk-KDIL5WUL.mjs.map +0 -1
- package/dist/chunk-N4BQ6HKL.mjs +0 -2945
- package/dist/chunk-N4BQ6HKL.mjs.map +0 -1
- package/dist/chunk-ONQMRE2G.mjs +0 -26
- package/dist/chunk-ONQMRE2G.mjs.map +0 -1
- package/dist/chunk-P4C5IRM5.mjs +0 -39
- package/dist/chunk-P4C5IRM5.mjs.map +0 -1
- package/dist/chunk-PK3LFBGC.mjs +0 -10575
- package/dist/chunk-PK3LFBGC.mjs.map +0 -1
- package/dist/chunk-SHYNXDRO.mjs +0 -11906
- package/dist/chunk-SHYNXDRO.mjs.map +0 -1
- package/dist/chunk-SZJB5FLZ.mjs.map +0 -1
- package/dist/chunk-US4TG745.mjs +0 -194
- package/dist/chunk-US4TG745.mjs.map +0 -1
- package/dist/management/management.js +0 -44217
- package/dist/management/management.js.map +0 -1
- package/dist/management/management.mjs +0 -16
- package/dist/management/management.mjs.map +0 -1
- package/dist/memoryUtils-HGCYEUCD.mjs.map +0 -1
- package/dist/modals/chat-modal/chat-modal.js +0 -19613
- package/dist/modals/chat-modal/chat-modal.js.map +0 -1
- package/dist/modals/chat-modal/chat-modal.mjs +0 -18
- package/dist/modals/chat-modal/chat-modal.mjs.map +0 -1
- package/dist/modelStore-TFNX4GEC.mjs +0 -8
- package/dist/modelStore-TFNX4GEC.mjs.map +0 -1
- package/dist/shared/custom-element.js +0 -73
- package/dist/shared/custom-element.js.map +0 -1
- package/dist/shared/custom-element.mjs +0 -7
- package/dist/shared/custom-element.mjs.map +0 -1
- package/docs/06_busl_licensing.md +0 -25
- package/docs/api_reference/.nojekyll +0 -1
- package/docs/api_reference/assets/bandit-docs.js +0 -462
- package/docs/api_reference/assets/highlight.css +0 -141
- package/docs/api_reference/assets/icons.js +0 -18
- package/docs/api_reference/assets/icons.svg +0 -1
- package/docs/api_reference/assets/main.js +0 -61
- package/docs/api_reference/assets/navigation.js +0 -1
- package/docs/api_reference/assets/search.js +0 -1
- package/docs/api_reference/assets/style.css +0 -1664
- package/docs/api_reference/classes/DebugLogger.html +0 -29
- package/docs/api_reference/classes/FeatureFlagService.html +0 -28
- package/docs/api_reference/classes/NotificationService.html +0 -21
- package/docs/api_reference/classes/StreamingTTSClient.html +0 -19
- package/docs/api_reference/classes/VectorDatabaseService.html +0 -63
- package/docs/api_reference/classes/VectorMigrationService.html +0 -27
- package/docs/api_reference/classes/VoiceService.html +0 -4
- package/docs/api_reference/enums/TTSState.html +0 -6
- package/docs/api_reference/functions/Chat.html +0 -1
- package/docs/api_reference/functions/ChatModal.html +0 -29
- package/docs/api_reference/functions/ChatProvider.html +0 -29
- package/docs/api_reference/functions/FeatureFlagProvider.html +0 -30
- package/docs/api_reference/functions/FeedbackButton.html +0 -29
- package/docs/api_reference/functions/FeedbackModal.html +0 -29
- package/docs/api_reference/functions/InterestsEditor.html +0 -5
- package/docs/api_reference/functions/Management.html +0 -1
- package/docs/api_reference/functions/NotificationProvider.html +0 -29
- package/docs/api_reference/functions/SubscriptionExpiredGuard.html +0 -31
- package/docs/api_reference/functions/SubscriptionExpiredModal.html +0 -31
- package/docs/api_reference/functions/defineCustomElement.html +0 -1
- package/docs/api_reference/functions/getCriticalConfig.html +0 -2
- package/docs/api_reference/functions/getFeatureMatrix.html +0 -1
- package/docs/api_reference/functions/getStreamingTTSClient.html +0 -1
- package/docs/api_reference/functions/getSystemConstants.html +0 -2
- package/docs/api_reference/functions/getTTSState.html +0 -1
- package/docs/api_reference/functions/handleHttpError.html +0 -2
- package/docs/api_reference/functions/handleSubscriptionUpgrade.html +0 -1
- package/docs/api_reference/functions/handleValidationError.html +0 -2
- package/docs/api_reference/functions/initializeCoreSystem.html +0 -2
- package/docs/api_reference/functions/isWorkspaceAdminRole.html +0 -6
- package/docs/api_reference/functions/pauseTTS.html +0 -1
- package/docs/api_reference/functions/previewTierUpgrade.html +0 -1
- package/docs/api_reference/functions/resolveManagementSections.html +0 -2
- package/docs/api_reference/functions/resumeTTS.html +0 -1
- package/docs/api_reference/functions/showInfoNotification.html +0 -2
- package/docs/api_reference/functions/showSuccessNotification.html +0 -2
- package/docs/api_reference/functions/speakWithStreaming.html +0 -1
- package/docs/api_reference/functions/stopTTS.html +0 -1
- package/docs/api_reference/functions/syncSubscriptionWithAPI.html +0 -1
- package/docs/api_reference/functions/updateSubscriptionTier.html +0 -2
- package/docs/api_reference/functions/useFeatureFlag.html +0 -2
- package/docs/api_reference/functions/useFeatureVisibility.html +0 -2
- package/docs/api_reference/functions/useFeatures.html +0 -2
- package/docs/api_reference/functions/useGatewayHealth.html +0 -1
- package/docs/api_reference/functions/useGatewayMemory.html +0 -1
- package/docs/api_reference/functions/useGatewayModels.html +0 -1
- package/docs/api_reference/functions/useGlobalTTS.html +0 -2
- package/docs/api_reference/functions/useManagementAccess.html +0 -2
- package/docs/api_reference/functions/useNotification.html +0 -1
- package/docs/api_reference/functions/useNotificationService.html +0 -6
- package/docs/api_reference/functions/useTTS.html +0 -2
- package/docs/api_reference/functions/useVectorStore.html +0 -13
- package/docs/api_reference/functions/useVoiceStore.html +0 -8
- package/docs/api_reference/functions/useVoices.html +0 -3
- package/docs/api_reference/functions/validateEnvironment.html +0 -2
- package/docs/api_reference/functions/validateSystemIntegrity.html +0 -2
- package/docs/api_reference/index.html +0 -916
- package/docs/api_reference/interfaces/AIChatRequest.html +0 -8
- package/docs/api_reference/interfaces/AIChatResponse.html +0 -3
- package/docs/api_reference/interfaces/AIGenerateRequest.html +0 -5
- package/docs/api_reference/interfaces/AIGenerateResponse.html +0 -3
- package/docs/api_reference/interfaces/AIMessage.html +0 -4
- package/docs/api_reference/interfaces/AIModel.html +0 -6
- package/docs/api_reference/interfaces/AIProviderConfig.html +0 -12
- package/docs/api_reference/interfaces/ChatConfig.html +0 -5
- package/docs/api_reference/interfaces/ChatModalProps.html +0 -7
- package/docs/api_reference/interfaces/CreateMemoryOptions.html +0 -7
- package/docs/api_reference/interfaces/FeatureEvaluation.html +0 -14
- package/docs/api_reference/interfaces/FeatureFlagConfig.html +0 -18
- package/docs/api_reference/interfaces/FeatureFlagContextValue.html +0 -16
- package/docs/api_reference/interfaces/FeatureFlagProviderProps.html +0 -4
- package/docs/api_reference/interfaces/FeedbackButtonProps.html +0 -19
- package/docs/api_reference/interfaces/FeedbackCategories.html +0 -6
- package/docs/api_reference/interfaces/FeedbackModalProps.html +0 -4
- package/docs/api_reference/interfaces/FeedbackPriorities.html +0 -5
- package/docs/api_reference/interfaces/FeedbackRequest.html +0 -12
- package/docs/api_reference/interfaces/FeedbackResponse.html +0 -7
- package/docs/api_reference/interfaces/FileUploadResult.html +0 -4
- package/docs/api_reference/interfaces/GatewayChatRequest.html +0 -13
- package/docs/api_reference/interfaces/GatewayChatResponse.html +0 -7
- package/docs/api_reference/interfaces/GatewayContract.html +0 -4
- package/docs/api_reference/interfaces/GatewayGenerateRequest.html +0 -8
- package/docs/api_reference/interfaces/GatewayGenerateResponse.html +0 -12
- package/docs/api_reference/interfaces/GatewayHealthResponse.html +0 -5
- package/docs/api_reference/interfaces/GatewayMemoryRecord.html +0 -7
- package/docs/api_reference/interfaces/GatewayMemoryResponse.html +0 -4
- package/docs/api_reference/interfaces/GatewayMessage.html +0 -5
- package/docs/api_reference/interfaces/GatewayMessageContent.html +0 -4
- package/docs/api_reference/interfaces/GatewayModel.html +0 -9
- package/docs/api_reference/interfaces/GatewayModelsResponse.html +0 -2
- package/docs/api_reference/interfaces/ManagementAccess.html +0 -5
- package/docs/api_reference/interfaces/ManagementAccessInput.html +0 -5
- package/docs/api_reference/interfaces/ManagementLink.html +0 -7
- package/docs/api_reference/interfaces/ManagementProps.html +0 -22
- package/docs/api_reference/interfaces/ManagementSectionDef.html +0 -10
- package/docs/api_reference/interfaces/MemorySearchFilters.html +0 -5
- package/docs/api_reference/interfaces/MigrationProgress.html +0 -6
- package/docs/api_reference/interfaces/MigrationStatus.html +0 -7
- package/docs/api_reference/interfaces/NotificationConfig.html +0 -5
- package/docs/api_reference/interfaces/NotificationContextType.html +0 -6
- package/docs/api_reference/interfaces/NotificationProviderProps.html +0 -4
- package/docs/api_reference/interfaces/PackageSettings.html +0 -22
- package/docs/api_reference/interfaces/SearchOptions.html +0 -6
- package/docs/api_reference/interfaces/SearchResult.html +0 -5
- package/docs/api_reference/interfaces/SubscriptionExpiredGuardProps.html +0 -7
- package/docs/api_reference/interfaces/SubscriptionExpiredModalProps.html +0 -6
- package/docs/api_reference/interfaces/TTSOptions.html +0 -5
- package/docs/api_reference/interfaces/TTSProgress.html +0 -6
- package/docs/api_reference/interfaces/TrialUsage.html +0 -6
- package/docs/api_reference/interfaces/UploadRequest.html +0 -9
- package/docs/api_reference/interfaces/UseTTSReturn.html +0 -14
- package/docs/api_reference/interfaces/VectorDocument.html +0 -11
- package/docs/api_reference/interfaces/VectorMemory.html +0 -12
- package/docs/api_reference/interfaces/VectorMemoryMetadata.html +0 -7
- package/docs/api_reference/interfaces/VectorStoreStatus.html +0 -7
- package/docs/api_reference/interfaces/VoiceModelsResponse.html +0 -4
- package/docs/api_reference/interfaces/VoiceState.html +0 -12
- package/docs/api_reference/media/02_gateway_api.md +0 -123
- package/docs/api_reference/media/05_cli_quickstart.md +0 -87
- package/docs/api_reference/media/LICENSE +0 -43
- package/docs/api_reference/media/PRE-PUSH-CHECKLIST.md +0 -10
- package/docs/api_reference/media/PROTECTION-NOTICE.md +0 -11
- package/docs/api_reference/media/README.md +0 -58
- package/docs/api_reference/modules.html +0 -136
- package/docs/api_reference/types/FeatureKey.html +0 -2
- package/docs/api_reference/types/FeatureMatrix.html +0 -2
- package/docs/api_reference/types/GatewayQueryOptions.html +0 -1
- package/docs/api_reference/types/LogContext.html +0 -14
- package/docs/api_reference/types/ManagementRequest.html +0 -1
- package/docs/api_reference/types/ManagementSectionId.html +0 -2
- package/docs/api_reference/types/SubscriptionTier.html +0 -2
- package/docs/api_reference/variables/DEFAULT_TIER_FEATURES.html +0 -2
- package/docs/api_reference/variables/FeatureFlagContext.html +0 -1
- package/docs/api_reference/variables/MANAGEMENT_SECTIONS.html +0 -1
- package/docs/api_reference/variables/OSS_DEFAULT_FEATURES.html +0 -2
- package/docs/api_reference/variables/SYSTEM_FLAGS.html +0 -2
- package/docs/api_reference/variables/authenticationService.html +0 -1
- package/docs/api_reference/variables/debugLogger-1.html +0 -1
- package/docs/api_reference/variables/featureFlagService-1.html +0 -2
- package/docs/api_reference/variables/notificationService-1.html +0 -1
- package/docs/api_reference/variables/vectorDatabaseService-1.html +0 -1
- package/docs/api_reference/variables/vectorMigrationService-1.html +0 -1
- package/docs/api_reference/variables/voiceService-1.html +0 -1
package/dist/chunk-CABOLDNR.mjs
DELETED
|
@@ -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":[]}
|
package/dist/chunk-E5WMDLE3.mjs
DELETED
|
@@ -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
|