@burdenoff/microfe-botmanor 2026.813.1 → 2026.821.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.
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../src/botlit/pages/SettingsPage.tsx"],"sourcesContent":["/**\n * Settings Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport {\n Key,\n Bell,\n Shield,\n Database,\n Palette,\n Save,\n Brain,\n Link2,\n ExternalLink,\n} from 'lucide-react';\nimport { useTheme, type ThemeMode } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { toast } from 'sonner';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, FormField } from '../components/Input';\nimport { Badge } from '../components/Badge';\nimport { useLLMProviders, useConfigureLLMProvider, useLLMModels } from '../hooks/useLLMProviders';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { cn } from '../utils/cn';\nimport { toUnion } from '../utils/unions';\n\n/** Provider kinds the form offers, in the casing the service stores. */\nconst PROVIDER_TYPES = [\n 'OPENAI',\n 'ANTHROPIC',\n 'GOOGLE',\n 'AZURE_OPENAI',\n 'AWS_BEDROCK',\n 'CUSTOM',\n] as const;\n\n/** The `<option>` values are lowercase; the column is the uppercase enum. */\nfunction toProviderType(value: string): (typeof PROVIDER_TYPES)[number] {\n return toUnion(value.toUpperCase(), PROVIDER_TYPES, 'CUSTOM');\n}\n\nexport const SettingsPage: FC = () => {\n const { data: providers, refetch: refetchProviders } = useLLMProviders();\n const { configureProvider, isConfiguring } = useConfigureLLMProvider();\n const { data: llmModels } = useLLMModels();\n const { mode, setMode } = useTheme();\n const [activeTab, setActiveTab] = useState('providers');\n const [apiKey, setApiKey] = useState('');\n const [selectedProviderType, setSelectedProviderType] = useState('openai');\n const [editingProviderId, setEditingProviderId] = useState<string | null>(null);\n // Credential method: 'integration' (preferred) or 'apikey' (legacy)\n const [credentialMethod, setCredentialMethod] = useState<'integration' | 'apikey'>('apikey');\n const [connectionId, setConnectionId] = useState('');\n // Model creation form state\n const [newModelName, setNewModelName] = useState('');\n const [newModelId, setNewModelId] = useState('');\n const [newModelContextWindow, setNewModelContextWindow] = useState('128000');\n const [newModelMaxOutput, setNewModelMaxOutput] = useState('4096');\n const [newModelInputPrice, setNewModelInputPrice] = useState('2.5');\n const [newModelOutputPrice, setNewModelOutputPrice] = useState('10');\n const [newModelProviderId, setNewModelProviderId] = useState('');\n\n const tabs = [\n { id: 'providers', label: 'LLM Providers', icon: <Key size={16} /> },\n { id: 'notifications', label: 'Notifications', icon: <Bell size={16} /> },\n { id: 'security', label: 'Security', icon: <Shield size={16} /> },\n { id: 'storage', label: 'Storage', icon: <Database size={16} /> },\n { id: 'appearance', label: 'Appearance', icon: <Palette size={16} /> },\n ];\n\n return (\n <PageLayout title=\"Settings\" description=\"Configure your Botlit workspace settings\">\n <div className=\"space-y-6\">\n <PagePurpose icon={<Key size={18} />}>\n Workspace-wide settings that affect every bot and agent you build. The most important is\n LLM Providers — connect at least one model provider (OpenAI, Anthropic, Google and others)\n so your agents have a brain to think with. From here you also manage models,\n notifications, security keys, storage retention and appearance.\n </PagePurpose>\n <div className=\"grid grid-cols-12 gap-6\">\n {/* Sidebar */}\n <div className=\"col-span-3\">\n <Card>\n <CardContent className=\"p-2\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'w-full flex items-center gap-3 px-4 py-3 rounded-lg text-left transition-colors',\n activeTab === tab.id\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'hover:bg-accent'\n )}\n >\n {tab.icon}\n <span className=\"font-medium\">{tab.label}</span>\n </button>\n ))}\n </CardContent>\n </Card>\n </div>\n\n {/* Content */}\n <div className=\"col-span-9 space-y-6\">\n {activeTab === 'providers' && (\n <>\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>LLM Providers</CardTitle>\n <CardDescription>Configure API keys for AI model providers</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {providers?.map(\n (provider: {\n id: string;\n name: string;\n type: string;\n isActive: boolean;\n connectionId?: string | null;\n credentialsHash?: string | null;\n }) => (\n <div\n key={provider.id}\n className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n {provider.connectionId ? (\n <Link2 className=\"h-5 w-5 text-primary\" />\n ) : (\n <Key className=\"h-5 w-5 text-primary\" />\n )}\n </div>\n <div>\n <p className=\"font-medium\">{provider.name}</p>\n <p className=\"text-sm text-text-secondary\">Type: {provider.type}</p>\n {provider.connectionId && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Connected via Integrations\n </p>\n )}\n {!provider.connectionId && provider.credentialsHash && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n API key stored locally\n </p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n {provider.connectionId && <Badge variant=\"default\">Integration</Badge>}\n <Badge variant={provider.isActive ? 'success' : 'secondary'}>\n {provider.isActive ? 'Active' : 'Inactive'}\n </Badge>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setEditingProviderId(provider.id);\n setSelectedProviderType(provider.type.toLowerCase());\n setApiKey('');\n setConnectionId(provider.connectionId || '');\n setCredentialMethod(\n provider.connectionId ? 'integration' : 'apikey'\n );\n // Scroll to the Add Provider form\n document\n .getElementById('provider-form')\n ?.scrollIntoView({ behavior: 'smooth' });\n }}\n >\n Configure\n </Button>\n </div>\n </div>\n )\n )}\n </CardContent>\n </Card>\n\n {/* LLM Models List */}\n <Card>\n <CardHeader>\n <CardTitle>LLM Models</CardTitle>\n <CardDescription>Registered models across your providers</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {llmModels && llmModels.length > 0 ? (\n llmModels.map(\n (model: {\n id: string;\n name: string;\n modelId: string;\n providerId: string;\n isActive: boolean;\n contextWindow?: number;\n maxOutputTokens?: number;\n inputPricePerMToken?: number;\n outputPricePerMToken?: number;\n }) => {\n const providerName = providers?.find(\n (p: { id: string; name: string }) => p.id === model.providerId\n )?.name;\n return (\n <div\n key={model.id}\n className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"p-2 bg-purple-500/10 rounded-lg\">\n <Brain className=\"h-5 w-5 text-purple-500\" />\n </div>\n <div>\n <p className=\"font-medium\">{model.name}</p>\n <p className=\"text-sm text-text-secondary\">\n {model.modelId}\n {providerName && ` · ${providerName}`}\n </p>\n <div className=\"flex gap-3 mt-1 text-xs text-text-secondary\">\n {model.contextWindow != null && (\n <span>\n Context: {(model.contextWindow / 1000).toFixed(0)}K\n </span>\n )}\n {model.maxOutputTokens != null && (\n <span>\n Max out: {(model.maxOutputTokens / 1000).toFixed(0)}K\n </span>\n )}\n {model.inputPricePerMToken != null && (\n <span>${model.inputPricePerMToken}/M in</span>\n )}\n {model.outputPricePerMToken != null && (\n <span>${model.outputPricePerMToken}/M out</span>\n )}\n </div>\n </div>\n </div>\n <Badge variant={model.isActive ? 'success' : 'secondary'}>\n {model.isActive ? 'Active' : 'Inactive'}\n </Badge>\n </div>\n );\n }\n )\n ) : (\n <p className=\"text-sm text-text-secondary text-center py-4\">\n No models registered yet. Add a model below.\n </p>\n )}\n </CardContent>\n </Card>\n\n <Card id=\"provider-form\">\n <CardHeader>\n <CardTitle>{editingProviderId ? 'Update Provider' : 'Add Provider'}</CardTitle>\n <CardDescription>\n {editingProviderId\n ? 'Update credentials for this provider'\n : 'Configure a new LLM provider'}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Provider\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={selectedProviderType}\n onChange={(e) => setSelectedProviderType(e.target.value)}\n >\n <option value=\"openai\">OpenAI</option>\n <option value=\"anthropic\">Anthropic</option>\n <option value=\"google\">Google AI</option>\n <option value=\"azure_openai\">Azure OpenAI</option>\n <option value=\"aws_bedrock\">AWS Bedrock</option>\n <option value=\"custom\">Custom</option>\n </select>\n </FormField>\n\n {/* Credential method selector */}\n <FormField label=\"Credential Method\">\n <div className=\"flex gap-3\">\n <label\n className={cn(\n 'flex items-center gap-2 px-4 py-3 border rounded-lg cursor-pointer transition-colors flex-1',\n credentialMethod === 'integration'\n ? 'border-primary bg-action-primary-bg/5'\n : 'border-border-subtle hover:border-primary/50'\n )}\n >\n <input\n type=\"radio\"\n name=\"credentialMethod\"\n value=\"integration\"\n checked={credentialMethod === 'integration'}\n onChange={() => setCredentialMethod('integration')}\n className=\"h-4 w-4\"\n />\n <div>\n <p className=\"font-medium text-sm\">Connect via Integrations</p>\n <p className=\"text-xs text-text-secondary\">\n Managed credentials (recommended)\n </p>\n </div>\n </label>\n <label\n className={cn(\n 'flex items-center gap-2 px-4 py-3 border rounded-lg cursor-pointer transition-colors flex-1',\n credentialMethod === 'apikey'\n ? 'border-primary bg-action-primary-bg/5'\n : 'border-border-subtle hover:border-primary/50'\n )}\n >\n <input\n type=\"radio\"\n name=\"credentialMethod\"\n value=\"apikey\"\n checked={credentialMethod === 'apikey'}\n onChange={() => setCredentialMethod('apikey')}\n className=\"h-4 w-4\"\n />\n <div>\n <p className=\"font-medium text-sm\">Enter API Key</p>\n <p className=\"text-xs text-text-secondary\">\n Paste key directly (legacy)\n </p>\n </div>\n </label>\n </div>\n </FormField>\n\n {/* Integration connection method */}\n {credentialMethod === 'integration' && (\n <div className=\"space-y-3\">\n <div className=\"p-4 bg-bg-sunken/50 border border-border-subtle rounded-lg\">\n <div className=\"flex items-start gap-3\">\n <Link2 className=\"h-5 w-5 text-primary mt-0.5 flex-shrink-0\" />\n <div className=\"space-y-2 flex-1\">\n <p className=\"text-sm font-medium\">Integration Connection</p>\n <p className=\"text-xs text-text-secondary\">\n Create a connection in the Integrations module, then paste the\n Connection ID here. This stores your API key securely in the\n Integrations vault.\n </p>\n <div className=\"flex gap-2 mt-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n window.open('/integrations/connections', '_blank');\n }}\n >\n <ExternalLink size={14} className=\"mr-1.5\" />\n Open Integrations\n </Button>\n </div>\n </div>\n </div>\n </div>\n <FormField label=\"Connection ID\">\n <Input\n placeholder=\"Paste connection ID from Integrations...\"\n value={connectionId}\n onChange={(e) => setConnectionId(e.target.value)}\n />\n </FormField>\n </div>\n )}\n\n {/* Legacy API key method */}\n {credentialMethod === 'apikey' && (\n <FormField label=\"API Key\">\n <Input\n type=\"password\"\n placeholder=\"sk-...\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n />\n </FormField>\n )}\n\n <div className=\"flex gap-2\">\n <Button\n leftIcon={<Save size={16} />}\n isLoading={isConfiguring}\n disabled={credentialMethod === 'apikey' ? !apiKey : !connectionId}\n onClick={async () => {\n try {\n const providerName =\n selectedProviderType.charAt(0).toUpperCase() +\n selectedProviderType.slice(1);\n\n // `useConfigureLLMProvider` projects each payload\n // onto the fields its input type declares and adds\n // the workspace id, so only real fields go here.\n const credentials =\n credentialMethod === 'integration'\n ? undefined\n : apiKey\n ? { apiKey }\n : undefined;\n const linkedConnectionId =\n credentialMethod === 'integration' ? connectionId : undefined;\n\n if (editingProviderId) {\n await configureProvider(\n {\n name: providerName,\n type: toProviderType(selectedProviderType),\n connectionId: linkedConnectionId,\n credentials,\n },\n editingProviderId\n );\n } else {\n await configureProvider({\n name: providerName,\n type: toProviderType(selectedProviderType),\n connectionId: linkedConnectionId,\n credentials,\n });\n }\n\n setApiKey('');\n setConnectionId('');\n setEditingProviderId(null);\n await refetchProviders();\n const providerLabel =\n selectedProviderType.charAt(0).toUpperCase() +\n selectedProviderType.slice(1);\n toast.success(\n editingProviderId\n ? `${providerLabel} provider updated successfully`\n : `${providerLabel} provider added successfully`\n );\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : 'Failed to save provider';\n toast.error(message);\n }\n }}\n >\n {editingProviderId ? 'Update Provider' : 'Save Provider'}\n </Button>\n {editingProviderId && (\n <Button\n variant=\"outline\"\n onClick={() => {\n setEditingProviderId(null);\n setApiKey('');\n setConnectionId('');\n setCredentialMethod('apikey');\n setSelectedProviderType('openai');\n }}\n >\n Cancel\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Add Model</CardTitle>\n <CardDescription>\n Register a new LLM model for an existing provider\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Provider\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={newModelProviderId}\n onChange={(e) => setNewModelProviderId(e.target.value)}\n >\n <option value=\"\">Select a provider...</option>\n {providers?.map((p: { id: string; name: string }) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Model Name\">\n <Input\n placeholder=\"e.g., GPT-4o\"\n value={newModelName}\n onChange={(e) => setNewModelName(e.target.value)}\n />\n </FormField>\n <FormField label=\"Model ID\">\n <Input\n placeholder=\"e.g., gpt-4o\"\n value={newModelId}\n onChange={(e) => setNewModelId(e.target.value)}\n />\n </FormField>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Context Window\">\n <Input\n type=\"number\"\n value={newModelContextWindow}\n onChange={(e) => setNewModelContextWindow(e.target.value)}\n />\n </FormField>\n <FormField label=\"Max Output Tokens\">\n <Input\n type=\"number\"\n value={newModelMaxOutput}\n onChange={(e) => setNewModelMaxOutput(e.target.value)}\n />\n </FormField>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Input Price / 1M tokens\">\n <Input\n type=\"number\"\n step=\"0.01\"\n value={newModelInputPrice}\n onChange={(e) => setNewModelInputPrice(e.target.value)}\n />\n </FormField>\n <FormField label=\"Output Price / 1M tokens\">\n <Input\n type=\"number\"\n step=\"0.01\"\n value={newModelOutputPrice}\n onChange={(e) => setNewModelOutputPrice(e.target.value)}\n />\n </FormField>\n </div>\n <Button\n leftIcon={<Save size={16} />}\n disabled={true}\n onClick={async () => {\n // TODO: Fix this - useCreateLLMModel not available yet\n toast.error('Model creation not yet implemented');\n // try {\n // await createModel({\n // providerId: newModelProviderId,\n // name: newModelName,\n // modelId: newModelId,\n // contextWindow: parseInt(newModelContextWindow) || 128000,\n // maxOutputTokens: parseInt(newModelMaxOutput) || 4096,\n // inputPricePerMToken: parseFloat(newModelInputPrice) || 2.5,\n // outputPricePerMToken: parseFloat(newModelOutputPrice) || 10,\n // });\n // await Promise.all([refetchProviders(), refetchModels()]);\n // toast.success(`Model \"${newModelName}\" added successfully`);\n // setNewModelName('');\n // setNewModelId('');\n // setNewModelProviderId('');\n // } catch (err: unknown) {\n // const message = err instanceof Error ? err.message : 'Failed to add model';\n // toast.error(message);\n // }\n }}\n >\n Add Model\n </Button>\n </CardContent>\n </Card>\n </>\n )}\n\n {activeTab === 'notifications' && (\n <Card>\n <CardHeader>\n <CardTitle>Notification Settings</CardTitle>\n <CardDescription>Configure how you receive notifications</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {[\n {\n label: 'Agent errors',\n description: 'Get notified when an agent encounters an error',\n },\n {\n label: 'High usage alerts',\n description: 'Alerts when token usage exceeds thresholds',\n },\n { label: 'Weekly reports', description: 'Receive weekly usage summaries' },\n {\n label: 'New conversation',\n description: 'Notify when a new conversation starts',\n },\n ].map((item) => (\n <label\n key={item.label}\n className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg cursor-pointer\"\n >\n <div>\n <p className=\"font-medium\">{item.label}</p>\n <p className=\"text-sm text-text-secondary\">{item.description}</p>\n </div>\n <input type=\"checkbox\" className=\"h-5 w-5 rounded\" defaultChecked />\n </label>\n ))}\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'security' && (\n <Card>\n <CardHeader>\n <CardTitle>Security Settings</CardTitle>\n <CardDescription>Manage security and access controls</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"API Key\">\n <div className=\"flex gap-2\">\n <Input type=\"password\" value=\"••••••••••••••••\" readOnly />\n <Button variant=\"outline\">Regenerate</Button>\n </div>\n </FormField>\n <FormField label=\"Webhook Secret\">\n <div className=\"flex gap-2\">\n <Input type=\"password\" value=\"••••••••••••••••\" readOnly />\n <Button variant=\"outline\">Regenerate</Button>\n </div>\n </FormField>\n <FormField label=\"Allowed Origins (CORS)\">\n <Input placeholder=\"https://example.com\" />\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'storage' && (\n <Card>\n <CardHeader>\n <CardTitle>Storage Settings</CardTitle>\n <CardDescription>Configure data storage and retention</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"p-4 bg-bg-sunken rounded-lg text-center\">\n <p className=\"text-2xl font-bold\">45.2 GB</p>\n <p className=\"text-sm text-text-secondary\">Total Storage</p>\n </div>\n <div className=\"p-4 bg-bg-sunken rounded-lg text-center\">\n <p className=\"text-2xl font-bold\">12.8 GB</p>\n <p className=\"text-sm text-text-secondary\">Conversations</p>\n </div>\n <div className=\"p-4 bg-bg-sunken rounded-lg text-center\">\n <p className=\"text-2xl font-bold\">32.4 GB</p>\n <p className=\"text-sm text-text-secondary\">Knowledge Bases</p>\n </div>\n </div>\n <FormField label=\"Conversation Retention\">\n <select className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"30\">30 days</option>\n <option value=\"90\">90 days</option>\n <option value=\"180\">180 days</option>\n <option value=\"365\">1 year</option>\n <option value=\"forever\">Forever</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'appearance' && (\n <Card>\n <CardHeader>\n <CardTitle>Appearance Settings</CardTitle>\n <CardDescription>Customize the look and feel</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Theme\">\n <div className=\"flex gap-4\">\n {(['light', 'dark', 'system'] as ThemeMode[]).map((theme) => (\n <label key={theme} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"theme\"\n value={theme}\n checked={mode === theme}\n onChange={() => setMode(theme)}\n className=\"h-4 w-4\"\n />\n <span className=\"capitalize\">{theme}</span>\n </label>\n ))}\n </div>\n </FormField>\n <FormField label=\"Accent Color\">\n <div className=\"flex gap-2\">\n {['#3b82f6', '#8b5cf6', '#22c55e', '#f59e0b', '#ef4444', '#ec4899'].map(\n (color) => (\n <button\n key={color}\n className=\"h-8 w-8 rounded-full border-2 border-transparent hover:border-foreground\"\n style={{ backgroundColor: color }}\n />\n )\n )}\n </div>\n </FormField>\n <FormField label=\"Font Size\">\n <select className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"sm\">Small</option>\n <option value=\"md\">Medium</option>\n <option value=\"lg\">Large</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../src/botlit/pages/SettingsPage.tsx"],"sourcesContent":["/**\n * Settings Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { Key, Save, Brain, Link2, ExternalLink } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, FormField } from '../components/Input';\nimport { Badge } from '../components/Badge';\nimport { useLLMProviders, useConfigureLLMProvider, useLLMModels } from '../hooks/useLLMProviders';\nimport { cn } from '../utils/cn';\nimport { toUnion } from '../utils/unions';\n\n/** Provider kinds the form offers, in the casing the service stores. */\nconst PROVIDER_TYPES = [\n 'OPENAI',\n 'ANTHROPIC',\n 'GOOGLE',\n 'AZURE_OPENAI',\n 'AWS_BEDROCK',\n 'CUSTOM',\n] as const;\n\n/** The `<option>` values are lowercase; the column is the uppercase enum. */\nfunction toProviderType(value: string): (typeof PROVIDER_TYPES)[number] {\n return toUnion(value.toUpperCase(), PROVIDER_TYPES, 'CUSTOM');\n}\n\nexport const SettingsPage: FC = () => {\n const { data: providers, refetch: refetchProviders } = useLLMProviders();\n const { configureProvider, isConfiguring } = useConfigureLLMProvider();\n const { data: llmModels } = useLLMModels();\n const [apiKey, setApiKey] = useState('');\n const [selectedProviderType, setSelectedProviderType] = useState('openai');\n const [editingProviderId, setEditingProviderId] = useState<string | null>(null);\n // Credential method: 'integration' (preferred) or 'apikey' (legacy)\n const [credentialMethod, setCredentialMethod] = useState<'integration' | 'apikey'>('apikey');\n const [connectionId, setConnectionId] = useState('');\n\n return (\n <PageLayout title=\"Settings\" description=\"Configure your Botlit workspace settings\">\n <div className=\"space-y-6\">\n <PagePurpose icon={<Key size={18} />}>\n Workspace-wide settings for LLM Providers — connect at least one model provider (OpenAI,\n Anthropic, Google and others) so your agents have a brain to think with.\n </PagePurpose>\n\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>LLM Providers</CardTitle>\n <CardDescription>Configure API keys for AI model providers</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {providers?.map(\n (provider: {\n id: string;\n name: string;\n type: string;\n isActive: boolean;\n connectionId?: string | null;\n credentialsHash?: string | null;\n }) => (\n <div\n key={provider.id}\n className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n {provider.connectionId ? (\n <Link2 className=\"h-5 w-5 text-primary\" />\n ) : (\n <Key className=\"h-5 w-5 text-primary\" />\n )}\n </div>\n <div>\n <p className=\"font-medium\">{provider.name}</p>\n <p className=\"text-sm text-text-secondary\">Type: {provider.type}</p>\n {provider.connectionId && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Connected via Integrations\n </p>\n )}\n {!provider.connectionId && provider.credentialsHash && (\n <p className=\"text-xs text-text-secondary mt-0.5\">API key stored locally</p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n {provider.connectionId && <Badge variant=\"default\">Integration</Badge>}\n <Badge variant={provider.isActive ? 'success' : 'secondary'}>\n {provider.isActive ? 'Active' : 'Inactive'}\n </Badge>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setEditingProviderId(provider.id);\n setSelectedProviderType(provider.type.toLowerCase());\n setApiKey('');\n setConnectionId(provider.connectionId || '');\n setCredentialMethod(provider.connectionId ? 'integration' : 'apikey');\n // Scroll to the Add Provider form\n document\n .getElementById('provider-form')\n ?.scrollIntoView({ behavior: 'smooth' });\n }}\n >\n Configure\n </Button>\n </div>\n </div>\n )\n )}\n </CardContent>\n </Card>\n\n {/* LLM Models List */}\n <Card>\n <CardHeader>\n <CardTitle>LLM Models</CardTitle>\n <CardDescription>Registered models across your providers</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {llmModels && llmModels.length > 0 ? (\n llmModels.map(\n (model: {\n id: string;\n name: string;\n modelId: string;\n providerId: string;\n isActive: boolean;\n contextWindow?: number;\n maxOutputTokens?: number;\n inputPricePerMToken?: number;\n outputPricePerMToken?: number;\n }) => {\n const providerName = providers?.find(\n (p: { id: string; name: string }) => p.id === model.providerId\n )?.name;\n return (\n <div\n key={model.id}\n className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"p-2 bg-purple-500/10 rounded-lg\">\n <Brain className=\"h-5 w-5 text-purple-500\" />\n </div>\n <div>\n <p className=\"font-medium\">{model.name}</p>\n <p className=\"text-sm text-text-secondary\">\n {model.modelId}\n {providerName && ` · ${providerName}`}\n </p>\n <div className=\"flex gap-3 mt-1 text-xs text-text-secondary\">\n {model.contextWindow != null && (\n <span>Context: {(model.contextWindow / 1000).toFixed(0)}K</span>\n )}\n {model.maxOutputTokens != null && (\n <span>Max out: {(model.maxOutputTokens / 1000).toFixed(0)}K</span>\n )}\n {model.inputPricePerMToken != null && (\n <span>${model.inputPricePerMToken}/M in</span>\n )}\n {model.outputPricePerMToken != null && (\n <span>${model.outputPricePerMToken}/M out</span>\n )}\n </div>\n </div>\n </div>\n <Badge variant={model.isActive ? 'success' : 'secondary'}>\n {model.isActive ? 'Active' : 'Inactive'}\n </Badge>\n </div>\n );\n }\n )\n ) : (\n <p className=\"text-sm text-text-secondary text-center py-4\">\n No models registered yet.\n </p>\n )}\n </CardContent>\n </Card>\n\n <Card id=\"provider-form\">\n <CardHeader>\n <CardTitle>{editingProviderId ? 'Update Provider' : 'Add Provider'}</CardTitle>\n <CardDescription>\n {editingProviderId\n ? 'Update credentials for this provider'\n : 'Configure a new LLM provider'}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Provider\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={selectedProviderType}\n onChange={(e) => setSelectedProviderType(e.target.value)}\n >\n <option value=\"openai\">OpenAI</option>\n <option value=\"anthropic\">Anthropic</option>\n <option value=\"google\">Google AI</option>\n <option value=\"azure_openai\">Azure OpenAI</option>\n <option value=\"aws_bedrock\">AWS Bedrock</option>\n <option value=\"custom\">Custom</option>\n </select>\n </FormField>\n\n {/* Credential method selector */}\n <FormField label=\"Credential Method\">\n <div className=\"flex gap-3\">\n <label\n className={cn(\n 'flex items-center gap-2 px-4 py-3 border rounded-lg cursor-pointer transition-colors flex-1',\n credentialMethod === 'integration'\n ? 'border-primary bg-action-primary-bg/5'\n : 'border-border-subtle hover:border-primary/50'\n )}\n >\n <input\n type=\"radio\"\n name=\"credentialMethod\"\n value=\"integration\"\n checked={credentialMethod === 'integration'}\n onChange={() => setCredentialMethod('integration')}\n className=\"h-4 w-4\"\n />\n <div>\n <p className=\"font-medium text-sm\">Connect via Integrations</p>\n <p className=\"text-xs text-text-secondary\">Managed credentials (recommended)</p>\n </div>\n </label>\n <label\n className={cn(\n 'flex items-center gap-2 px-4 py-3 border rounded-lg cursor-pointer transition-colors flex-1',\n credentialMethod === 'apikey'\n ? 'border-primary bg-action-primary-bg/5'\n : 'border-border-subtle hover:border-primary/50'\n )}\n >\n <input\n type=\"radio\"\n name=\"credentialMethod\"\n value=\"apikey\"\n checked={credentialMethod === 'apikey'}\n onChange={() => setCredentialMethod('apikey')}\n className=\"h-4 w-4\"\n />\n <div>\n <p className=\"font-medium text-sm\">Enter API Key</p>\n <p className=\"text-xs text-text-secondary\">Paste key directly (legacy)</p>\n </div>\n </label>\n </div>\n </FormField>\n\n {/* Integration connection method */}\n {credentialMethod === 'integration' && (\n <div className=\"space-y-3\">\n <div className=\"p-4 bg-bg-sunken/50 border border-border-subtle rounded-lg\">\n <div className=\"flex items-start gap-3\">\n <Link2 className=\"h-5 w-5 text-primary mt-0.5 flex-shrink-0\" />\n <div className=\"space-y-2 flex-1\">\n <p className=\"text-sm font-medium\">Integration Connection</p>\n <p className=\"text-xs text-text-secondary\">\n Create a connection in the Integrations module, then paste the Connection ID\n here. This stores your API key securely in the Integrations vault.\n </p>\n <div className=\"flex gap-2 mt-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n window.open('/integrations/connections', '_blank');\n }}\n >\n <ExternalLink size={14} className=\"mr-1.5\" />\n Open Integrations\n </Button>\n </div>\n </div>\n </div>\n </div>\n <FormField label=\"Connection ID\">\n <Input\n placeholder=\"Paste connection ID from Integrations...\"\n value={connectionId}\n onChange={(e) => setConnectionId(e.target.value)}\n />\n </FormField>\n </div>\n )}\n\n {/* Legacy API key method */}\n {credentialMethod === 'apikey' && (\n <FormField label=\"API Key\">\n <Input\n type=\"password\"\n placeholder=\"sk-...\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n />\n </FormField>\n )}\n\n <div className=\"flex gap-2\">\n <Button\n leftIcon={<Save size={16} />}\n isLoading={isConfiguring}\n disabled={credentialMethod === 'apikey' ? !apiKey : !connectionId}\n onClick={async () => {\n try {\n const providerName =\n selectedProviderType.charAt(0).toUpperCase() + selectedProviderType.slice(1);\n\n // `useConfigureLLMProvider` projects each payload\n // onto the fields its input type declares and adds\n // the workspace id, so only real fields go here.\n const credentials =\n credentialMethod === 'integration'\n ? undefined\n : apiKey\n ? { apiKey }\n : undefined;\n const linkedConnectionId =\n credentialMethod === 'integration' ? connectionId : undefined;\n\n if (editingProviderId) {\n await configureProvider(\n {\n name: providerName,\n type: toProviderType(selectedProviderType),\n connectionId: linkedConnectionId,\n credentials,\n },\n editingProviderId\n );\n } else {\n await configureProvider({\n name: providerName,\n type: toProviderType(selectedProviderType),\n connectionId: linkedConnectionId,\n credentials,\n });\n }\n\n setApiKey('');\n setConnectionId('');\n setEditingProviderId(null);\n await refetchProviders();\n const providerLabel =\n selectedProviderType.charAt(0).toUpperCase() + selectedProviderType.slice(1);\n toast.success(\n editingProviderId\n ? `${providerLabel} provider updated successfully`\n : `${providerLabel} provider added successfully`\n );\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to save provider';\n toast.error(message);\n }\n }}\n >\n {editingProviderId ? 'Update Provider' : 'Save Provider'}\n </Button>\n {editingProviderId && (\n <Button\n variant=\"outline\"\n onClick={() => {\n setEditingProviderId(null);\n setApiKey('');\n setConnectionId('');\n setCredentialMethod('apikey');\n setSelectedProviderType('openai');\n }}\n >\n Cancel\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -954,8 +954,10 @@ var N = e`
954
954
  query ListMCPTools($connectionId: ID!) {
955
955
  listMCPTools(connectionId: $connectionId) {
956
956
  description
957
+ id
957
958
  inputSchema
958
959
  name
960
+ riskLevel
959
961
  }
960
962
  }
961
963
  `, I = e`
@@ -1022,11 +1024,25 @@ e`
1022
1024
  mutation RefreshMCPTools($connectionId: ID!) {
1023
1025
  refreshMCPTools(connectionId: $connectionId) {
1024
1026
  description
1027
+ id
1025
1028
  inputSchema
1026
1029
  name
1030
+ riskLevel
1027
1031
  }
1028
1032
  }
1029
- `, e`
1033
+ `;
1034
+ var B = e`
1035
+ mutation UpdateMCPTool($id: ID!, $input: UpdateMCPToolInput!) {
1036
+ updateMCPTool(id: $id, input: $input) {
1037
+ description
1038
+ id
1039
+ inputSchema
1040
+ name
1041
+ riskLevel
1042
+ }
1043
+ }
1044
+ `;
1045
+ e`
1030
1046
  mutation RefreshMCPResources($connectionId: ID!) {
1031
1047
  refreshMCPResources(connectionId: $connectionId) {
1032
1048
  description
@@ -1036,7 +1052,7 @@ e`
1036
1052
  }
1037
1053
  }
1038
1054
  `;
1039
- var B = e`
1055
+ var V = e`
1040
1056
  query GetPolicy($id: ID!) {
1041
1057
  getPolicy(id: $id) {
1042
1058
  bucketId
@@ -1057,7 +1073,7 @@ var B = e`
1057
1073
  workspaceId
1058
1074
  }
1059
1075
  }
1060
- `, V = e`
1076
+ `, H = e`
1061
1077
  query ListPolicies($filters: PolicyFilterInput, $pagination: PaginationInput) {
1062
1078
  listPolicies(filters: $filters, pagination: $pagination) {
1063
1079
  bucketId
@@ -1078,7 +1094,7 @@ var B = e`
1078
1094
  workspaceId
1079
1095
  }
1080
1096
  }
1081
- `, H = e`
1097
+ `, U = e`
1082
1098
  mutation CreatePolicy($input: CreatePolicyInput!) {
1083
1099
  createPolicy(input: $input) {
1084
1100
  bucketId
@@ -1099,7 +1115,7 @@ var B = e`
1099
1115
  workspaceId
1100
1116
  }
1101
1117
  }
1102
- `, U = e`
1118
+ `, W = e`
1103
1119
  mutation UpdatePolicy($id: ID!, $input: UpdatePolicyInput!) {
1104
1120
  updatePolicy(id: $id, input: $input) {
1105
1121
  bucketId
@@ -1120,11 +1136,11 @@ var B = e`
1120
1136
  workspaceId
1121
1137
  }
1122
1138
  }
1123
- `, W = e`
1139
+ `, G = e`
1124
1140
  mutation DeletePolicy($id: ID!) {
1125
1141
  deletePolicy(id: $id)
1126
1142
  }
1127
- `, G = e`
1143
+ `, K = e`
1128
1144
  query GetPromptTemplate($id: ID!) {
1129
1145
  getPromptTemplate(id: $id) {
1130
1146
  bucketId
@@ -1174,7 +1190,7 @@ e`
1174
1190
  }
1175
1191
  }
1176
1192
  `;
1177
- var K = e`
1193
+ var q = e`
1178
1194
  query ListPromptTemplates($filters: PromptTemplateFilterInput, $pagination: PaginationInput) {
1179
1195
  listPromptTemplates(filters: $filters, pagination: $pagination) {
1180
1196
  bucketId
@@ -1198,7 +1214,7 @@ var K = e`
1198
1214
  workspaceId
1199
1215
  }
1200
1216
  }
1201
- `, q = e`
1217
+ `, J = e`
1202
1218
  mutation CreatePromptTemplate($input: CreatePromptTemplateInput!) {
1203
1219
  createPromptTemplate(input: $input) {
1204
1220
  bucketId
@@ -1222,7 +1238,7 @@ var K = e`
1222
1238
  workspaceId
1223
1239
  }
1224
1240
  }
1225
- `, J = e`
1241
+ `, Y = e`
1226
1242
  mutation UpdatePromptTemplate($id: ID!, $input: UpdatePromptTemplateInput!) {
1227
1243
  updatePromptTemplate(id: $id, input: $input) {
1228
1244
  bucketId
@@ -1246,7 +1262,7 @@ var K = e`
1246
1262
  workspaceId
1247
1263
  }
1248
1264
  }
1249
- `, Y = e`
1265
+ `, X = e`
1250
1266
  mutation DeletePromptTemplate($id: ID!) {
1251
1267
  deletePromptTemplate(id: $id)
1252
1268
  }
@@ -1276,11 +1292,11 @@ e`
1276
1292
  }
1277
1293
  }
1278
1294
  `;
1279
- var X = e`
1295
+ var Z = e`
1280
1296
  mutation RenderPromptTemplate($id: ID!, $variables: JSON) {
1281
1297
  renderPromptTemplate(id: $id, variables: $variables)
1282
1298
  }
1283
- `, Z = e`
1299
+ `, Q = e`
1284
1300
  query GetRetrievalProfile($id: ID!) {
1285
1301
  getRetrievalProfile(id: $id) {
1286
1302
  bucketId
@@ -1315,7 +1331,7 @@ var X = e`
1315
1331
  workspaceId
1316
1332
  }
1317
1333
  }
1318
- `, Q = e`
1334
+ `, $ = e`
1319
1335
  query ListRetrievalProfiles($filters: RetrievalProfileFilterInput, $pagination: PaginationInput) {
1320
1336
  listRetrievalProfiles(filters: $filters, pagination: $pagination) {
1321
1337
  bucketId
@@ -1349,7 +1365,7 @@ var X = e`
1349
1365
  workspaceId
1350
1366
  }
1351
1367
  }
1352
- `, $ = e`
1368
+ `, te = e`
1353
1369
  mutation CreateRetrievalProfile($input: CreateRetrievalProfileInput!) {
1354
1370
  createRetrievalProfile(input: $input) {
1355
1371
  bucketId
@@ -1384,7 +1400,7 @@ var X = e`
1384
1400
  workspaceId
1385
1401
  }
1386
1402
  }
1387
- `, te = e`
1403
+ `, ne = e`
1388
1404
  mutation UpdateRetrievalProfile($id: ID!, $input: UpdateRetrievalProfileInput!) {
1389
1405
  updateRetrievalProfile(id: $id, input: $input) {
1390
1406
  bucketId
@@ -1419,11 +1435,11 @@ var X = e`
1419
1435
  workspaceId
1420
1436
  }
1421
1437
  }
1422
- `, ne = e`
1438
+ `, re = e`
1423
1439
  mutation DeleteRetrievalProfile($id: ID!) {
1424
1440
  deleteRetrievalProfile(id: $id)
1425
1441
  }
1426
- `, re = e`
1442
+ `, ie = e`
1427
1443
  query GetSkill($id: ID!) {
1428
1444
  getSkill(id: $id) {
1429
1445
  bucketId
@@ -1448,7 +1464,7 @@ var X = e`
1448
1464
  workspaceId
1449
1465
  }
1450
1466
  }
1451
- `, ie = e`
1467
+ `, ae = e`
1452
1468
  query ListSkills($filters: SkillFilterInput, $pagination: PaginationInput) {
1453
1469
  listSkills(filters: $filters, pagination: $pagination) {
1454
1470
  bucketId
@@ -1473,7 +1489,7 @@ var X = e`
1473
1489
  workspaceId
1474
1490
  }
1475
1491
  }
1476
- `, ae = e`
1492
+ `, oe = e`
1477
1493
  mutation CreateSkill($input: CreateSkillInput!) {
1478
1494
  createSkill(input: $input) {
1479
1495
  bucketId
@@ -1498,7 +1514,7 @@ var X = e`
1498
1514
  workspaceId
1499
1515
  }
1500
1516
  }
1501
- `, oe = e`
1517
+ `, se = e`
1502
1518
  mutation UpdateSkill($id: ID!, $input: UpdateSkillInput!) {
1503
1519
  updateSkill(id: $id, input: $input) {
1504
1520
  bucketId
@@ -1523,7 +1539,7 @@ var X = e`
1523
1539
  workspaceId
1524
1540
  }
1525
1541
  }
1526
- `, se = e`
1542
+ `, ce = e`
1527
1543
  mutation DeleteSkill($id: ID!) {
1528
1544
  deleteSkill(id: $id)
1529
1545
  }
@@ -1535,13 +1551,13 @@ e`
1535
1551
  }
1536
1552
  }
1537
1553
  ${t}`;
1538
- var ce = e`
1554
+ var le = e`
1539
1555
  query GetStorePackageBySlug($slug: String!) {
1540
1556
  getStorePackageBySlug(slug: $slug) {
1541
1557
  ...StorePackageFields
1542
1558
  }
1543
1559
  }
1544
- ${t}`, le = e`
1560
+ ${t}`, ue = e`
1545
1561
  query ListStorePackages($filters: StorePackageFilterInput, $pagination: PaginationInput) {
1546
1562
  listStorePackages(filters: $filters, pagination: $pagination) {
1547
1563
  ...StorePackageFields
@@ -1555,25 +1571,25 @@ e`
1555
1571
  }
1556
1572
  }
1557
1573
  ${n}`;
1558
- var ue = e`
1574
+ var de = e`
1559
1575
  query ListInstalledPackages($filters: InstalledPackageFilterInput!, $pagination: PaginationInput) {
1560
1576
  listInstalledPackages(filters: $filters, pagination: $pagination) {
1561
1577
  ...InstalledPackageFields
1562
1578
  }
1563
1579
  }
1564
- ${n}`, de = e`
1580
+ ${n}`, fe = e`
1565
1581
  mutation InstallPackage($input: InstallPackageInput!) {
1566
1582
  installPackage(input: $input) {
1567
1583
  ...InstalledPackageFields
1568
1584
  }
1569
1585
  }
1570
- ${n}`, fe = e`
1586
+ ${n}`, pe = e`
1571
1587
  mutation UpdateInstalledPackage($id: ID!, $input: UpdateInstalledPackageInput!) {
1572
1588
  updateInstalledPackage(id: $id, input: $input) {
1573
1589
  ...InstalledPackageFields
1574
1590
  }
1575
1591
  }
1576
- ${n}`, pe = e`
1592
+ ${n}`, me = e`
1577
1593
  mutation UninstallPackage($id: ID!) {
1578
1594
  uninstallPackage(id: $id)
1579
1595
  }
@@ -1586,6 +1602,6 @@ e`
1586
1602
  }
1587
1603
  ${n}`;
1588
1604
  //#endregion
1589
- export { a as CreateA2ARegistryEntryDocument, A as CreateBotlitLlmProviderDocument, l as CreateBucketDocument, h as CreateChannelConnectorDocument, v as CreateChannelRouteDocument, S as CreateExecutionDocument, E as CreateKnowledgeBaseDocument, L as CreateMcpConnectionDocument, H as CreatePolicyDocument, q as CreatePromptTemplateDocument, $ as CreateRetrievalProfileDocument, ae as CreateSkillDocument, s as DeleteA2ARegistryEntryDocument, d as DeleteBucketDocument, _ as DeleteChannelConnectorDocument, y as DeleteChannelRouteDocument, z as DeleteMcpConnectionDocument, W as DeletePolicyDocument, Y as DeletePromptTemplateDocument, ne as DeleteRetrievalProfileDocument, se as DeleteSkillDocument, r as GetA2ARegistryEntryDocument, f as GetChannelConnectorDocument, b as GetExecutionDocument, w as GetKnowledgeBaseDocument, N as GetMcpConnectionDocument, B as GetPolicyDocument, G as GetPromptTemplateDocument, Z as GetRetrievalProfileDocument, re as GetSkillDocument, ce as GetStorePackageBySlugDocument, de as InstallPackageDocument, i as ListA2ARegistryEntriesDocument, c as ListBucketsDocument, p as ListChannelConnectorsDocument, m as ListChannelRoutesDocument, x as ListExecutionsDocument, ue as ListInstalledPackagesDocument, C as ListKnowledgeBasesDocument, T as ListKnowledgeDocumentsDocument, M as ListLlmModelsDocument, k as ListLlmProvidersDocument, P as ListMcpConnectionsDocument, I as ListMcpResourcesDocument, F as ListMcpToolsDocument, V as ListPoliciesDocument, K as ListPromptTemplatesDocument, Q as ListRetrievalProfilesDocument, ie as ListSkillsDocument, le as ListStorePackagesDocument, O as RebuildKnowledgeBaseIndexDocument, X as RenderPromptTemplateDocument, ee as TestMcpConnectionDocument, pe as UninstallPackageDocument, o as UpdateA2ARegistryEntryDocument, u as UpdateBucketDocument, g as UpdateChannelConnectorDocument, fe as UpdateInstalledPackageDocument, D as UpdateKnowledgeBaseDocument, j as UpdateLlmProviderDocument, R as UpdateMcpConnectionDocument, U as UpdatePolicyDocument, J as UpdatePromptTemplateDocument, te as UpdateRetrievalProfileDocument, oe as UpdateSkillDocument };
1605
+ export { a as CreateA2ARegistryEntryDocument, A as CreateBotlitLlmProviderDocument, l as CreateBucketDocument, h as CreateChannelConnectorDocument, v as CreateChannelRouteDocument, S as CreateExecutionDocument, E as CreateKnowledgeBaseDocument, L as CreateMcpConnectionDocument, U as CreatePolicyDocument, J as CreatePromptTemplateDocument, te as CreateRetrievalProfileDocument, oe as CreateSkillDocument, s as DeleteA2ARegistryEntryDocument, d as DeleteBucketDocument, _ as DeleteChannelConnectorDocument, y as DeleteChannelRouteDocument, z as DeleteMcpConnectionDocument, G as DeletePolicyDocument, X as DeletePromptTemplateDocument, re as DeleteRetrievalProfileDocument, ce as DeleteSkillDocument, r as GetA2ARegistryEntryDocument, f as GetChannelConnectorDocument, b as GetExecutionDocument, w as GetKnowledgeBaseDocument, N as GetMcpConnectionDocument, V as GetPolicyDocument, K as GetPromptTemplateDocument, Q as GetRetrievalProfileDocument, ie as GetSkillDocument, le as GetStorePackageBySlugDocument, fe as InstallPackageDocument, i as ListA2ARegistryEntriesDocument, c as ListBucketsDocument, p as ListChannelConnectorsDocument, m as ListChannelRoutesDocument, x as ListExecutionsDocument, de as ListInstalledPackagesDocument, C as ListKnowledgeBasesDocument, T as ListKnowledgeDocumentsDocument, M as ListLlmModelsDocument, k as ListLlmProvidersDocument, P as ListMcpConnectionsDocument, I as ListMcpResourcesDocument, F as ListMcpToolsDocument, H as ListPoliciesDocument, q as ListPromptTemplatesDocument, $ as ListRetrievalProfilesDocument, ae as ListSkillsDocument, ue as ListStorePackagesDocument, O as RebuildKnowledgeBaseIndexDocument, Z as RenderPromptTemplateDocument, ee as TestMcpConnectionDocument, me as UninstallPackageDocument, o as UpdateA2ARegistryEntryDocument, u as UpdateBucketDocument, g as UpdateChannelConnectorDocument, pe as UpdateInstalledPackageDocument, D as UpdateKnowledgeBaseDocument, j as UpdateLlmProviderDocument, R as UpdateMcpConnectionDocument, B as UpdateMcpToolDocument, W as UpdatePolicyDocument, Y as UpdatePromptTemplateDocument, ne as UpdateRetrievalProfileDocument, se as UpdateSkillDocument };
1590
1606
 
1591
1607
  //# sourceMappingURL=wspace-operations.js.map