@burdenoff/microfe-botmanor 2026.813.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +12 -0
  2. package/dist/botlit/BotlitRoutes.js +357 -0
  3. package/dist/botlit/BotlitRoutes.js.map +1 -0
  4. package/dist/botlit/BotmanorRoot.js +12 -0
  5. package/dist/botlit/BotmanorRoot.js.map +1 -0
  6. package/dist/botlit/BotmanorRootInner.js +101 -0
  7. package/dist/botlit/BotmanorRootInner.js.map +1 -0
  8. package/dist/botlit/components/Badge.js +39 -0
  9. package/dist/botlit/components/Badge.js.map +1 -0
  10. package/dist/botlit/components/Button.js +46 -0
  11. package/dist/botlit/components/Button.js.map +1 -0
  12. package/dist/botlit/components/Card.js +31 -0
  13. package/dist/botlit/components/Card.js.map +1 -0
  14. package/dist/botlit/components/ChannelSelectorSheet.js +130 -0
  15. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -0
  16. package/dist/botlit/components/EmptyState.js +35 -0
  17. package/dist/botlit/components/EmptyState.js.map +1 -0
  18. package/dist/botlit/components/ErrorState.js +33 -0
  19. package/dist/botlit/components/ErrorState.js.map +1 -0
  20. package/dist/botlit/components/Input.js +59 -0
  21. package/dist/botlit/components/Input.js.map +1 -0
  22. package/dist/botlit/components/PageLayout.js +34 -0
  23. package/dist/botlit/components/PageLayout.js.map +1 -0
  24. package/dist/botlit/components/QuotaExhaustedDialog.js +20 -0
  25. package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -0
  26. package/dist/botlit/components/RouteLoader.js +52 -0
  27. package/dist/botlit/components/RouteLoader.js.map +1 -0
  28. package/dist/botlit/components/VersionHistoryPanel.js +144 -0
  29. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -0
  30. package/dist/botlit/components/WorkspaceRequired.js +70 -0
  31. package/dist/botlit/components/WorkspaceRequired.js.map +1 -0
  32. package/dist/botlit/hooks/index.js +16 -0
  33. package/dist/botlit/hooks/internal/mutationInput.js +16 -0
  34. package/dist/botlit/hooks/internal/mutationInput.js.map +1 -0
  35. package/dist/botlit/hooks/internal/workspaceGateway.js +99 -0
  36. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -0
  37. package/dist/botlit/hooks/useA2A.js +184 -0
  38. package/dist/botlit/hooks/useA2A.js.map +1 -0
  39. package/dist/botlit/hooks/useAgents.js +469 -0
  40. package/dist/botlit/hooks/useAgents.js.map +1 -0
  41. package/dist/botlit/hooks/useBots.js +306 -0
  42. package/dist/botlit/hooks/useBots.js.map +1 -0
  43. package/dist/botlit/hooks/useBuckets.js +119 -0
  44. package/dist/botlit/hooks/useBuckets.js.map +1 -0
  45. package/dist/botlit/hooks/useChannels.js +213 -0
  46. package/dist/botlit/hooks/useChannels.js.map +1 -0
  47. package/dist/botlit/hooks/useConversations.js +64 -0
  48. package/dist/botlit/hooks/useConversations.js.map +1 -0
  49. package/dist/botlit/hooks/useExecutions.js +86 -0
  50. package/dist/botlit/hooks/useExecutions.js.map +1 -0
  51. package/dist/botlit/hooks/useKnowledgeBases.js +113 -0
  52. package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -0
  53. package/dist/botlit/hooks/useLLMProviders.js +83 -0
  54. package/dist/botlit/hooks/useLLMProviders.js.map +1 -0
  55. package/dist/botlit/hooks/useMCPServers.js +134 -0
  56. package/dist/botlit/hooks/useMCPServers.js.map +1 -0
  57. package/dist/botlit/hooks/usePolicies.js +120 -0
  58. package/dist/botlit/hooks/usePolicies.js.map +1 -0
  59. package/dist/botlit/hooks/usePromptTemplates.js +161 -0
  60. package/dist/botlit/hooks/usePromptTemplates.js.map +1 -0
  61. package/dist/botlit/hooks/useRetrievalProfiles.js +146 -0
  62. package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -0
  63. package/dist/botlit/hooks/useSkills.js +132 -0
  64. package/dist/botlit/hooks/useSkills.js.map +1 -0
  65. package/dist/botlit/hooks/useStore.js +167 -0
  66. package/dist/botlit/hooks/useStore.js.map +1 -0
  67. package/dist/botlit/hooks/useUserPlatformConnection.js +172 -0
  68. package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -0
  69. package/dist/botlit/index.js +11 -0
  70. package/dist/botlit/pages/A2AAgentDetailPage.js +589 -0
  71. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -0
  72. package/dist/botlit/pages/A2ARegistryPage.js +240 -0
  73. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -0
  74. package/dist/botlit/pages/AgentBuilderPage.js +486 -0
  75. package/dist/botlit/pages/AgentBuilderPage.js.map +1 -0
  76. package/dist/botlit/pages/AgentDetailPage.js +517 -0
  77. package/dist/botlit/pages/AgentDetailPage.js.map +1 -0
  78. package/dist/botlit/pages/AgentsListPage.js +294 -0
  79. package/dist/botlit/pages/AgentsListPage.js.map +1 -0
  80. package/dist/botlit/pages/BotChannelsTab.js +530 -0
  81. package/dist/botlit/pages/BotChannelsTab.js.map +1 -0
  82. package/dist/botlit/pages/BotDetailPage.js +872 -0
  83. package/dist/botlit/pages/BotDetailPage.js.map +1 -0
  84. package/dist/botlit/pages/BotWorkflowTab.js +229 -0
  85. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -0
  86. package/dist/botlit/pages/BotsListPage.js +313 -0
  87. package/dist/botlit/pages/BotsListPage.js.map +1 -0
  88. package/dist/botlit/pages/BucketsPage.js +604 -0
  89. package/dist/botlit/pages/BucketsPage.js.map +1 -0
  90. package/dist/botlit/pages/ChannelDetailPage.js +955 -0
  91. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -0
  92. package/dist/botlit/pages/ChannelRoutesPage.js +218 -0
  93. package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -0
  94. package/dist/botlit/pages/ChannelsPage.js +304 -0
  95. package/dist/botlit/pages/ChannelsPage.js.map +1 -0
  96. package/dist/botlit/pages/ChatPage.js +247 -0
  97. package/dist/botlit/pages/ChatPage.js.map +1 -0
  98. package/dist/botlit/pages/DashboardPage.js +318 -0
  99. package/dist/botlit/pages/DashboardPage.js.map +1 -0
  100. package/dist/botlit/pages/ExecutionDetailPage.js +313 -0
  101. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -0
  102. package/dist/botlit/pages/ExecutionsPage.js +294 -0
  103. package/dist/botlit/pages/ExecutionsPage.js.map +1 -0
  104. package/dist/botlit/pages/InstalledPackagesPage.js +619 -0
  105. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -0
  106. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +473 -0
  107. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -0
  108. package/dist/botlit/pages/KnowledgeBasesPage.js +150 -0
  109. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -0
  110. package/dist/botlit/pages/MCPServerDetailPage.js +550 -0
  111. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -0
  112. package/dist/botlit/pages/MCPServersPage.js +321 -0
  113. package/dist/botlit/pages/MCPServersPage.js.map +1 -0
  114. package/dist/botlit/pages/PoliciesPage.js +224 -0
  115. package/dist/botlit/pages/PoliciesPage.js.map +1 -0
  116. package/dist/botlit/pages/PolicyDetailPage.js +861 -0
  117. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -0
  118. package/dist/botlit/pages/PromptStudioPage.js +236 -0
  119. package/dist/botlit/pages/PromptStudioPage.js.map +1 -0
  120. package/dist/botlit/pages/PromptTemplateDetailPage.js +812 -0
  121. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -0
  122. package/dist/botlit/pages/PromptTemplatesPage.js +269 -0
  123. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -0
  124. package/dist/botlit/pages/RetrievalProfileDetailPage.js +559 -0
  125. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -0
  126. package/dist/botlit/pages/RetrievalProfilesPage.js +219 -0
  127. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -0
  128. package/dist/botlit/pages/SettingsPage.js +655 -0
  129. package/dist/botlit/pages/SettingsPage.js.map +1 -0
  130. package/dist/botlit/pages/SkillDetailPage.js +778 -0
  131. package/dist/botlit/pages/SkillDetailPage.js.map +1 -0
  132. package/dist/botlit/pages/SkillsPage.js +206 -0
  133. package/dist/botlit/pages/SkillsPage.js.map +1 -0
  134. package/dist/botlit/pages/StorePackageDetailPage.js +462 -0
  135. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -0
  136. package/dist/botlit/pages/StorePage.js +315 -0
  137. package/dist/botlit/pages/StorePage.js.map +1 -0
  138. package/dist/botlit/providers/BotlitProvider.js +93 -0
  139. package/dist/botlit/providers/BotlitProvider.js.map +1 -0
  140. package/dist/botlit/store/botlitStore.js +101 -0
  141. package/dist/botlit/store/botlitStore.js.map +1 -0
  142. package/dist/botlit/utils/cn.js +10 -0
  143. package/dist/botlit/utils/cn.js.map +1 -0
  144. package/dist/botlit/utils/formatters.js +37 -0
  145. package/dist/botlit/utils/formatters.js.map +1 -0
  146. package/dist/botlit/utils/navigation.js +9 -0
  147. package/dist/botlit/utils/navigation.js.map +1 -0
  148. package/dist/botlit/utils/unions.js +14 -0
  149. package/dist/botlit/utils/unions.js.map +1 -0
  150. package/dist/generated/global-operations.js +66 -0
  151. package/dist/generated/global-operations.js.map +1 -0
  152. package/dist/generated/global-types.js +8 -0
  153. package/dist/generated/global-types.js.map +1 -0
  154. package/dist/generated/wspace-operations.js +1591 -0
  155. package/dist/generated/wspace-operations.js.map +1 -0
  156. package/dist/generated/wspace-types.js +12 -0
  157. package/dist/generated/wspace-types.js.map +1 -0
  158. package/dist/index.js +13 -0
  159. package/dist/utils/nativeBridge.js +2 -0
  160. package/package.json +133 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionsPage.js","names":[],"sources":["../../../src/botlit/pages/ExecutionsPage.tsx"],"sourcesContent":["/**\n * Executions Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Search as SearchIcon,\n Activity,\n CheckCircle,\n XCircle,\n Clock,\n DollarSign,\n Zap,\n RefreshCw,\n TrendingUp,\n Hourglass,\n} from 'lucide-react';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardContent } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input } from '../components/Input';\nimport { Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport { useExecutions, summariseExecutions, type ExecutionRecord } from '../hooks';\nimport {\n formatNumber,\n formatRelativeTime,\n formatCurrency,\n formatDuration,\n MISSING_VALUE,\n} from '../utils/formatters';\nimport { ExecutionStatus as GqlExecutionStatus } from '../../generated/wspace-types';\n\n/**\n * The statuses wspace-botlit-svc actually reports. These MUST match the\n * `ExecutionStatus` enum in the supergraph — sending anything else fails\n * GraphQL validation at the gateway.\n */\nconst EXECUTION_STATUSES: GqlExecutionStatus[] = [\n GqlExecutionStatus.Completed,\n GqlExecutionStatus.Running,\n GqlExecutionStatus.Pending,\n GqlExecutionStatus.Failed,\n GqlExecutionStatus.Timeout,\n GqlExecutionStatus.Cancelled,\n];\n\nconst STATUS_LABELS: Record<GqlExecutionStatus, string> = {\n [GqlExecutionStatus.Completed]: 'Completed',\n [GqlExecutionStatus.Running]: 'Running',\n [GqlExecutionStatus.Pending]: 'Pending',\n [GqlExecutionStatus.Failed]: 'Failed',\n [GqlExecutionStatus.Timeout]: 'Timed out',\n [GqlExecutionStatus.Cancelled]: 'Cancelled',\n};\n\nconst StatusIcon: FC<{ status: string; className?: string }> = ({ status, className }) => {\n switch (status) {\n case GqlExecutionStatus.Completed:\n return <CheckCircle className={className ?? 'h-4 w-4 text-status-success-text'} />;\n case GqlExecutionStatus.Failed:\n case GqlExecutionStatus.Timeout:\n return <XCircle className={className ?? 'h-4 w-4 text-status-error-text'} />;\n case GqlExecutionStatus.Running:\n return (\n <RefreshCw\n className={className ?? 'h-4 w-4 text-status-info-text motion-safe:animate-spin'}\n />\n );\n case GqlExecutionStatus.Pending:\n return <Hourglass className={className ?? 'h-4 w-4 text-status-warning-text'} />;\n default:\n return <Activity className={className ?? 'h-4 w-4 text-text-secondary'} />;\n }\n};\n\nconst StatusBadge: FC<{ status: string }> = ({ status }) => {\n const variants: Record<string, 'success' | 'destructive' | 'warning' | 'secondary' | 'default'> =\n {\n [GqlExecutionStatus.Completed]: 'success',\n [GqlExecutionStatus.Failed]: 'destructive',\n [GqlExecutionStatus.Timeout]: 'destructive',\n [GqlExecutionStatus.Running]: 'default',\n [GqlExecutionStatus.Pending]: 'warning',\n [GqlExecutionStatus.Cancelled]: 'secondary',\n };\n\n return (\n <Badge variant={variants[status] ?? 'secondary'} className=\"flex items-center gap-1\">\n <StatusIcon status={status} />\n {STATUS_LABELS[status as GqlExecutionStatus] ?? status}\n </Badge>\n );\n};\n\nexport const ExecutionsPage: FC = () => {\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState<GqlExecutionStatus[]>([]);\n\n const filter = useMemo(\n () => ({ search, status: statusFilter as string[] }),\n [search, statusFilter]\n );\n const { data: executions, loading, error, refetch } = useExecutions(filter);\n\n // No server-side aggregate exists for executions — these numbers describe the\n // runs currently loaded, and the caption below says so.\n const rollup = useMemo(() => summariseExecutions(executions), [executions]);\n\n return (\n <PageLayout\n title=\"Executions\"\n description=\"Monitor agent execution history, performance, and costs\"\n actions={\n <Button variant=\"outline\" leftIcon={<RefreshCw size={16} />} onClick={() => void refetch()}>\n Refresh\n </Button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Activity size={18} />}>\n An execution is a single run of an agent — one request in, one response out. This page is\n your observability and cost dashboard: see which runs succeeded or failed, how long they\n took, how many tokens they burned and what they cost. Use it to spot failing agents,\n runaway spend and latency regressions, then open any run to inspect its full trace.\n </PagePurpose>\n\n {/* Stats over the loaded runs */}\n {rollup.total > 0 && (\n <div className=\"space-y-2\">\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">Executions</p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatNumber(rollup.total)}\n </p>\n </div>\n <Activity className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">Success Rate</p>\n <p className=\"text-2xl font-bold tabular-nums text-status-success-text\">\n {(rollup.successRate * 100).toFixed(1)}%\n </p>\n </div>\n <TrendingUp className=\"h-8 w-8 text-status-success-text\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">Avg Duration</p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatDuration(rollup.avgDurationMs)}\n </p>\n </div>\n <Clock className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">Total Cost</p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatCurrency(rollup.totalCost)}\n </p>\n </div>\n <DollarSign className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n </div>\n <p className=\"text-xs text-text-secondary\">\n Calculated across the {formatNumber(rollup.total)} runs shown below.\n </p>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search by run, agent, bot or input…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {EXECUTION_STATUSES.map((status) => (\n <Button\n key={status}\n variant={statusFilter.includes(status) ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() =>\n setStatusFilter((prev) =>\n prev.includes(status) ? prev.filter((s) => s !== status) : [...prev, status]\n )\n }\n >\n <StatusIcon status={status} />\n <span className=\"ml-1\">{STATUS_LABELS[status]}</span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Executions List */}\n {loading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className=\"h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"executions\" error={error} onRetry={() => void refetch()} />\n ) : executions.length > 0 ? (\n <div className=\"space-y-2\">\n {/* Table Header */}\n <div className=\"grid grid-cols-12 gap-4 px-4 py-2 text-sm font-medium text-text-secondary border-b border-border-subtle\">\n <div className=\"col-span-2\">Status</div>\n <div className=\"col-span-3\">Bot / Agent</div>\n <div className=\"col-span-2\">Duration</div>\n <div className=\"col-span-2\">Tokens</div>\n <div className=\"col-span-1\">Cost</div>\n <div className=\"col-span-2\">Started</div>\n </div>\n\n {/* Table Rows */}\n {executions.map((execution: ExecutionRecord) => (\n <Link key={execution.id} to={getPath(`executions/${execution.id}`)}>\n <Card className=\"hover:border-primary/50 transition-colors cursor-pointer\">\n <CardContent className=\"py-3\">\n <div className=\"grid grid-cols-12 gap-4 items-center\">\n <div className=\"col-span-2\">\n <StatusBadge status={execution.status} />\n </div>\n <div className=\"col-span-3\">\n <p className=\"font-medium truncate\">{execution.appId ?? MISSING_VALUE}</p>\n <p className=\"text-sm text-text-secondary truncate\">\n {execution.agentId ?? MISSING_VALUE}\n </p>\n </div>\n <div className=\"col-span-2\">\n <div className=\"flex items-center gap-1\">\n <Clock size={14} className=\"text-text-secondary\" />\n <span>{formatDuration(execution.duration)}</span>\n </div>\n </div>\n <div className=\"col-span-2\">\n <div className=\"flex items-center gap-1\">\n <Zap size={14} className=\"text-text-secondary\" />\n <span>{formatNumber(execution.tokensUsed)}</span>\n </div>\n </div>\n <div className=\"col-span-1\">\n <div className=\"flex items-center gap-1\">\n <DollarSign size={14} className=\"text-text-secondary\" />\n <span>{formatCurrency(execution.cost)}</span>\n </div>\n </div>\n <div className=\"col-span-2 text-sm text-text-secondary\">\n {formatRelativeTime(execution.createdAt)}\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No executions found\"\n description={\n statusFilter.length > 0 || search\n ? 'No executions match your filters. Try adjusting your search.'\n : 'Executions will appear here when agents process requests.'\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,619 @@
1
+ import { useBotlit as e } from "../providers/BotlitProvider.js";
2
+ import { formatRelativeTime as t } from "../utils/formatters.js";
3
+ import { PageLayout as n } from "../components/PageLayout.js";
4
+ import { Card as r, CardContent as i, CardDescription as a, CardHeader as o, CardTitle as s } from "../components/Card.js";
5
+ import { Button as c } from "../components/Button.js";
6
+ import { Badge as l } from "../components/Badge.js";
7
+ import { EmptyState as u } from "../components/EmptyState.js";
8
+ import { Input as d } from "../components/Input.js";
9
+ import { ErrorState as f } from "../components/ErrorState.js";
10
+ import { storePackageName as p, useInstalledPackages as ee, usePinPackageVersion as m, useUninstallPackage as te, useUpdateInstalledPackage as h } from "../hooks/useStore.js";
11
+ import "../hooks/index.js";
12
+ import { PackageKind as g } from "../../generated/wspace-types.js";
13
+ import { useMemo as _, useState as v } from "react";
14
+ import { GlassCard as y, PagePurpose as ne } from "@burdenoff/fe-libs/ui";
15
+ import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
16
+ import { Link as re } from "react-router";
17
+ import { ArrowUpCircle as C, Copy as ie, Download as ae, ExternalLink as oe, GitBranch as w, Link2 as T, Package as E, RefreshCw as se, Search as ce, Settings as le, Trash2 as D } from "lucide-react";
18
+ import { toast as O } from "sonner";
19
+ //#region src/botlit/pages/InstalledPackagesPage.tsx
20
+ var k = [
21
+ "DEV",
22
+ "STAGING",
23
+ "PROD"
24
+ ], A = {
25
+ APP: {
26
+ label: "Bot",
27
+ icon: "📱"
28
+ },
29
+ AGENT: {
30
+ label: "Agent",
31
+ icon: "🤖"
32
+ },
33
+ SKILL: {
34
+ label: "Skill",
35
+ icon: "⚡"
36
+ },
37
+ MCP_PACK: {
38
+ label: "MCP Pack",
39
+ icon: "🔧"
40
+ },
41
+ PROMPT_TEMPLATE: {
42
+ label: "Template",
43
+ icon: "📝"
44
+ },
45
+ PROMPT: {
46
+ label: "Prompt",
47
+ icon: "📝"
48
+ },
49
+ RETRIEVAL_PROFILE: {
50
+ label: "Retrieval",
51
+ icon: "🔍"
52
+ },
53
+ POLICY_BUNDLE: {
54
+ label: "Policy",
55
+ icon: "🛡️"
56
+ },
57
+ CHANNEL_TEMPLATE: {
58
+ label: "Channel",
59
+ icon: "📡"
60
+ },
61
+ A2A_AGENT: {
62
+ label: "A2A Agent",
63
+ icon: "🔗"
64
+ },
65
+ KB_TEMPLATE: {
66
+ label: "KB Template",
67
+ icon: "📚"
68
+ },
69
+ KNOWLEDGE_BASE: {
70
+ label: "Knowledge Base",
71
+ icon: "📚"
72
+ },
73
+ INTEGRATION: {
74
+ label: "Integration",
75
+ icon: "🔌"
76
+ },
77
+ TEMPLATE: {
78
+ label: "Template",
79
+ icon: "📝"
80
+ },
81
+ TOOL: {
82
+ label: "Tool",
83
+ icon: "🔧"
84
+ },
85
+ WORKFLOW: {
86
+ label: "Workflow",
87
+ icon: "🔀"
88
+ }
89
+ }, j = {
90
+ label: "Package",
91
+ icon: "📦"
92
+ };
93
+ function M(e) {
94
+ return e.package?.slug ?? e.packageId;
95
+ }
96
+ function N(e) {
97
+ return e.package?.kind;
98
+ }
99
+ function P(e) {
100
+ let t = N(e);
101
+ return t && A[t] || j;
102
+ }
103
+ function F(e) {
104
+ let t = e.package?.version;
105
+ return !!(t && t !== e.installedVersion);
106
+ }
107
+ function I(e, t) {
108
+ let n = e.pinnedByEnv?.[t];
109
+ return typeof n == "string" && n !== "" ? n : void 0;
110
+ }
111
+ var L = () => {
112
+ let { navigateTo: A, getPath: j } = e(), { data: L, loading: R, error: z, refetch: B } = ee(), { uninstall: V, loading: H } = te(), { update: U, loading: ue } = h(), { pin: de } = m(), [W, fe] = v(""), [pe, G] = v(!1), [K, me] = v("all"), [q, J] = v(null), Y = _(() => {
113
+ let e = W.trim().toLowerCase();
114
+ return L.filter((t) => {
115
+ let n = !e || M(t).toLowerCase().includes(e) || p(t.package).toLowerCase().includes(e), r = K === "all" || N(t) === K;
116
+ return n && r;
117
+ });
118
+ }, [
119
+ L,
120
+ W,
121
+ K
122
+ ]), X = _(() => L.find((e) => e.id === q) ?? null, [L, q]), he = _(() => L.filter(F).length, [L]), ge = async () => {
123
+ G(!0);
124
+ try {
125
+ await B();
126
+ } finally {
127
+ G(!1);
128
+ }
129
+ }, Z = async (e) => {
130
+ if (confirm("Are you sure you want to uninstall this package?")) try {
131
+ await V(e.id), O.success(`Uninstalled "${p(e.package) || M(e)}"`), J(null), B();
132
+ } catch (e) {
133
+ O.error(e instanceof Error ? e.message : "Failed to uninstall package");
134
+ }
135
+ }, _e = async (e) => {
136
+ let t = e.package?.version;
137
+ if (t) try {
138
+ await U({
139
+ installedId: e.id,
140
+ input: { installedVersion: t }
141
+ }), O.success(`Updated to v${t}`), B();
142
+ } catch (e) {
143
+ O.error(e instanceof Error ? e.message : "Failed to update package");
144
+ }
145
+ }, Q = async (e, t, n) => {
146
+ try {
147
+ await de({
148
+ installedId: e.id,
149
+ environment: t,
150
+ version: n,
151
+ pinnedByEnv: e.pinnedByEnv
152
+ }), O.success(n ? `Pinned ${t} to v${n}` : `Unpinned ${t}`), B();
153
+ } catch (e) {
154
+ O.error(e instanceof Error ? e.message : "Failed to change version pin");
155
+ }
156
+ }, $ = (e) => e === "LINKED" ? /* @__PURE__ */ x(T, { className: "h-4 w-4 text-status-info-text" }) : /* @__PURE__ */ x(ie, { className: "h-4 w-4 text-status-warning-text" }), ve = ({ pkg: e }) => {
157
+ let n = P(e), a = M(e), o = F(e), s = k.filter((t) => I(e, t));
158
+ return /* @__PURE__ */ x(r, {
159
+ className: "hover:shadow-md transition-shadow cursor-pointer",
160
+ onClick: () => J(e.id),
161
+ children: /* @__PURE__ */ S(i, {
162
+ className: "pt-6",
163
+ children: [
164
+ /* @__PURE__ */ S("div", {
165
+ className: "flex items-start justify-between",
166
+ children: [/* @__PURE__ */ S("div", {
167
+ className: "flex items-start gap-3",
168
+ children: [/* @__PURE__ */ x("div", {
169
+ className: "p-2 rounded-lg bg-bg-sunken text-2xl",
170
+ children: n.icon
171
+ }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
172
+ className: "flex items-center gap-2",
173
+ children: [/* @__PURE__ */ x("h3", {
174
+ className: "font-semibold",
175
+ children: p(e.package) || a
176
+ }), o && /* @__PURE__ */ S(l, {
177
+ variant: "warning",
178
+ className: "gap-1",
179
+ children: [/* @__PURE__ */ x(C, { className: "h-3 w-3" }), "Update"]
180
+ })]
181
+ }), /* @__PURE__ */ x("p", {
182
+ className: "text-sm text-text-secondary font-mono",
183
+ children: a
184
+ })] })]
185
+ }), /* @__PURE__ */ S("div", {
186
+ className: "flex items-center gap-2",
187
+ children: [$(e.mode), /* @__PURE__ */ x(l, {
188
+ variant: "outline",
189
+ children: n.label
190
+ })]
191
+ })]
192
+ }),
193
+ /* @__PURE__ */ S("div", {
194
+ className: "mt-4 grid grid-cols-3 gap-4 text-sm",
195
+ children: [
196
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
197
+ className: "text-text-secondary",
198
+ children: "Installed Version"
199
+ }), /* @__PURE__ */ S("p", {
200
+ className: "font-medium font-mono",
201
+ children: ["v", e.installedVersion]
202
+ })] }),
203
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
204
+ className: "text-text-secondary",
205
+ children: "Mode"
206
+ }), /* @__PURE__ */ S("p", {
207
+ className: "font-medium flex items-center gap-1",
208
+ children: [$(e.mode), e.mode]
209
+ })] }),
210
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
211
+ className: "text-text-secondary",
212
+ children: "Installed"
213
+ }), /* @__PURE__ */ x("p", {
214
+ className: "font-medium",
215
+ children: t(e.installedAt)
216
+ })] })
217
+ ]
218
+ }),
219
+ s.length > 0 && /* @__PURE__ */ S("div", {
220
+ className: "mt-4 pt-4 border-t border-border-subtle",
221
+ children: [/* @__PURE__ */ x("p", {
222
+ className: "text-xs text-text-secondary mb-2",
223
+ children: "Pinned Versions"
224
+ }), /* @__PURE__ */ x("div", {
225
+ className: "flex gap-2",
226
+ children: k.map((t) => {
227
+ let n = I(e, t);
228
+ return /* @__PURE__ */ S(l, {
229
+ variant: n ? "default" : "outline",
230
+ className: "text-xs",
231
+ children: [
232
+ t,
233
+ ": ",
234
+ n ?? "latest"
235
+ ]
236
+ }, t);
237
+ })
238
+ })]
239
+ }),
240
+ /* @__PURE__ */ S("div", {
241
+ className: "mt-4 flex justify-end gap-2",
242
+ children: [
243
+ /* @__PURE__ */ S(c, {
244
+ variant: "ghost",
245
+ size: "sm",
246
+ onClick: (e) => {
247
+ e.stopPropagation(), A(`store/package/${a}`);
248
+ },
249
+ children: [/* @__PURE__ */ x(oe, { className: "h-4 w-4 mr-1" }), "View in Store"]
250
+ }),
251
+ o && /* @__PURE__ */ S(c, {
252
+ variant: "outline",
253
+ size: "sm",
254
+ onClick: (t) => {
255
+ t.stopPropagation(), _e(e);
256
+ },
257
+ isLoading: ue,
258
+ children: [/* @__PURE__ */ x(C, { className: "h-4 w-4 mr-1" }), "Update"]
259
+ }),
260
+ /* @__PURE__ */ x(c, {
261
+ variant: "ghost",
262
+ size: "sm",
263
+ "aria-label": "Uninstall package",
264
+ className: "text-status-error-text hover:text-status-error-text",
265
+ onClick: (t) => {
266
+ t.stopPropagation(), Z(e);
267
+ },
268
+ isLoading: H,
269
+ children: /* @__PURE__ */ x(D, { className: "h-4 w-4" })
270
+ })
271
+ ]
272
+ })
273
+ ]
274
+ })
275
+ });
276
+ };
277
+ return R ? /* @__PURE__ */ x(n, {
278
+ title: "Installed Packages",
279
+ description: "Manage installed store packages",
280
+ children: /* @__PURE__ */ x("div", {
281
+ className: "space-y-4",
282
+ children: [
283
+ 1,
284
+ 2,
285
+ 3
286
+ ].map((e) => /* @__PURE__ */ x("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
287
+ })
288
+ }) : /* @__PURE__ */ S(n, {
289
+ title: "Installed Packages",
290
+ description: "Manage packages installed from the Botlit Store",
291
+ actions: /* @__PURE__ */ S("div", {
292
+ className: "flex gap-2",
293
+ children: [/* @__PURE__ */ x(c, {
294
+ variant: "outline",
295
+ leftIcon: /* @__PURE__ */ x(se, { size: 16 }),
296
+ onClick: () => void ge(),
297
+ isLoading: pe,
298
+ children: "Check Updates"
299
+ }), /* @__PURE__ */ x(c, {
300
+ leftIcon: /* @__PURE__ */ x(E, { size: 16 }),
301
+ onClick: () => A("store"),
302
+ children: "Browse Store"
303
+ })]
304
+ }),
305
+ children: [
306
+ /* @__PURE__ */ x(ne, {
307
+ className: "mb-6",
308
+ icon: /* @__PURE__ */ x(E, { size: 18 }),
309
+ children: "These are the packages you have installed from the Botlit Store and how they are wired into your workspace. Manage each one’s installation mode (linked, so it auto-updates, or forked as an independent copy), pin specific versions per environment, and update or uninstall — this is your dependency manager for everything you pulled from the store."
310
+ }),
311
+ z ? /* @__PURE__ */ x(f, {
312
+ resource: "installed packages",
313
+ error: z,
314
+ onRetry: () => void B()
315
+ }) : /* @__PURE__ */ S(b, { children: [
316
+ /* @__PURE__ */ S("div", {
317
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4 mb-6",
318
+ children: [
319
+ /* @__PURE__ */ S(y, {
320
+ treatment: "glass",
321
+ glow: !0,
322
+ className: "p-6 text-center",
323
+ children: [/* @__PURE__ */ x("p", {
324
+ className: "text-3xl font-bold tabular-nums text-text-primary",
325
+ children: L.length
326
+ }), /* @__PURE__ */ x("p", {
327
+ className: "text-sm text-text-secondary",
328
+ children: "Total Installed"
329
+ })]
330
+ }),
331
+ /* @__PURE__ */ S(y, {
332
+ treatment: "metric",
333
+ className: "p-6 text-center",
334
+ children: [/* @__PURE__ */ x("p", {
335
+ className: "text-3xl font-bold tabular-nums text-text-primary",
336
+ children: L.filter((e) => e.mode === "LINKED").length
337
+ }), /* @__PURE__ */ x("p", {
338
+ className: "text-sm text-text-secondary",
339
+ children: "Linked"
340
+ })]
341
+ }),
342
+ /* @__PURE__ */ S(y, {
343
+ treatment: "metric",
344
+ className: "p-6 text-center",
345
+ children: [/* @__PURE__ */ x("p", {
346
+ className: "text-3xl font-bold tabular-nums text-text-primary",
347
+ children: L.filter((e) => e.mode === "FORKED").length
348
+ }), /* @__PURE__ */ x("p", {
349
+ className: "text-sm text-text-secondary",
350
+ children: "Forked"
351
+ })]
352
+ }),
353
+ /* @__PURE__ */ S(y, {
354
+ treatment: "metric",
355
+ className: "p-6 text-center",
356
+ children: [/* @__PURE__ */ x("p", {
357
+ className: "text-3xl font-bold tabular-nums text-text-primary",
358
+ children: he
359
+ }), /* @__PURE__ */ x("p", {
360
+ className: "text-sm text-text-secondary",
361
+ children: "Updates Available"
362
+ })]
363
+ })
364
+ ]
365
+ }),
366
+ /* @__PURE__ */ S("div", {
367
+ className: "flex flex-col md:flex-row gap-4 mb-6",
368
+ children: [/* @__PURE__ */ S("div", {
369
+ className: "relative flex-1",
370
+ children: [/* @__PURE__ */ x(ce, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x(d, {
371
+ placeholder: "Search packages...",
372
+ value: W,
373
+ onChange: (e) => fe(e.target.value),
374
+ className: "pl-9"
375
+ })]
376
+ }), /* @__PURE__ */ x("div", {
377
+ className: "flex gap-2",
378
+ children: /* @__PURE__ */ S("select", {
379
+ "aria-label": "Filter by package type",
380
+ className: "flex h-10 rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
381
+ value: K,
382
+ onChange: (e) => me(e.target.value),
383
+ children: [
384
+ /* @__PURE__ */ x("option", {
385
+ value: "all",
386
+ children: "All Types"
387
+ }),
388
+ /* @__PURE__ */ x("option", {
389
+ value: g.Agent,
390
+ children: "Agents"
391
+ }),
392
+ /* @__PURE__ */ x("option", {
393
+ value: g.Skill,
394
+ children: "Skills"
395
+ }),
396
+ /* @__PURE__ */ x("option", {
397
+ value: g.McpPack,
398
+ children: "MCP Packs"
399
+ }),
400
+ /* @__PURE__ */ x("option", {
401
+ value: g.PromptTemplate,
402
+ children: "Templates"
403
+ }),
404
+ /* @__PURE__ */ x("option", {
405
+ value: g.RetrievalProfile,
406
+ children: "Retrieval Profiles"
407
+ })
408
+ ]
409
+ })
410
+ })]
411
+ }),
412
+ Y.length > 0 ? /* @__PURE__ */ x("div", {
413
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
414
+ children: Y.map((e) => /* @__PURE__ */ x(ve, { pkg: e }, e.id))
415
+ }) : /* @__PURE__ */ x(u, {
416
+ illustration: "empty-generic",
417
+ title: W || K !== "all" ? "No matching packages" : "No packages installed",
418
+ description: W || K !== "all" ? "Try adjusting your search or type filter." : "Browse the Botlit Store to find agents, skills, and tools to install.",
419
+ action: /* @__PURE__ */ x(c, {
420
+ onClick: () => A("store"),
421
+ leftIcon: /* @__PURE__ */ x(ae, { className: "h-4 w-4" }),
422
+ children: "Browse Store"
423
+ })
424
+ })
425
+ ] }),
426
+ X && /* @__PURE__ */ x(({ pkg: e, onClose: n }) => {
427
+ let l = P(e), u = M(e), d = e.bindings ?? {};
428
+ return /* @__PURE__ */ x("div", {
429
+ className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50",
430
+ children: /* @__PURE__ */ S("div", {
431
+ className: "bg-bg-surface rounded-lg shadow-xl max-w-2xl w-full mx-4 max-h-[90vh] overflow-y-auto",
432
+ children: [
433
+ /* @__PURE__ */ x("div", {
434
+ className: "p-6 border-b border-border-subtle",
435
+ children: /* @__PURE__ */ S("div", {
436
+ className: "flex items-start justify-between",
437
+ children: [/* @__PURE__ */ S("div", {
438
+ className: "flex items-start gap-3",
439
+ children: [/* @__PURE__ */ x("div", {
440
+ className: "p-3 rounded-lg bg-bg-sunken text-3xl",
441
+ children: l.icon
442
+ }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h2", {
443
+ className: "text-xl font-bold",
444
+ children: p(e.package) || u
445
+ }), /* @__PURE__ */ x("p", {
446
+ className: "text-sm text-text-secondary font-mono",
447
+ children: u
448
+ })] })]
449
+ }), /* @__PURE__ */ x(c, {
450
+ variant: "ghost",
451
+ size: "sm",
452
+ "aria-label": "Close",
453
+ onClick: n,
454
+ children: "×"
455
+ })]
456
+ })
457
+ }),
458
+ /* @__PURE__ */ S("div", {
459
+ className: "p-6 space-y-6",
460
+ children: [
461
+ /* @__PURE__ */ S(r, { children: [/* @__PURE__ */ x(o, { children: /* @__PURE__ */ x(s, {
462
+ className: "text-base",
463
+ children: "Version Information"
464
+ }) }), /* @__PURE__ */ S(i, {
465
+ className: "space-y-4",
466
+ children: [/* @__PURE__ */ S("div", {
467
+ className: "grid grid-cols-2 gap-4",
468
+ children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
469
+ className: "text-sm text-text-secondary",
470
+ children: "Installed Version"
471
+ }), /* @__PURE__ */ S("p", {
472
+ className: "font-mono font-medium",
473
+ children: ["v", e.installedVersion]
474
+ })] }), e.package && /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
475
+ className: "text-sm text-text-secondary",
476
+ children: "Latest Version"
477
+ }), /* @__PURE__ */ S("p", {
478
+ className: "font-mono font-medium",
479
+ children: ["v", e.package.version]
480
+ })] })]
481
+ }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
482
+ className: "text-sm text-text-secondary mb-2",
483
+ children: "Installation Mode"
484
+ }), /* @__PURE__ */ S("div", {
485
+ className: "flex items-center gap-2",
486
+ children: [
487
+ $(e.mode),
488
+ /* @__PURE__ */ x("span", {
489
+ className: "font-medium",
490
+ children: e.mode
491
+ }),
492
+ /* @__PURE__ */ x("span", {
493
+ className: "text-sm text-text-secondary",
494
+ children: e.mode === "LINKED" ? "- Receives updates automatically" : "- Independent copy, no auto-updates"
495
+ })
496
+ ]
497
+ })] })]
498
+ })] }),
499
+ /* @__PURE__ */ S(r, { children: [/* @__PURE__ */ S(o, { children: [/* @__PURE__ */ S(s, {
500
+ className: "text-base flex items-center gap-2",
501
+ children: [/* @__PURE__ */ x(w, { className: "h-4 w-4" }), "Environment Version Pins"]
502
+ }), /* @__PURE__ */ x(a, { children: "Pin specific versions for each environment" })] }), /* @__PURE__ */ x(i, { children: /* @__PURE__ */ x("div", {
503
+ className: "space-y-3",
504
+ children: k.map((t) => {
505
+ let n = I(e, t);
506
+ return /* @__PURE__ */ S("div", {
507
+ className: "flex items-center justify-between p-3 bg-bg-sunken rounded-lg",
508
+ children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
509
+ className: "font-medium",
510
+ children: t
511
+ }), /* @__PURE__ */ x("p", {
512
+ className: "text-sm text-text-secondary font-mono",
513
+ children: n ? `v${n}` : "Using latest"
514
+ })] }), /* @__PURE__ */ x("div", {
515
+ className: "flex gap-2",
516
+ children: n ? /* @__PURE__ */ x(c, {
517
+ variant: "outline",
518
+ size: "sm",
519
+ onClick: () => void Q(e, t, ""),
520
+ children: "Unpin"
521
+ }) : /* @__PURE__ */ x(c, {
522
+ variant: "outline",
523
+ size: "sm",
524
+ onClick: () => void Q(e, t, e.installedVersion),
525
+ children: "Pin Current"
526
+ })
527
+ })]
528
+ }, t);
529
+ })
530
+ }) })] }),
531
+ Object.keys(d).length > 0 && /* @__PURE__ */ S(r, { children: [/* @__PURE__ */ x(o, { children: /* @__PURE__ */ S(s, {
532
+ className: "text-base flex items-center gap-2",
533
+ children: [/* @__PURE__ */ x(le, { className: "h-4 w-4" }), "Configuration Bindings"]
534
+ }) }), /* @__PURE__ */ x(i, { children: /* @__PURE__ */ x("div", {
535
+ className: "space-y-2",
536
+ children: Object.entries(d).map(([e, t]) => /* @__PURE__ */ S("div", {
537
+ className: "flex justify-between p-2 bg-bg-sunken rounded",
538
+ children: [/* @__PURE__ */ x("span", {
539
+ className: "font-mono text-sm",
540
+ children: e
541
+ }), /* @__PURE__ */ x("span", {
542
+ className: "font-mono text-sm text-text-secondary",
543
+ children: typeof t == "string" ? t : JSON.stringify(t)
544
+ })]
545
+ }, e))
546
+ }) })] }),
547
+ /* @__PURE__ */ S(r, { children: [/* @__PURE__ */ x(o, { children: /* @__PURE__ */ x(s, {
548
+ className: "text-base",
549
+ children: "Metadata"
550
+ }) }), /* @__PURE__ */ x(i, { children: /* @__PURE__ */ S("div", {
551
+ className: "grid grid-cols-2 gap-4 text-sm",
552
+ children: [
553
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
554
+ className: "text-text-secondary",
555
+ children: "Installed At"
556
+ }), /* @__PURE__ */ x("p", {
557
+ className: "font-medium",
558
+ children: t(e.installedAt)
559
+ })] }),
560
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
561
+ className: "text-text-secondary",
562
+ children: "Installed By"
563
+ }), /* @__PURE__ */ x("p", {
564
+ className: "font-medium",
565
+ children: e.installedBy
566
+ })] }),
567
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
568
+ className: "text-text-secondary",
569
+ children: "Package ID"
570
+ }), /* @__PURE__ */ x("p", {
571
+ className: "font-mono text-xs",
572
+ children: e.packageId
573
+ })] }),
574
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
575
+ className: "text-text-secondary",
576
+ children: "Installation ID"
577
+ }), /* @__PURE__ */ x("p", {
578
+ className: "font-mono text-xs",
579
+ children: e.id
580
+ })] })
581
+ ]
582
+ }) })] })
583
+ ]
584
+ }),
585
+ /* @__PURE__ */ S("div", {
586
+ className: "p-6 border-t border-border-subtle flex justify-between",
587
+ children: [/* @__PURE__ */ S(c, {
588
+ variant: "destructive",
589
+ onClick: () => void Z(e),
590
+ children: [/* @__PURE__ */ x(D, { className: "h-4 w-4 mr-2" }), "Uninstall"]
591
+ }), /* @__PURE__ */ S("div", {
592
+ className: "flex gap-2",
593
+ children: [/* @__PURE__ */ x(re, {
594
+ to: j(`store/package/${u}`),
595
+ children: /* @__PURE__ */ x(c, {
596
+ variant: "outline",
597
+ children: "View in Store"
598
+ })
599
+ }), /* @__PURE__ */ x(c, {
600
+ variant: "outline",
601
+ onClick: n,
602
+ children: "Close"
603
+ })]
604
+ })]
605
+ })
606
+ ]
607
+ })
608
+ });
609
+ }, {
610
+ pkg: X,
611
+ onClose: () => J(null)
612
+ })
613
+ ]
614
+ });
615
+ };
616
+ //#endregion
617
+ export { L as InstalledPackagesPage };
618
+
619
+ //# sourceMappingURL=InstalledPackagesPage.js.map