@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":"StorePackageDetailPage.js","names":[],"sources":["../../../src/botlit/pages/StorePackageDetailPage.tsx"],"sourcesContent":["/**\n * Store Package Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n ArrowLeft,\n Package,\n Download,\n Shield,\n ExternalLink,\n FileText,\n Tag,\n GitBranch,\n CheckCircle,\n AlertTriangle,\n Globe,\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 } from '../components/Badge';\nimport { toast } from 'sonner';\nimport { useStorePackage, useInstallPackage } from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport { InstallMode as GqlInstallMode } from '../../generated/wspace-types';\n\nconst KindLabel: Record<string, string> = {\n APP: 'Bot',\n AGENT: 'Agent',\n MCP_PACK: 'MCP Pack',\n PROMPT_TEMPLATE: 'Prompt Template',\n PROMPT: 'Prompt',\n SKILL: 'Skill',\n RETRIEVAL_PROFILE: 'Retrieval Profile',\n POLICY_BUNDLE: 'Policy Bundle',\n CHANNEL_TEMPLATE: 'Channel Template',\n A2A_AGENT: 'A2A Agent',\n KB_TEMPLATE: 'KB Template',\n KNOWLEDGE_BASE: 'Knowledge Base',\n INTEGRATION: 'Integration',\n TEMPLATE: 'Template',\n TOOL: 'Tool',\n WORKFLOW: 'Workflow',\n};\n\nconst RiskBadge: FC<{ risk: string | undefined }> = ({ risk }) => {\n const variants: Record<string, 'success' | 'warning' | 'destructive'> = {\n low: 'success',\n medium: 'warning',\n high: 'destructive',\n };\n if (!risk) {\n return <Badge variant=\"secondary\">Risk unknown</Badge>;\n }\n return (\n <Badge variant={variants[risk] ?? 'secondary'} className=\"capitalize\">\n {risk} Risk\n </Badge>\n );\n};\n\ninterface PackageDependencyView {\n slug: string;\n version: string;\n}\n\n/**\n * The manifest is free-form JSON on the service, so every field is read\n * defensively — a package published without a section must not blank the page.\n */\ninterface ManifestView {\n name?: string;\n slug?: string;\n description?: string;\n icon?: string;\n license?: string;\n homepage?: string;\n repository?: string;\n authorName?: string;\n authorUrl?: string;\n tags: string[];\n dependencies: PackageDependencyView[];\n compatibility: Record<string, string>;\n risk?: string;\n requiresSecrets: boolean;\n networkEgress?: string;\n checksum?: string;\n signature?: string;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction readManifest(manifest: Record<string, unknown>): ManifestView {\n const info = asRecord(manifest.package);\n const author = asRecord(info.author);\n const security = asRecord(manifest.security);\n const integrity = asRecord(manifest.integrity);\n const compatibilitySource = asRecord(manifest.compatibility);\n\n const compatibility: Record<string, string> = {};\n for (const [key, value] of Object.entries(compatibilitySource)) {\n const text = asString(value);\n if (text) compatibility[key] = text;\n }\n\n const dependencies: PackageDependencyView[] = Array.isArray(manifest.dependencies)\n ? manifest.dependencies.flatMap((entry) => {\n const dep = asRecord(entry);\n const slug = asString(dep.slug);\n return slug ? [{ slug, version: asString(dep.version) ?? '*' }] : [];\n })\n : [];\n\n return {\n name: asString(info.name),\n slug: asString(info.slug),\n description: asString(info.description),\n icon: asString(info.icon),\n license: asString(info.license),\n homepage: asString(info.homepage),\n repository: asString(info.repository),\n authorName: asString(author.name),\n authorUrl: asString(author.url),\n tags: Array.isArray(info.tags)\n ? info.tags.filter((tag): tag is string => typeof tag === 'string')\n : [],\n dependencies,\n compatibility,\n risk: asString(security.risk),\n requiresSecrets: security.requiresSecrets === true,\n networkEgress: asString(asRecord(security.network).egress),\n checksum: asString(integrity.checksum),\n signature: asString(integrity.signature),\n };\n}\n\nexport const StorePackageDetailPage: FC = () => {\n const { slug } = useParams();\n const { navigateTo } = useBotlit();\n const decodedSlug = slug ? decodeURIComponent(slug) : undefined;\n const { data: pkg, loading } = useStorePackage(decodedSlug);\n const { install, loading: installLoading } = useInstallPackage();\n\n const [installMode, setInstallMode] = useState<GqlInstallMode>(GqlInstallMode.Linked);\n const [showInstallDialog, setShowInstallDialog] = useState(false);\n\n const manifest = useMemo(() => readManifest(pkg?.manifest ?? {}), [pkg?.manifest]);\n\n const handleInstall = async () => {\n if (!pkg) return;\n try {\n await install({ packageId: pkg.id, mode: installMode });\n } catch (err) {\n // Keep the dialog open so a failed install is never mistaken for a success.\n toast.error(err instanceof Error ? err.message : 'Failed to install package');\n return;\n }\n toast.success(`Installed \"${manifest.name ?? pkg.slug}\"`);\n setShowInstallDialog(false);\n navigateTo('store/installed');\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 (!pkg) {\n return (\n <PageLayout title=\"Package Not Found\">\n <EmptyState\n illustration=\"empty-search\"\n title=\"Package Not Found\"\n description=\"This package doesn't exist.\"\n action={<Button onClick={() => navigateTo('store')}>Back to Store</Button>}\n />\n </PageLayout>\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('store')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n {manifest.icon ? (\n <span className=\"text-2xl\">{manifest.icon}</span>\n ) : (\n <Package className=\"h-6 w-6 text-primary\" />\n )}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{manifest.name ?? pkg.slug}</span>\n <Badge variant=\"outline\">v{pkg.version}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{pkg.slug}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {manifest.homepage && (\n <a href={manifest.homepage} target=\"_blank\" rel=\"noopener noreferrer\">\n <Button variant=\"outline\" leftIcon={<ExternalLink size={16} />}>\n Homepage\n </Button>\n </a>\n )}\n <Button leftIcon={<Download size={16} />} onClick={() => setShowInstallDialog(true)}>\n Install\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Package size={18} />}>\n This is a store package — a ready-made bot, agent, skill, tool pack or template you can\n install into your workspace. Review what it does, its security posture and version, then\n install it (linked so it stays updated, or forked as your own copy) to get a head start\n instead of building from scratch.\n </PagePurpose>\n\n {/* Overview Cards */}\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 <Badge variant=\"outline\" className=\"text-xs\">\n {KindLabel[pkg.kind] ?? pkg.kind}\n </Badge>\n <p className=\"text-sm text-text-secondary mt-1\">Type</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold\">v{pkg.version}</p>\n <p className=\"text-sm text-text-secondary\">Version</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <RiskBadge risk={manifest.risk} />\n <p className=\"text-sm text-text-secondary mt-1\">Security</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold\">{manifest.license ?? MISSING_VALUE}</p>\n <p className=\"text-sm text-text-secondary\">License</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Description */}\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-text-primary\">{manifest.description ?? MISSING_VALUE}</p>\n {manifest.tags.length > 0 && (\n <div className=\"flex items-center gap-2 mt-4\">\n <Tag size={14} className=\"text-text-secondary\" />\n {manifest.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* README */}\n {pkg.readme && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n README\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n <pre className=\"whitespace-pre-wrap text-sm\">{pkg.readme}</pre>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Author & Links */}\n <Card>\n <CardHeader>\n <CardTitle>Author & Links</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Author</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"font-medium\">{manifest.authorName ?? MISSING_VALUE}</span>\n {manifest.authorUrl && (\n <a\n href={manifest.authorUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n >\n <ExternalLink size={12} />\n </a>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Published</p>\n <p className=\"font-medium mt-1\">{formatRelativeTime(pkg.publishedAt)}</p>\n </div>\n {manifest.repository && (\n <div>\n <p className=\"text-sm text-text-secondary\">Repository</p>\n <a\n href={manifest.repository}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 mt-1 text-primary hover:underline\"\n >\n <GitBranch size={14} />\n View Source\n </a>\n </div>\n )}\n {manifest.homepage && (\n <div>\n <p className=\"text-sm text-text-secondary\">Homepage</p>\n <a\n href={manifest.homepage}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 mt-1 text-primary hover:underline\"\n >\n <Globe size={14} />\n Visit Site\n </a>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n\n {/* Dependencies */}\n {manifest.dependencies.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Dependencies</CardTitle>\n <CardDescription>\n This package depends on {manifest.dependencies.length} other package(s)\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {manifest.dependencies.map((dep) => (\n <Badge key={dep.slug} variant=\"outline\" className=\"font-mono\">\n {dep.slug}@{dep.version}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Compatibility & Security */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CheckCircle size={18} />\n Compatibility\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n {Object.keys(manifest.compatibility).length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n This package does not declare compatibility ranges.\n </p>\n ) : (\n Object.entries(manifest.compatibility).map(([target, range]) => (\n <div key={target} className=\"flex justify-between\">\n <span className=\"text-text-secondary capitalize\">{target}</span>\n <Badge variant=\"outline\">{range}</Badge>\n </div>\n ))\n )}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Security\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Risk Level</span>\n <RiskBadge risk={manifest.risk} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Requires Secrets</span>\n <Badge variant={manifest.requiresSecrets ? 'warning' : 'secondary'}>\n {manifest.requiresSecrets ? 'Yes' : 'No'}\n </Badge>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Network Egress</span>\n <Badge\n variant={\n manifest.networkEgress === 'any'\n ? 'warning'\n : manifest.networkEgress === 'restricted'\n ? 'secondary'\n : 'success'\n }\n className=\"capitalize\"\n >\n {manifest.networkEgress ?? 'unknown'}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Integrity */}\n <Card>\n <CardHeader>\n <CardTitle>Integrity</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div>\n <p className=\"text-sm text-text-secondary\">Checksum</p>\n <p className=\"font-mono text-sm break-all\">{manifest.checksum ?? MISSING_VALUE}</p>\n </div>\n {manifest.signature && (\n <div>\n <p className=\"text-sm text-text-secondary\">Signature</p>\n <p className=\"font-mono text-sm break-all\">{manifest.signature}</p>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Install Dialog */}\n {showInstallDialog && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md\">\n <CardHeader>\n <CardTitle>Install Package</CardTitle>\n <CardDescription>\n Install {manifest.name ?? pkg.slug} v{pkg.version}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-medium mb-2\">Install Mode</p>\n <div className=\"space-y-2\">\n <label className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\">\n <input\n type=\"radio\"\n name=\"mode\"\n value=\"LINKED\"\n checked={installMode === GqlInstallMode.Linked}\n onChange={() => setInstallMode(GqlInstallMode.Linked)}\n className=\"mt-1\"\n />\n <div>\n <p className=\"font-medium\">Linked</p>\n <p className=\"text-sm text-text-secondary\">\n Stay in sync with store updates. Recommended for most cases.\n </p>\n </div>\n </label>\n <label className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\">\n <input\n type=\"radio\"\n name=\"mode\"\n value=\"FORKED\"\n checked={installMode === GqlInstallMode.Forked}\n onChange={() => setInstallMode(GqlInstallMode.Forked)}\n className=\"mt-1\"\n />\n <div>\n <p className=\"font-medium\">Forked</p>\n <p className=\"text-sm text-text-secondary\">\n Create a local copy you can customize. No automatic updates.\n </p>\n </div>\n </label>\n </div>\n </div>\n\n {manifest.requiresSecrets && (\n <div className=\"p-3 bg-status-warning-bg-subtle rounded-lg\">\n <div className=\"flex items-center gap-2 text-status-warning-text\">\n <AlertTriangle size={16} />\n <span className=\"text-sm font-medium\">Requires Secrets</span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n This package requires secret configuration after installation.\n </p>\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 pt-4\">\n <Button variant=\"outline\" onClick={() => setShowInstallDialog(false)}>\n Cancel\n </Button>\n <Button\n onClick={() => void handleInstall()}\n isLoading={installLoading}\n leftIcon={<Download size={16} />}\n >\n Install\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"StorePackageDetailPage.js","names":[],"sources":["../../../src/botlit/pages/StorePackageDetailPage.tsx"],"sourcesContent":["/**\n * Store Package Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n ArrowLeft,\n Package,\n Download,\n Shield,\n ExternalLink,\n FileText,\n Tag,\n GitBranch,\n CheckCircle,\n AlertTriangle,\n Globe,\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 } from '../components/Badge';\nimport { toast } from 'sonner';\nimport { useStorePackage, useInstallPackage } from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport { InstallMode as GqlInstallMode } from '../../generated/wspace-types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst KindLabel: Record<string, string> = {\n APP: 'Bot',\n AGENT: 'Agent',\n MCP_PACK: 'MCP Pack',\n PROMPT_TEMPLATE: 'Prompt Template',\n PROMPT: 'Prompt',\n SKILL: 'Skill',\n RETRIEVAL_PROFILE: 'Retrieval Profile',\n POLICY_BUNDLE: 'Policy Bundle',\n CHANNEL_TEMPLATE: 'Channel Template',\n A2A_AGENT: 'A2A Agent',\n KB_TEMPLATE: 'KB Template',\n KNOWLEDGE_BASE: 'Knowledge Base',\n INTEGRATION: 'Integration',\n TEMPLATE: 'Template',\n TOOL: 'Tool',\n WORKFLOW: 'Workflow',\n};\n\nconst RiskBadge: FC<{ risk: string | undefined }> = ({ risk }) => {\n const variants: Record<string, 'success' | 'warning' | 'destructive'> = {\n low: 'success',\n medium: 'warning',\n high: 'destructive',\n };\n if (!risk) {\n return <Badge variant=\"secondary\">Risk unknown</Badge>;\n }\n return (\n <Badge variant={variants[risk] ?? 'secondary'} className=\"capitalize\">\n {risk} Risk\n </Badge>\n );\n};\n\ninterface PackageDependencyView {\n slug: string;\n version: string;\n}\n\n/**\n * The manifest is free-form JSON on the service, so every field is read\n * defensively — a package published without a section must not blank the page.\n */\ninterface ManifestView {\n name?: string;\n slug?: string;\n description?: string;\n icon?: string;\n license?: string;\n homepage?: string;\n repository?: string;\n authorName?: string;\n authorUrl?: string;\n tags: string[];\n dependencies: PackageDependencyView[];\n compatibility: Record<string, string>;\n risk?: string;\n requiresSecrets: boolean;\n networkEgress?: string;\n checksum?: string;\n signature?: string;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction readManifest(manifest: Record<string, unknown>): ManifestView {\n const info = asRecord(manifest.package);\n const author = asRecord(info.author);\n const security = asRecord(manifest.security);\n const integrity = asRecord(manifest.integrity);\n const compatibilitySource = asRecord(manifest.compatibility);\n\n const compatibility: Record<string, string> = {};\n for (const [key, value] of Object.entries(compatibilitySource)) {\n const text = asString(value);\n if (text) compatibility[key] = text;\n }\n\n const dependencies: PackageDependencyView[] = Array.isArray(manifest.dependencies)\n ? manifest.dependencies.flatMap((entry) => {\n const dep = asRecord(entry);\n const slug = asString(dep.slug);\n return slug ? [{ slug, version: asString(dep.version) ?? '*' }] : [];\n })\n : [];\n\n return {\n name: asString(info.name),\n slug: asString(info.slug),\n description: asString(info.description),\n icon: asString(info.icon),\n license: asString(info.license),\n homepage: asString(info.homepage),\n repository: asString(info.repository),\n authorName: asString(author.name),\n authorUrl: asString(author.url),\n tags: Array.isArray(info.tags)\n ? info.tags.filter((tag): tag is string => typeof tag === 'string')\n : [],\n dependencies,\n compatibility,\n risk: asString(security.risk),\n requiresSecrets: security.requiresSecrets === true,\n networkEgress: asString(asRecord(security.network).egress),\n checksum: asString(integrity.checksum),\n signature: asString(integrity.signature),\n };\n}\n\nexport const StorePackageDetailPage: FC = () => {\n const { slug } = useParams();\n const { navigateTo } = useBotlit();\n const decodedSlug = slug ? decodeURIComponent(slug) : undefined;\n const { data: pkg, loading } = useStorePackage(decodedSlug);\n const { install, loading: installLoading } = useInstallPackage();\n\n const [installMode, setInstallMode] = useState<GqlInstallMode>(GqlInstallMode.Linked);\n const [showInstallDialog, setShowInstallDialog] = useState(false);\n\n const manifest = useMemo(() => readManifest(pkg?.manifest ?? {}), [pkg?.manifest]);\n\n const handleInstall = async () => {\n if (!pkg) return;\n try {\n await install({ packageId: pkg.id, mode: installMode });\n } catch (err) {\n // Keep the dialog open so a failed install is never mistaken for a success.\n toast.error(err instanceof Error ? err.message : 'Failed to install package');\n return;\n }\n toast.success(`Installed \"${manifest.name ?? pkg.slug}\"`);\n setShowInstallDialog(false);\n navigateTo('store/installed');\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 (!pkg) {\n return (\n <PageLayout title=\"Package Not Found\">\n <EmptyState\n illustration=\"empty-search\"\n title=\"Package Not Found\"\n description=\"This package doesn't exist.\"\n action={<Button onClick={() => navigateTo('store')}>Back to Store</Button>}\n />\n </PageLayout>\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('store')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n {manifest.icon ? (\n <span className=\"text-2xl\">{manifest.icon}</span>\n ) : (\n <Package className=\"h-6 w-6 text-primary\" />\n )}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{manifest.name ?? pkg.slug}</span>\n <Badge variant=\"outline\">v{pkg.version}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{pkg.slug}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {manifest.homepage && (\n <a href={manifest.homepage} target=\"_blank\" rel=\"noopener noreferrer\">\n <Button variant=\"outline\" leftIcon={<ExternalLink size={16} />}>\n Homepage\n </Button>\n </a>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.STORE_CREATE}>\n <Button leftIcon={<Download size={16} />} onClick={() => setShowInstallDialog(true)}>\n Install\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Package size={18} />}>\n This is a store package — a ready-made bot, agent, skill, tool pack or template you can\n install into your workspace. Review what it does, its security posture and version, then\n install it (linked so it stays updated, or forked as your own copy) to get a head start\n instead of building from scratch.\n </PagePurpose>\n\n {/* Overview Cards */}\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 <Badge variant=\"outline\" className=\"text-xs\">\n {KindLabel[pkg.kind] ?? pkg.kind}\n </Badge>\n <p className=\"text-sm text-text-secondary mt-1\">Type</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold\">v{pkg.version}</p>\n <p className=\"text-sm text-text-secondary\">Version</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <RiskBadge risk={manifest.risk} />\n <p className=\"text-sm text-text-secondary mt-1\">Security</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold\">{manifest.license ?? MISSING_VALUE}</p>\n <p className=\"text-sm text-text-secondary\">License</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Description */}\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-text-primary\">{manifest.description ?? MISSING_VALUE}</p>\n {manifest.tags.length > 0 && (\n <div className=\"flex items-center gap-2 mt-4\">\n <Tag size={14} className=\"text-text-secondary\" />\n {manifest.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* README */}\n {pkg.readme && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n README\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n <pre className=\"whitespace-pre-wrap text-sm\">{pkg.readme}</pre>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Author & Links */}\n <Card>\n <CardHeader>\n <CardTitle>Author & Links</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Author</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"font-medium\">{manifest.authorName ?? MISSING_VALUE}</span>\n {manifest.authorUrl && (\n <a\n href={manifest.authorUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n >\n <ExternalLink size={12} />\n </a>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Published</p>\n <p className=\"font-medium mt-1\">{formatRelativeTime(pkg.publishedAt)}</p>\n </div>\n {manifest.repository && (\n <div>\n <p className=\"text-sm text-text-secondary\">Repository</p>\n <a\n href={manifest.repository}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 mt-1 text-primary hover:underline\"\n >\n <GitBranch size={14} />\n View Source\n </a>\n </div>\n )}\n {manifest.homepage && (\n <div>\n <p className=\"text-sm text-text-secondary\">Homepage</p>\n <a\n href={manifest.homepage}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 mt-1 text-primary hover:underline\"\n >\n <Globe size={14} />\n Visit Site\n </a>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n\n {/* Dependencies */}\n {manifest.dependencies.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Dependencies</CardTitle>\n <CardDescription>\n This package depends on {manifest.dependencies.length} other package(s)\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {manifest.dependencies.map((dep) => (\n <Badge key={dep.slug} variant=\"outline\" className=\"font-mono\">\n {dep.slug}@{dep.version}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Compatibility & Security */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CheckCircle size={18} />\n Compatibility\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n {Object.keys(manifest.compatibility).length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n This package does not declare compatibility ranges.\n </p>\n ) : (\n Object.entries(manifest.compatibility).map(([target, range]) => (\n <div key={target} className=\"flex justify-between\">\n <span className=\"text-text-secondary capitalize\">{target}</span>\n <Badge variant=\"outline\">{range}</Badge>\n </div>\n ))\n )}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Security\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Risk Level</span>\n <RiskBadge risk={manifest.risk} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Requires Secrets</span>\n <Badge variant={manifest.requiresSecrets ? 'warning' : 'secondary'}>\n {manifest.requiresSecrets ? 'Yes' : 'No'}\n </Badge>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Network Egress</span>\n <Badge\n variant={\n manifest.networkEgress === 'any'\n ? 'warning'\n : manifest.networkEgress === 'restricted'\n ? 'secondary'\n : 'success'\n }\n className=\"capitalize\"\n >\n {manifest.networkEgress ?? 'unknown'}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Integrity */}\n <Card>\n <CardHeader>\n <CardTitle>Integrity</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div>\n <p className=\"text-sm text-text-secondary\">Checksum</p>\n <p className=\"font-mono text-sm break-all\">{manifest.checksum ?? MISSING_VALUE}</p>\n </div>\n {manifest.signature && (\n <div>\n <p className=\"text-sm text-text-secondary\">Signature</p>\n <p className=\"font-mono text-sm break-all\">{manifest.signature}</p>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Install Dialog */}\n {showInstallDialog && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md\">\n <CardHeader>\n <CardTitle>Install Package</CardTitle>\n <CardDescription>\n Install {manifest.name ?? pkg.slug} v{pkg.version}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-medium mb-2\">Install Mode</p>\n <div className=\"space-y-2\">\n <label className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\">\n <input\n type=\"radio\"\n name=\"mode\"\n value=\"LINKED\"\n checked={installMode === GqlInstallMode.Linked}\n onChange={() => setInstallMode(GqlInstallMode.Linked)}\n className=\"mt-1\"\n />\n <div>\n <p className=\"font-medium\">Linked</p>\n <p className=\"text-sm text-text-secondary\">\n Stay in sync with store updates. Recommended for most cases.\n </p>\n </div>\n </label>\n <label className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\">\n <input\n type=\"radio\"\n name=\"mode\"\n value=\"FORKED\"\n checked={installMode === GqlInstallMode.Forked}\n onChange={() => setInstallMode(GqlInstallMode.Forked)}\n className=\"mt-1\"\n />\n <div>\n <p className=\"font-medium\">Forked</p>\n <p className=\"text-sm text-text-secondary\">\n Create a local copy you can customize. No automatic updates.\n </p>\n </div>\n </label>\n </div>\n </div>\n\n {manifest.requiresSecrets && (\n <div className=\"p-3 bg-status-warning-bg-subtle rounded-lg\">\n <div className=\"flex items-center gap-2 text-status-warning-text\">\n <AlertTriangle size={16} />\n <span className=\"text-sm font-medium\">Requires Secrets</span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n This package requires secret configuration after installation.\n </p>\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 pt-4\">\n <Button variant=\"outline\" onClick={() => setShowInstallDialog(false)}>\n Cancel\n </Button>\n <Button\n onClick={() => void handleInstall()}\n isLoading={installLoading}\n leftIcon={<Download size={16} />}\n >\n Install\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}