@burdenoff/microfe-botmanor 2026.1027.2 → 2026.1028.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/botlit/BotlitRoutes.js +142 -132
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/components/AgentApprovalPanel.js +144 -126
- package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
- package/dist/botlit/components/ModelRegistrationPanel.js +4 -4
- package/dist/botlit/components/RetentionStatusPanel.js +95 -0
- package/dist/botlit/components/RetentionStatusPanel.js.map +1 -0
- package/dist/botlit/components/VersionHistoryPanel.js +92 -83
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/hooks/index.js +1 -0
- package/dist/botlit/hooks/useRetention.js +31 -0
- package/dist/botlit/hooks/useRetention.js.map +1 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js +212 -203
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/A2ARegistryPage.js +129 -117
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentApprovalsPage.js +122 -110
- package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
- package/dist/botlit/pages/AgentBuilderPage.js +18 -18
- package/dist/botlit/pages/AgentDetailPage.js +298 -273
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +145 -121
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +238 -226
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.js +307 -288
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.js +125 -116
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +159 -144
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +279 -258
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +346 -328
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelRoutesPage.js +10 -10
- package/dist/botlit/pages/ChannelsPage.js +163 -148
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/DashboardPage.js +129 -114
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionDetailPage.js +145 -139
- package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +14 -14
- package/dist/botlit/pages/InstalledPackagesPage.js +245 -227
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js +168 -156
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.js +91 -79
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServerDetailPage.js +200 -188
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +170 -155
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.js +115 -104
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/PolicyDetailPage.js +368 -324
- package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptStudioPage.js +106 -97
- package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplateDetailPage.js +359 -347
- package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplatesPage.js +127 -112
- package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfileDetailPage.js +219 -210
- package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.js +112 -103
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +264 -252
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +235 -226
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.js +115 -106
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +194 -188
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +161 -155
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/permissions/PermissionRequired.js +45 -0
- package/dist/botlit/permissions/PermissionRequired.js.map +1 -0
- package/dist/botlit/permissions/botmanorPermissions.js +72 -0
- package/dist/botlit/permissions/botmanorPermissions.js.map +1 -0
- package/dist/botlit/permissions/index.js +3 -0
- package/dist/botlit/permissions/useBotmanorPermissions.js +19 -0
- package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -0
- package/dist/botlit/utils/policyConfig.js +67 -42
- package/dist/botlit/utils/policyConfig.js.map +1 -1
- package/dist/generated/global-types.js.map +1 -1
- package/dist/generated/wspace-operations.js +90 -54
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillDetailPage.js","names":[],"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';\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 <Button variant=\"outline\" leftIcon={<Edit size={16} />} onClick={startEditing}>\n Edit\n </Button>\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 <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\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":[],"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,57 +1,63 @@
|
|
|
1
1
|
import { useTr as e } from "../../shared/hooks/useTr.js";
|
|
2
2
|
import { useBotlit as t } from "../providers/BotlitProvider.js";
|
|
3
3
|
import { formatRelativeTime as n } from "../utils/formatters.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
4
|
+
import { BOTMANOR_PERMISSIONS as r } from "../permissions/botmanorPermissions.js";
|
|
5
|
+
import { BotmanorPermissionGate as i } from "../permissions/useBotmanorPermissions.js";
|
|
6
|
+
import { PageLayout as a } from "../components/PageLayout.js";
|
|
7
|
+
import { Button as o } from "../components/Button.js";
|
|
8
|
+
import "../permissions/index.js";
|
|
9
|
+
import { Card as s, CardContent as c, CardDescription as l, CardHeader as u, CardTitle as d } from "../components/Card.js";
|
|
10
|
+
import { Badge as f, StatusBadge as p } from "../components/Badge.js";
|
|
11
|
+
import { EmptyState as m } from "../components/EmptyState.js";
|
|
12
|
+
import { Input as h } from "../components/Input.js";
|
|
13
|
+
import { ErrorState as g } from "../components/ErrorState.js";
|
|
14
|
+
import { useSkills as _ } from "../hooks/useSkills.js";
|
|
12
15
|
import "../hooks/index.js";
|
|
13
|
-
import { useState as
|
|
14
|
-
import { GlassCard as
|
|
15
|
-
import { jsx as
|
|
16
|
-
import { Link as
|
|
17
|
-
import { Database as
|
|
16
|
+
import { useState as v } from "react";
|
|
17
|
+
import { GlassCard as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
|
|
18
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
19
|
+
import { Link as C } from "react-router";
|
|
20
|
+
import { Database as w, FileText as T, Filter as E, Package as D, Plus as O, Search as k, Sparkles as A, Wrench as j } from "lucide-react";
|
|
18
21
|
//#region src/botlit/pages/SkillsPage.tsx
|
|
19
|
-
var
|
|
20
|
-
let
|
|
21
|
-
return /* @__PURE__ */
|
|
22
|
-
title:
|
|
23
|
-
description:
|
|
24
|
-
actions: /* @__PURE__ */
|
|
25
|
-
|
|
26
|
-
children: /* @__PURE__ */
|
|
27
|
-
|
|
28
|
-
children:
|
|
22
|
+
var M = () => {
|
|
23
|
+
let M = e(), { getPath: N } = t(), [P, F] = v(""), { data: I, loading: L, error: R, refetch: z } = _({ search: P });
|
|
24
|
+
return /* @__PURE__ */ x(a, {
|
|
25
|
+
title: M("botlit.skills.title", "Skills"),
|
|
26
|
+
description: M("botlit.skills.description", "Reusable skill bundles that combine prompts, tools, and knowledge"),
|
|
27
|
+
actions: /* @__PURE__ */ x(i, {
|
|
28
|
+
permission: r.SKILL_CREATE,
|
|
29
|
+
children: /* @__PURE__ */ x(o, {
|
|
30
|
+
leftIcon: /* @__PURE__ */ x(O, { size: 16 }),
|
|
31
|
+
children: /* @__PURE__ */ x(C, {
|
|
32
|
+
to: N("skills/new"),
|
|
33
|
+
children: M("botlit.skills.actions.createSkill", "Create Skill")
|
|
34
|
+
})
|
|
29
35
|
})
|
|
30
36
|
}),
|
|
31
|
-
children: /* @__PURE__ */
|
|
37
|
+
children: /* @__PURE__ */ S("div", {
|
|
32
38
|
className: "space-y-6",
|
|
33
39
|
children: [
|
|
34
|
-
/* @__PURE__ */
|
|
35
|
-
icon: /* @__PURE__ */
|
|
36
|
-
children:
|
|
40
|
+
/* @__PURE__ */ x(b, {
|
|
41
|
+
icon: /* @__PURE__ */ x(A, { size: 18 }),
|
|
42
|
+
children: M("botlit.skills.purpose", "A skill is a reusable bundle that packages a prompt template, a tool policy and a knowledge (retrieval) profile into one capability you can drop onto any agent. Build a skill once — say \"Customer Support\" or \"Code Review\" — and reuse it across agents instead of wiring the same prompt, tools and knowledge by hand each time.")
|
|
37
43
|
}),
|
|
38
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ S("div", {
|
|
39
45
|
className: "flex items-center gap-4",
|
|
40
|
-
children: [/* @__PURE__ */
|
|
46
|
+
children: [/* @__PURE__ */ S("div", {
|
|
41
47
|
className: "relative flex-1 max-w-md",
|
|
42
|
-
children: [/* @__PURE__ */
|
|
43
|
-
placeholder:
|
|
44
|
-
value:
|
|
45
|
-
onChange: (e) =>
|
|
48
|
+
children: [/* @__PURE__ */ x(k, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x(h, {
|
|
49
|
+
placeholder: M("botlit.skills.searchPlaceholder", "Search skills..."),
|
|
50
|
+
value: P,
|
|
51
|
+
onChange: (e) => F(e.target.value),
|
|
46
52
|
className: "pl-9"
|
|
47
53
|
})]
|
|
48
|
-
}), /* @__PURE__ */
|
|
54
|
+
}), /* @__PURE__ */ x(o, {
|
|
49
55
|
variant: "outline",
|
|
50
|
-
leftIcon: /* @__PURE__ */
|
|
51
|
-
children:
|
|
56
|
+
leftIcon: /* @__PURE__ */ x(E, { size: 16 }),
|
|
57
|
+
children: M("botlit.skills.actions.filters", "Filters")
|
|
52
58
|
})]
|
|
53
59
|
}),
|
|
54
|
-
|
|
60
|
+
L ? /* @__PURE__ */ x("div", {
|
|
55
61
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
56
62
|
children: [
|
|
57
63
|
1,
|
|
@@ -60,57 +66,57 @@ var A = () => {
|
|
|
60
66
|
4,
|
|
61
67
|
5,
|
|
62
68
|
6
|
|
63
|
-
].map((e) => /* @__PURE__ */
|
|
64
|
-
}) :
|
|
69
|
+
].map((e) => /* @__PURE__ */ x("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
70
|
+
}) : R ? /* @__PURE__ */ x(g, {
|
|
65
71
|
resource: "skills",
|
|
66
|
-
error:
|
|
67
|
-
onRetry: () => void
|
|
68
|
-
}) :
|
|
72
|
+
error: R,
|
|
73
|
+
onRetry: () => void z()
|
|
74
|
+
}) : I.length > 0 ? /* @__PURE__ */ x("div", {
|
|
69
75
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
70
|
-
children:
|
|
71
|
-
to:
|
|
72
|
-
children: /* @__PURE__ */
|
|
76
|
+
children: I.map((e) => /* @__PURE__ */ x(C, {
|
|
77
|
+
to: N(`skills/${e.id}`),
|
|
78
|
+
children: /* @__PURE__ */ S(s, {
|
|
73
79
|
className: "h-full hover:border-primary/50 transition-colors cursor-pointer",
|
|
74
|
-
children: [/* @__PURE__ */
|
|
80
|
+
children: [/* @__PURE__ */ x(u, { children: /* @__PURE__ */ S("div", {
|
|
75
81
|
className: "flex items-start justify-between",
|
|
76
|
-
children: [/* @__PURE__ */
|
|
82
|
+
children: [/* @__PURE__ */ S("div", {
|
|
77
83
|
className: "flex items-center gap-3",
|
|
78
|
-
children: [/* @__PURE__ */
|
|
84
|
+
children: [/* @__PURE__ */ x("div", {
|
|
79
85
|
className: "p-2 bg-gradient-to-br from-primary/20 to-primary/5 rounded-lg",
|
|
80
|
-
children: /* @__PURE__ */
|
|
81
|
-
}), /* @__PURE__ */
|
|
86
|
+
children: /* @__PURE__ */ x(A, { className: "h-5 w-5 text-primary" })
|
|
87
|
+
}), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x(d, {
|
|
82
88
|
className: "text-base",
|
|
83
89
|
children: e.name
|
|
84
|
-
}), /* @__PURE__ */
|
|
90
|
+
}), /* @__PURE__ */ x(l, {
|
|
85
91
|
className: "text-xs line-clamp-1",
|
|
86
92
|
children: e.description
|
|
87
93
|
})] })]
|
|
88
|
-
}), /* @__PURE__ */
|
|
89
|
-
}) }), /* @__PURE__ */
|
|
94
|
+
}), /* @__PURE__ */ x(p, { status: e.status })]
|
|
95
|
+
}) }), /* @__PURE__ */ x(c, { children: /* @__PURE__ */ S("div", {
|
|
90
96
|
className: "space-y-3",
|
|
91
|
-
children: [/* @__PURE__ */
|
|
97
|
+
children: [/* @__PURE__ */ S("div", {
|
|
92
98
|
className: "flex flex-wrap gap-2",
|
|
93
99
|
children: [
|
|
94
|
-
e.promptTemplateId && /* @__PURE__ */
|
|
100
|
+
e.promptTemplateId && /* @__PURE__ */ S(f, {
|
|
95
101
|
variant: "outline",
|
|
96
102
|
className: "text-xs flex items-center gap-1",
|
|
97
|
-
children: [/* @__PURE__ */
|
|
103
|
+
children: [/* @__PURE__ */ x(T, { size: 10 }), M("botlit.skills.badge.prompt", "Prompt")]
|
|
98
104
|
}),
|
|
99
|
-
e.toolPolicyId && /* @__PURE__ */
|
|
105
|
+
e.toolPolicyId && /* @__PURE__ */ S(f, {
|
|
100
106
|
variant: "outline",
|
|
101
107
|
className: "text-xs flex items-center gap-1",
|
|
102
|
-
children: [/* @__PURE__ */
|
|
108
|
+
children: [/* @__PURE__ */ x(j, { size: 10 }), M("botlit.skills.badge.tools", "Tools")]
|
|
103
109
|
}),
|
|
104
|
-
e.retrievalProfileId && /* @__PURE__ */
|
|
110
|
+
e.retrievalProfileId && /* @__PURE__ */ S(f, {
|
|
105
111
|
variant: "outline",
|
|
106
112
|
className: "text-xs flex items-center gap-1",
|
|
107
|
-
children: [/* @__PURE__ */
|
|
113
|
+
children: [/* @__PURE__ */ x(w, { size: 10 }), M("botlit.skills.badge.knowledge", "Knowledge")]
|
|
108
114
|
})
|
|
109
115
|
]
|
|
110
|
-
}), /* @__PURE__ */
|
|
116
|
+
}), /* @__PURE__ */ S("div", {
|
|
111
117
|
className: "pt-3 border-t border-border-subtle text-xs text-text-secondary",
|
|
112
118
|
children: [
|
|
113
|
-
|
|
119
|
+
M("botlit.botsList.createdLabel", "Created"),
|
|
114
120
|
" ",
|
|
115
121
|
n(e.createdAt)
|
|
116
122
|
]
|
|
@@ -118,96 +124,99 @@ var A = () => {
|
|
|
118
124
|
}) })]
|
|
119
125
|
})
|
|
120
126
|
}, e.id))
|
|
121
|
-
}) : /* @__PURE__ */
|
|
127
|
+
}) : /* @__PURE__ */ x(m, {
|
|
122
128
|
illustration: "empty-generic",
|
|
123
|
-
title:
|
|
124
|
-
description:
|
|
125
|
-
action: /* @__PURE__ */
|
|
126
|
-
|
|
127
|
-
children: /* @__PURE__ */
|
|
128
|
-
|
|
129
|
-
children:
|
|
129
|
+
title: M("botlit.skills.empty.title", "No skills created"),
|
|
130
|
+
description: M("botlit.skills.empty.description", "Create reusable skill bundles to quickly configure agents with common capabilities."),
|
|
131
|
+
action: /* @__PURE__ */ x(i, {
|
|
132
|
+
permission: r.SKILL_CREATE,
|
|
133
|
+
children: /* @__PURE__ */ x(o, {
|
|
134
|
+
leftIcon: /* @__PURE__ */ x(O, { size: 16 }),
|
|
135
|
+
children: /* @__PURE__ */ x(C, {
|
|
136
|
+
to: N("skills/new"),
|
|
137
|
+
children: M("botlit.skills.actions.createSkill", "Create Skill")
|
|
138
|
+
})
|
|
130
139
|
})
|
|
131
140
|
})
|
|
132
141
|
}),
|
|
133
|
-
/* @__PURE__ */
|
|
142
|
+
/* @__PURE__ */ S(y, {
|
|
134
143
|
treatment: "glass",
|
|
135
144
|
glow: !0,
|
|
136
145
|
className: "p-6",
|
|
137
|
-
children: [/* @__PURE__ */
|
|
146
|
+
children: [/* @__PURE__ */ S("div", {
|
|
138
147
|
className: "mb-4",
|
|
139
|
-
children: [/* @__PURE__ */
|
|
148
|
+
children: [/* @__PURE__ */ S("h2", {
|
|
140
149
|
className: "flex items-center gap-2 text-lg font-semibold tracking-tight text-text-primary",
|
|
141
|
-
children: [/* @__PURE__ */
|
|
142
|
-
}), /* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ x(D, { size: 18 }), M("botlit.skills.overview.title", "What are Skills?")]
|
|
151
|
+
}), /* @__PURE__ */ x("p", {
|
|
143
152
|
className: "text-sm text-text-secondary",
|
|
144
|
-
children:
|
|
153
|
+
children: M("botlit.skills.overview.description", "Skills are composable bundles that encapsulate agent capabilities")
|
|
145
154
|
})]
|
|
146
|
-
}), /* @__PURE__ */
|
|
155
|
+
}), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
|
|
147
156
|
className: "grid grid-cols-1 md:grid-cols-3 gap-6",
|
|
148
157
|
children: [
|
|
149
|
-
/* @__PURE__ */
|
|
158
|
+
/* @__PURE__ */ S("div", {
|
|
150
159
|
className: "space-y-2",
|
|
151
|
-
children: [/* @__PURE__ */
|
|
160
|
+
children: [/* @__PURE__ */ S("h4", {
|
|
152
161
|
className: "font-medium flex items-center gap-2",
|
|
153
|
-
children: [/* @__PURE__ */
|
|
162
|
+
children: [/* @__PURE__ */ x(T, {
|
|
154
163
|
size: 16,
|
|
155
164
|
className: "text-primary"
|
|
156
|
-
}),
|
|
157
|
-
}), /* @__PURE__ */
|
|
165
|
+
}), M("botlit.skills.overview.promptTitle", "Prompt Templates")]
|
|
166
|
+
}), /* @__PURE__ */ x("p", {
|
|
158
167
|
className: "text-sm text-text-secondary",
|
|
159
|
-
children:
|
|
168
|
+
children: M("botlit.skills.overview.promptDescription", "Pre-configured system prompts with variable support for consistent agent behavior.")
|
|
160
169
|
})]
|
|
161
170
|
}),
|
|
162
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ S("div", {
|
|
163
172
|
className: "space-y-2",
|
|
164
|
-
children: [/* @__PURE__ */
|
|
173
|
+
children: [/* @__PURE__ */ S("h4", {
|
|
165
174
|
className: "font-medium flex items-center gap-2",
|
|
166
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ x(j, {
|
|
167
176
|
size: 16,
|
|
168
177
|
className: "text-primary"
|
|
169
|
-
}),
|
|
170
|
-
}), /* @__PURE__ */
|
|
178
|
+
}), M("botlit.skills.overview.toolsTitle", "Tool Configurations")]
|
|
179
|
+
}), /* @__PURE__ */ x("p", {
|
|
171
180
|
className: "text-sm text-text-secondary",
|
|
172
|
-
children:
|
|
181
|
+
children: M("botlit.skills.overview.toolsDescription", "Bundled MCP tool packs with policies defining allowed operations and limits.")
|
|
173
182
|
})]
|
|
174
183
|
}),
|
|
175
|
-
/* @__PURE__ */
|
|
184
|
+
/* @__PURE__ */ S("div", {
|
|
176
185
|
className: "space-y-2",
|
|
177
|
-
children: [/* @__PURE__ */
|
|
186
|
+
children: [/* @__PURE__ */ S("h4", {
|
|
178
187
|
className: "font-medium flex items-center gap-2",
|
|
179
|
-
children: [/* @__PURE__ */
|
|
188
|
+
children: [/* @__PURE__ */ x(w, {
|
|
180
189
|
size: 16,
|
|
181
190
|
className: "text-primary"
|
|
182
|
-
}),
|
|
183
|
-
}), /* @__PURE__ */
|
|
191
|
+
}), M("botlit.skills.overview.knowledgeTitle", "Knowledge Bindings")]
|
|
192
|
+
}), /* @__PURE__ */ x("p", {
|
|
184
193
|
className: "text-sm text-text-secondary",
|
|
185
|
-
children:
|
|
194
|
+
children: M("botlit.skills.overview.knowledgeDescription", "Pre-configured retrieval profiles for domain-specific knowledge access.")
|
|
186
195
|
})]
|
|
187
196
|
})
|
|
188
197
|
]
|
|
189
|
-
}), /* @__PURE__ */
|
|
198
|
+
}), /* @__PURE__ */ S("div", {
|
|
190
199
|
className: "mt-6 p-4 bg-bg-sunken rounded-lg",
|
|
191
|
-
children: [/* @__PURE__ */
|
|
200
|
+
children: [/* @__PURE__ */ x("h4", {
|
|
192
201
|
className: "font-medium mb-2",
|
|
193
|
-
children:
|
|
194
|
-
}), /* @__PURE__ */
|
|
202
|
+
children: M("botlit.skills.overview.useCases.title", "Use Cases")
|
|
203
|
+
}), /* @__PURE__ */ S("ul", {
|
|
195
204
|
className: "text-sm text-text-secondary space-y-1",
|
|
196
205
|
children: [
|
|
197
|
-
/* @__PURE__ */
|
|
206
|
+
/* @__PURE__ */ S("li", { children: [
|
|
198
207
|
"•",
|
|
199
208
|
" ",
|
|
200
|
-
|
|
209
|
+
M("botlit.skills.overview.useCases.case1", "Create a \"Customer Support\" skill with FAQ knowledge and ticketing tools")
|
|
201
210
|
] }),
|
|
202
|
-
/* @__PURE__ */
|
|
211
|
+
/* @__PURE__ */ S("li", { children: [
|
|
203
212
|
"•",
|
|
204
213
|
" ",
|
|
205
|
-
|
|
214
|
+
M("botlit.skills.overview.useCases.case2", "Build a \"Code Review\" skill with GitHub tools and coding guidelines")
|
|
206
215
|
] }),
|
|
207
|
-
/* @__PURE__ */
|
|
216
|
+
/* @__PURE__ */ S("li", { children: [
|
|
208
217
|
"•",
|
|
209
218
|
" ",
|
|
210
|
-
|
|
219
|
+
M("botlit.skills.overview.useCases.case3", "Package a \"Sales Assistant\" skill with CRM tools and product catalog")
|
|
211
220
|
] })
|
|
212
221
|
]
|
|
213
222
|
})]
|
|
@@ -218,6 +227,6 @@ var A = () => {
|
|
|
218
227
|
});
|
|
219
228
|
};
|
|
220
229
|
//#endregion
|
|
221
|
-
export {
|
|
230
|
+
export { M as SkillsPage };
|
|
222
231
|
|
|
223
232
|
//# sourceMappingURL=SkillsPage.js.map
|