@burdenoff/microfe-botmanor 2026.1109.2 → 2026.1110.2
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/dist/botlit/components/Badge.js +2 -2
- package/dist/botlit/components/Badge.js.map +1 -1
- package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
- package/dist/botlit/components/LoadMore.d.ts +9 -0
- package/dist/botlit/components/LoadMore.js +22 -0
- package/dist/botlit/components/LoadMore.js.map +1 -0
- package/dist/botlit/components/index.d.ts +1 -0
- package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useAgents.d.ts +2 -6
- package/dist/botlit/hooks/useAgents.js +71 -95
- package/dist/botlit/hooks/useAgents.js.map +1 -1
- package/dist/botlit/hooks/useBots.d.ts +2 -6
- package/dist/botlit/hooks/useBots.js +51 -75
- package/dist/botlit/hooks/useBots.js.map +1 -1
- package/dist/botlit/hooks/useExecutions.d.ts +2 -2
- package/dist/botlit/hooks/useExecutions.js +30 -34
- package/dist/botlit/hooks/useExecutions.js.map +1 -1
- package/dist/botlit/hooks/useStore.d.ts +3 -3
- package/dist/botlit/hooks/useStore.js +41 -50
- package/dist/botlit/hooks/useStore.js.map +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +1 -1
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +157 -156
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +24 -24
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +147 -146
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +2 -2
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +141 -134
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +1 -1
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +2 -2
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +1 -1
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +150 -143
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -120,8 +120,8 @@ var k = () => {
|
|
|
120
120
|
children: [/* @__PURE__ */ b("div", {
|
|
121
121
|
className: "flex items-center gap-4",
|
|
122
122
|
children: [/* @__PURE__ */ y("div", {
|
|
123
|
-
className: "p-2 bg-
|
|
124
|
-
children: /* @__PURE__ */ y(x, { className: "h-5 w-5 text-
|
|
123
|
+
className: "p-2 bg-accent rounded-lg",
|
|
124
|
+
children: /* @__PURE__ */ y(x, { className: "h-5 w-5 text-text-primary" })
|
|
125
125
|
}), /* @__PURE__ */ b("div", { children: [
|
|
126
126
|
/* @__PURE__ */ y("p", {
|
|
127
127
|
className: "font-medium",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPage.js","names":["PROVIDER_TYPES","toProviderType","toUnion","value","SettingsPage","t","useTr","providers","refetchProviders","providersLoading","providersError","useLLMProviders","useConfigureLLMProvider","llmModels","refetchModels","modelsLoading","modelsError","useLLMModels","catalogLoading","catalogError","apiKey","setApiKey","useState","providerEnabled","setProviderEnabled","selectedProviderType","setSelectedProviderType","editingProviderId","setEditingProviderId","credentialMethod","setCredentialMethod","connectionId","setConnectionId","region","setRegion","isBedrock","usesIam","regionValid","PageLayout","Button","PagePurpose","Key","Card","CardHeader","CardTitle","CardDescription","CardContent","provider","Link2","Badge","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","providerName","p","model","Brain","ModelRegistrationPanel","FormField","event","Input","cn","ExternalLink","Save","isConfiguring","credentials","linkedConnectionId","previousMetadata","metadata","configureProvider","providerLabel","err","message"],"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 { useTr } from '../../shared/hooks/useTr';\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 { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\nimport { ModelRegistrationPanel } from '../components/ModelRegistrationPanel';\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 t = useTr();\n const {\n data: providers,\n refetch: refetchProviders,\n loading: providersLoading,\n error: providersError,\n } = useLLMProviders();\n const { configureProvider, isConfiguring } = useConfigureLLMProvider();\n const {\n data: llmModels,\n refetch: refetchModels,\n loading: modelsLoading,\n error: modelsError,\n } = useLLMModels();\n const catalogLoading = providersLoading || modelsLoading;\n const catalogError = providersError || modelsError;\n const [apiKey, setApiKey] = useState('');\n const [providerEnabled, setProviderEnabled] = useState(true);\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' | 'iam'>(\n 'apikey'\n );\n const [connectionId, setConnectionId] = useState('');\n const [region, setRegion] = useState('ap-south-1');\n const isBedrock = selectedProviderType === 'aws_bedrock';\n const usesIam = isBedrock && credentialMethod === 'iam';\n const regionValid = /^[a-z]{2}(?:-[a-z]+)+-\\d+$/.test(region.trim());\n\n return (\n <PageLayout\n title={t('botlit.settings.title', 'Settings')}\n description={t('botlit.settings.description', 'Configure your BotManor workspace settings')}\n >\n <div className=\"space-y-6\">\n {catalogLoading && <p role=\"status\">Loading providers and models…</p>}\n {catalogError && (\n <div role=\"alert\">\n <p>Could not load providers and models. Try loading the catalog again.</p>\n <Button\n variant=\"secondary\"\n onClick={() => {\n void refetchProviders();\n void refetchModels();\n }}\n >\n Retry model catalog\n </Button>\n </div>\n )}\n <PagePurpose icon={<Key size={18} />}>\n {t(\n 'botlit.settings.purpose',\n 'Workspace-wide settings for LLM Providers — connect at least one model provider (OpenAI, Anthropic, Google and others) so your agents have a brain to think with.'\n )}\n </PagePurpose>\n\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>{t('botlit.settings.providers.title', 'LLM Providers')}</CardTitle>\n <CardDescription>\n {t(\n 'botlit.settings.providers.description',\n 'Configure API keys for AI model providers'\n )}\n </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 metadata?: Record<string, unknown> | 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\">\n {t('botlit.settings.providers.type', 'Type: {{type}}', {\n type: provider.type,\n })}\n </p>\n {provider.connectionId && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {t(\n 'botlit.settings.providers.connectedViaIntegrations',\n 'Connected via Integrations'\n )}\n </p>\n )}\n {!provider.connectionId && provider.credentialsHash && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {t('botlit.settings.providers.apiKeyStored', 'API key stored locally')}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n {provider.connectionId && (\n <Badge variant=\"default\">\n {t('botlit.settings.providers.integrationBadge', 'Integration')}\n </Badge>\n )}\n <Badge variant={provider.isActive ? 'success' : 'secondary'}>\n {provider.isActive\n ? t('botlit.settings.providers.active', 'Active')\n : t('botlit.settings.providers.inactive', 'Inactive')}\n </Badge>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.LLM_UPDATE}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setEditingProviderId(provider.id);\n setProviderEnabled(provider.isActive);\n setSelectedProviderType(provider.type.toLowerCase());\n setApiKey('');\n setConnectionId(provider.connectionId || '');\n setCredentialMethod(\n provider.type === 'AWS_BEDROCK' &&\n provider.metadata?.awsAuthentication === 'iam'\n ? 'iam'\n : provider.connectionId\n ? 'integration'\n : 'apikey'\n );\n setRegion(\n typeof provider.metadata?.region === 'string'\n ? provider.metadata.region\n : 'ap-south-1'\n );\n // Scroll to the Add Provider form\n document\n .getElementById('provider-form')\n ?.scrollIntoView({ behavior: 'smooth' });\n }}\n >\n {t('botlit.settings.actions.configure', 'Configure')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n )\n )}\n </CardContent>\n </Card>\n\n {/* LLM Models List */}\n <Card>\n <CardHeader>\n <CardTitle>{t('botlit.settings.models.title', 'LLM Models')}</CardTitle>\n <CardDescription>\n {t('botlit.settings.models.description', 'Registered models across your providers')}\n </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 {t('botlit.settings.models.context', 'Context: {{value}}K', {\n value: (model.contextWindow / 1000).toFixed(0),\n })}\n </span>\n )}\n {model.maxOutputTokens != null && (\n <span>\n {t('botlit.settings.models.maxOut', 'Max out: {{value}}K', {\n value: (model.maxOutputTokens / 1000).toFixed(0),\n })}\n </span>\n )}\n {model.inputPricePerMToken != null && (\n <span>\n {t('botlit.settings.models.priceIn', '${{value}}/M in', {\n value: model.inputPricePerMToken,\n })}\n </span>\n )}\n {model.outputPricePerMToken != null && (\n <span>\n {t('botlit.settings.models.priceOut', '${{value}}/M out', {\n value: model.outputPricePerMToken,\n })}\n </span>\n )}\n </div>\n </div>\n </div>\n <Badge variant={model.isActive ? 'success' : 'secondary'}>\n {model.isActive\n ? t('botlit.settings.providers.active', 'Active')\n : t('botlit.settings.providers.inactive', 'Inactive')}\n </Badge>\n </div>\n );\n }\n )\n ) : !catalogLoading && !catalogError ? (\n <p className=\"text-sm text-text-secondary text-center py-4\">\n {t('botlit.settings.models.empty', 'No models registered yet.')}\n </p>\n ) : null}\n </CardContent>\n </Card>\n\n {!catalogLoading && !catalogError && (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.LLM_CREATE}>\n <ModelRegistrationPanel\n providers={providers ?? []}\n onCreated={() => void refetchModels()}\n />\n </BotmanorPermissionGate>\n )}\n\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.LLM_CREATE}>\n <Card id=\"provider-form\">\n <CardHeader>\n <CardTitle>\n {editingProviderId\n ? t('botlit.settings.form.updateTitle', 'Update Provider')\n : t('botlit.settings.form.addTitle', 'Add Provider')}\n </CardTitle>\n <CardDescription>\n {editingProviderId\n ? t(\n 'botlit.settings.form.updateDescription',\n 'Update credentials for this provider'\n )\n : t('botlit.settings.form.addDescription', 'Configure a new LLM provider')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label={t('botlit.settings.form.providerLabel', '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 disabled={Boolean(editingProviderId)}\n onChange={(e) => {\n setSelectedProviderType(e.target.value);\n setCredentialMethod(e.target.value === 'aws_bedrock' ? 'iam' : 'apikey');\n setApiKey('');\n setConnectionId('');\n }}\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 {editingProviderId && (\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={providerEnabled}\n onChange={(event) => setProviderEnabled(event.target.checked)}\n />\n Provider enabled\n </label>\n )}\n {isBedrock && (\n <FormField label=\"AWS region\">\n <Input\n aria-label=\"AWS region\"\n value={region}\n onChange={(event) => setRegion(event.target.value)}\n />\n <p className=\"text-sm text-text-secondary\">\n Managed AWS IAM requires model access enabled for this workspace by your\n platform administrator.\n </p>\n </FormField>\n )}\n\n {/* Credential method selector */}\n <FormField label={t('botlit.settings.form.credentialMethod', 'Credential Method')}>\n <div className=\"flex flex-wrap gap-3\">\n {isBedrock && (\n <label\n className={cn(\n 'flex items-center gap-2 px-4 py-3 border rounded-lg cursor-pointer flex-1',\n usesIam\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=\"iam\"\n checked={usesIam}\n onChange={() => {\n setCredentialMethod('iam');\n setApiKey('');\n setConnectionId('');\n }}\n />\n Managed AWS IAM\n </label>\n )}\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\">\n {t('botlit.settings.form.integrationOption', 'Connect via Integrations')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'botlit.settings.form.integrationHint',\n 'Managed credentials (recommended)'\n )}\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\">\n {t('botlit.settings.form.apiKeyOption', 'Enter API Key')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('botlit.settings.form.apiKeyHint', '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\">\n {t('botlit.settings.form.integrationTitle', 'Integration Connection')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'botlit.settings.form.integrationDescription',\n 'Create a connection in the Integrations module, then paste the Connection ID here. This stores your API key securely in the Integrations vault.'\n )}\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 {t('botlit.settings.form.openIntegrations', 'Open Integrations')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n <FormField\n label={t('botlit.settings.form.connectionIdPlaceholder', 'Connection ID')}\n >\n <Input\n placeholder={t(\n 'botlit.settings.form.connectionIdPlaceholder',\n 'Paste connection ID from Integrations...'\n )}\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={t('botlit.settings.form.apiKeyLabel', 'API Key')}>\n <Input\n type=\"password\"\n placeholder={t('botlit.settings.form.apiKeyPlaceholder', '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={\n (isBedrock && !regionValid) ||\n (usesIam\n ? false\n : credentialMethod === 'apikey'\n ? !apiKey.trim()\n : !connectionId.trim())\n }\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 !== 'apikey' ? undefined : apiKey ? { apiKey } : undefined;\n const linkedConnectionId =\n credentialMethod === 'integration' ? connectionId : null;\n const previousMetadata =\n providers?.find((provider) => provider.id === editingProviderId)\n ?.metadata ?? {};\n const metadata = isBedrock\n ? {\n ...previousMetadata,\n region: region.trim(),\n awsAuthentication: usesIam ? 'iam' : 'credentials',\n }\n : previousMetadata;\n\n if (editingProviderId) {\n await configureProvider(\n {\n name: providerName,\n type: toProviderType(selectedProviderType),\n connectionId: linkedConnectionId,\n credentials,\n metadata,\n isActive: providerEnabled,\n },\n editingProviderId\n );\n } else {\n await configureProvider({\n name: providerName,\n type: toProviderType(selectedProviderType),\n connectionId: linkedConnectionId,\n credentials,\n metadata,\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 ? t(\n 'botlit.settings.form.updateSuccess',\n '{{provider}} provider updated successfully',\n { provider: providerLabel }\n )\n : t(\n 'botlit.settings.form.addSuccess',\n '{{provider}} provider added successfully',\n { provider: providerLabel }\n )\n );\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.settings.form.saveError', 'Failed to save provider');\n toast.error(message);\n }\n }}\n >\n {editingProviderId\n ? t('botlit.settings.form.updateProvider', 'Update Provider')\n : t('botlit.settings.form.saveProvider', '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 {t('botlit.settings.form.cancel', 'Cancel')}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n </BotmanorPermissionGate>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsPage.js","names":["PROVIDER_TYPES","toProviderType","toUnion","value","SettingsPage","t","useTr","providers","refetchProviders","providersLoading","providersError","useLLMProviders","useConfigureLLMProvider","llmModels","refetchModels","modelsLoading","modelsError","useLLMModels","catalogLoading","catalogError","apiKey","setApiKey","useState","providerEnabled","setProviderEnabled","selectedProviderType","setSelectedProviderType","editingProviderId","setEditingProviderId","credentialMethod","setCredentialMethod","connectionId","setConnectionId","region","setRegion","isBedrock","usesIam","regionValid","PageLayout","Button","PagePurpose","Key","Card","CardHeader","CardTitle","CardDescription","CardContent","provider","Link2","Badge","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","providerName","p","model","Brain","ModelRegistrationPanel","FormField","event","Input","cn","ExternalLink","Save","isConfiguring","credentials","linkedConnectionId","previousMetadata","metadata","configureProvider","providerLabel","err","message"],"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 { useTr } from '../../shared/hooks/useTr';\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 { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\nimport { ModelRegistrationPanel } from '../components/ModelRegistrationPanel';\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 t = useTr();\n const {\n data: providers,\n refetch: refetchProviders,\n loading: providersLoading,\n error: providersError,\n } = useLLMProviders();\n const { configureProvider, isConfiguring } = useConfigureLLMProvider();\n const {\n data: llmModels,\n refetch: refetchModels,\n loading: modelsLoading,\n error: modelsError,\n } = useLLMModels();\n const catalogLoading = providersLoading || modelsLoading;\n const catalogError = providersError || modelsError;\n const [apiKey, setApiKey] = useState('');\n const [providerEnabled, setProviderEnabled] = useState(true);\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' | 'iam'>(\n 'apikey'\n );\n const [connectionId, setConnectionId] = useState('');\n const [region, setRegion] = useState('ap-south-1');\n const isBedrock = selectedProviderType === 'aws_bedrock';\n const usesIam = isBedrock && credentialMethod === 'iam';\n const regionValid = /^[a-z]{2}(?:-[a-z]+)+-\\d+$/.test(region.trim());\n\n return (\n <PageLayout\n title={t('botlit.settings.title', 'Settings')}\n description={t('botlit.settings.description', 'Configure your BotManor workspace settings')}\n >\n <div className=\"space-y-6\">\n {catalogLoading && <p role=\"status\">Loading providers and models…</p>}\n {catalogError && (\n <div role=\"alert\">\n <p>Could not load providers and models. Try loading the catalog again.</p>\n <Button\n variant=\"secondary\"\n onClick={() => {\n void refetchProviders();\n void refetchModels();\n }}\n >\n Retry model catalog\n </Button>\n </div>\n )}\n <PagePurpose icon={<Key size={18} />}>\n {t(\n 'botlit.settings.purpose',\n 'Workspace-wide settings for LLM Providers — connect at least one model provider (OpenAI, Anthropic, Google and others) so your agents have a brain to think with.'\n )}\n </PagePurpose>\n\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>{t('botlit.settings.providers.title', 'LLM Providers')}</CardTitle>\n <CardDescription>\n {t(\n 'botlit.settings.providers.description',\n 'Configure API keys for AI model providers'\n )}\n </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 metadata?: Record<string, unknown> | 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\">\n {t('botlit.settings.providers.type', 'Type: {{type}}', {\n type: provider.type,\n })}\n </p>\n {provider.connectionId && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {t(\n 'botlit.settings.providers.connectedViaIntegrations',\n 'Connected via Integrations'\n )}\n </p>\n )}\n {!provider.connectionId && provider.credentialsHash && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {t('botlit.settings.providers.apiKeyStored', 'API key stored locally')}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n {provider.connectionId && (\n <Badge variant=\"default\">\n {t('botlit.settings.providers.integrationBadge', 'Integration')}\n </Badge>\n )}\n <Badge variant={provider.isActive ? 'success' : 'secondary'}>\n {provider.isActive\n ? t('botlit.settings.providers.active', 'Active')\n : t('botlit.settings.providers.inactive', 'Inactive')}\n </Badge>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.LLM_UPDATE}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setEditingProviderId(provider.id);\n setProviderEnabled(provider.isActive);\n setSelectedProviderType(provider.type.toLowerCase());\n setApiKey('');\n setConnectionId(provider.connectionId || '');\n setCredentialMethod(\n provider.type === 'AWS_BEDROCK' &&\n provider.metadata?.awsAuthentication === 'iam'\n ? 'iam'\n : provider.connectionId\n ? 'integration'\n : 'apikey'\n );\n setRegion(\n typeof provider.metadata?.region === 'string'\n ? provider.metadata.region\n : 'ap-south-1'\n );\n // Scroll to the Add Provider form\n document\n .getElementById('provider-form')\n ?.scrollIntoView({ behavior: 'smooth' });\n }}\n >\n {t('botlit.settings.actions.configure', 'Configure')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n )\n )}\n </CardContent>\n </Card>\n\n {/* LLM Models List */}\n <Card>\n <CardHeader>\n <CardTitle>{t('botlit.settings.models.title', 'LLM Models')}</CardTitle>\n <CardDescription>\n {t('botlit.settings.models.description', 'Registered models across your providers')}\n </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-accent rounded-lg\">\n <Brain className=\"h-5 w-5 text-text-primary\" />\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 {t('botlit.settings.models.context', 'Context: {{value}}K', {\n value: (model.contextWindow / 1000).toFixed(0),\n })}\n </span>\n )}\n {model.maxOutputTokens != null && (\n <span>\n {t('botlit.settings.models.maxOut', 'Max out: {{value}}K', {\n value: (model.maxOutputTokens / 1000).toFixed(0),\n })}\n </span>\n )}\n {model.inputPricePerMToken != null && (\n <span>\n {t('botlit.settings.models.priceIn', '${{value}}/M in', {\n value: model.inputPricePerMToken,\n })}\n </span>\n )}\n {model.outputPricePerMToken != null && (\n <span>\n {t('botlit.settings.models.priceOut', '${{value}}/M out', {\n value: model.outputPricePerMToken,\n })}\n </span>\n )}\n </div>\n </div>\n </div>\n <Badge variant={model.isActive ? 'success' : 'secondary'}>\n {model.isActive\n ? t('botlit.settings.providers.active', 'Active')\n : t('botlit.settings.providers.inactive', 'Inactive')}\n </Badge>\n </div>\n );\n }\n )\n ) : !catalogLoading && !catalogError ? (\n <p className=\"text-sm text-text-secondary text-center py-4\">\n {t('botlit.settings.models.empty', 'No models registered yet.')}\n </p>\n ) : null}\n </CardContent>\n </Card>\n\n {!catalogLoading && !catalogError && (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.LLM_CREATE}>\n <ModelRegistrationPanel\n providers={providers ?? []}\n onCreated={() => void refetchModels()}\n />\n </BotmanorPermissionGate>\n )}\n\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.LLM_CREATE}>\n <Card id=\"provider-form\">\n <CardHeader>\n <CardTitle>\n {editingProviderId\n ? t('botlit.settings.form.updateTitle', 'Update Provider')\n : t('botlit.settings.form.addTitle', 'Add Provider')}\n </CardTitle>\n <CardDescription>\n {editingProviderId\n ? t(\n 'botlit.settings.form.updateDescription',\n 'Update credentials for this provider'\n )\n : t('botlit.settings.form.addDescription', 'Configure a new LLM provider')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label={t('botlit.settings.form.providerLabel', '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 disabled={Boolean(editingProviderId)}\n onChange={(e) => {\n setSelectedProviderType(e.target.value);\n setCredentialMethod(e.target.value === 'aws_bedrock' ? 'iam' : 'apikey');\n setApiKey('');\n setConnectionId('');\n }}\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 {editingProviderId && (\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={providerEnabled}\n onChange={(event) => setProviderEnabled(event.target.checked)}\n />\n Provider enabled\n </label>\n )}\n {isBedrock && (\n <FormField label=\"AWS region\">\n <Input\n aria-label=\"AWS region\"\n value={region}\n onChange={(event) => setRegion(event.target.value)}\n />\n <p className=\"text-sm text-text-secondary\">\n Managed AWS IAM requires model access enabled for this workspace by your\n platform administrator.\n </p>\n </FormField>\n )}\n\n {/* Credential method selector */}\n <FormField label={t('botlit.settings.form.credentialMethod', 'Credential Method')}>\n <div className=\"flex flex-wrap gap-3\">\n {isBedrock && (\n <label\n className={cn(\n 'flex items-center gap-2 px-4 py-3 border rounded-lg cursor-pointer flex-1',\n usesIam\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=\"iam\"\n checked={usesIam}\n onChange={() => {\n setCredentialMethod('iam');\n setApiKey('');\n setConnectionId('');\n }}\n />\n Managed AWS IAM\n </label>\n )}\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\">\n {t('botlit.settings.form.integrationOption', 'Connect via Integrations')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'botlit.settings.form.integrationHint',\n 'Managed credentials (recommended)'\n )}\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\">\n {t('botlit.settings.form.apiKeyOption', 'Enter API Key')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('botlit.settings.form.apiKeyHint', '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\">\n {t('botlit.settings.form.integrationTitle', 'Integration Connection')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'botlit.settings.form.integrationDescription',\n 'Create a connection in the Integrations module, then paste the Connection ID here. This stores your API key securely in the Integrations vault.'\n )}\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 {t('botlit.settings.form.openIntegrations', 'Open Integrations')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n <FormField\n label={t('botlit.settings.form.connectionIdPlaceholder', 'Connection ID')}\n >\n <Input\n placeholder={t(\n 'botlit.settings.form.connectionIdPlaceholder',\n 'Paste connection ID from Integrations...'\n )}\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={t('botlit.settings.form.apiKeyLabel', 'API Key')}>\n <Input\n type=\"password\"\n placeholder={t('botlit.settings.form.apiKeyPlaceholder', '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={\n (isBedrock && !regionValid) ||\n (usesIam\n ? false\n : credentialMethod === 'apikey'\n ? !apiKey.trim()\n : !connectionId.trim())\n }\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 !== 'apikey' ? undefined : apiKey ? { apiKey } : undefined;\n const linkedConnectionId =\n credentialMethod === 'integration' ? connectionId : null;\n const previousMetadata =\n providers?.find((provider) => provider.id === editingProviderId)\n ?.metadata ?? {};\n const metadata = isBedrock\n ? {\n ...previousMetadata,\n region: region.trim(),\n awsAuthentication: usesIam ? 'iam' : 'credentials',\n }\n : previousMetadata;\n\n if (editingProviderId) {\n await configureProvider(\n {\n name: providerName,\n type: toProviderType(selectedProviderType),\n connectionId: linkedConnectionId,\n credentials,\n metadata,\n isActive: providerEnabled,\n },\n editingProviderId\n );\n } else {\n await configureProvider({\n name: providerName,\n type: toProviderType(selectedProviderType),\n connectionId: linkedConnectionId,\n credentials,\n metadata,\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 ? t(\n 'botlit.settings.form.updateSuccess',\n '{{provider}} provider updated successfully',\n { provider: providerLabel }\n )\n : t(\n 'botlit.settings.form.addSuccess',\n '{{provider}} provider added successfully',\n { provider: providerLabel }\n )\n );\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.settings.form.saveError', 'Failed to save provider');\n toast.error(message);\n }\n }}\n >\n {editingProviderId\n ? t('botlit.settings.form.updateProvider', 'Update Provider')\n : t('botlit.settings.form.saveProvider', '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 {t('botlit.settings.form.cancel', 'Cancel')}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n </BotmanorPermissionGate>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -358,7 +358,7 @@ var z = [
|
|
|
358
358
|
});
|
|
359
359
|
let $ = ({ label: e, enabled: t }) => /* @__PURE__ */ D("div", {
|
|
360
360
|
className: "flex items-center gap-2",
|
|
361
|
-
children: [t ? /* @__PURE__ */ E(ce, { className: "h-4 w-4 text-
|
|
361
|
+
children: [t ? /* @__PURE__ */ E(ce, { className: "h-4 w-4 text-status-success-text" }) : /* @__PURE__ */ E(I, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ E("span", {
|
|
362
362
|
className: t ? "text-text-primary" : "text-text-secondary",
|
|
363
363
|
children: e
|
|
364
364
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillDetailPage.js","names":["Textarea","_Fragment","Textarea$1","VISIBILITIES","SkillDetailPage","useParams","useBotlit","skill","useSkill","isNew","skillId","promptTemplates","usePromptTemplates","policies","usePolicies","retrievalProfiles","useRetrievalProfiles","createSkill","createLoading","useCreateSkill","updateSkill","updateLoading","useUpdateSkill","deleteSkill","deleteLoading","useDeleteSkill","isEditing","setIsEditing","useState","showDeleteConfirm","setShowDeleteConfirm","formData","setFormData","handleCreate","createSkillOrThrow","err","t","p","toast","navigateTo","handleUpdate","updateSkillOrThrow","handleDelete","isNative","nativeNotify","startEditing","toUnion","jsonBoolean","toolPolicies","PageLayout","Button","Save","Card","CardHeader","CardTitle","CardContent","FormField","Input","FileText","CardDescription","template","Wrench","policy","Database","profile","Shield","loading","EmptyState","CapabilityItem","enabled","CheckCircle","XCircle","label","ArrowLeft","Zap","StatusBadge","Fragment","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Edit","nativeImpact","Trash2","PagePurpose","Link","getPath","ExternalLink","Badge","dep","policyId","Settings","formatRelativeTime","tag"],"sources":["../../../src/botlit/pages/SkillDetailPage.tsx"],"sourcesContent":["/**\n * Skill Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { useParams, Link } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Zap,\n FileText,\n Wrench,\n Database,\n Shield,\n Settings,\n Save,\n ExternalLink,\n CheckCircle,\n XCircle,\n Edit,\n Trash2,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { StatusBadge, Badge } from '../components/Badge';\nimport {\n useSkill,\n useCreateSkill,\n useUpdateSkill,\n useDeleteSkill,\n usePromptTemplates,\n usePolicies,\n useRetrievalProfiles,\n} from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { jsonBoolean, toUnion } from '../utils/unions';\nimport type { Visibility } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst VISIBILITIES: Visibility[] = ['PRIVATE', 'WORKSPACE', 'PUBLIC'];\n\ninterface SkillDetailPageProps {\n isNew?: boolean;\n}\n\nexport const SkillDetailPage: FC<SkillDetailPageProps> = ({ isNew }) => {\n const { skillId } = useParams();\n const { navigateTo, getPath } = useBotlit();\n const { data: skill, loading } = useSkill(isNew ? undefined : skillId);\n const { data: promptTemplates } = usePromptTemplates();\n const { data: policies } = usePolicies();\n const { data: retrievalProfiles } = useRetrievalProfiles();\n const { create: createSkill, loading: createLoading } = useCreateSkill();\n const { update: updateSkill, loading: updateLoading } = useUpdateSkill();\n const { remove: deleteSkill, loading: deleteLoading } = useDeleteSkill();\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n visibility: 'PRIVATE' as Visibility,\n promptTemplateId: '',\n toolPolicyId: '',\n retrievalProfileId: '',\n toolPackDeps: '',\n recommendedPolicies: '',\n requiresTools: false,\n requiresKnowledge: false,\n requiresA2A: false,\n });\n\n const handleCreate = async () => {\n if (!formData.name) return;\n try {\n await createSkillOrThrow();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create skill');\n }\n };\n\n const createSkillOrThrow = async () => {\n await createSkill({\n name: formData.name,\n description: formData.description,\n visibility: formData.visibility,\n promptTemplateId: formData.promptTemplateId || undefined,\n toolPolicyId: formData.toolPolicyId || undefined,\n retrievalProfileId: formData.retrievalProfileId || undefined,\n toolPackDeps: formData.toolPackDeps\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n recommendedPolicies: formData.recommendedPolicies\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean),\n capabilityFlags: {\n requiresTools: formData.requiresTools,\n requiresKnowledge: formData.requiresKnowledge,\n requiresA2A: formData.requiresA2A,\n },\n });\n toast.success(`Skill \"${formData.name}\" created`);\n navigateTo('skills');\n };\n\n const handleUpdate = async () => {\n if (!skillId || !formData.name) return;\n try {\n await updateSkillOrThrow();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update skill');\n }\n };\n\n const updateSkillOrThrow = async () => {\n if (!skillId) return;\n await updateSkill({\n skillId,\n input: {\n name: formData.name,\n description: formData.description,\n visibility: formData.visibility,\n promptTemplateId: formData.promptTemplateId || undefined,\n toolPolicyId: formData.toolPolicyId || undefined,\n retrievalProfileId: formData.retrievalProfileId || undefined,\n toolPackDeps: formData.toolPackDeps\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n recommendedPolicies: formData.recommendedPolicies\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean),\n capabilityFlags: {\n requiresTools: formData.requiresTools,\n requiresKnowledge: formData.requiresKnowledge,\n requiresA2A: formData.requiresA2A,\n },\n },\n });\n toast.success('Skill updated');\n setIsEditing(false);\n };\n\n const handleDelete = async () => {\n if (!skillId) return;\n try {\n await deleteSkill(skillId);\n if (isNative()) void nativeNotify('success');\n toast.success('Skill deleted');\n navigateTo('skills');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to delete skill');\n }\n };\n\n const startEditing = () => {\n if (!skill) return;\n setFormData({\n name: skill.name,\n description: skill.description || '',\n visibility: toUnion(skill.visibility, VISIBILITIES, 'PRIVATE'),\n promptTemplateId: skill.promptTemplateId || '',\n toolPolicyId: skill.toolPolicyId || '',\n retrievalProfileId: skill.retrievalProfileId || '',\n toolPackDeps: skill.toolPackDeps.join(', '),\n recommendedPolicies: skill.recommendedPolicies.join(', '),\n requiresTools: jsonBoolean(skill.capabilityFlags, 'requiresTools'),\n requiresKnowledge: jsonBoolean(skill.capabilityFlags, 'requiresKnowledge'),\n requiresA2A: jsonBoolean(skill.capabilityFlags, 'requiresA2A'),\n });\n setIsEditing(true);\n };\n\n const toolPolicies =\n policies?.filter((p: { id: string; name: string; type: string }) => p.type === 'TOOL') || [];\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Create Skill\"\n description=\"Bundle prompts, tools, and policies into a reusable skill\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('skills')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createLoading}\n disabled={!formData.name}\n >\n Create\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Skill Name\" required>\n <Input\n placeholder=\"e.g., Code Review Skill\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What does this skill enable agents to do?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <FormField label=\"Visibility\">\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={formData.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Prompt Template\n </CardTitle>\n <CardDescription>Associate a prompt template with this skill</CardDescription>\n </CardHeader>\n <CardContent>\n <FormField label=\"Prompt Template\">\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={formData.promptTemplateId}\n onChange={(e) => setFormData({ ...formData, promptTemplateId: e.target.value })}\n >\n <option value=\"\">None</option>\n {promptTemplates?.map(\n (template: { id: string; name: string; version?: string | null }) => (\n <option key={template.id} value={template.id}>\n {template.name} (v{template.version})\n </option>\n )\n )}\n </select>\n </FormField>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tools Configuration\n </CardTitle>\n <CardDescription>Configure tool access for this skill</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Tool Policy\">\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={formData.toolPolicyId}\n onChange={(e) => setFormData({ ...formData, toolPolicyId: e.target.value })}\n >\n <option value=\"\">None</option>\n {toolPolicies.map((policy: { id: string; name: string }) => (\n <option key={policy.id} value={policy.id}>\n {policy.name}\n </option>\n ))}\n </select>\n </FormField>\n\n <FormField label=\"Tool Pack Dependencies\" description=\"Comma-separated package slugs\">\n <Input\n placeholder=\"e.g., @botlit/github-tools, @botlit/web-browser\"\n value={formData.toolPackDeps}\n onChange={(e) => setFormData({ ...formData, toolPackDeps: e.target.value })}\n />\n </FormField>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Database size={18} />\n Knowledge Configuration\n </CardTitle>\n <CardDescription>Configure knowledge retrieval for this skill</CardDescription>\n </CardHeader>\n <CardContent>\n <FormField label=\"Retrieval Profile\">\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={formData.retrievalProfileId}\n onChange={(e) => setFormData({ ...formData, retrievalProfileId: e.target.value })}\n >\n <option value=\"\">None</option>\n {retrievalProfiles?.map((profile: { id: string; name: string }) => (\n <option key={profile.id} value={profile.id}>\n {profile.name}\n </option>\n ))}\n </select>\n </FormField>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Policies & Capabilities\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Recommended Policies\" description=\"Comma-separated policy IDs\">\n <Input\n placeholder=\"e.g., content-policy-1, budget-policy-1\"\n value={formData.recommendedPolicies}\n onChange={(e) =>\n setFormData({ ...formData, recommendedPolicies: e.target.value })\n }\n />\n </FormField>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">Capability Requirements</p>\n <div className=\"flex flex-wrap gap-4\">\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresTools}\n onChange={(e) =>\n setFormData({ ...formData, requiresTools: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires Tools</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresKnowledge}\n onChange={(e) =>\n setFormData({ ...formData, requiresKnowledge: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires Knowledge</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresA2A}\n onChange={(e) => setFormData({ ...formData, requiresA2A: e.target.checked })}\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires A2A</span>\n </label>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!skill) {\n return (\n <PageLayout title=\"Skill Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Skill Not Found\"\n description=\"This skill doesn't exist.\"\n action={<Button onClick={() => navigateTo('skills')}>Back to Skills</Button>}\n />\n </PageLayout>\n );\n }\n\n const CapabilityItem: FC<{ label: string; enabled: boolean }> = ({ label, enabled }) => (\n <div className=\"flex items-center gap-2\">\n {enabled ? (\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n ) : (\n <XCircle className=\"h-4 w-4 text-text-secondary\" />\n )}\n <span className={enabled ? 'text-text-primary' : 'text-text-secondary'}>{label}</span>\n </div>\n );\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('skills')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n <Zap className=\"h-6 w-6 text-primary\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{skill.name}</span>\n <StatusBadge status={skill.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{skill.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button variant=\"outline\" onClick={() => setIsEditing(false)}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateLoading}\n disabled={!formData.name}\n >\n Save Changes\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.SKILL_UPDATE}>\n <Button variant=\"outline\" leftIcon={<Edit size={16} />} onClick={startEditing}>\n Edit\n </Button>\n </BotmanorPermissionGate>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteLoading}\n >\n Confirm Delete\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.SKILL_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\n </BotmanorPermissionGate>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Zap size={18} />}>\n This skill bundles a prompt, a set of tools and a knowledge profile into one reusable\n capability. Review what it includes and the policies it recommends, then attach it to any\n agent to grant all of those abilities at once — keeping your agents consistent without\n re-wiring the same pieces every time.\n </PagePurpose>\n\n {/* Edit Form */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Edit Skill</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Skill Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Visibility\">\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={formData.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </div>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={2}\n />\n </FormField>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Prompt Template\">\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={formData.promptTemplateId}\n onChange={(e) => setFormData({ ...formData, promptTemplateId: e.target.value })}\n >\n <option value=\"\">None</option>\n {promptTemplates?.map((template: { id: string; name: string }) => (\n <option key={template.id} value={template.id}>\n {template.name}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Retrieval Profile\">\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={formData.retrievalProfileId}\n onChange={(e) =>\n setFormData({ ...formData, retrievalProfileId: e.target.value })\n }\n >\n <option value=\"\">None</option>\n {retrievalProfiles?.map((profile: { id: string; name: string }) => (\n <option key={profile.id} value={profile.id}>\n {profile.name}\n </option>\n ))}\n </select>\n </FormField>\n </div>\n <FormField label=\"Tool Pack Dependencies\" description=\"Comma-separated\">\n <Input\n value={formData.toolPackDeps}\n onChange={(e) => setFormData({ ...formData, toolPackDeps: e.target.value })}\n placeholder=\"e.g., @botlit/github-tools, @botlit/web-browser\"\n />\n </FormField>\n <div className=\"flex gap-4\">\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresTools}\n onChange={(e) => setFormData({ ...formData, requiresTools: e.target.checked })}\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires Tools</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresKnowledge}\n onChange={(e) =>\n setFormData({ ...formData, requiresKnowledge: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires Knowledge</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresA2A}\n onChange={(e) => setFormData({ ...formData, requiresA2A: e.target.checked })}\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires A2A</span>\n </label>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Overview */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n <Zap className=\"h-5 w-5 text-primary\" />\n </div>\n <p className=\"text-lg font-bold capitalize\">{skill.visibility.toLowerCase()}</p>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{skill.toolPackDeps.length}</p>\n <p className=\"text-sm text-text-secondary\">Tool Packs</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">\n {skill.recommendedPolicies.length}\n </p>\n <p className=\"text-sm text-text-secondary\">Policies</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{skill.revision}</p>\n <p className=\"text-sm text-text-secondary\">Revision</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Capability Requirements */}\n <Card>\n <CardHeader>\n <CardTitle>Capability Requirements</CardTitle>\n <CardDescription>What this skill requires from agents</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex gap-8\">\n <CapabilityItem\n label=\"Tools\"\n enabled={jsonBoolean(skill.capabilityFlags, 'requiresTools')}\n />\n <CapabilityItem\n label=\"Knowledge\"\n enabled={jsonBoolean(skill.capabilityFlags, 'requiresKnowledge')}\n />\n <CapabilityItem\n label=\"A2A\"\n enabled={jsonBoolean(skill.capabilityFlags, 'requiresA2A')}\n />\n </div>\n </CardContent>\n </Card>\n\n {/* Components */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* Prompt Template */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Prompt Template\n </CardTitle>\n </CardHeader>\n <CardContent>\n {skill.promptTemplateId ? (\n <div className=\"p-4 bg-bg-sunken rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium\">{skill.promptTemplateId}</span>\n <Link to={getPath(`prompt-templates/${skill.promptTemplateId}`)}>\n <Button variant=\"ghost\" size=\"sm\">\n <ExternalLink size={14} />\n </Button>\n </Link>\n </div>\n </div>\n ) : (\n <p className=\"text-text-secondary\">No prompt template associated</p>\n )}\n </CardContent>\n </Card>\n\n {/* Retrieval Profile */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Database size={18} />\n Retrieval Profile\n </CardTitle>\n </CardHeader>\n <CardContent>\n {skill.retrievalProfileId ? (\n <div className=\"p-4 bg-bg-sunken rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium\">{skill.retrievalProfileId}</span>\n <Link to={getPath(`retrieval-profiles/${skill.retrievalProfileId}`)}>\n <Button variant=\"ghost\" size=\"sm\">\n <ExternalLink size={14} />\n </Button>\n </Link>\n </div>\n </div>\n ) : (\n <p className=\"text-text-secondary\">No retrieval profile associated</p>\n )}\n </CardContent>\n </Card>\n </div>\n\n {/* Tool Pack Dependencies */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tool Pack Dependencies\n </CardTitle>\n </CardHeader>\n <CardContent>\n {skill.toolPackDeps.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {skill.toolPackDeps.map((dep: string) => (\n <Badge key={dep} variant=\"secondary\" className=\"font-mono\">\n {dep}\n </Badge>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No tool pack dependencies</p>\n )}\n </CardContent>\n </Card>\n\n {/* Recommended Policies */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Recommended Policies\n </CardTitle>\n </CardHeader>\n <CardContent>\n {skill.recommendedPolicies.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {skill.recommendedPolicies.map((policyId: string) => (\n <Badge key={policyId} variant=\"outline\">\n {policyId}\n </Badge>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No recommended policies</p>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(skill.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(skill.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Tags</p>\n <div className=\"flex gap-1\">\n {skill.tags.length > 0 ? (\n skill.tags.map((tag: string) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SkillDetailPage.js","names":["Textarea","_Fragment","Textarea$1","VISIBILITIES","SkillDetailPage","useParams","useBotlit","skill","useSkill","isNew","skillId","promptTemplates","usePromptTemplates","policies","usePolicies","retrievalProfiles","useRetrievalProfiles","createSkill","createLoading","useCreateSkill","updateSkill","updateLoading","useUpdateSkill","deleteSkill","deleteLoading","useDeleteSkill","isEditing","setIsEditing","useState","showDeleteConfirm","setShowDeleteConfirm","formData","setFormData","handleCreate","createSkillOrThrow","err","t","p","toast","navigateTo","handleUpdate","updateSkillOrThrow","handleDelete","isNative","nativeNotify","startEditing","toUnion","jsonBoolean","toolPolicies","PageLayout","Button","Save","Card","CardHeader","CardTitle","CardContent","FormField","Input","FileText","CardDescription","template","Wrench","policy","Database","profile","Shield","loading","EmptyState","CapabilityItem","enabled","CheckCircle","XCircle","label","ArrowLeft","Zap","StatusBadge","Fragment","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Edit","nativeImpact","Trash2","PagePurpose","Link","getPath","ExternalLink","Badge","dep","policyId","Settings","formatRelativeTime","tag"],"sources":["../../../src/botlit/pages/SkillDetailPage.tsx"],"sourcesContent":["/**\n * Skill Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { useParams, Link } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Zap,\n FileText,\n Wrench,\n Database,\n Shield,\n Settings,\n Save,\n ExternalLink,\n CheckCircle,\n XCircle,\n Edit,\n Trash2,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { StatusBadge, Badge } from '../components/Badge';\nimport {\n useSkill,\n useCreateSkill,\n useUpdateSkill,\n useDeleteSkill,\n usePromptTemplates,\n usePolicies,\n useRetrievalProfiles,\n} from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { jsonBoolean, toUnion } from '../utils/unions';\nimport type { Visibility } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst VISIBILITIES: Visibility[] = ['PRIVATE', 'WORKSPACE', 'PUBLIC'];\n\ninterface SkillDetailPageProps {\n isNew?: boolean;\n}\n\nexport const SkillDetailPage: FC<SkillDetailPageProps> = ({ isNew }) => {\n const { skillId } = useParams();\n const { navigateTo, getPath } = useBotlit();\n const { data: skill, loading } = useSkill(isNew ? undefined : skillId);\n const { data: promptTemplates } = usePromptTemplates();\n const { data: policies } = usePolicies();\n const { data: retrievalProfiles } = useRetrievalProfiles();\n const { create: createSkill, loading: createLoading } = useCreateSkill();\n const { update: updateSkill, loading: updateLoading } = useUpdateSkill();\n const { remove: deleteSkill, loading: deleteLoading } = useDeleteSkill();\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n visibility: 'PRIVATE' as Visibility,\n promptTemplateId: '',\n toolPolicyId: '',\n retrievalProfileId: '',\n toolPackDeps: '',\n recommendedPolicies: '',\n requiresTools: false,\n requiresKnowledge: false,\n requiresA2A: false,\n });\n\n const handleCreate = async () => {\n if (!formData.name) return;\n try {\n await createSkillOrThrow();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create skill');\n }\n };\n\n const createSkillOrThrow = async () => {\n await createSkill({\n name: formData.name,\n description: formData.description,\n visibility: formData.visibility,\n promptTemplateId: formData.promptTemplateId || undefined,\n toolPolicyId: formData.toolPolicyId || undefined,\n retrievalProfileId: formData.retrievalProfileId || undefined,\n toolPackDeps: formData.toolPackDeps\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n recommendedPolicies: formData.recommendedPolicies\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean),\n capabilityFlags: {\n requiresTools: formData.requiresTools,\n requiresKnowledge: formData.requiresKnowledge,\n requiresA2A: formData.requiresA2A,\n },\n });\n toast.success(`Skill \"${formData.name}\" created`);\n navigateTo('skills');\n };\n\n const handleUpdate = async () => {\n if (!skillId || !formData.name) return;\n try {\n await updateSkillOrThrow();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update skill');\n }\n };\n\n const updateSkillOrThrow = async () => {\n if (!skillId) return;\n await updateSkill({\n skillId,\n input: {\n name: formData.name,\n description: formData.description,\n visibility: formData.visibility,\n promptTemplateId: formData.promptTemplateId || undefined,\n toolPolicyId: formData.toolPolicyId || undefined,\n retrievalProfileId: formData.retrievalProfileId || undefined,\n toolPackDeps: formData.toolPackDeps\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n recommendedPolicies: formData.recommendedPolicies\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean),\n capabilityFlags: {\n requiresTools: formData.requiresTools,\n requiresKnowledge: formData.requiresKnowledge,\n requiresA2A: formData.requiresA2A,\n },\n },\n });\n toast.success('Skill updated');\n setIsEditing(false);\n };\n\n const handleDelete = async () => {\n if (!skillId) return;\n try {\n await deleteSkill(skillId);\n if (isNative()) void nativeNotify('success');\n toast.success('Skill deleted');\n navigateTo('skills');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to delete skill');\n }\n };\n\n const startEditing = () => {\n if (!skill) return;\n setFormData({\n name: skill.name,\n description: skill.description || '',\n visibility: toUnion(skill.visibility, VISIBILITIES, 'PRIVATE'),\n promptTemplateId: skill.promptTemplateId || '',\n toolPolicyId: skill.toolPolicyId || '',\n retrievalProfileId: skill.retrievalProfileId || '',\n toolPackDeps: skill.toolPackDeps.join(', '),\n recommendedPolicies: skill.recommendedPolicies.join(', '),\n requiresTools: jsonBoolean(skill.capabilityFlags, 'requiresTools'),\n requiresKnowledge: jsonBoolean(skill.capabilityFlags, 'requiresKnowledge'),\n requiresA2A: jsonBoolean(skill.capabilityFlags, 'requiresA2A'),\n });\n setIsEditing(true);\n };\n\n const toolPolicies =\n policies?.filter((p: { id: string; name: string; type: string }) => p.type === 'TOOL') || [];\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Create Skill\"\n description=\"Bundle prompts, tools, and policies into a reusable skill\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('skills')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createLoading}\n disabled={!formData.name}\n >\n Create\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Skill Name\" required>\n <Input\n placeholder=\"e.g., Code Review Skill\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What does this skill enable agents to do?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <FormField label=\"Visibility\">\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={formData.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Prompt Template\n </CardTitle>\n <CardDescription>Associate a prompt template with this skill</CardDescription>\n </CardHeader>\n <CardContent>\n <FormField label=\"Prompt Template\">\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={formData.promptTemplateId}\n onChange={(e) => setFormData({ ...formData, promptTemplateId: e.target.value })}\n >\n <option value=\"\">None</option>\n {promptTemplates?.map(\n (template: { id: string; name: string; version?: string | null }) => (\n <option key={template.id} value={template.id}>\n {template.name} (v{template.version})\n </option>\n )\n )}\n </select>\n </FormField>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tools Configuration\n </CardTitle>\n <CardDescription>Configure tool access for this skill</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Tool Policy\">\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={formData.toolPolicyId}\n onChange={(e) => setFormData({ ...formData, toolPolicyId: e.target.value })}\n >\n <option value=\"\">None</option>\n {toolPolicies.map((policy: { id: string; name: string }) => (\n <option key={policy.id} value={policy.id}>\n {policy.name}\n </option>\n ))}\n </select>\n </FormField>\n\n <FormField label=\"Tool Pack Dependencies\" description=\"Comma-separated package slugs\">\n <Input\n placeholder=\"e.g., @botlit/github-tools, @botlit/web-browser\"\n value={formData.toolPackDeps}\n onChange={(e) => setFormData({ ...formData, toolPackDeps: e.target.value })}\n />\n </FormField>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Database size={18} />\n Knowledge Configuration\n </CardTitle>\n <CardDescription>Configure knowledge retrieval for this skill</CardDescription>\n </CardHeader>\n <CardContent>\n <FormField label=\"Retrieval Profile\">\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={formData.retrievalProfileId}\n onChange={(e) => setFormData({ ...formData, retrievalProfileId: e.target.value })}\n >\n <option value=\"\">None</option>\n {retrievalProfiles?.map((profile: { id: string; name: string }) => (\n <option key={profile.id} value={profile.id}>\n {profile.name}\n </option>\n ))}\n </select>\n </FormField>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Policies & Capabilities\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Recommended Policies\" description=\"Comma-separated policy IDs\">\n <Input\n placeholder=\"e.g., content-policy-1, budget-policy-1\"\n value={formData.recommendedPolicies}\n onChange={(e) =>\n setFormData({ ...formData, recommendedPolicies: e.target.value })\n }\n />\n </FormField>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">Capability Requirements</p>\n <div className=\"flex flex-wrap gap-4\">\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresTools}\n onChange={(e) =>\n setFormData({ ...formData, requiresTools: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires Tools</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresKnowledge}\n onChange={(e) =>\n setFormData({ ...formData, requiresKnowledge: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires Knowledge</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresA2A}\n onChange={(e) => setFormData({ ...formData, requiresA2A: e.target.checked })}\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires A2A</span>\n </label>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!skill) {\n return (\n <PageLayout title=\"Skill Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Skill Not Found\"\n description=\"This skill doesn't exist.\"\n action={<Button onClick={() => navigateTo('skills')}>Back to Skills</Button>}\n />\n </PageLayout>\n );\n }\n\n const CapabilityItem: FC<{ label: string; enabled: boolean }> = ({ label, enabled }) => (\n <div className=\"flex items-center gap-2\">\n {enabled ? (\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <XCircle className=\"h-4 w-4 text-text-secondary\" />\n )}\n <span className={enabled ? 'text-text-primary' : 'text-text-secondary'}>{label}</span>\n </div>\n );\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('skills')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n <Zap className=\"h-6 w-6 text-primary\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{skill.name}</span>\n <StatusBadge status={skill.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{skill.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button variant=\"outline\" onClick={() => setIsEditing(false)}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateLoading}\n disabled={!formData.name}\n >\n Save Changes\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.SKILL_UPDATE}>\n <Button variant=\"outline\" leftIcon={<Edit size={16} />} onClick={startEditing}>\n Edit\n </Button>\n </BotmanorPermissionGate>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteLoading}\n >\n Confirm Delete\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.SKILL_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\n </BotmanorPermissionGate>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Zap size={18} />}>\n This skill bundles a prompt, a set of tools and a knowledge profile into one reusable\n capability. Review what it includes and the policies it recommends, then attach it to any\n agent to grant all of those abilities at once — keeping your agents consistent without\n re-wiring the same pieces every time.\n </PagePurpose>\n\n {/* Edit Form */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Edit Skill</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Skill Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Visibility\">\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={formData.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </div>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={2}\n />\n </FormField>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Prompt Template\">\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={formData.promptTemplateId}\n onChange={(e) => setFormData({ ...formData, promptTemplateId: e.target.value })}\n >\n <option value=\"\">None</option>\n {promptTemplates?.map((template: { id: string; name: string }) => (\n <option key={template.id} value={template.id}>\n {template.name}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Retrieval Profile\">\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={formData.retrievalProfileId}\n onChange={(e) =>\n setFormData({ ...formData, retrievalProfileId: e.target.value })\n }\n >\n <option value=\"\">None</option>\n {retrievalProfiles?.map((profile: { id: string; name: string }) => (\n <option key={profile.id} value={profile.id}>\n {profile.name}\n </option>\n ))}\n </select>\n </FormField>\n </div>\n <FormField label=\"Tool Pack Dependencies\" description=\"Comma-separated\">\n <Input\n value={formData.toolPackDeps}\n onChange={(e) => setFormData({ ...formData, toolPackDeps: e.target.value })}\n placeholder=\"e.g., @botlit/github-tools, @botlit/web-browser\"\n />\n </FormField>\n <div className=\"flex gap-4\">\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresTools}\n onChange={(e) => setFormData({ ...formData, requiresTools: e.target.checked })}\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires Tools</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresKnowledge}\n onChange={(e) =>\n setFormData({ ...formData, requiresKnowledge: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires Knowledge</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={formData.requiresA2A}\n onChange={(e) => setFormData({ ...formData, requiresA2A: e.target.checked })}\n className=\"h-4 w-4\"\n />\n <span className=\"text-sm\">Requires A2A</span>\n </label>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Overview */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n <Zap className=\"h-5 w-5 text-primary\" />\n </div>\n <p className=\"text-lg font-bold capitalize\">{skill.visibility.toLowerCase()}</p>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{skill.toolPackDeps.length}</p>\n <p className=\"text-sm text-text-secondary\">Tool Packs</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">\n {skill.recommendedPolicies.length}\n </p>\n <p className=\"text-sm text-text-secondary\">Policies</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{skill.revision}</p>\n <p className=\"text-sm text-text-secondary\">Revision</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Capability Requirements */}\n <Card>\n <CardHeader>\n <CardTitle>Capability Requirements</CardTitle>\n <CardDescription>What this skill requires from agents</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex gap-8\">\n <CapabilityItem\n label=\"Tools\"\n enabled={jsonBoolean(skill.capabilityFlags, 'requiresTools')}\n />\n <CapabilityItem\n label=\"Knowledge\"\n enabled={jsonBoolean(skill.capabilityFlags, 'requiresKnowledge')}\n />\n <CapabilityItem\n label=\"A2A\"\n enabled={jsonBoolean(skill.capabilityFlags, 'requiresA2A')}\n />\n </div>\n </CardContent>\n </Card>\n\n {/* Components */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* Prompt Template */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Prompt Template\n </CardTitle>\n </CardHeader>\n <CardContent>\n {skill.promptTemplateId ? (\n <div className=\"p-4 bg-bg-sunken rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium\">{skill.promptTemplateId}</span>\n <Link to={getPath(`prompt-templates/${skill.promptTemplateId}`)}>\n <Button variant=\"ghost\" size=\"sm\">\n <ExternalLink size={14} />\n </Button>\n </Link>\n </div>\n </div>\n ) : (\n <p className=\"text-text-secondary\">No prompt template associated</p>\n )}\n </CardContent>\n </Card>\n\n {/* Retrieval Profile */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Database size={18} />\n Retrieval Profile\n </CardTitle>\n </CardHeader>\n <CardContent>\n {skill.retrievalProfileId ? (\n <div className=\"p-4 bg-bg-sunken rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium\">{skill.retrievalProfileId}</span>\n <Link to={getPath(`retrieval-profiles/${skill.retrievalProfileId}`)}>\n <Button variant=\"ghost\" size=\"sm\">\n <ExternalLink size={14} />\n </Button>\n </Link>\n </div>\n </div>\n ) : (\n <p className=\"text-text-secondary\">No retrieval profile associated</p>\n )}\n </CardContent>\n </Card>\n </div>\n\n {/* Tool Pack Dependencies */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tool Pack Dependencies\n </CardTitle>\n </CardHeader>\n <CardContent>\n {skill.toolPackDeps.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {skill.toolPackDeps.map((dep: string) => (\n <Badge key={dep} variant=\"secondary\" className=\"font-mono\">\n {dep}\n </Badge>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No tool pack dependencies</p>\n )}\n </CardContent>\n </Card>\n\n {/* Recommended Policies */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Recommended Policies\n </CardTitle>\n </CardHeader>\n <CardContent>\n {skill.recommendedPolicies.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {skill.recommendedPolicies.map((policyId: string) => (\n <Badge key={policyId} variant=\"outline\">\n {policyId}\n </Badge>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No recommended policies</p>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(skill.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(skill.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Tags</p>\n <div className=\"flex gap-1\">\n {skill.tags.length > 0 ? (\n skill.tags.map((tag: string) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -369,7 +369,7 @@ var z = () => {
|
|
|
369
369
|
}) })] })
|
|
370
370
|
]
|
|
371
371
|
}), G && /* @__PURE__ */ y("div", {
|
|
372
|
-
className: "fixed inset-0 bg-
|
|
372
|
+
className: "fixed inset-0 bg-bg-overlay flex items-center justify-center z-50",
|
|
373
373
|
children: /* @__PURE__ */ b(a, {
|
|
374
374
|
className: "w-full max-w-md",
|
|
375
375
|
children: [/* @__PURE__ */ b(c, { children: [/* @__PURE__ */ y(l, { children: "Install Package" }), /* @__PURE__ */ b(s, { children: [
|