@burdenoff/microfe-botmanor 2026.1027.2 → 2026.1027.3

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