@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":"A2AAgentDetailPage.js","names":[],"sources":["../../../src/botlit/pages/A2AAgentDetailPage.tsx"],"sourcesContent":["/**\n * A2A Agent Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Edit,\n Trash2,\n Share2,\n Shield,\n Globe,\n Key,\n Zap,\n ExternalLink,\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 { Badge, StatusBadge } from '../components/Badge';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport {\n useA2AAgent,\n useRegisterA2AAgent,\n useUpdateA2AAgent,\n useDeleteA2AAgent,\n readAgentCard,\n readEntitlements,\n validateAgentCard,\n type A2AAgentRecord,\n} from '../hooks/useA2A';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { TrustLevel } from '../types';\n\ninterface A2AAgentDetailPageProps {\n isNew?: boolean;\n}\n\n/** Editable subset of an A2A registry entry. */\ninterface A2AAgentForm {\n name: string;\n description: string;\n wellKnownUrl: string;\n trustLevel: TrustLevel;\n /** The `/.well-known/agent.json` document, edited as raw JSON. */\n agentCardJson: string;\n}\n\nconst TRUST_LEVELS: TrustLevel[] = ['UNVERIFIED', 'VERIFIED_PUBLISHER', 'INTERNAL'];\n\nconst EMPTY_AGENT_CARD_JSON = JSON.stringify(\n {\n name: '',\n description: '',\n url: '',\n version: '1.0.0',\n capabilities: { streaming: false, pushNotifications: false, stateTransitionHistory: false },\n authentication: { schemes: ['bearer'] },\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n skills: [],\n },\n null,\n 2\n);\n\nconst DEFAULT_FORM: A2AAgentForm = {\n name: '',\n description: '',\n wellKnownUrl: '',\n trustLevel: 'UNVERIFIED',\n agentCardJson: EMPTY_AGENT_CARD_JSON,\n};\n\nfunction toTrustLevel(value: string): TrustLevel {\n return TRUST_LEVELS.includes(value as TrustLevel) ? (value as TrustLevel) : 'UNVERIFIED';\n}\n\nfunction toForm(agent: A2AAgentRecord): A2AAgentForm {\n return {\n name: agent.name,\n description: agent.description ?? '',\n wellKnownUrl: agent.wellKnownUrl ?? '',\n trustLevel: toTrustLevel(agent.trustLevel),\n agentCardJson: JSON.stringify(agent.agentCard ?? {}, null, 2),\n };\n}\n\n/** Parses the edited agent card; returns undefined when the JSON is malformed. */\nfunction parseAgentCard(json: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(json);\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const A2AAgentDetailPage: FC<A2AAgentDetailPageProps> = ({ isNew = false }) => {\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: a2aAgent, loading } = useA2AAgent(isNew ? undefined : agentId);\n const [createA2AAgent, createA2AAgentResult] = useRegisterA2AAgent();\n const [updateA2AAgent, updateA2AAgentResult] = useUpdateA2AAgent();\n const [deleteA2AAgent, deleteA2AAgentResult] = useDeleteA2AAgent();\n\n const [isEditing, setIsEditing] = useState(isNew);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [formData, setFormData] = useState<A2AAgentForm>(DEFAULT_FORM);\n\n // Seed the form once the entry arrives so \"Edit\" opens on current values.\n useEffect(() => {\n if (a2aAgent && !isNew) {\n setFormData(toForm(a2aAgent));\n }\n }, [a2aAgent, isNew]);\n\n // While editing, preview the card being typed; otherwise the stored one.\n const agentCard = useMemo(\n () =>\n readAgentCard(\n isEditing ? parseAgentCard(formData.agentCardJson) : (a2aAgent?.agentCard ?? undefined)\n ),\n [isEditing, formData.agentCardJson, a2aAgent]\n );\n\n const entitlements = useMemo(\n () => readEntitlements(a2aAgent?.entitlements),\n [a2aAgent?.entitlements]\n );\n\n if (loading && !isNew) {\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 (!a2aAgent && !isNew) {\n return (\n <PageLayout title=\"A2A Agent Not Found\">\n <EmptyState\n illustration=\"empty-people\"\n title=\"A2A Agent Not Found\"\n description=\"The A2A agent doesn't exist.\"\n action={<Button onClick={() => navigateTo('a2a')}>Back to A2A Registry</Button>}\n />\n </PageLayout>\n );\n }\n\n const getTrustBadgeVariant = (level: TrustLevel) => {\n switch (level) {\n case 'INTERNAL':\n return 'success';\n case 'VERIFIED_PUBLISHER':\n return 'default';\n default:\n return 'secondary';\n }\n };\n\n const handleSave = async () => {\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n\n // `agentCard` is `JSON!` on the service — a registration without a usable\n // card is rejected, so the document is parsed and checked before sending.\n const agentCard = parseAgentCard(formData.agentCardJson);\n if (!agentCard) {\n toast.error('Agent card must be a valid JSON object');\n return;\n }\n const validation = validateAgentCard(agentCard);\n if (!validation.valid) {\n toast.error(validation.errors[0]);\n return;\n }\n\n if (isNew) {\n try {\n const created = await createA2AAgent({\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n });\n toast.success(`Registered \"${created.name}\"`);\n navigateTo(`a2a/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to register A2A agent');\n }\n return;\n }\n\n if (!agentId) return;\n try {\n await updateA2AAgent({\n agentId,\n input: {\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n },\n });\n toast.success('A2A agent updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update A2A agent');\n }\n };\n\n const handleDelete = async () => {\n if (!agentId) return;\n try {\n await deleteA2AAgent(agentId);\n if (isNative()) void nativeNotify('success');\n toast.success('A2A agent removed');\n navigateTo('a2a');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to remove A2A agent');\n }\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('a2a')}>\n <ArrowLeft size={20} />\n </Button>\n <Share2 size={24} className=\"text-primary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{isNew ? 'Register A2A Agent' : a2aAgent?.name}</span>\n {!isNew && a2aAgent && <StatusBadge status={a2aAgent.status} />}\n {!isNew && a2aAgent && (\n <Badge variant={getTrustBadgeVariant(toTrustLevel(a2aAgent.trustLevel))}>\n {a2aAgent.trustLevel.replace('_', ' ')}\n </Badge>\n )}\n </div>\n {!isNew && a2aAgent?.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{a2aAgent.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => (isNew ? navigateTo('a2a') : setIsEditing(false))}\n >\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n isLoading={createA2AAgentResult.loading || updateA2AAgentResult.loading}\n >\n {isNew ? 'Register Agent' : 'Save Changes'}\n </Button>\n </>\n ) : (\n <>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => {\n if (a2aAgent) setFormData(toForm(a2aAgent));\n setIsEditing(true);\n }}\n >\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={deleteA2AAgentResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Remove\n </Button>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Globe size={18} />}>\n This is one external agent registered in your A2A network. Inspect its public agent card —\n the skills it advertises, its provider and trust level — and decide how your own agents\n may delegate work to it. Keeping this entry accurate is what lets BotManor safely hand off\n tasks to agents outside your workspace.\n </PagePurpose>\n\n {/* Basic Info */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"e.g., External Weather Agent\"\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Describe what this A2A agent does...\"\n rows={3}\n />\n </FormField>\n <FormField label=\"Well-Known URL\" description=\"URL to fetch agent.json\">\n <Input\n value={formData.wellKnownUrl}\n onChange={(e) => setFormData({ ...formData, wellKnownUrl: e.target.value })}\n placeholder=\"https://example.com/.well-known/agent.json\"\n />\n </FormField>\n <FormField label=\"Trust Level\">\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.trustLevel}\n onChange={(e) =>\n setFormData({ ...formData, trustLevel: toTrustLevel(e.target.value) })\n }\n >\n <option value=\"UNVERIFIED\">Unverified</option>\n <option value=\"VERIFIED_PUBLISHER\">Verified Publisher</option>\n <option value=\"INTERNAL\">Internal</option>\n </select>\n </FormField>\n <FormField\n label=\"Agent Card (JSON)\"\n required\n description=\"Paste the agent's /.well-known/agent.json document\"\n >\n <Textarea\n value={formData.agentCardJson}\n onChange={(e) => setFormData({ ...formData, agentCardJson: e.target.value })}\n rows={12}\n className=\"font-mono text-xs\"\n />\n </FormField>\n {!parseAgentCard(formData.agentCardJson) && (\n <p className=\"text-sm text-status-error-text\">\n Agent card must be a valid JSON object.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Agent Card */}\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Globe size={18} />\n Agent Card\n </CardTitle>\n <CardDescription>Public agent metadata per A2A spec</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {!isNew && a2aAgent?.wellKnownUrl && (\n <div className=\"flex items-center gap-2 p-3 bg-bg-sunken rounded-lg\">\n <Globe size={16} className=\"text-text-secondary\" />\n <a\n href={a2aAgent.wellKnownUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-primary hover:underline flex items-center gap-1\"\n >\n {a2aAgent.wellKnownUrl}\n <ExternalLink size={12} />\n </a>\n </div>\n )}\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Agent URL</p>\n <p className=\"font-medium font-mono text-sm\">{agentCard.url || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Version</p>\n <Badge variant=\"outline\">{agentCard.version || MISSING_VALUE}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Provider</p>\n <p className=\"font-medium\">{agentCard.providerOrganization || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Documentation</p>\n {agentCard.documentationUrl ? (\n <a\n href={agentCard.documentationUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline flex items-center gap-1\"\n >\n View Docs <ExternalLink size={12} />\n </a>\n ) : (\n <p className=\"text-text-secondary\">{MISSING_VALUE}</p>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Capabilities */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Capabilities\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n {[\n {\n key: 'streaming',\n label: 'Streaming',\n value: agentCard.capabilities.streaming,\n },\n {\n key: 'pushNotifications',\n label: 'Push Notifications',\n value: agentCard.capabilities.pushNotifications,\n },\n {\n key: 'stateTransitionHistory',\n label: 'State History',\n value: agentCard.capabilities.stateTransitionHistory,\n },\n ].map((cap) => (\n <div\n key={cap.key}\n className={`p-3 rounded-lg border ${cap.value ? 'border-green-500 bg-green-500/10' : 'border-border-subtle bg-bg-sunken'}`}\n >\n <p className=\"font-medium\">{cap.label}</p>\n <Badge variant={cap.value ? 'success' : 'secondary'}>\n {cap.value ? 'Supported' : 'Not Supported'}\n </Badge>\n </div>\n ))}\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Input Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultInputModes.length > 0 ? (\n agentCard.defaultInputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Output Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultOutputModes.length > 0 ? (\n agentCard.defaultOutputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Authentication */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Key size={18} />\n Authentication\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <p className=\"text-sm text-text-secondary\">Supported Schemes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.authenticationSchemes.length > 0 ? (\n agentCard.authenticationSchemes.map((scheme) => (\n <Badge key={scheme} variant=\"outline\">\n {scheme}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None specified</span>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Skills */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Skills\n </CardTitle>\n <CardDescription>Capabilities exposed by this agent</CardDescription>\n </CardHeader>\n <CardContent>\n {agentCard.skills.length > 0 ? (\n <div className=\"space-y-3\">\n {agentCard.skills.map((skill) => (\n <div key={skill.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h4 className=\"font-medium\">{skill.name}</h4>\n <p className=\"text-sm text-text-secondary\">{skill.description}</p>\n </div>\n <Badge variant=\"outline\">{skill.id}</Badge>\n </div>\n {skill.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {skill.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n {skill.examples.length > 0 && (\n <div className=\"mt-2\">\n <p className=\"text-xs text-text-secondary\">Examples:</p>\n <ul className=\"text-sm text-text-secondary list-disc list-inside\">\n {skill.examples.map((ex, i) => (\n <li key={i}>{ex}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No skills defined</p>\n )}\n </CardContent>\n </Card>\n\n {/* Entitlements */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Entitlements\n </CardTitle>\n <CardDescription>Which apps/agents can invoke this A2A agent</CardDescription>\n </CardHeader>\n <CardContent>\n {entitlements.length > 0 ? (\n <div className=\"space-y-3\">\n {entitlements.map((entitlement) => (\n <div key={entitlement.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entitlement.sourceType}\n </Badge>\n <span className=\"font-mono text-sm\">{entitlement.sourceId}</span>\n </div>\n {entitlement.maxHops && (\n <span className=\"text-sm text-text-secondary\">\n Max Hops: {entitlement.maxHops}\n </span>\n )}\n </div>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Allowed Skills</p>\n {entitlement.allowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.allowedSkills.map((s) => (\n <Badge key={s} variant=\"success\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">All</span>\n )}\n </div>\n <div>\n <p className=\"text-text-secondary\">Disallowed Skills</p>\n {entitlement.disallowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.disallowedSkills.map((s) => (\n <Badge key={s} variant=\"destructive\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No entitlements configured</p>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n {!isNew && a2aAgent && (\n <Card>\n <CardHeader>\n <CardTitle>Metadata</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Revision</p>\n <p className=\"font-medium\">{a2aAgent.revision}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{a2aAgent.visibility}</Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"A2AAgentDetailPage.js","names":[],"sources":["../../../src/botlit/pages/A2AAgentDetailPage.tsx"],"sourcesContent":["/**\n * A2A Agent Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Edit,\n Trash2,\n Share2,\n Shield,\n Globe,\n Key,\n Zap,\n ExternalLink,\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 { Badge, StatusBadge } from '../components/Badge';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport {\n useA2AAgent,\n useRegisterA2AAgent,\n useUpdateA2AAgent,\n useDeleteA2AAgent,\n readAgentCard,\n readEntitlements,\n validateAgentCard,\n type A2AAgentRecord,\n} from '../hooks/useA2A';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { TrustLevel } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface A2AAgentDetailPageProps {\n isNew?: boolean;\n}\n\n/** Editable subset of an A2A registry entry. */\ninterface A2AAgentForm {\n name: string;\n description: string;\n wellKnownUrl: string;\n trustLevel: TrustLevel;\n /** The `/.well-known/agent.json` document, edited as raw JSON. */\n agentCardJson: string;\n}\n\nconst TRUST_LEVELS: TrustLevel[] = ['UNVERIFIED', 'VERIFIED_PUBLISHER', 'INTERNAL'];\n\nconst EMPTY_AGENT_CARD_JSON = JSON.stringify(\n {\n name: '',\n description: '',\n url: '',\n version: '1.0.0',\n capabilities: { streaming: false, pushNotifications: false, stateTransitionHistory: false },\n authentication: { schemes: ['bearer'] },\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n skills: [],\n },\n null,\n 2\n);\n\nconst DEFAULT_FORM: A2AAgentForm = {\n name: '',\n description: '',\n wellKnownUrl: '',\n trustLevel: 'UNVERIFIED',\n agentCardJson: EMPTY_AGENT_CARD_JSON,\n};\n\nfunction toTrustLevel(value: string): TrustLevel {\n return TRUST_LEVELS.includes(value as TrustLevel) ? (value as TrustLevel) : 'UNVERIFIED';\n}\n\nfunction toForm(agent: A2AAgentRecord): A2AAgentForm {\n return {\n name: agent.name,\n description: agent.description ?? '',\n wellKnownUrl: agent.wellKnownUrl ?? '',\n trustLevel: toTrustLevel(agent.trustLevel),\n agentCardJson: JSON.stringify(agent.agentCard ?? {}, null, 2),\n };\n}\n\n/** Parses the edited agent card; returns undefined when the JSON is malformed. */\nfunction parseAgentCard(json: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(json);\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const A2AAgentDetailPage: FC<A2AAgentDetailPageProps> = ({ isNew = false }) => {\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: a2aAgent, loading } = useA2AAgent(isNew ? undefined : agentId);\n const [createA2AAgent, createA2AAgentResult] = useRegisterA2AAgent();\n const [updateA2AAgent, updateA2AAgentResult] = useUpdateA2AAgent();\n const [deleteA2AAgent, deleteA2AAgentResult] = useDeleteA2AAgent();\n\n const [isEditing, setIsEditing] = useState(isNew);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [formData, setFormData] = useState<A2AAgentForm>(DEFAULT_FORM);\n\n // Seed the form once the entry arrives so \"Edit\" opens on current values.\n useEffect(() => {\n if (a2aAgent && !isNew) {\n setFormData(toForm(a2aAgent));\n }\n }, [a2aAgent, isNew]);\n\n // While editing, preview the card being typed; otherwise the stored one.\n const agentCard = useMemo(\n () =>\n readAgentCard(\n isEditing ? parseAgentCard(formData.agentCardJson) : (a2aAgent?.agentCard ?? undefined)\n ),\n [isEditing, formData.agentCardJson, a2aAgent]\n );\n\n const entitlements = useMemo(\n () => readEntitlements(a2aAgent?.entitlements),\n [a2aAgent?.entitlements]\n );\n\n if (loading && !isNew) {\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 (!a2aAgent && !isNew) {\n return (\n <PageLayout title=\"A2A Agent Not Found\">\n <EmptyState\n illustration=\"empty-people\"\n title=\"A2A Agent Not Found\"\n description=\"The A2A agent doesn't exist.\"\n action={<Button onClick={() => navigateTo('a2a')}>Back to A2A Registry</Button>}\n />\n </PageLayout>\n );\n }\n\n const getTrustBadgeVariant = (level: TrustLevel) => {\n switch (level) {\n case 'INTERNAL':\n return 'success';\n case 'VERIFIED_PUBLISHER':\n return 'default';\n default:\n return 'secondary';\n }\n };\n\n const handleSave = async () => {\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n\n // `agentCard` is `JSON!` on the service — a registration without a usable\n // card is rejected, so the document is parsed and checked before sending.\n const agentCard = parseAgentCard(formData.agentCardJson);\n if (!agentCard) {\n toast.error('Agent card must be a valid JSON object');\n return;\n }\n const validation = validateAgentCard(agentCard);\n if (!validation.valid) {\n toast.error(validation.errors[0]);\n return;\n }\n\n if (isNew) {\n try {\n const created = await createA2AAgent({\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n });\n toast.success(`Registered \"${created.name}\"`);\n navigateTo(`a2a/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to register A2A agent');\n }\n return;\n }\n\n if (!agentId) return;\n try {\n await updateA2AAgent({\n agentId,\n input: {\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n },\n });\n toast.success('A2A agent updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update A2A agent');\n }\n };\n\n const handleDelete = async () => {\n if (!agentId) return;\n try {\n await deleteA2AAgent(agentId);\n if (isNative()) void nativeNotify('success');\n toast.success('A2A agent removed');\n navigateTo('a2a');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to remove A2A agent');\n }\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('a2a')}>\n <ArrowLeft size={20} />\n </Button>\n <Share2 size={24} className=\"text-primary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{isNew ? 'Register A2A Agent' : a2aAgent?.name}</span>\n {!isNew && a2aAgent && <StatusBadge status={a2aAgent.status} />}\n {!isNew && a2aAgent && (\n <Badge variant={getTrustBadgeVariant(toTrustLevel(a2aAgent.trustLevel))}>\n {a2aAgent.trustLevel.replace('_', ' ')}\n </Badge>\n )}\n </div>\n {!isNew && a2aAgent?.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{a2aAgent.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => (isNew ? navigateTo('a2a') : setIsEditing(false))}\n >\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n isLoading={createA2AAgentResult.loading || updateA2AAgentResult.loading}\n >\n {isNew ? 'Register Agent' : 'Save Changes'}\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.A2A_REGISTRY_UPDATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => {\n if (a2aAgent) setFormData(toForm(a2aAgent));\n setIsEditing(true);\n }}\n >\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={deleteA2AAgentResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.A2A_REGISTRY_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Remove\n </Button>\n </BotmanorPermissionGate>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Globe size={18} />}>\n This is one external agent registered in your A2A network. Inspect its public agent card —\n the skills it advertises, its provider and trust level — and decide how your own agents\n may delegate work to it. Keeping this entry accurate is what lets BotManor safely hand off\n tasks to agents outside your workspace.\n </PagePurpose>\n\n {/* Basic Info */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"e.g., External Weather Agent\"\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Describe what this A2A agent does...\"\n rows={3}\n />\n </FormField>\n <FormField label=\"Well-Known URL\" description=\"URL to fetch agent.json\">\n <Input\n value={formData.wellKnownUrl}\n onChange={(e) => setFormData({ ...formData, wellKnownUrl: e.target.value })}\n placeholder=\"https://example.com/.well-known/agent.json\"\n />\n </FormField>\n <FormField label=\"Trust Level\">\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.trustLevel}\n onChange={(e) =>\n setFormData({ ...formData, trustLevel: toTrustLevel(e.target.value) })\n }\n >\n <option value=\"UNVERIFIED\">Unverified</option>\n <option value=\"VERIFIED_PUBLISHER\">Verified Publisher</option>\n <option value=\"INTERNAL\">Internal</option>\n </select>\n </FormField>\n <FormField\n label=\"Agent Card (JSON)\"\n required\n description=\"Paste the agent's /.well-known/agent.json document\"\n >\n <Textarea\n value={formData.agentCardJson}\n onChange={(e) => setFormData({ ...formData, agentCardJson: e.target.value })}\n rows={12}\n className=\"font-mono text-xs\"\n />\n </FormField>\n {!parseAgentCard(formData.agentCardJson) && (\n <p className=\"text-sm text-status-error-text\">\n Agent card must be a valid JSON object.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Agent Card */}\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Globe size={18} />\n Agent Card\n </CardTitle>\n <CardDescription>Public agent metadata per A2A spec</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {!isNew && a2aAgent?.wellKnownUrl && (\n <div className=\"flex items-center gap-2 p-3 bg-bg-sunken rounded-lg\">\n <Globe size={16} className=\"text-text-secondary\" />\n <a\n href={a2aAgent.wellKnownUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-primary hover:underline flex items-center gap-1\"\n >\n {a2aAgent.wellKnownUrl}\n <ExternalLink size={12} />\n </a>\n </div>\n )}\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Agent URL</p>\n <p className=\"font-medium font-mono text-sm\">{agentCard.url || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Version</p>\n <Badge variant=\"outline\">{agentCard.version || MISSING_VALUE}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Provider</p>\n <p className=\"font-medium\">{agentCard.providerOrganization || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Documentation</p>\n {agentCard.documentationUrl ? (\n <a\n href={agentCard.documentationUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline flex items-center gap-1\"\n >\n View Docs <ExternalLink size={12} />\n </a>\n ) : (\n <p className=\"text-text-secondary\">{MISSING_VALUE}</p>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Capabilities */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Capabilities\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n {[\n {\n key: 'streaming',\n label: 'Streaming',\n value: agentCard.capabilities.streaming,\n },\n {\n key: 'pushNotifications',\n label: 'Push Notifications',\n value: agentCard.capabilities.pushNotifications,\n },\n {\n key: 'stateTransitionHistory',\n label: 'State History',\n value: agentCard.capabilities.stateTransitionHistory,\n },\n ].map((cap) => (\n <div\n key={cap.key}\n className={`p-3 rounded-lg border ${cap.value ? 'border-green-500 bg-green-500/10' : 'border-border-subtle bg-bg-sunken'}`}\n >\n <p className=\"font-medium\">{cap.label}</p>\n <Badge variant={cap.value ? 'success' : 'secondary'}>\n {cap.value ? 'Supported' : 'Not Supported'}\n </Badge>\n </div>\n ))}\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Input Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultInputModes.length > 0 ? (\n agentCard.defaultInputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Output Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultOutputModes.length > 0 ? (\n agentCard.defaultOutputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Authentication */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Key size={18} />\n Authentication\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <p className=\"text-sm text-text-secondary\">Supported Schemes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.authenticationSchemes.length > 0 ? (\n agentCard.authenticationSchemes.map((scheme) => (\n <Badge key={scheme} variant=\"outline\">\n {scheme}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None specified</span>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Skills */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Skills\n </CardTitle>\n <CardDescription>Capabilities exposed by this agent</CardDescription>\n </CardHeader>\n <CardContent>\n {agentCard.skills.length > 0 ? (\n <div className=\"space-y-3\">\n {agentCard.skills.map((skill) => (\n <div key={skill.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h4 className=\"font-medium\">{skill.name}</h4>\n <p className=\"text-sm text-text-secondary\">{skill.description}</p>\n </div>\n <Badge variant=\"outline\">{skill.id}</Badge>\n </div>\n {skill.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {skill.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n {skill.examples.length > 0 && (\n <div className=\"mt-2\">\n <p className=\"text-xs text-text-secondary\">Examples:</p>\n <ul className=\"text-sm text-text-secondary list-disc list-inside\">\n {skill.examples.map((ex, i) => (\n <li key={i}>{ex}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No skills defined</p>\n )}\n </CardContent>\n </Card>\n\n {/* Entitlements */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Entitlements\n </CardTitle>\n <CardDescription>Which apps/agents can invoke this A2A agent</CardDescription>\n </CardHeader>\n <CardContent>\n {entitlements.length > 0 ? (\n <div className=\"space-y-3\">\n {entitlements.map((entitlement) => (\n <div key={entitlement.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entitlement.sourceType}\n </Badge>\n <span className=\"font-mono text-sm\">{entitlement.sourceId}</span>\n </div>\n {entitlement.maxHops && (\n <span className=\"text-sm text-text-secondary\">\n Max Hops: {entitlement.maxHops}\n </span>\n )}\n </div>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Allowed Skills</p>\n {entitlement.allowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.allowedSkills.map((s) => (\n <Badge key={s} variant=\"success\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">All</span>\n )}\n </div>\n <div>\n <p className=\"text-text-secondary\">Disallowed Skills</p>\n {entitlement.disallowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.disallowedSkills.map((s) => (\n <Badge key={s} variant=\"destructive\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No entitlements configured</p>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n {!isNew && a2aAgent && (\n <Card>\n <CardHeader>\n <CardTitle>Metadata</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Revision</p>\n <p className=\"font-medium\">{a2aAgent.revision}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{a2aAgent.visibility}</Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -1,222 +1,234 @@
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 { a2aAgentSkillCount as m, useA2AAgents as h } from "../hooks/useA2A.js";
11
- import { ErrorState as g } from "../components/ErrorState.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 { a2aAgentSkillCount as g, useA2AAgents as _ } from "../hooks/useA2A.js";
14
+ import { ErrorState as v } from "../components/ErrorState.js";
12
15
  import "../hooks/index.js";
13
- import { useState as _ } from "react";
14
- import { GlassCard as v, PagePurpose as y } from "@burdenoff/fe-libs/ui";
15
- import { jsx as b, jsxs as x } from "react/jsx-runtime";
16
- import { Link as S } from "react-router";
17
- import { AlertCircle as C, CheckCircle as w, ExternalLink as T, Filter as E, Globe as D, Plus as O, Search as k, Shield as A, Zap as j } from "lucide-react";
16
+ import { useState as y } from "react";
17
+ import { GlassCard as b, PagePurpose as x } from "@burdenoff/fe-libs/ui";
18
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
19
+ import { Link as w } from "react-router";
20
+ import { AlertCircle as T, CheckCircle as E, ExternalLink as D, Filter as O, Globe as k, Plus as A, Search as j, Shield as M, Zap as N } from "lucide-react";
18
21
  //#region src/botlit/pages/A2ARegistryPage.tsx
19
- var M = ({ level: e, t }) => {
22
+ var P = ({ level: e, t }) => {
20
23
  switch (e) {
21
- case "INTERNAL": return /* @__PURE__ */ x(u, {
24
+ case "INTERNAL": return /* @__PURE__ */ C(f, {
22
25
  variant: "success",
23
26
  className: "flex items-center gap-1",
24
- children: [/* @__PURE__ */ b(A, { size: 12 }), t("botlit.a2aRegistry.trustBadge.internal", "Internal")]
27
+ children: [/* @__PURE__ */ S(M, { size: 12 }), t("botlit.a2aRegistry.trustBadge.internal", "Internal")]
25
28
  });
26
- case "VERIFIED_PUBLISHER": return /* @__PURE__ */ x(u, {
29
+ case "VERIFIED_PUBLISHER": return /* @__PURE__ */ C(f, {
27
30
  variant: "default",
28
31
  className: "flex items-center gap-1",
29
- children: [/* @__PURE__ */ b(w, { size: 12 }), t("botlit.a2aRegistry.trustBadge.verified", "Verified")]
32
+ children: [/* @__PURE__ */ S(E, { size: 12 }), t("botlit.a2aRegistry.trustBadge.verified", "Verified")]
30
33
  });
31
- default: return /* @__PURE__ */ x(u, {
34
+ default: return /* @__PURE__ */ C(f, {
32
35
  variant: "outline",
33
36
  className: "flex items-center gap-1",
34
- children: [/* @__PURE__ */ b(C, { size: 12 }), t("botlit.a2aRegistry.trustBadge.unverified", "Unverified")]
37
+ children: [/* @__PURE__ */ S(T, { size: 12 }), t("botlit.a2aRegistry.trustBadge.unverified", "Unverified")]
35
38
  });
36
39
  }
37
- }, N = () => {
38
- let C = e(), { getPath: w } = t(), [N, P] = _(""), { data: F, loading: I, error: L, refetch: R } = h({ search: N });
39
- return /* @__PURE__ */ b(r, {
40
- title: C("botlit.a2aRegistry.title", "A2A Registry"),
41
- description: C("botlit.a2aRegistry.description", "Discover and connect to external agents via the Agent-to-Agent protocol"),
42
- actions: /* @__PURE__ */ b(l, {
43
- leftIcon: /* @__PURE__ */ b(O, { size: 16 }),
44
- children: /* @__PURE__ */ b(S, {
45
- to: w("a2a/register"),
46
- children: C("botlit.a2aRegistry.actions.registerAgent", "Register Agent")
40
+ }, F = () => {
41
+ let T = e(), { getPath: E } = t(), [F, I] = y(""), { data: L, loading: R, error: z, refetch: B } = _({ search: F });
42
+ return /* @__PURE__ */ S(a, {
43
+ title: T("botlit.a2aRegistry.title", "A2A Registry"),
44
+ description: T("botlit.a2aRegistry.description", "Discover and connect to external agents via the Agent-to-Agent protocol"),
45
+ actions: /* @__PURE__ */ S(i, {
46
+ permission: r.A2A_REGISTRY_CREATE,
47
+ children: /* @__PURE__ */ S(o, {
48
+ leftIcon: /* @__PURE__ */ S(A, { size: 16 }),
49
+ children: /* @__PURE__ */ S(w, {
50
+ to: E("a2a/register"),
51
+ children: T("botlit.a2aRegistry.actions.registerAgent", "Register Agent")
52
+ })
47
53
  })
48
54
  }),
49
- children: /* @__PURE__ */ x("div", {
55
+ children: /* @__PURE__ */ C("div", {
50
56
  className: "space-y-6",
51
57
  children: [
52
- /* @__PURE__ */ b(y, {
53
- icon: /* @__PURE__ */ b(D, { size: 18 }),
54
- children: C("botlit.a2aRegistry.purpose", "The A2A (Agent-to-Agent) registry lets your bots collaborate with external agents — your own or third-party — over a shared open protocol. Register an agent by its /.well-known/agent.json card to discover its skills, set how much you trust it, and let your agents delegate tasks to it. Use this page to curate that network of partner agents.")
58
+ /* @__PURE__ */ S(x, {
59
+ icon: /* @__PURE__ */ S(k, { size: 18 }),
60
+ children: T("botlit.a2aRegistry.purpose", "The A2A (Agent-to-Agent) registry lets your bots collaborate with external agents — your own or third-party — over a shared open protocol. Register an agent by its /.well-known/agent.json card to discover its skills, set how much you trust it, and let your agents delegate tasks to it. Use this page to curate that network of partner agents.")
55
61
  }),
56
- /* @__PURE__ */ x("div", {
62
+ /* @__PURE__ */ C("div", {
57
63
  className: "flex items-center gap-4",
58
- children: [/* @__PURE__ */ x("div", {
64
+ children: [/* @__PURE__ */ C("div", {
59
65
  className: "relative flex-1 max-w-md",
60
- children: [/* @__PURE__ */ b(k, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ b(p, {
61
- placeholder: C("botlit.a2aRegistry.searchPlaceholder", "Search A2A agents..."),
62
- value: N,
63
- onChange: (e) => P(e.target.value),
66
+ children: [/* @__PURE__ */ S(j, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ S(h, {
67
+ placeholder: T("botlit.a2aRegistry.searchPlaceholder", "Search A2A agents..."),
68
+ value: F,
69
+ onChange: (e) => I(e.target.value),
64
70
  className: "pl-9"
65
71
  })]
66
- }), /* @__PURE__ */ b(l, {
72
+ }), /* @__PURE__ */ S(o, {
67
73
  variant: "outline",
68
- leftIcon: /* @__PURE__ */ b(E, { size: 16 }),
69
- children: C("botlit.a2aRegistry.actions.filters", "Filters")
74
+ leftIcon: /* @__PURE__ */ S(O, { size: 16 }),
75
+ children: T("botlit.a2aRegistry.actions.filters", "Filters")
70
76
  })]
71
77
  }),
72
- I ? /* @__PURE__ */ b("div", {
78
+ R ? /* @__PURE__ */ S("div", {
73
79
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
74
80
  children: [
75
81
  1,
76
82
  2,
77
83
  3,
78
84
  4
79
- ].map((e) => /* @__PURE__ */ b("div", { className: "h-56 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
80
- }) : L ? /* @__PURE__ */ b(g, {
85
+ ].map((e) => /* @__PURE__ */ S("div", { className: "h-56 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
86
+ }) : z ? /* @__PURE__ */ S(v, {
81
87
  resource: "the A2A registry",
82
- error: L,
83
- onRetry: () => void R()
84
- }) : F.length > 0 ? /* @__PURE__ */ b("div", {
88
+ error: z,
89
+ onRetry: () => void B()
90
+ }) : L.length > 0 ? /* @__PURE__ */ S("div", {
85
91
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
86
- children: F.map((e) => /* @__PURE__ */ b(S, {
87
- to: w(`a2a/${e.id}`),
88
- children: /* @__PURE__ */ x(i, {
92
+ children: L.map((e) => /* @__PURE__ */ S(w, {
93
+ to: E(`a2a/${e.id}`),
94
+ children: /* @__PURE__ */ C(s, {
89
95
  className: "h-full hover:border-primary/50 transition-colors cursor-pointer",
90
- children: [/* @__PURE__ */ b(s, { children: /* @__PURE__ */ x("div", {
96
+ children: [/* @__PURE__ */ S(u, { children: /* @__PURE__ */ C("div", {
91
97
  className: "flex items-start justify-between",
92
- children: [/* @__PURE__ */ x("div", {
98
+ children: [/* @__PURE__ */ C("div", {
93
99
  className: "flex items-center gap-3",
94
- children: [/* @__PURE__ */ b("div", {
100
+ children: [/* @__PURE__ */ S("div", {
95
101
  className: "p-2 bg-action-primary-bg/10 rounded-lg",
96
- children: /* @__PURE__ */ b(D, { className: "h-5 w-5 text-primary" })
97
- }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b(c, {
102
+ children: /* @__PURE__ */ S(k, { className: "h-5 w-5 text-primary" })
103
+ }), /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S(d, {
98
104
  className: "text-base",
99
105
  children: e.name
100
- }), /* @__PURE__ */ b(o, {
106
+ }), /* @__PURE__ */ S(l, {
101
107
  className: "text-xs line-clamp-2",
102
108
  children: e.description
103
109
  })] })]
104
- }), /* @__PURE__ */ b(d, { status: e.status })]
105
- }) }), /* @__PURE__ */ b(a, { children: /* @__PURE__ */ x("div", {
110
+ }), /* @__PURE__ */ S(p, { status: e.status })]
111
+ }) }), /* @__PURE__ */ S(c, { children: /* @__PURE__ */ C("div", {
106
112
  className: "space-y-3",
107
113
  children: [
108
- /* @__PURE__ */ x("div", {
114
+ /* @__PURE__ */ C("div", {
109
115
  className: "flex items-center justify-between",
110
- children: [/* @__PURE__ */ b("span", {
116
+ children: [/* @__PURE__ */ S("span", {
111
117
  className: "text-sm text-text-secondary",
112
- children: C("botlit.a2aRegistry.list.trustLevel", "Trust Level")
113
- }), /* @__PURE__ */ b(M, {
118
+ children: T("botlit.a2aRegistry.list.trustLevel", "Trust Level")
119
+ }), /* @__PURE__ */ S(P, {
114
120
  level: e.trustLevel,
115
- t: C
121
+ t: T
116
122
  })]
117
123
  }),
118
- /* @__PURE__ */ x("div", {
124
+ /* @__PURE__ */ C("div", {
119
125
  className: "flex items-center justify-between",
120
- children: [/* @__PURE__ */ b("span", {
126
+ children: [/* @__PURE__ */ S("span", {
121
127
  className: "text-sm text-text-secondary",
122
- children: C("botlit.a2aRegistry.list.availableSkills", "Available Skills")
123
- }), /* @__PURE__ */ b(u, {
128
+ children: T("botlit.a2aRegistry.list.availableSkills", "Available Skills")
129
+ }), /* @__PURE__ */ S(f, {
124
130
  variant: "secondary",
125
- children: C("botlit.a2aRegistry.list.skillsCount", "{{count}} skills", { count: m(e) })
131
+ children: T("botlit.a2aRegistry.list.skillsCount", "{{count}} skills", { count: g(e) })
126
132
  })]
127
133
  }),
128
- /* @__PURE__ */ x("div", {
134
+ /* @__PURE__ */ C("div", {
129
135
  className: "flex items-center gap-2 text-sm text-text-secondary",
130
- children: [/* @__PURE__ */ b(T, { size: 14 }), /* @__PURE__ */ b("span", {
136
+ children: [/* @__PURE__ */ S(D, { size: 14 }), /* @__PURE__ */ S("span", {
131
137
  className: "truncate",
132
138
  children: e.wellKnownUrl ?? "—"
133
139
  })]
134
140
  }),
135
- /* @__PURE__ */ x("div", {
141
+ /* @__PURE__ */ C("div", {
136
142
  className: "pt-3 border-t border-border-subtle flex items-center justify-between text-xs text-text-secondary",
137
- children: [/* @__PURE__ */ x("span", { children: [
138
- C("botlit.a2aRegistry.list.added", "Added"),
143
+ children: [/* @__PURE__ */ C("span", { children: [
144
+ T("botlit.a2aRegistry.list.added", "Added"),
139
145
  " ",
140
146
  n(e.createdAt)
141
- ] }), /* @__PURE__ */ x(l, {
142
- variant: "ghost",
143
- size: "sm",
144
- className: "h-7 text-xs",
145
- children: [/* @__PURE__ */ b(j, {
146
- size: 12,
147
- className: "mr-1"
148
- }), C("botlit.a2aRegistry.actions.test", "Test")]
147
+ ] }), /* @__PURE__ */ S(i, {
148
+ permission: r.A2A_REGISTRY_UPDATE,
149
+ children: /* @__PURE__ */ C(o, {
150
+ variant: "ghost",
151
+ size: "sm",
152
+ className: "h-7 text-xs",
153
+ children: [/* @__PURE__ */ S(N, {
154
+ size: 12,
155
+ className: "mr-1"
156
+ }), T("botlit.a2aRegistry.actions.test", "Test")]
157
+ })
149
158
  })]
150
159
  })
151
160
  ]
152
161
  }) })]
153
162
  })
154
163
  }, e.id))
155
- }) : /* @__PURE__ */ b(f, {
164
+ }) : /* @__PURE__ */ S(m, {
156
165
  illustration: "empty-people",
157
- title: C("botlit.a2aRegistry.empty.title", "No A2A agents registered"),
158
- description: C("botlit.a2aRegistry.empty.description", "Register external agents to enable agent-to-agent communication and delegation."),
159
- action: /* @__PURE__ */ b(l, {
160
- leftIcon: /* @__PURE__ */ b(O, { size: 16 }),
161
- children: /* @__PURE__ */ b(S, {
162
- to: w("a2a/register"),
163
- children: C("botlit.a2aRegistry.actions.registerAgent", "Register Agent")
166
+ title: T("botlit.a2aRegistry.empty.title", "No A2A agents registered"),
167
+ description: T("botlit.a2aRegistry.empty.description", "Register external agents to enable agent-to-agent communication and delegation."),
168
+ action: /* @__PURE__ */ S(i, {
169
+ permission: r.A2A_REGISTRY_CREATE,
170
+ children: /* @__PURE__ */ S(o, {
171
+ leftIcon: /* @__PURE__ */ S(A, { size: 16 }),
172
+ children: /* @__PURE__ */ S(w, {
173
+ to: E("a2a/register"),
174
+ children: T("botlit.a2aRegistry.actions.registerAgent", "Register Agent")
175
+ })
164
176
  })
165
177
  })
166
178
  }),
167
- /* @__PURE__ */ x(v, {
179
+ /* @__PURE__ */ C(b, {
168
180
  treatment: "glass",
169
181
  glow: !0,
170
182
  className: "p-6",
171
- children: [/* @__PURE__ */ x("div", {
183
+ children: [/* @__PURE__ */ C("div", {
172
184
  className: "mb-4",
173
- children: [/* @__PURE__ */ x("h2", {
185
+ children: [/* @__PURE__ */ C("h2", {
174
186
  className: "flex items-center gap-2 text-lg font-semibold tracking-tight text-text-primary",
175
- children: [/* @__PURE__ */ b(D, { size: 18 }), C("botlit.a2aRegistry.overview.title", "Agent-to-Agent Protocol")]
176
- }), /* @__PURE__ */ b("p", {
187
+ children: [/* @__PURE__ */ S(k, { size: 18 }), T("botlit.a2aRegistry.overview.title", "Agent-to-Agent Protocol")]
188
+ }), /* @__PURE__ */ S("p", {
177
189
  className: "text-sm text-text-secondary",
178
- children: C("botlit.a2aRegistry.overview.description", "A2A enables secure communication between agents across different systems")
190
+ children: T("botlit.a2aRegistry.overview.description", "A2A enables secure communication between agents across different systems")
179
191
  })]
180
- }), /* @__PURE__ */ x("div", {
192
+ }), /* @__PURE__ */ C("div", {
181
193
  className: "grid grid-cols-1 md:grid-cols-3 gap-6",
182
194
  children: [
183
- /* @__PURE__ */ x("div", {
195
+ /* @__PURE__ */ C("div", {
184
196
  className: "space-y-2",
185
- children: [/* @__PURE__ */ x("h4", {
197
+ children: [/* @__PURE__ */ C("h4", {
186
198
  className: "font-medium flex items-center gap-2",
187
- children: [/* @__PURE__ */ b(A, {
199
+ children: [/* @__PURE__ */ S(M, {
188
200
  size: 16,
189
201
  className: "text-primary"
190
- }), C("botlit.a2aRegistry.overview.trustTitle", "Trust Levels")]
191
- }), /* @__PURE__ */ b("ul", {
202
+ }), T("botlit.a2aRegistry.overview.trustTitle", "Trust Levels")]
203
+ }), /* @__PURE__ */ S("ul", {
192
204
  className: "text-sm text-text-secondary space-y-1",
193
- children: /* @__PURE__ */ b("li", { children: C("botlit.a2aRegistry.overview.trustDescription", "Internal: your own agents; Verified: publisher verified by BotManor; Unverified: community agents.") })
205
+ children: /* @__PURE__ */ S("li", { children: T("botlit.a2aRegistry.overview.trustDescription", "Internal: your own agents; Verified: publisher verified by BotManor; Unverified: community agents.") })
194
206
  })]
195
207
  }),
196
- /* @__PURE__ */ x("div", {
208
+ /* @__PURE__ */ C("div", {
197
209
  className: "space-y-2",
198
- children: [/* @__PURE__ */ x("h4", {
210
+ children: [/* @__PURE__ */ C("h4", {
199
211
  className: "font-medium flex items-center gap-2",
200
- children: [/* @__PURE__ */ b(j, {
212
+ children: [/* @__PURE__ */ S(N, {
201
213
  size: 16,
202
214
  className: "text-primary"
203
- }), C("botlit.a2aRegistry.overview.capabilitiesTitle", "Capabilities")]
204
- }), /* @__PURE__ */ b("ul", {
215
+ }), T("botlit.a2aRegistry.overview.capabilitiesTitle", "Capabilities")]
216
+ }), /* @__PURE__ */ S("ul", {
205
217
  className: "text-sm text-text-secondary space-y-1",
206
- children: /* @__PURE__ */ b("li", { children: C("botlit.a2aRegistry.overview.capabilitiesDescription", "Skill discovery via agent cards, secure task delegation, and structured input/output modes.") })
218
+ children: /* @__PURE__ */ S("li", { children: T("botlit.a2aRegistry.overview.capabilitiesDescription", "Skill discovery via agent cards, secure task delegation, and structured input/output modes.") })
207
219
  })]
208
220
  }),
209
- /* @__PURE__ */ x("div", {
221
+ /* @__PURE__ */ C("div", {
210
222
  className: "space-y-2",
211
- children: [/* @__PURE__ */ x("h4", {
223
+ children: [/* @__PURE__ */ C("h4", {
212
224
  className: "font-medium flex items-center gap-2",
213
- children: [/* @__PURE__ */ b(T, {
225
+ children: [/* @__PURE__ */ S(D, {
214
226
  size: 16,
215
227
  className: "text-primary"
216
- }), C("botlit.a2aRegistry.overview.integrationTitle", "Integration")]
217
- }), /* @__PURE__ */ b("ul", {
228
+ }), T("botlit.a2aRegistry.overview.integrationTitle", "Integration")]
229
+ }), /* @__PURE__ */ S("ul", {
218
230
  className: "text-sm text-text-secondary space-y-1",
219
- children: /* @__PURE__ */ b("li", { children: C("botlit.a2aRegistry.overview.integrationDescription", "Discover via /.well-known/agent.json, automatic capability negotiation, and entitlement-based access control.") })
231
+ children: /* @__PURE__ */ S("li", { children: T("botlit.a2aRegistry.overview.integrationDescription", "Discover via /.well-known/agent.json, automatic capability negotiation, and entitlement-based access control.") })
220
232
  })]
221
233
  })
222
234
  ]
@@ -227,6 +239,6 @@ var M = ({ level: e, t }) => {
227
239
  });
228
240
  };
229
241
  //#endregion
230
- export { N as A2ARegistryPage };
242
+ export { F as A2ARegistryPage };
231
243
 
232
244
  //# sourceMappingURL=A2ARegistryPage.js.map