@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,462 @@
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 { useInstallPackage as d, useStorePackage as f } from "../hooks/useStore.js";
9
+ import "../hooks/index.js";
10
+ import { InstallMode as p } from "../../generated/wspace-types.js";
11
+ import { useMemo as m, useState as h } from "react";
12
+ import { PagePurpose as g } from "@burdenoff/fe-libs/ui";
13
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
14
+ import { useParams as y } from "react-router";
15
+ import { AlertTriangle as b, ArrowLeft as x, CheckCircle as S, Download as C, ExternalLink as w, FileText as T, GitBranch as E, Globe as D, Package as O, Shield as k, Tag as A } from "lucide-react";
16
+ import { toast as j } from "sonner";
17
+ //#region src/botlit/pages/StorePackageDetailPage.tsx
18
+ var M = {
19
+ APP: "Bot",
20
+ AGENT: "Agent",
21
+ MCP_PACK: "MCP Pack",
22
+ PROMPT_TEMPLATE: "Prompt Template",
23
+ PROMPT: "Prompt",
24
+ SKILL: "Skill",
25
+ RETRIEVAL_PROFILE: "Retrieval Profile",
26
+ POLICY_BUNDLE: "Policy Bundle",
27
+ CHANNEL_TEMPLATE: "Channel Template",
28
+ A2A_AGENT: "A2A Agent",
29
+ KB_TEMPLATE: "KB Template",
30
+ KNOWLEDGE_BASE: "Knowledge Base",
31
+ INTEGRATION: "Integration",
32
+ TEMPLATE: "Template",
33
+ TOOL: "Tool",
34
+ WORKFLOW: "Workflow"
35
+ }, N = ({ risk: e }) => e ? /* @__PURE__ */ v(l, {
36
+ variant: {
37
+ low: "success",
38
+ medium: "warning",
39
+ high: "destructive"
40
+ }[e] ?? "secondary",
41
+ className: "capitalize",
42
+ children: [e, " Risk"]
43
+ }) : /* @__PURE__ */ _(l, {
44
+ variant: "secondary",
45
+ children: "Risk unknown"
46
+ });
47
+ function P(e) {
48
+ return e && typeof e == "object" && !Array.isArray(e) ? e : {};
49
+ }
50
+ function F(e) {
51
+ return typeof e == "string" && e !== "" ? e : void 0;
52
+ }
53
+ function I(e) {
54
+ let t = P(e.package), n = P(t.author), r = P(e.security), i = P(e.integrity), a = P(e.compatibility), o = {};
55
+ for (let [e, t] of Object.entries(a)) {
56
+ let n = F(t);
57
+ n && (o[e] = n);
58
+ }
59
+ let s = Array.isArray(e.dependencies) ? e.dependencies.flatMap((e) => {
60
+ let t = P(e), n = F(t.slug);
61
+ return n ? [{
62
+ slug: n,
63
+ version: F(t.version) ?? "*"
64
+ }] : [];
65
+ }) : [];
66
+ return {
67
+ name: F(t.name),
68
+ slug: F(t.slug),
69
+ description: F(t.description),
70
+ icon: F(t.icon),
71
+ license: F(t.license),
72
+ homepage: F(t.homepage),
73
+ repository: F(t.repository),
74
+ authorName: F(n.name),
75
+ authorUrl: F(n.url),
76
+ tags: Array.isArray(t.tags) ? t.tags.filter((e) => typeof e == "string") : [],
77
+ dependencies: s,
78
+ compatibility: o,
79
+ risk: F(r.risk),
80
+ requiresSecrets: r.requiresSecrets === !0,
81
+ networkEgress: F(P(r.network).egress),
82
+ checksum: F(i.checksum),
83
+ signature: F(i.signature)
84
+ };
85
+ }
86
+ var L = () => {
87
+ let { slug: P } = y(), { navigateTo: F } = e(), { data: L, loading: R } = f(P ? decodeURIComponent(P) : void 0), { install: z, loading: B } = d(), [V, H] = h(p.Linked), [U, W] = h(!1), G = m(() => I(L?.manifest ?? {}), [L?.manifest]), K = async () => {
88
+ if (L) {
89
+ try {
90
+ await z({
91
+ packageId: L.id,
92
+ mode: V
93
+ });
94
+ } catch (e) {
95
+ j.error(e instanceof Error ? e.message : "Failed to install package");
96
+ return;
97
+ }
98
+ j.success(`Installed "${G.name ?? L.slug}"`), W(!1), F("store/installed");
99
+ }
100
+ };
101
+ return R ? /* @__PURE__ */ _(n, {
102
+ title: "Loading...",
103
+ children: /* @__PURE__ */ _("div", { className: "h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" })
104
+ }) : L ? /* @__PURE__ */ v(n, {
105
+ title: /* @__PURE__ */ v("div", {
106
+ className: "flex items-center gap-3",
107
+ children: [
108
+ /* @__PURE__ */ _(c, {
109
+ variant: "ghost",
110
+ size: "icon",
111
+ onClick: () => F("store"),
112
+ children: /* @__PURE__ */ _(x, { size: 20 })
113
+ }),
114
+ /* @__PURE__ */ _("div", {
115
+ className: "p-2 rounded-lg bg-action-primary-bg/10",
116
+ children: G.icon ? /* @__PURE__ */ _("span", {
117
+ className: "text-2xl",
118
+ children: G.icon
119
+ }) : /* @__PURE__ */ _(O, { className: "h-6 w-6 text-primary" })
120
+ }),
121
+ /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ v("div", {
122
+ className: "flex items-center gap-2",
123
+ children: [/* @__PURE__ */ _("span", { children: G.name ?? L.slug }), /* @__PURE__ */ v(l, {
124
+ variant: "outline",
125
+ children: ["v", L.version]
126
+ })]
127
+ }), /* @__PURE__ */ _("p", {
128
+ className: "text-sm font-normal text-text-secondary",
129
+ children: L.slug
130
+ })] })
131
+ ]
132
+ }),
133
+ actions: /* @__PURE__ */ v("div", {
134
+ className: "flex gap-2",
135
+ children: [G.homepage && /* @__PURE__ */ _("a", {
136
+ href: G.homepage,
137
+ target: "_blank",
138
+ rel: "noopener noreferrer",
139
+ children: /* @__PURE__ */ _(c, {
140
+ variant: "outline",
141
+ leftIcon: /* @__PURE__ */ _(w, { size: 16 }),
142
+ children: "Homepage"
143
+ })
144
+ }), /* @__PURE__ */ _(c, {
145
+ leftIcon: /* @__PURE__ */ _(C, { size: 16 }),
146
+ onClick: () => W(!0),
147
+ children: "Install"
148
+ })]
149
+ }),
150
+ children: [/* @__PURE__ */ v("div", {
151
+ className: "space-y-6",
152
+ children: [
153
+ /* @__PURE__ */ _(g, {
154
+ icon: /* @__PURE__ */ _(O, { size: 18 }),
155
+ children: "This is a store package — a ready-made bot, agent, skill, tool pack or template you can install into your workspace. Review what it does, its security posture and version, then install it (linked so it stays updated, or forked as your own copy) to get a head start instead of building from scratch."
156
+ }),
157
+ /* @__PURE__ */ v("div", {
158
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
159
+ children: [
160
+ /* @__PURE__ */ _(r, {
161
+ treatment: "glass",
162
+ glow: !0,
163
+ children: /* @__PURE__ */ v(i, {
164
+ className: "pt-6 text-center",
165
+ children: [/* @__PURE__ */ _(l, {
166
+ variant: "outline",
167
+ className: "text-xs",
168
+ children: M[L.kind] ?? L.kind
169
+ }), /* @__PURE__ */ _("p", {
170
+ className: "text-sm text-text-secondary mt-1",
171
+ children: "Type"
172
+ })]
173
+ })
174
+ }),
175
+ /* @__PURE__ */ _(r, { children: /* @__PURE__ */ v(i, {
176
+ className: "pt-6 text-center",
177
+ children: [/* @__PURE__ */ v("p", {
178
+ className: "text-lg font-bold",
179
+ children: ["v", L.version]
180
+ }), /* @__PURE__ */ _("p", {
181
+ className: "text-sm text-text-secondary",
182
+ children: "Version"
183
+ })]
184
+ }) }),
185
+ /* @__PURE__ */ _(r, { children: /* @__PURE__ */ v(i, {
186
+ className: "pt-6 text-center",
187
+ children: [/* @__PURE__ */ _(N, { risk: G.risk }), /* @__PURE__ */ _("p", {
188
+ className: "text-sm text-text-secondary mt-1",
189
+ children: "Security"
190
+ })]
191
+ }) }),
192
+ /* @__PURE__ */ _(r, { children: /* @__PURE__ */ v(i, {
193
+ className: "pt-6 text-center",
194
+ children: [/* @__PURE__ */ _("p", {
195
+ className: "text-lg font-bold",
196
+ children: G.license ?? "—"
197
+ }), /* @__PURE__ */ _("p", {
198
+ className: "text-sm text-text-secondary",
199
+ children: "License"
200
+ })]
201
+ }) })
202
+ ]
203
+ }),
204
+ /* @__PURE__ */ v(r, { children: [/* @__PURE__ */ _(o, { children: /* @__PURE__ */ _(s, { children: "Description" }) }), /* @__PURE__ */ v(i, { children: [/* @__PURE__ */ _("p", {
205
+ className: "text-text-primary",
206
+ children: G.description ?? "—"
207
+ }), G.tags.length > 0 && /* @__PURE__ */ v("div", {
208
+ className: "flex items-center gap-2 mt-4",
209
+ children: [/* @__PURE__ */ _(A, {
210
+ size: 14,
211
+ className: "text-text-secondary"
212
+ }), G.tags.map((e) => /* @__PURE__ */ _(l, {
213
+ variant: "secondary",
214
+ children: e
215
+ }, e))]
216
+ })] })] }),
217
+ L.readme && /* @__PURE__ */ v(r, { children: [/* @__PURE__ */ _(o, { children: /* @__PURE__ */ v(s, {
218
+ className: "flex items-center gap-2",
219
+ children: [/* @__PURE__ */ _(T, { size: 18 }), "README"]
220
+ }) }), /* @__PURE__ */ _(i, { children: /* @__PURE__ */ _("div", {
221
+ className: "prose prose-sm max-w-none dark:prose-invert",
222
+ children: /* @__PURE__ */ _("pre", {
223
+ className: "whitespace-pre-wrap text-sm",
224
+ children: L.readme
225
+ })
226
+ }) })] }),
227
+ /* @__PURE__ */ v(r, { children: [/* @__PURE__ */ _(o, { children: /* @__PURE__ */ _(s, { children: "Author & Links" }) }), /* @__PURE__ */ _(i, { children: /* @__PURE__ */ v("div", {
228
+ className: "grid grid-cols-2 md:grid-cols-4 gap-6",
229
+ children: [
230
+ /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
231
+ className: "text-sm text-text-secondary",
232
+ children: "Author"
233
+ }), /* @__PURE__ */ v("div", {
234
+ className: "flex items-center gap-2 mt-1",
235
+ children: [/* @__PURE__ */ _("span", {
236
+ className: "font-medium",
237
+ children: G.authorName ?? "—"
238
+ }), G.authorUrl && /* @__PURE__ */ _("a", {
239
+ href: G.authorUrl,
240
+ target: "_blank",
241
+ rel: "noopener noreferrer",
242
+ className: "text-primary hover:underline",
243
+ children: /* @__PURE__ */ _(w, { size: 12 })
244
+ })]
245
+ })] }),
246
+ /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
247
+ className: "text-sm text-text-secondary",
248
+ children: "Published"
249
+ }), /* @__PURE__ */ _("p", {
250
+ className: "font-medium mt-1",
251
+ children: t(L.publishedAt)
252
+ })] }),
253
+ G.repository && /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
254
+ className: "text-sm text-text-secondary",
255
+ children: "Repository"
256
+ }), /* @__PURE__ */ v("a", {
257
+ href: G.repository,
258
+ target: "_blank",
259
+ rel: "noopener noreferrer",
260
+ className: "flex items-center gap-1 mt-1 text-primary hover:underline",
261
+ children: [/* @__PURE__ */ _(E, { size: 14 }), "View Source"]
262
+ })] }),
263
+ G.homepage && /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
264
+ className: "text-sm text-text-secondary",
265
+ children: "Homepage"
266
+ }), /* @__PURE__ */ v("a", {
267
+ href: G.homepage,
268
+ target: "_blank",
269
+ rel: "noopener noreferrer",
270
+ className: "flex items-center gap-1 mt-1 text-primary hover:underline",
271
+ children: [/* @__PURE__ */ _(D, { size: 14 }), "Visit Site"]
272
+ })] })
273
+ ]
274
+ }) })] }),
275
+ G.dependencies.length > 0 && /* @__PURE__ */ v(r, { children: [/* @__PURE__ */ v(o, { children: [/* @__PURE__ */ _(s, { children: "Dependencies" }), /* @__PURE__ */ v(a, { children: [
276
+ "This package depends on ",
277
+ G.dependencies.length,
278
+ " other package(s)"
279
+ ] })] }), /* @__PURE__ */ _(i, { children: /* @__PURE__ */ _("div", {
280
+ className: "flex flex-wrap gap-2",
281
+ children: G.dependencies.map((e) => /* @__PURE__ */ v(l, {
282
+ variant: "outline",
283
+ className: "font-mono",
284
+ children: [
285
+ e.slug,
286
+ "@",
287
+ e.version
288
+ ]
289
+ }, e.slug))
290
+ }) })] }),
291
+ /* @__PURE__ */ v("div", {
292
+ className: "grid grid-cols-1 md:grid-cols-2 gap-6",
293
+ children: [/* @__PURE__ */ v(r, { children: [/* @__PURE__ */ _(o, { children: /* @__PURE__ */ v(s, {
294
+ className: "flex items-center gap-2",
295
+ children: [/* @__PURE__ */ _(S, { size: 18 }), "Compatibility"]
296
+ }) }), /* @__PURE__ */ _(i, { children: /* @__PURE__ */ _("div", {
297
+ className: "space-y-2",
298
+ children: Object.keys(G.compatibility).length === 0 ? /* @__PURE__ */ _("p", {
299
+ className: "text-sm text-text-secondary",
300
+ children: "This package does not declare compatibility ranges."
301
+ }) : Object.entries(G.compatibility).map(([e, t]) => /* @__PURE__ */ v("div", {
302
+ className: "flex justify-between",
303
+ children: [/* @__PURE__ */ _("span", {
304
+ className: "text-text-secondary capitalize",
305
+ children: e
306
+ }), /* @__PURE__ */ _(l, {
307
+ variant: "outline",
308
+ children: t
309
+ })]
310
+ }, e))
311
+ }) })] }), /* @__PURE__ */ v(r, { children: [/* @__PURE__ */ _(o, { children: /* @__PURE__ */ v(s, {
312
+ className: "flex items-center gap-2",
313
+ children: [/* @__PURE__ */ _(k, { size: 18 }), "Security"]
314
+ }) }), /* @__PURE__ */ _(i, { children: /* @__PURE__ */ v("div", {
315
+ className: "space-y-3",
316
+ children: [
317
+ /* @__PURE__ */ v("div", {
318
+ className: "flex items-center justify-between",
319
+ children: [/* @__PURE__ */ _("span", {
320
+ className: "text-text-secondary",
321
+ children: "Risk Level"
322
+ }), /* @__PURE__ */ _(N, { risk: G.risk })]
323
+ }),
324
+ /* @__PURE__ */ v("div", {
325
+ className: "flex items-center justify-between",
326
+ children: [/* @__PURE__ */ _("span", {
327
+ className: "text-text-secondary",
328
+ children: "Requires Secrets"
329
+ }), /* @__PURE__ */ _(l, {
330
+ variant: G.requiresSecrets ? "warning" : "secondary",
331
+ children: G.requiresSecrets ? "Yes" : "No"
332
+ })]
333
+ }),
334
+ /* @__PURE__ */ v("div", {
335
+ className: "flex items-center justify-between",
336
+ children: [/* @__PURE__ */ _("span", {
337
+ className: "text-text-secondary",
338
+ children: "Network Egress"
339
+ }), /* @__PURE__ */ _(l, {
340
+ variant: G.networkEgress === "any" ? "warning" : G.networkEgress === "restricted" ? "secondary" : "success",
341
+ className: "capitalize",
342
+ children: G.networkEgress ?? "unknown"
343
+ })]
344
+ })
345
+ ]
346
+ }) })] })]
347
+ }),
348
+ /* @__PURE__ */ v(r, { children: [/* @__PURE__ */ _(o, { children: /* @__PURE__ */ _(s, { children: "Integrity" }) }), /* @__PURE__ */ _(i, { children: /* @__PURE__ */ v("div", {
349
+ className: "space-y-2",
350
+ children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
351
+ className: "text-sm text-text-secondary",
352
+ children: "Checksum"
353
+ }), /* @__PURE__ */ _("p", {
354
+ className: "font-mono text-sm break-all",
355
+ children: G.checksum ?? "—"
356
+ })] }), G.signature && /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
357
+ className: "text-sm text-text-secondary",
358
+ children: "Signature"
359
+ }), /* @__PURE__ */ _("p", {
360
+ className: "font-mono text-sm break-all",
361
+ children: G.signature
362
+ })] })]
363
+ }) })] })
364
+ ]
365
+ }), U && /* @__PURE__ */ _("div", {
366
+ className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50",
367
+ children: /* @__PURE__ */ v(r, {
368
+ className: "w-full max-w-md",
369
+ children: [/* @__PURE__ */ v(o, { children: [/* @__PURE__ */ _(s, { children: "Install Package" }), /* @__PURE__ */ v(a, { children: [
370
+ "Install ",
371
+ G.name ?? L.slug,
372
+ " v",
373
+ L.version
374
+ ] })] }), /* @__PURE__ */ v(i, {
375
+ className: "space-y-4",
376
+ children: [
377
+ /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
378
+ className: "text-sm font-medium mb-2",
379
+ children: "Install Mode"
380
+ }), /* @__PURE__ */ v("div", {
381
+ className: "space-y-2",
382
+ children: [/* @__PURE__ */ v("label", {
383
+ className: "flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent",
384
+ children: [/* @__PURE__ */ _("input", {
385
+ type: "radio",
386
+ name: "mode",
387
+ value: "LINKED",
388
+ checked: V === p.Linked,
389
+ onChange: () => H(p.Linked),
390
+ className: "mt-1"
391
+ }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
392
+ className: "font-medium",
393
+ children: "Linked"
394
+ }), /* @__PURE__ */ _("p", {
395
+ className: "text-sm text-text-secondary",
396
+ children: "Stay in sync with store updates. Recommended for most cases."
397
+ })] })]
398
+ }), /* @__PURE__ */ v("label", {
399
+ className: "flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent",
400
+ children: [/* @__PURE__ */ _("input", {
401
+ type: "radio",
402
+ name: "mode",
403
+ value: "FORKED",
404
+ checked: V === p.Forked,
405
+ onChange: () => H(p.Forked),
406
+ className: "mt-1"
407
+ }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
408
+ className: "font-medium",
409
+ children: "Forked"
410
+ }), /* @__PURE__ */ _("p", {
411
+ className: "text-sm text-text-secondary",
412
+ children: "Create a local copy you can customize. No automatic updates."
413
+ })] })]
414
+ })]
415
+ })] }),
416
+ G.requiresSecrets && /* @__PURE__ */ v("div", {
417
+ className: "p-3 bg-status-warning-bg-subtle rounded-lg",
418
+ children: [/* @__PURE__ */ v("div", {
419
+ className: "flex items-center gap-2 text-status-warning-text",
420
+ children: [/* @__PURE__ */ _(b, { size: 16 }), /* @__PURE__ */ _("span", {
421
+ className: "text-sm font-medium",
422
+ children: "Requires Secrets"
423
+ })]
424
+ }), /* @__PURE__ */ _("p", {
425
+ className: "text-sm text-text-secondary mt-1",
426
+ children: "This package requires secret configuration after installation."
427
+ })]
428
+ }),
429
+ /* @__PURE__ */ v("div", {
430
+ className: "flex justify-end gap-2 pt-4",
431
+ children: [/* @__PURE__ */ _(c, {
432
+ variant: "outline",
433
+ onClick: () => W(!1),
434
+ children: "Cancel"
435
+ }), /* @__PURE__ */ _(c, {
436
+ onClick: () => void K(),
437
+ isLoading: B,
438
+ leftIcon: /* @__PURE__ */ _(C, { size: 16 }),
439
+ children: "Install"
440
+ })]
441
+ })
442
+ ]
443
+ })]
444
+ })
445
+ })]
446
+ }) : /* @__PURE__ */ _(n, {
447
+ title: "Package Not Found",
448
+ children: /* @__PURE__ */ _(u, {
449
+ illustration: "empty-search",
450
+ title: "Package Not Found",
451
+ description: "This package doesn't exist.",
452
+ action: /* @__PURE__ */ _(c, {
453
+ onClick: () => F("store"),
454
+ children: "Back to Store"
455
+ })
456
+ })
457
+ });
458
+ };
459
+ //#endregion
460
+ export { L as StorePackageDetailPage };
461
+
462
+ //# sourceMappingURL=StorePackageDetailPage.js.map
@@ -0,0 +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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"}