@burtson-labs/bandit-engine 2.0.168 → 2.1.1
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 +42 -0
- package/LICENSE +189 -31
- package/NOTICE +26 -0
- package/README.md +15 -59
- package/dist/aiProviderStore-42S3LW2J.mjs +8 -0
- package/dist/aiProviderStore-42S3LW2J.mjs.map +1 -0
- package/dist/chat-GDC4ZVCF.mjs +10 -0
- package/dist/chat-GDC4ZVCF.mjs.map +1 -0
- package/dist/{chunk-GRPTCHFN.mjs → chunk-5KC42IIR.mjs} +339 -155
- package/dist/chunk-5KC42IIR.mjs.map +1 -0
- package/dist/chunk-7QYA3PAF.mjs +29521 -0
- package/dist/chunk-7QYA3PAF.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-HNXPDIWC.mjs → chunk-NI7BKLC7.mjs} +1 -1
- package/dist/chunk-NI7BKLC7.mjs.map +1 -0
- package/dist/index.d.mts +63 -57
- package/dist/index.d.ts +63 -57
- package/dist/index.js +18053 -9606
- 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-D8UsefSk.d.mts} +21 -8
- package/dist/{public-DJa4Db00.d.ts → public-D8UsefSk.d.ts} +21 -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-7LOFYEWE.mjs +0 -15
- package/dist/chat-7LOFYEWE.mjs.map +0 -1
- package/dist/chat-provider.js +0 -11080
- 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-4SXXEGEK.mjs +0 -10690
- package/dist/chunk-4SXXEGEK.mjs.map +0 -1
- package/dist/chunk-62IYSU3I.mjs +0 -7324
- package/dist/chunk-62IYSU3I.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-JD6C64CT.mjs +0 -516
- package/dist/chunk-JD6C64CT.mjs.map +0 -1
- package/dist/chunk-KAXUI5H7.mjs +0 -6009
- package/dist/chunk-KAXUI5H7.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-QI67R5F6.mjs +0 -194
- package/dist/chunk-QI67R5F6.mjs.map +0 -1
- package/dist/chunk-R3NOM2DG.mjs +0 -2945
- package/dist/chunk-R3NOM2DG.mjs.map +0 -1
- package/dist/chunk-SZJB5FLZ.mjs.map +0 -1
- package/dist/chunk-YGOLNWXJ.mjs +0 -11906
- package/dist/chunk-YGOLNWXJ.mjs.map +0 -1
- package/dist/management/management.js +0 -44454
- 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 -19730
- 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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store/mcpToolsStore.ts","../src/services/mcp/mcpServersService.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { create } from \"zustand\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { listMcpServers, discoverMcpTools } from \"../services/mcp/mcpServersService\";\nimport type { McpTool as ControllerTool } from \"../services/mcp/mcpControllerService\";\n\n// Sanitize an MCP tool into a valid, namespaced function name for the model.\nconst sanitizeMcpToolName = (raw: string): string =>\n raw.replace(/[^a-zA-Z0-9_]/g, \"_\").replace(/_+/g, \"_\").replace(/^_|_$/g, \"\").slice(0, 60);\n\nexport interface MCPTool {\n id: string;\n name: string;\n description: string;\n enabled: boolean;\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, unknown>;\n required: string[];\n };\n };\n endpoint?: string; // API endpoint for gateway calls\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n isBuiltIn?: boolean;\n // Set when this tool comes from a user-connected MCP server. Such tools are\n // invoked through POST /mcp/invoke (not a fixed endpoint) and are never\n // persisted to IndexedDB — they're re-discovered from the gateway each load.\n mcpServerId?: string;\n mcpToolName?: string; // the tool's real name on the MCP server\n}\n\nexport type ToolSaveState = \"idle\" | \"saving\" | \"saved\" | \"error\";\n\ninterface MCPToolsStore {\n tools: MCPTool[];\n isLoaded: boolean;\n /**\n * The person's own on/off choice per tool id. It wins over every default:\n * a built-in's, the tool controller's `isEnabled`, and a discovered MCP\n * server tool's. A tool with no entry follows its default. Persisted with\n * the custom tools in this origin's IndexedDB, and each workspace is its own\n * origin (acme.banditai.ai), so choices are per workspace.\n */\n choices: Record<string, boolean>;\n /** Whether the last change a person made was written. */\n saveState: ToolSaveState;\n lastSavedAt: number | null;\n addTool: (tool: Omit<MCPTool, \"id\">) => void;\n updateTool: (id: string, updates: Partial<MCPTool>) => void;\n deleteTool: (id: string) => void;\n /** Flips a tool, records it as the person's choice and saves. Resolves false if the save failed. */\n toggleTool: (id: string) => Promise<boolean>;\n loadTools: () => Promise<void>;\n /** Saves, reporting through saveState. Resolves false if the write failed. */\n saveTools: () => Promise<boolean>;\n getEnabledTools: () => MCPTool[];\n loadMcpServerTools: () => Promise<void>;\n /**\n * Aligns local tools with what the tool controller reports: adds the ones\n * we don't have, and sets each to the person's choice or, if they haven't\n * made one, the controller's default. Never overrides a choice.\n */\n syncControllerTools: (controllerTools: ControllerTool[]) => void;\n}\n\nconst STORE_CONFIGS = [{ name: \"config\", keyPath: \"id\" }];\n\ntype PersistedTools = { tools?: unknown; choices?: unknown };\n\nconst readChoices = (value: unknown): Record<string, boolean> => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const out: Record<string, boolean> = {};\n for (const [id, on] of Object.entries(value as Record<string, unknown>)) {\n if (typeof on === \"boolean\") out[id] = on;\n }\n return out;\n};\n\nconst withChoice = (tool: MCPTool, choices: Record<string, boolean>): MCPTool =>\n Object.prototype.hasOwnProperty.call(choices, tool.id) && tool.enabled !== choices[tool.id]\n ? { ...tool, enabled: choices[tool.id]! }\n : tool;\n\n// Built-in controller-backed tools\nconst healthCheckTool: MCPTool = {\n id: \"health-check\",\n name: \"check_gateway_health\",\n description: \"Check the health status of the gateway API service\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"check_gateway_health\",\n description: \"Check the health status of the gateway API service\",\n parameters: {\n type: \"object\",\n properties: {},\n required: []\n }\n },\n endpoint: \"/mcp/health\",\n method: \"GET\",\n isBuiltIn: true\n};\n\nconst webSearchTool: MCPTool = {\n id: \"web-search\",\n name: \"web_search\",\n description: \"Search the web for current information, documentation, and facts\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"web_search\",\n description: \"Search the web and return ranked results with snippets (and an optional summarized answer). Use for current events, documentation, libraries, error messages, and factual lookups.\",\n parameters: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"The search query — natural language or keywords\" },\n count: { type: \"number\", description: \"Number of results to return (1-10, default 5)\" },\n include_answer: { type: \"boolean\", description: \"Include a short summarized answer when available\" }\n },\n required: [\"query\"]\n }\n },\n endpoint: \"/mcp/web-search\",\n method: \"GET\",\n isBuiltIn: true\n};\n\nconst webFetchTool: MCPTool = {\n id: \"web-fetch\",\n name: \"web_fetch\",\n description: \"Fetch the text content of a specific URL\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"web_fetch\",\n description: \"Fetch a single public URL and return its trimmed text content. Use when you already have a specific link you need to read.\",\n parameters: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"Absolute http(s) URL to fetch\" }\n },\n required: [\"url\"]\n }\n },\n endpoint: \"/mcp/web-fetch\",\n method: \"GET\",\n isBuiltIn: true\n};\n\n// Image generation runs on Burtson's own GPU (the Image Studio backend behind\n// the gateway) — never a third-party image API. The gateway forwards the\n// user's token to Anton, whose admin/partner gate decides who may take the\n// GPU; everyone else gets a clear \"limited to admin and partner accounts\"\n// message. Cold starts can take a couple of minutes.\nconst imageGenerationTool: MCPTool = {\n id: \"image-generation\",\n name: \"image_generation\",\n description: \"Generate an image from a text prompt on the Burtson Labs GPU\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"image_generation\",\n description: \"Generate an image from a text prompt on the Burtson Labs GPU\",\n parameters: {\n type: \"object\",\n properties: {\n prompt: { type: \"string\", description: \"Text description of the image to generate\" },\n size: { type: \"string\", enum: [\"1024x1024\", \"1344x768\", \"768x1344\"], description: \"Canvas: square, landscape, or portrait\" }\n },\n required: [\"prompt\"]\n }\n },\n endpoint: \"/mcp/generate-image\",\n method: \"POST\",\n isBuiltIn: true\n};\n\n// Create a downloadable file for the user (stored ~1 hour at a gateway URL).\nconst createFileTool: MCPTool = {\n id: \"create-file\",\n name: \"create_file\",\n description: \"Create a downloadable file for the user (md, txt, csv, json, html, docx, pptx, pdf). Returns a temporary (~1 hour) download link.\",\n enabled: true,\n type: \"function\",\n function: {\n name: \"create_file\",\n description:\n \"Generate a file the user can download. For docx/pptx write well-structured Markdown (headings, lists, tables; use '## ' headings to start each slide). For pdf, prefer complete HTML with inline CSS (branded proposals, print layouts) — Chromium renders it without browser headers/footers; Markdown also works. Returns a short-lived (~1 hour) download URL — tell the user it expires.\",\n parameters: {\n type: \"object\",\n properties: {\n content: { type: \"string\", description: \"The file content (HTML preferred for pdf; Markdown for docx/pptx/pdf; raw text for others).\" },\n filename: { type: \"string\", description: \"Desired filename, e.g. 'report.pdf' or 'notes.md'.\" },\n format: {\n type: \"string\",\n enum: [\"md\", \"txt\", \"csv\", \"json\", \"html\", \"xml\", \"yaml\", \"docx\", \"pptx\", \"pdf\"],\n description: \"File format. Defaults to md.\",\n },\n },\n required: [\"content\", \"format\"],\n },\n },\n endpoint: \"/mcp/create-file\",\n method: \"POST\",\n isBuiltIn: true,\n};\n\nconst defaultTools: MCPTool[] = [healthCheckTool, webSearchTool, webFetchTool, imageGenerationTool, createFileTool];\n\nexport const useMCPToolsStore = create<MCPToolsStore>((set, get) => {\n // Writes custom tools and choices. Built-ins and discovered MCP-server tools\n // are never stored themselves: they come back from code and the gateway.\n const persist = async () => {\n const { tools, choices } = get();\n const customTools = tools.filter((tool) => !tool.isBuiltIn && !tool.mcpServerId);\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"mcpTools\",\n tools: customTools,\n choices,\n }, STORE_CONFIGS);\n debugLogger.debug(\"MCP tools saved to IndexedDB\", { toolCount: customTools.length, choices: Object.keys(choices).length });\n };\n\n // Background writes (first run, controller sync) don't touch saveState:\n // \"Saved\" and \"Couldn't save\" describe what the person did.\n const persistQuietly = async () => {\n try {\n await persist();\n } catch (error) {\n debugLogger.error(\"Failed to save MCP tools to IndexedDB\", { error });\n }\n };\n\n return {\n tools: defaultTools,\n isLoaded: false,\n choices: {},\n saveState: \"idle\",\n lastSavedAt: null,\n\n addTool: (toolData) => {\n const newTool: MCPTool = {\n ...toolData,\n id: `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n };\n set((state) => ({\n tools: [...state.tools, newTool],\n }));\n get().saveTools();\n },\n \n updateTool: (id, updates) => {\n set((state) => ({\n tools: state.tools.map((tool) =>\n tool.id === id ? { ...tool, ...updates } : tool\n ),\n }));\n get().saveTools();\n },\n \n deleteTool: (id) => {\n set((state) => ({\n tools: state.tools.filter((tool) => tool.id !== id || tool.isBuiltIn),\n }));\n get().saveTools();\n },\n \n toggleTool: async (id) => {\n const tool = get().tools.find((t) => t.id === id);\n if (!tool) return false;\n const enabled = !tool.enabled;\n set((state) => ({\n tools: state.tools.map((t) => (t.id === id ? { ...t, enabled } : t)),\n choices: { ...state.choices, [id]: enabled },\n }));\n return get().saveTools();\n },\n \n getEnabledTools: () => {\n return get().tools.filter((tool) => tool.enabled);\n },\n \n loadTools: async () => {\n try {\n const data = await indexedDBService.get<PersistedTools>(\"banditConfig\", 1, \"config\", \"mcpTools\", STORE_CONFIGS);\n \n if (data?.tools && Array.isArray(data.tools)) {\n // Choices made in this session before the load finished are newer than the stored ones.\n const choices = { ...readChoices(data.choices), ...get().choices };\n // Built-ins always use their code definition; only the on/off is the person's.\n const savedTools = data.tools as MCPTool[];\n const builtInIds = defaultTools.map(t => t.id);\n const customTools = savedTools.filter(\n (tool) => !tool.isBuiltIn && !builtInIds.includes(tool.id)\n );\n const discovered = get().tools.filter((t) => t.mcpServerId);\n\n set({\n tools: [...defaultTools, ...customTools, ...discovered].map((t) => withChoice(t, choices)),\n choices,\n isLoaded: true\n });\n debugLogger.info(\"MCP tools loaded from IndexedDB\", { \n totalTools: defaultTools.length + customTools.length,\n builtInTools: defaultTools.length,\n customTools: customTools.length,\n choices: Object.keys(choices).length,\n });\n } else {\n // First time, save defaults\n set({ isLoaded: true });\n await persistQuietly();\n debugLogger.info(\"Default MCP tools initialized\");\n }\n } catch (error) {\n debugLogger.error(\"Failed to load MCP tools from IndexedDB\", { error });\n set({ isLoaded: true }); // Mark as loaded even if failed, so UI can render\n }\n },\n \n saveTools: async () => {\n set({ saveState: \"saving\" });\n try {\n await persist();\n set({ saveState: \"saved\", lastSavedAt: Date.now() });\n return true;\n } catch (error) {\n debugLogger.error(\"Failed to save MCP tools to IndexedDB\", { error });\n set({ saveState: \"error\" });\n return false;\n }\n },\n\n syncControllerTools: (controllerTools) => {\n const { choices } = get();\n const next = [...get().tools];\n let changed = false;\n for (const ct of controllerTools) {\n const functionName = (ct.id || ct.name).replace(/[^a-zA-Z0-9_]/g, \"_\");\n const index =\n [\n next.findIndex((lt) => lt.function.name === functionName),\n next.findIndex((lt) => lt.function.name === ct.id),\n next.findIndex((lt) => lt.id === ct.id),\n ].find((i) => i >= 0) ?? -1;\n\n if (index < 0) {\n // A local representation lets the person switch it for the assistant.\n next.push({\n id: `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n name: functionName,\n description: ct.description,\n enabled: ct.isEnabled,\n type: \"function\",\n function: {\n name: ct.id, // the controller id maps back to the tool\n description: ct.description,\n parameters: { type: \"object\", properties: {}, required: [] },\n },\n endpoint: `/mcp/${ct.id}`,\n method: \"GET\",\n isBuiltIn: false,\n });\n changed = true;\n continue;\n }\n const local = next[index]!;\n const enabled = Object.prototype.hasOwnProperty.call(choices, local.id) ? choices[local.id]! : ct.isEnabled;\n if (local.enabled !== enabled) {\n next[index] = { ...local, enabled };\n changed = true;\n }\n }\n if (!changed) return;\n set({ tools: next });\n void persistQuietly();\n },\n\n // Discover the user's connected MCP servers' tools from the gateway and merge\n // them into the tool list (so the model can call them). Replaces any prior\n // MCP-server tools; best-effort — a single unreachable server is skipped.\n loadMcpServerTools: async () => {\n let servers;\n try {\n servers = await listMcpServers();\n } catch (error) {\n debugLogger.warn(\"Could not list MCP servers\", { error: String(error) });\n return;\n }\n\n const collected: MCPTool[] = [];\n for (const server of servers.filter((s) => s.enabled)) {\n try {\n const { tools } = await discoverMcpTools(server.id);\n for (const t of tools) {\n const fnName = sanitizeMcpToolName(`mcp_${server.name}_${t.name}`);\n const schema =\n t.inputSchema && typeof t.inputSchema === \"object\" && (t.inputSchema as { type?: string }).type === \"object\"\n ? (t.inputSchema as MCPTool[\"function\"][\"parameters\"])\n : { type: \"object\" as const, properties: {}, required: [] };\n const id = `mcp-${server.id}-${t.name}`;\n const { choices } = get();\n collected.push({\n id,\n name: fnName,\n description: t.description || `${t.name} (via ${server.name})`,\n enabled: Object.prototype.hasOwnProperty.call(choices, id) ? choices[id]! : true,\n type: \"function\",\n function: {\n name: fnName,\n description: t.description || `${t.name} — provided by the ${server.name} MCP server.`,\n parameters: schema,\n },\n mcpServerId: server.id,\n mcpToolName: t.name,\n });\n }\n } catch (error) {\n debugLogger.warn(\"Failed to discover tools for MCP server\", { server: server.name, error: String(error) });\n }\n }\n\n set((state) => ({\n tools: [...state.tools.filter((t) => !t.mcpServerId), ...collected],\n }));\n debugLogger.info(\"MCP server tools loaded\", { count: collected.length });\n },\n };\n});\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { authenticationService } from \"../auth/authenticationService\";\n\n/**\n * Client for the gateway's MCP host (phase 1 backend at /api/mcp/servers + /invoke).\n * Lets users connect their own remote MCP servers; the gateway holds the configs\n * and proxies discovery/invocation. Mirrors mcpService's gateway-base + bearer\n * conventions (gatewayApiUrl already ends in /api, so paths start with /mcp/...).\n */\n\nexport interface McpServer {\n id: string;\n name: string;\n url: string;\n authType: string;\n hasAuth: boolean;\n headerName?: string | null;\n enabled: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface McpServerInput {\n name: string;\n url: string;\n authType?: \"none\" | \"bearer\" | \"header\";\n authValue?: string;\n headerName?: string;\n enabled?: boolean;\n}\n\nexport interface McpDiscoveredTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nconst gatewayBase = (): string => {\n const settings = usePackageSettingsStore.getState().settings;\n const url = settings?.gatewayApiUrl?.replace(/\\/$/, \"\");\n if (!url) throw new Error(\"Gateway API is not configured.\");\n return url;\n};\n\nconst authHeaders = (): Record<string, string> => {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n const token = authenticationService.getToken();\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n return headers;\n};\n\nconst parse = async (res: Response) => {\n const text = await res.text();\n const body = text ? JSON.parse(text) : null;\n if (!res.ok) {\n const message =\n (body && typeof body === \"object\" && (body.error || body.message)) ||\n `Request failed (${res.status})`;\n throw new Error(String(message));\n }\n return body;\n};\n\nexport const listMcpServers = async (): Promise<McpServer[]> =>\n parse(await fetch(`${gatewayBase()}/mcp/servers`, { headers: authHeaders() }));\n\nexport const addMcpServer = async (input: McpServerInput): Promise<McpServer> =>\n parse(\n await fetch(`${gatewayBase()}/mcp/servers`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify(input),\n }),\n );\n\nexport const updateMcpServer = async (\n id: string,\n input: Partial<McpServerInput>,\n): Promise<McpServer> =>\n parse(\n await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}`, {\n method: \"PUT\",\n headers: authHeaders(),\n body: JSON.stringify(input),\n }),\n );\n\nexport const deleteMcpServer = async (id: string): Promise<void> => {\n const res = await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n headers: authHeaders(),\n });\n if (!res.ok && res.status !== 204) {\n throw new Error(`Could not remove the server (${res.status}).`);\n }\n};\n\nexport const discoverMcpTools = async (\n id: string,\n): Promise<{ serverId: string; server: string; tools: McpDiscoveredTool[] }> =>\n parse(await fetch(`${gatewayBase()}/mcp/servers/${encodeURIComponent(id)}/tools`, { headers: authHeaders() }));\n"],"mappings":"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","names":[]}
|