@burdenoff/microfe-botmanor 2026.821.1 → 2026.925.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 (65) hide show
  1. package/dist/botlit/BotlitRoutes.js.map +1 -1
  2. package/dist/botlit/BotmanorRoot.js.map +1 -1
  3. package/dist/botlit/BotmanorRootInner.js +4 -4
  4. package/dist/botlit/BotmanorRootInner.js.map +1 -1
  5. package/dist/botlit/components/ErrorState.js +33 -29
  6. package/dist/botlit/components/ErrorState.js.map +1 -1
  7. package/dist/botlit/components/RouteLoader.js +52 -48
  8. package/dist/botlit/components/RouteLoader.js.map +1 -1
  9. package/dist/botlit/components/VersionHistoryPanel.js +74 -77
  10. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  11. package/dist/botlit/components/WorkspaceRequired.js +31 -30
  12. package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
  13. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  14. package/dist/botlit/hooks/useConversations.js.map +1 -1
  15. package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
  16. package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
  17. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  18. package/dist/botlit/pages/A2ARegistryPage.js +116 -124
  19. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  20. package/dist/botlit/pages/AgentDetailPage.js +169 -172
  21. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  22. package/dist/botlit/pages/AgentsListPage.js +96 -90
  23. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  24. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  25. package/dist/botlit/pages/BotDetailPage.js +228 -231
  26. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  27. package/dist/botlit/pages/BotWorkflowTab.js +84 -87
  28. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  29. package/dist/botlit/pages/BotsListPage.js +144 -147
  30. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  31. package/dist/botlit/pages/BucketsPage.js +3 -3
  32. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  33. package/dist/botlit/pages/ChannelDetailPage.js +1 -1
  34. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  35. package/dist/botlit/pages/ChannelsPage.js +156 -149
  36. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  37. package/dist/botlit/pages/ChatPage.js +126 -129
  38. package/dist/botlit/pages/ChatPage.js.map +1 -1
  39. package/dist/botlit/pages/DashboardPage.js +111 -114
  40. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  41. package/dist/botlit/pages/ExecutionsPage.js +163 -159
  42. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  43. package/dist/botlit/pages/InstalledPackagesPage.js +3 -3
  44. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  45. package/dist/botlit/pages/KnowledgeBasesPage.js +84 -78
  46. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  47. package/dist/botlit/pages/MCPServersPage.js +159 -154
  48. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  49. package/dist/botlit/pages/PoliciesPage.js +119 -114
  50. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  51. package/dist/botlit/pages/RetrievalProfilesPage.js +102 -109
  52. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  53. package/dist/botlit/pages/SettingsPage.js +144 -159
  54. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  55. package/dist/botlit/pages/SkillsPage.js +122 -105
  56. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  57. package/dist/botlit/pages/StorePage.js +176 -175
  58. package/dist/botlit/pages/StorePage.js.map +1 -1
  59. package/dist/botlit/providers/BotlitProvider.js.map +1 -1
  60. package/dist/botlit/store/botlitStore.js +1 -1
  61. package/dist/botlit/store/botlitStore.js.map +1 -1
  62. package/dist/botlit/utils/navigation.js.map +1 -1
  63. package/dist/shared/hooks/useTr.js +14 -0
  64. package/dist/shared/hooks/useTr.js.map +1 -0
  65. package/package.json +33 -9
@@ -1,238 +1,239 @@
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 { storePackageDescription as p, storePackageName as m, useInstallPackage as h, useInstalledPackages as g, useStorePackages as _ } from "../hooks/useStore.js";
1
+ import { useTr as e } from "../../shared/hooks/useTr.js";
2
+ import { useBotlit as t } from "../providers/BotlitProvider.js";
3
+ import { formatRelativeTime as n } from "../utils/formatters.js";
4
+ import { PageLayout as r } from "../components/PageLayout.js";
5
+ import { Card as i, CardContent as a, CardDescription as o, CardHeader as s, CardTitle as c } from "../components/Card.js";
6
+ import { Button as l } from "../components/Button.js";
7
+ import { Badge as u } from "../components/Badge.js";
8
+ import { EmptyState as d } from "../components/EmptyState.js";
9
+ import { Input as f } from "../components/Input.js";
10
+ import { ErrorState as p } from "../components/ErrorState.js";
11
+ import { storePackageDescription as m, storePackageName as h, useInstallPackage as g, useInstalledPackages as _, useStorePackages as v } from "../hooks/useStore.js";
11
12
  import "../hooks/index.js";
12
- import { InstallMode as v, PackageKind as y } from "../../generated/wspace-types.js";
13
- import { useMemo as b, useState as x } from "react";
14
- import { GlassCard as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
15
- import { jsx as w, jsxs as T } from "react/jsx-runtime";
16
- import { Link as E } from "react-router";
17
- import { Bot as D, Check as O, Database as k, ExternalLink as A, FileText as j, Package as M, Search as N, Shield as P, Sparkles as F, Store as I, Wrench as L } from "lucide-react";
18
- import { toast as R } from "sonner";
13
+ import { InstallMode as y, PackageKind as b } from "../../generated/wspace-types.js";
14
+ import { useMemo as x, useState as S } from "react";
15
+ import { GlassCard as C, PagePurpose as w } from "@burdenoff/fe-libs/ui";
16
+ import { jsx as T, jsxs as E } from "react/jsx-runtime";
17
+ import { Link as D } from "react-router";
18
+ import { Bot as O, Check as k, Database as A, ExternalLink as j, FileText as M, Package as N, Search as P, Shield as F, Sparkles as I, Store as L, Wrench as R } from "lucide-react";
19
+ import { toast as z } from "sonner";
19
20
  //#region src/botlit/pages/StorePage.tsx
20
- var z = ({ kind: e, className: t }) => {
21
+ var B = ({ kind: e, className: t }) => {
21
22
  switch (e) {
22
- case "APP": return /* @__PURE__ */ w(M, { className: t });
23
+ case "APP": return /* @__PURE__ */ T(N, { className: t });
23
24
  case "AGENT":
24
- case "A2A_AGENT": return /* @__PURE__ */ w(D, { className: t });
25
+ case "A2A_AGENT": return /* @__PURE__ */ T(O, { className: t });
25
26
  case "MCP_PACK":
26
- case "TOOL": return /* @__PURE__ */ w(L, { className: t });
27
+ case "TOOL": return /* @__PURE__ */ T(R, { className: t });
27
28
  case "PROMPT_TEMPLATE":
28
- case "PROMPT": return /* @__PURE__ */ w(j, { className: t });
29
- case "SKILL": return /* @__PURE__ */ w(F, { className: t });
29
+ case "PROMPT": return /* @__PURE__ */ T(M, { className: t });
30
+ case "SKILL": return /* @__PURE__ */ T(I, { className: t });
30
31
  case "RETRIEVAL_PROFILE":
31
32
  case "KNOWLEDGE_BASE":
32
- case "KB_TEMPLATE": return /* @__PURE__ */ w(k, { className: t });
33
- case "POLICY_BUNDLE": return /* @__PURE__ */ w(P, { className: t });
34
- default: return /* @__PURE__ */ w(M, { className: t });
33
+ case "KB_TEMPLATE": return /* @__PURE__ */ T(A, { className: t });
34
+ case "POLICY_BUNDLE": return /* @__PURE__ */ T(F, { className: t });
35
+ default: return /* @__PURE__ */ T(N, { className: t });
35
36
  }
36
- }, B = {
37
- APP: "Bot",
38
- AGENT: "Agent",
39
- MCP_PACK: "MCP Pack",
40
- PROMPT_TEMPLATE: "Prompt Template",
41
- PROMPT: "Prompt",
42
- SKILL: "Skill",
43
- RETRIEVAL_PROFILE: "Retrieval Profile",
44
- POLICY_BUNDLE: "Policy Bundle",
45
- CHANNEL_TEMPLATE: "Channel Template",
46
- A2A_AGENT: "A2A Agent",
47
- KB_TEMPLATE: "KB Template",
48
- KNOWLEDGE_BASE: "Knowledge Base",
49
- INTEGRATION: "Integration",
50
- TEMPLATE: "Template",
51
- TOOL: "Tool",
52
- WORKFLOW: "Workflow"
53
- }, V = () => {
54
- let { getPath: D } = e(), [k, j] = x(""), [M, P] = x(null), [F, L] = x("recent"), [V, H] = x(null), { data: U, loading: W, error: G, refetch: K } = _(b(() => ({
55
- search: k,
56
- kind: M ? [M] : void 0,
57
- sortBy: F
37
+ };
38
+ function V(e) {
39
+ return {
40
+ APP: e("botlit.store.kindLabel.APP", "Bot"),
41
+ AGENT: e("botlit.store.kindLabel.AGENT", "Agent"),
42
+ MCP_PACK: e("botlit.store.kindLabel.MCP_PACK", "MCP Pack"),
43
+ PROMPT_TEMPLATE: e("botlit.store.kindLabel.PROMPT_TEMPLATE", "Prompt Template"),
44
+ PROMPT: e("botlit.store.kindLabel.PROMPT", "Prompt"),
45
+ SKILL: e("botlit.store.kindLabel.SKILL", "Skill"),
46
+ RETRIEVAL_PROFILE: e("botlit.store.kindLabel.RETRIEVAL_PROFILE", "Retrieval Profile"),
47
+ POLICY_BUNDLE: e("botlit.store.kindLabel.POLICY_BUNDLE", "Policy Bundle"),
48
+ CHANNEL_TEMPLATE: e("botlit.store.kindLabel.CHANNEL_TEMPLATE", "Channel Template"),
49
+ A2A_AGENT: e("botlit.store.kindLabel.A2A_AGENT", "A2A Agent"),
50
+ KB_TEMPLATE: e("botlit.store.kindLabel.KB_TEMPLATE", "KB Template"),
51
+ KNOWLEDGE_BASE: e("botlit.store.kindLabel.KNOWLEDGE_BASE", "Knowledge Base"),
52
+ INTEGRATION: e("botlit.store.kindLabel.INTEGRATION", "Integration"),
53
+ TEMPLATE: e("botlit.store.kindLabel.TEMPLATE", "Template"),
54
+ TOOL: e("botlit.store.kindLabel.TOOL", "Tool"),
55
+ WORKFLOW: e("botlit.store.kindLabel.WORKFLOW", "Workflow")
56
+ };
57
+ }
58
+ var H = () => {
59
+ let O = e(), { getPath: A } = t(), M = V(O), [N, F] = S(""), [I, R] = S(null), [H, U] = S("recent"), [W, G] = S(null), { data: K, loading: q, error: J, refetch: Y } = v(x(() => ({
60
+ search: N,
61
+ kind: I ? [I] : void 0,
62
+ sortBy: H
58
63
  }), [
59
- k,
60
- M,
61
- F
62
- ])), { data: q, refetch: J } = g(), { install: Y } = h(), X = b(() => new Set(q.map((e) => e.package?.slug).filter((e) => typeof e == "string")), [q]), Z = async (e, t) => {
63
- t.preventDefault(), t.stopPropagation(), H(e.slug);
64
+ N,
65
+ I,
66
+ H
67
+ ])), { data: X, refetch: Z } = _(), { install: Q } = g(), $ = x(() => new Set(X.map((e) => e.package?.slug).filter((e) => typeof e == "string")), [X]), ee = async (e, t) => {
68
+ t.preventDefault(), t.stopPropagation(), G(e.slug);
64
69
  try {
65
- await Y({
70
+ await Q({
66
71
  packageId: e.id,
67
- mode: v.Linked
68
- }), R.success(`Installed "${m(e)}"`), J();
72
+ mode: y.Linked
73
+ }), z.success(O("botlit.store.install.success", "Installed \"{{name}}\"", { name: h(e) })), Z();
69
74
  } catch (e) {
70
- R.error(e instanceof Error ? e.message : "Failed to install package");
75
+ z.error(e instanceof Error ? e.message : O("botlit.store.install.error", "Failed to install package"));
71
76
  } finally {
72
- H(null);
77
+ G(null);
73
78
  }
74
- }, Q = [
75
- y.Agent,
76
- y.McpPack,
77
- y.Skill,
78
- y.PromptTemplate,
79
- y.PolicyBundle
79
+ }, te = [
80
+ b.Agent,
81
+ b.McpPack,
82
+ b.Skill,
83
+ b.PromptTemplate,
84
+ b.PolicyBundle
80
85
  ];
81
- return /* @__PURE__ */ w(n, {
82
- title: "Botlit Store",
83
- description: "Discover and install pre-built agents, tools, and configurations",
84
- actions: /* @__PURE__ */ T("div", {
86
+ return /* @__PURE__ */ T(r, {
87
+ title: O("botlit.store.title", "BotManor Store"),
88
+ description: O("botlit.store.description", "Discover and install pre-built agents, tools, and configurations"),
89
+ actions: /* @__PURE__ */ E("div", {
85
90
  className: "flex gap-2",
86
- children: [/* @__PURE__ */ w(c, {
91
+ children: [/* @__PURE__ */ T(l, {
87
92
  variant: "outline",
88
- children: /* @__PURE__ */ T(E, {
89
- to: D("store/installed"),
90
- children: [
91
- "View Installed (",
92
- q.length,
93
- ")"
94
- ]
93
+ children: /* @__PURE__ */ T(D, {
94
+ to: A("store/installed"),
95
+ children: O("botlit.store.actions.viewInstalled", "View Installed ({{count}})", { count: X.length })
95
96
  })
96
- }), /* @__PURE__ */ w(c, {
97
+ }), /* @__PURE__ */ T(l, {
97
98
  variant: "outline",
98
- leftIcon: /* @__PURE__ */ w(A, { size: 16 }),
99
- children: "Publish Package"
99
+ leftIcon: /* @__PURE__ */ T(j, { size: 16 }),
100
+ children: O("botlit.store.actions.publishPackage", "Publish Package")
100
101
  })]
101
102
  }),
102
- children: /* @__PURE__ */ T("div", {
103
+ children: /* @__PURE__ */ E("div", {
103
104
  className: "space-y-6",
104
105
  children: [
105
- /* @__PURE__ */ w(C, {
106
- icon: /* @__PURE__ */ w(I, { size: 18 }),
107
- children: "The store is a marketplace of ready-made building blocks — full bots, agents, MCP tool packs, prompt templates and policy bundles published by the Botlit team and the community. Browse and install a package to skip the setup and start from a working example, then customise it for your own use case instead of building everything from scratch."
106
+ /* @__PURE__ */ T(w, {
107
+ icon: /* @__PURE__ */ T(L, { size: 18 }),
108
+ children: O("botlit.store.purpose", "The store is a marketplace of ready-made building blocks — full bots, agents, MCP tool packs, prompt templates and policy bundles published by the BotManor team and the community. Browse and install a package to skip the setup and start from a working example, then customise it for your own use case instead of building everything from scratch.")
108
109
  }),
109
- /* @__PURE__ */ T("div", {
110
+ /* @__PURE__ */ E("div", {
110
111
  className: "flex flex-wrap items-center gap-4",
111
112
  children: [
112
- /* @__PURE__ */ T("div", {
113
+ /* @__PURE__ */ E("div", {
113
114
  className: "relative flex-1 max-w-md",
114
- children: [/* @__PURE__ */ w(N, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ w(d, {
115
- placeholder: "Search packages...",
116
- value: k,
117
- onChange: (e) => j(e.target.value),
115
+ children: [/* @__PURE__ */ T(P, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ T(f, {
116
+ placeholder: O("botlit.store.searchPlaceholder", "Search packages..."),
117
+ value: N,
118
+ onChange: (e) => F(e.target.value),
118
119
  className: "pl-9"
119
120
  })]
120
121
  }),
121
- /* @__PURE__ */ T("div", {
122
+ /* @__PURE__ */ E("div", {
122
123
  className: "flex gap-2",
123
- children: [/* @__PURE__ */ w(c, {
124
- variant: M === null ? "default" : "outline",
124
+ children: [/* @__PURE__ */ T(l, {
125
+ variant: I === null ? "default" : "outline",
125
126
  size: "sm",
126
- onClick: () => P(null),
127
- children: "All"
128
- }), Q.map((e) => /* @__PURE__ */ w(c, {
129
- variant: M === e ? "default" : "outline",
127
+ onClick: () => R(null),
128
+ children: O("botlit.store.filters.all", "All")
129
+ }), te.map((e) => /* @__PURE__ */ T(l, {
130
+ variant: I === e ? "default" : "outline",
130
131
  size: "sm",
131
- onClick: () => P(e),
132
- leftIcon: /* @__PURE__ */ w(z, {
132
+ onClick: () => R(e),
133
+ leftIcon: /* @__PURE__ */ T(B, {
133
134
  kind: e,
134
135
  className: "h-4 w-4"
135
136
  }),
136
- children: B[e]
137
+ children: M[e]
137
138
  }, e))]
138
139
  }),
139
- /* @__PURE__ */ T("select", {
140
- "aria-label": "Sort packages",
140
+ /* @__PURE__ */ E("select", {
141
+ "aria-label": O("botlit.store.filters.sortLabel", "Sort packages"),
141
142
  className: "h-9 px-3 border border-border-default rounded-md bg-bg-surface text-sm",
142
- value: F,
143
- onChange: (e) => L(e.target.value),
144
- children: [/* @__PURE__ */ w("option", {
143
+ value: H,
144
+ onChange: (e) => U(e.target.value),
145
+ children: [/* @__PURE__ */ T("option", {
145
146
  value: "recent",
146
- children: "Recently Published"
147
- }), /* @__PURE__ */ w("option", {
147
+ children: O("botlit.store.sort.recent", "Recently Published")
148
+ }), /* @__PURE__ */ T("option", {
148
149
  value: "name",
149
- children: "Name (A–Z)"
150
+ children: O("botlit.store.sort.name", "Name (A–Z)")
150
151
  })]
151
152
  })
152
153
  ]
153
154
  }),
154
- /* @__PURE__ */ T("div", {
155
+ /* @__PURE__ */ E("div", {
155
156
  className: "grid grid-cols-1 md:grid-cols-3 gap-4",
156
- children: [/* @__PURE__ */ w(S, {
157
+ children: [/* @__PURE__ */ T(C, {
157
158
  treatment: "glass",
158
159
  glow: !0,
159
160
  className: "md:col-span-2 p-6",
160
- children: /* @__PURE__ */ T("div", {
161
+ children: /* @__PURE__ */ E("div", {
161
162
  className: "flex items-start gap-4",
162
- children: [/* @__PURE__ */ w("div", {
163
+ children: [/* @__PURE__ */ T("div", {
163
164
  className: "p-3 bg-action-primary-bg/20 rounded-lg",
164
- children: /* @__PURE__ */ w(I, { className: "h-8 w-8 text-primary" })
165
- }), /* @__PURE__ */ T("div", { children: [
166
- /* @__PURE__ */ w("h3", {
165
+ children: /* @__PURE__ */ T(L, { className: "h-8 w-8 text-primary" })
166
+ }), /* @__PURE__ */ E("div", { children: [
167
+ /* @__PURE__ */ T("h3", {
167
168
  className: "text-lg font-semibold text-text-primary",
168
- children: "Welcome to the Botlit Store"
169
+ children: O("botlit.store.featured.title", "Welcome to the BotManor Store")
169
170
  }),
170
- /* @__PURE__ */ w("p", {
171
+ /* @__PURE__ */ T("p", {
171
172
  className: "text-sm text-text-secondary mt-1",
172
- children: "Discover production-ready agents, tool packs, and configurations built by the community and Botlit team. Install packages to jumpstart your AI applications."
173
+ children: O("botlit.store.featured.description", "Discover production-ready agents, tool packs, and configurations built by the community and BotManor team. Install packages to jumpstart your AI applications.")
173
174
  }),
174
- /* @__PURE__ */ T("div", {
175
+ /* @__PURE__ */ E("div", {
175
176
  className: "flex gap-4 mt-4",
176
- children: [/* @__PURE__ */ T("div", {
177
+ children: [/* @__PURE__ */ E("div", {
177
178
  className: "text-center",
178
- children: [/* @__PURE__ */ w("p", {
179
+ children: [/* @__PURE__ */ T("p", {
179
180
  className: "text-2xl font-bold tabular-nums",
180
- children: U.length
181
- }), /* @__PURE__ */ w("p", {
181
+ children: K.length
182
+ }), /* @__PURE__ */ T("p", {
182
183
  className: "text-xs text-text-secondary",
183
- children: "Packages"
184
+ children: O("botlit.store.featured.packages", "Packages")
184
185
  })]
185
- }), /* @__PURE__ */ T("div", {
186
+ }), /* @__PURE__ */ E("div", {
186
187
  className: "text-center",
187
- children: [/* @__PURE__ */ w("p", {
188
+ children: [/* @__PURE__ */ T("p", {
188
189
  className: "text-2xl font-bold tabular-nums",
189
- children: q.length
190
- }), /* @__PURE__ */ w("p", {
190
+ children: X.length
191
+ }), /* @__PURE__ */ T("p", {
191
192
  className: "text-xs text-text-secondary",
192
- children: "Installed"
193
+ children: O("botlit.store.featured.installed", "Installed")
193
194
  })]
194
195
  })]
195
196
  })
196
197
  ] })]
197
198
  })
198
- }), /* @__PURE__ */ T(r, { children: [/* @__PURE__ */ w(o, {
199
+ }), /* @__PURE__ */ E(i, { children: [/* @__PURE__ */ T(s, {
199
200
  className: "pb-2",
200
- children: /* @__PURE__ */ w(s, {
201
+ children: /* @__PURE__ */ T(c, {
201
202
  className: "text-sm",
202
- children: "Quick Install"
203
+ children: O("botlit.store.featured.quickInstall", "Quick Install")
203
204
  })
204
- }), /* @__PURE__ */ w(i, {
205
+ }), /* @__PURE__ */ T(a, {
205
206
  className: "space-y-2",
206
- children: U.slice(0, 3).map((e) => /* @__PURE__ */ T("div", {
207
+ children: K.slice(0, 3).map((e) => /* @__PURE__ */ E("div", {
207
208
  className: "flex items-center justify-between p-2 bg-bg-sunken rounded",
208
- children: [/* @__PURE__ */ T("div", {
209
+ children: [/* @__PURE__ */ E("div", {
209
210
  className: "flex items-center gap-2",
210
- children: [/* @__PURE__ */ w(z, {
211
+ children: [/* @__PURE__ */ T(B, {
211
212
  kind: e.kind,
212
213
  className: "h-4 w-4 text-text-secondary"
213
- }), /* @__PURE__ */ w("span", {
214
+ }), /* @__PURE__ */ T("span", {
214
215
  className: "text-sm truncate max-w-[150px]",
215
- children: m(e)
216
+ children: h(e)
216
217
  })]
217
- }), X.has(e.slug) ? /* @__PURE__ */ T(l, {
218
+ }), $.has(e.slug) ? /* @__PURE__ */ E(u, {
218
219
  variant: "success",
219
220
  className: "text-xs",
220
- children: [/* @__PURE__ */ w(O, {
221
+ children: [/* @__PURE__ */ T(k, {
221
222
  size: 12,
222
223
  className: "mr-1"
223
- }), "Installed"]
224
- }) : /* @__PURE__ */ w(c, {
224
+ }), O("botlit.store.install.installedBadge", "Installed")]
225
+ }) : /* @__PURE__ */ T(l, {
225
226
  size: "sm",
226
227
  variant: "ghost",
227
228
  className: "h-6 text-xs",
228
- onClick: (t) => void Z(e, t),
229
- isLoading: V === e.slug,
230
- children: "Install"
229
+ onClick: (t) => void ee(e, t),
230
+ isLoading: W === e.slug,
231
+ children: O("botlit.store.install.action", "Install")
231
232
  })]
232
233
  }, e.id))
233
234
  })] })]
234
235
  }),
235
- W ? /* @__PURE__ */ w("div", {
236
+ q ? /* @__PURE__ */ T("div", {
236
237
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
237
238
  children: [
238
239
  1,
@@ -241,31 +242,31 @@ var z = ({ kind: e, className: t }) => {
241
242
  4,
242
243
  5,
243
244
  6
244
- ].map((e) => /* @__PURE__ */ w("div", { className: "h-56 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
245
- }) : G ? /* @__PURE__ */ w(f, {
245
+ ].map((e) => /* @__PURE__ */ T("div", { className: "h-56 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
246
+ }) : J ? /* @__PURE__ */ T(p, {
246
247
  resource: "store packages",
247
- error: G,
248
- onRetry: () => void K()
249
- }) : U.length > 0 ? /* @__PURE__ */ w("div", {
248
+ error: J,
249
+ onRetry: () => void Y()
250
+ }) : K.length > 0 ? /* @__PURE__ */ T("div", {
250
251
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
251
- children: U.map((e) => /* @__PURE__ */ w(E, {
252
- to: D(`store/package/${e.slug}`),
253
- children: /* @__PURE__ */ T(r, {
252
+ children: K.map((e) => /* @__PURE__ */ T(D, {
253
+ to: A(`store/package/${e.slug}`),
254
+ children: /* @__PURE__ */ E(i, {
254
255
  className: "h-full hover:border-primary/50 transition-colors cursor-pointer",
255
- children: [/* @__PURE__ */ w(o, { children: /* @__PURE__ */ T("div", {
256
+ children: [/* @__PURE__ */ T(s, { children: /* @__PURE__ */ E("div", {
256
257
  className: "flex items-start justify-between",
257
- children: [/* @__PURE__ */ T("div", {
258
+ children: [/* @__PURE__ */ E("div", {
258
259
  className: "flex items-center gap-3",
259
- children: [/* @__PURE__ */ w("div", {
260
+ children: [/* @__PURE__ */ T("div", {
260
261
  className: "p-2 bg-action-primary-bg/10 rounded-lg",
261
- children: /* @__PURE__ */ w(z, {
262
+ children: /* @__PURE__ */ T(B, {
262
263
  kind: e.kind,
263
264
  className: "h-5 w-5 text-primary"
264
265
  })
265
- }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w(s, {
266
+ }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T(c, {
266
267
  className: "text-base",
267
- children: m(e)
268
- }), /* @__PURE__ */ T(a, {
268
+ children: h(e)
269
+ }), /* @__PURE__ */ E(o, {
269
270
  className: "text-xs",
270
271
  children: [
271
272
  e.slug,
@@ -273,43 +274,43 @@ var z = ({ kind: e, className: t }) => {
273
274
  e.version
274
275
  ]
275
276
  })] })]
276
- }), X.has(e.slug) && /* @__PURE__ */ T(l, {
277
+ }), $.has(e.slug) && /* @__PURE__ */ E(u, {
277
278
  variant: "success",
278
279
  className: "text-xs",
279
- children: [/* @__PURE__ */ w(O, {
280
+ children: [/* @__PURE__ */ T(k, {
280
281
  size: 10,
281
282
  className: "mr-1"
282
- }), "Installed"]
283
+ }), O("botlit.store.install.installedBadge", "Installed")]
283
284
  })]
284
- }) }), /* @__PURE__ */ w(i, { children: /* @__PURE__ */ T("div", {
285
+ }) }), /* @__PURE__ */ T(a, { children: /* @__PURE__ */ E("div", {
285
286
  className: "space-y-3",
286
- children: [/* @__PURE__ */ w("p", {
287
+ children: [/* @__PURE__ */ T("p", {
287
288
  className: "text-sm text-text-secondary line-clamp-2",
288
- children: p(e)
289
- }), /* @__PURE__ */ T("div", {
289
+ children: m(e)
290
+ }), /* @__PURE__ */ E("div", {
290
291
  className: "pt-3 border-t border-border-subtle flex items-center justify-between",
291
- children: [/* @__PURE__ */ w(l, {
292
+ children: [/* @__PURE__ */ T(u, {
292
293
  variant: "outline",
293
294
  className: "text-xs",
294
- children: B[e.kind] ?? e.kind
295
- }), /* @__PURE__ */ w("span", {
295
+ children: M[e.kind] ?? e.kind
296
+ }), /* @__PURE__ */ T("span", {
296
297
  className: "text-xs text-text-secondary",
297
- children: t(e.publishedAt)
298
+ children: n(e.publishedAt)
298
299
  })]
299
300
  })]
300
301
  }) })]
301
302
  })
302
303
  }, e.id))
303
- }) : /* @__PURE__ */ w(u, {
304
+ }) : /* @__PURE__ */ T(d, {
304
305
  illustration: "empty-search",
305
- title: "No packages found",
306
- description: k || M ? "Try adjusting your search or filters." : "No packages available in the store yet."
306
+ title: O("botlit.store.empty.title", "No packages found"),
307
+ description: N || I ? O("botlit.store.empty.descriptionFiltered", "Try adjusting your search or filters.") : O("botlit.store.empty.descriptionNoPackages", "No packages available in the store yet.")
307
308
  })
308
309
  ]
309
310
  })
310
311
  });
311
312
  };
312
313
  //#endregion
313
- export { V as StorePage };
314
+ export { H as StorePage };
314
315
 
315
316
  //# sourceMappingURL=StorePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StorePage.js","names":[],"sources":["../../../src/botlit/pages/StorePage.tsx"],"sourcesContent":["/**\n * Store Page\n * @module botlit/pages\n */\n\nimport type { FC, MouseEvent } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Search as SearchIcon,\n Store,\n Package,\n Bot,\n Wrench,\n FileText,\n Sparkles,\n Database,\n Shield,\n Check,\n ExternalLink,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } 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 {\n useStorePackages,\n useInstalledPackages,\n useInstallPackage,\n storePackageName,\n storePackageDescription,\n type StorePackageRecord,\n type StoreSortBy,\n} from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport {\n InstallMode as GqlInstallMode,\n PackageKind as GqlPackageKind,\n} from '../../generated/wspace-types';\nimport type { PackageKind } from '../types';\n\nconst KindIcon: FC<{ kind: string; className?: string }> = ({ kind, className }) => {\n switch (kind) {\n case 'APP':\n return <Package className={className} />;\n case 'AGENT':\n case 'A2A_AGENT':\n return <Bot className={className} />;\n case 'MCP_PACK':\n case 'TOOL':\n return <Wrench className={className} />;\n case 'PROMPT_TEMPLATE':\n case 'PROMPT':\n return <FileText className={className} />;\n case 'SKILL':\n return <Sparkles className={className} />;\n case 'RETRIEVAL_PROFILE':\n case 'KNOWLEDGE_BASE':\n case 'KB_TEMPLATE':\n return <Database className={className} />;\n case 'POLICY_BUNDLE':\n return <Shield className={className} />;\n default:\n return <Package className={className} />;\n }\n};\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\nexport const StorePage: FC = () => {\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [selectedKind, setSelectedKind] = useState<PackageKind | null>(null);\n const [sortBy, setSortBy] = useState<StoreSortBy>('recent');\n const [installingSlug, setInstallingSlug] = useState<string | null>(null);\n\n const storeFilter = useMemo(\n () => ({ search, kind: selectedKind ? [selectedKind] : undefined, sortBy }),\n [search, selectedKind, sortBy]\n );\n const { data: packages, loading, error, refetch } = useStorePackages(storeFilter);\n const { data: installed, refetch: refetchInstalled } = useInstalledPackages();\n const { install } = useInstallPackage();\n\n const installedSlugs = useMemo(\n () =>\n new Set(\n installed\n .map((entry) => entry.package?.slug)\n .filter((slug): slug is string => typeof slug === 'string')\n ),\n [installed]\n );\n\n const handleInstall = async (pkg: StorePackageRecord, e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setInstallingSlug(pkg.slug);\n try {\n await install({ packageId: pkg.id, mode: GqlInstallMode.Linked });\n toast.success(`Installed \"${storePackageName(pkg)}\"`);\n void refetchInstalled();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to install package');\n } finally {\n setInstallingSlug(null);\n }\n };\n\n const kinds: PackageKind[] = [\n GqlPackageKind.Agent,\n GqlPackageKind.McpPack,\n GqlPackageKind.Skill,\n GqlPackageKind.PromptTemplate,\n GqlPackageKind.PolicyBundle,\n ];\n\n return (\n <PageLayout\n title=\"Botlit Store\"\n description=\"Discover and install pre-built agents, tools, and configurations\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\">\n <Link to={getPath('store/installed')}>View Installed ({installed.length})</Link>\n </Button>\n <Button variant=\"outline\" leftIcon={<ExternalLink size={16} />}>\n Publish Package\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Store size={18} />}>\n The store is a marketplace of ready-made building blocks — full bots, agents, MCP tool\n packs, prompt templates and policy bundles published by the Botlit team and the community.\n Browse and install a package to skip the setup and start from a working example, then\n customise it for your own use case instead of building everything from scratch.\n </PagePurpose>\n\n {/* Search and 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 packages...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n {/* Kind Filters */}\n <div className=\"flex gap-2\">\n <Button\n variant={selectedKind === null ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedKind(null)}\n >\n All\n </Button>\n {kinds.map((kind) => (\n <Button\n key={kind}\n variant={selectedKind === kind ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedKind(kind)}\n leftIcon={<KindIcon kind={kind} className=\"h-4 w-4\" />}\n >\n {KindLabel[kind]}\n </Button>\n ))}\n </div>\n\n {/* Sort */}\n <select\n aria-label=\"Sort packages\"\n className=\"h-9 px-3 border border-border-default rounded-md bg-bg-surface text-sm\"\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as StoreSortBy)}\n >\n <option value=\"recent\">Recently Published</option>\n <option value=\"name\">Name (A–Z)</option>\n </select>\n </div>\n\n {/* Featured Section */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <GlassCard treatment=\"glass\" glow className=\"md:col-span-2 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"p-3 bg-action-primary-bg/20 rounded-lg\">\n <Store className=\"h-8 w-8 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary\">\n Welcome to the Botlit Store\n </h3>\n <p className=\"text-sm text-text-secondary mt-1\">\n Discover production-ready agents, tool packs, and configurations built by the\n community and Botlit team. Install packages to jumpstart your AI applications.\n </p>\n <div className=\"flex gap-4 mt-4\">\n <div className=\"text-center\">\n <p className=\"text-2xl font-bold tabular-nums\">{packages.length}</p>\n <p className=\"text-xs text-text-secondary\">Packages</p>\n </div>\n <div className=\"text-center\">\n <p className=\"text-2xl font-bold tabular-nums\">{installed.length}</p>\n <p className=\"text-xs text-text-secondary\">Installed</p>\n </div>\n </div>\n </div>\n </div>\n </GlassCard>\n <Card>\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"text-sm\">Quick Install</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {packages.slice(0, 3).map((pkg: StorePackageRecord) => (\n <div\n key={pkg.id}\n className=\"flex items-center justify-between p-2 bg-bg-sunken rounded\"\n >\n <div className=\"flex items-center gap-2\">\n <KindIcon kind={pkg.kind} className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm truncate max-w-[150px]\">{storePackageName(pkg)}</span>\n </div>\n {installedSlugs.has(pkg.slug) ? (\n <Badge variant=\"success\" className=\"text-xs\">\n <Check size={12} className=\"mr-1\" />\n Installed\n </Badge>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 text-xs\"\n onClick={(e) => void handleInstall(pkg, e)}\n isLoading={installingSlug === pkg.slug}\n >\n Install\n </Button>\n )}\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n {/* Packages Grid */}\n {loading ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"h-56 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"store packages\" error={error} onRetry={() => void refetch()} />\n ) : packages.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {packages.map((pkg: StorePackageRecord) => (\n <Link key={pkg.id} to={getPath(`store/package/${pkg.slug}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <KindIcon kind={pkg.kind} className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <CardTitle className=\"text-base\">{storePackageName(pkg)}</CardTitle>\n <CardDescription className=\"text-xs\">\n {pkg.slug} v{pkg.version}\n </CardDescription>\n </div>\n </div>\n {installedSlugs.has(pkg.slug) && (\n <Badge variant=\"success\" className=\"text-xs\">\n <Check size={10} className=\"mr-1\" />\n Installed\n </Badge>\n )}\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary line-clamp-2\">\n {storePackageDescription(pkg)}\n </p>\n\n {/* Footer */}\n <div className=\"pt-3 border-t border-border-subtle flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {KindLabel[pkg.kind] ?? pkg.kind}\n </Badge>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(pkg.publishedAt)}\n </span>\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No packages found\"\n description={\n search || selectedKind\n ? 'Try adjusting your search or filters.'\n : 'No packages available in the store yet.'\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"StorePage.js","names":[],"sources":["../../../src/botlit/pages/StorePage.tsx"],"sourcesContent":["/**\n * Store Page\n * @module botlit/pages\n */\n\nimport type { FC, MouseEvent } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Search as SearchIcon,\n Store,\n Package,\n Bot,\n Wrench,\n FileText,\n Sparkles,\n Database,\n Shield,\n Check,\n ExternalLink,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } 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 {\n useStorePackages,\n useInstalledPackages,\n useInstallPackage,\n storePackageName,\n storePackageDescription,\n type StorePackageRecord,\n type StoreSortBy,\n} from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport {\n InstallMode as GqlInstallMode,\n PackageKind as GqlPackageKind,\n} from '../../generated/wspace-types';\nimport type { PackageKind } from '../types';\n\nconst KindIcon: FC<{ kind: string; className?: string }> = ({ kind, className }) => {\n switch (kind) {\n case 'APP':\n return <Package className={className} />;\n case 'AGENT':\n case 'A2A_AGENT':\n return <Bot className={className} />;\n case 'MCP_PACK':\n case 'TOOL':\n return <Wrench className={className} />;\n case 'PROMPT_TEMPLATE':\n case 'PROMPT':\n return <FileText className={className} />;\n case 'SKILL':\n return <Sparkles className={className} />;\n case 'RETRIEVAL_PROFILE':\n case 'KNOWLEDGE_BASE':\n case 'KB_TEMPLATE':\n return <Database className={className} />;\n case 'POLICY_BUNDLE':\n return <Shield className={className} />;\n default:\n return <Package className={className} />;\n }\n};\n\nfunction useKindLabel(t: ReturnType<typeof useTr>): Record<string, string> {\n return {\n APP: t('botlit.store.kindLabel.APP', 'Bot'),\n AGENT: t('botlit.store.kindLabel.AGENT', 'Agent'),\n MCP_PACK: t('botlit.store.kindLabel.MCP_PACK', 'MCP Pack'),\n PROMPT_TEMPLATE: t('botlit.store.kindLabel.PROMPT_TEMPLATE', 'Prompt Template'),\n PROMPT: t('botlit.store.kindLabel.PROMPT', 'Prompt'),\n SKILL: t('botlit.store.kindLabel.SKILL', 'Skill'),\n RETRIEVAL_PROFILE: t('botlit.store.kindLabel.RETRIEVAL_PROFILE', 'Retrieval Profile'),\n POLICY_BUNDLE: t('botlit.store.kindLabel.POLICY_BUNDLE', 'Policy Bundle'),\n CHANNEL_TEMPLATE: t('botlit.store.kindLabel.CHANNEL_TEMPLATE', 'Channel Template'),\n A2A_AGENT: t('botlit.store.kindLabel.A2A_AGENT', 'A2A Agent'),\n KB_TEMPLATE: t('botlit.store.kindLabel.KB_TEMPLATE', 'KB Template'),\n KNOWLEDGE_BASE: t('botlit.store.kindLabel.KNOWLEDGE_BASE', 'Knowledge Base'),\n INTEGRATION: t('botlit.store.kindLabel.INTEGRATION', 'Integration'),\n TEMPLATE: t('botlit.store.kindLabel.TEMPLATE', 'Template'),\n TOOL: t('botlit.store.kindLabel.TOOL', 'Tool'),\n WORKFLOW: t('botlit.store.kindLabel.WORKFLOW', 'Workflow'),\n };\n}\n\nexport const StorePage: FC = () => {\n const t = useTr();\n const { getPath } = useBotlit();\n const kindLabel = useKindLabel(t);\n const [search, setSearch] = useState('');\n const [selectedKind, setSelectedKind] = useState<PackageKind | null>(null);\n const [sortBy, setSortBy] = useState<StoreSortBy>('recent');\n const [installingSlug, setInstallingSlug] = useState<string | null>(null);\n\n const storeFilter = useMemo(\n () => ({ search, kind: selectedKind ? [selectedKind] : undefined, sortBy }),\n [search, selectedKind, sortBy]\n );\n const { data: packages, loading, error, refetch } = useStorePackages(storeFilter);\n const { data: installed, refetch: refetchInstalled } = useInstalledPackages();\n const { install } = useInstallPackage();\n\n const installedSlugs = useMemo(\n () =>\n new Set(\n installed\n .map((entry) => entry.package?.slug)\n .filter((slug): slug is string => typeof slug === 'string')\n ),\n [installed]\n );\n\n const handleInstall = async (pkg: StorePackageRecord, e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setInstallingSlug(pkg.slug);\n try {\n await install({ packageId: pkg.id, mode: GqlInstallMode.Linked });\n toast.success(\n t('botlit.store.install.success', 'Installed \"{{name}}\"', {\n name: storePackageName(pkg),\n })\n );\n void refetchInstalled();\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.store.install.error', 'Failed to install package')\n );\n } finally {\n setInstallingSlug(null);\n }\n };\n\n const kinds: PackageKind[] = [\n GqlPackageKind.Agent,\n GqlPackageKind.McpPack,\n GqlPackageKind.Skill,\n GqlPackageKind.PromptTemplate,\n GqlPackageKind.PolicyBundle,\n ];\n\n return (\n <PageLayout\n title={t('botlit.store.title', 'BotManor Store')}\n description={t(\n 'botlit.store.description',\n 'Discover and install pre-built agents, tools, and configurations'\n )}\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\">\n <Link to={getPath('store/installed')}>\n {t('botlit.store.actions.viewInstalled', 'View Installed ({{count}})', {\n count: installed.length,\n })}\n </Link>\n </Button>\n <Button variant=\"outline\" leftIcon={<ExternalLink size={16} />}>\n {t('botlit.store.actions.publishPackage', 'Publish Package')}\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Store size={18} />}>\n {t(\n 'botlit.store.purpose',\n 'The store is a marketplace of ready-made building blocks — full bots, agents, MCP tool packs, prompt templates and policy bundles published by the BotManor team and the community. Browse and install a package to skip the setup and start from a working example, then customise it for your own use case instead of building everything from scratch.'\n )}\n </PagePurpose>\n\n {/* Search and 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={t('botlit.store.searchPlaceholder', 'Search packages...')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n {/* Kind Filters */}\n <div className=\"flex gap-2\">\n <Button\n variant={selectedKind === null ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedKind(null)}\n >\n {t('botlit.store.filters.all', 'All')}\n </Button>\n {kinds.map((kind) => (\n <Button\n key={kind}\n variant={selectedKind === kind ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedKind(kind)}\n leftIcon={<KindIcon kind={kind} className=\"h-4 w-4\" />}\n >\n {kindLabel[kind]}\n </Button>\n ))}\n </div>\n\n {/* Sort */}\n <select\n aria-label={t('botlit.store.filters.sortLabel', 'Sort packages')}\n className=\"h-9 px-3 border border-border-default rounded-md bg-bg-surface text-sm\"\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as StoreSortBy)}\n >\n <option value=\"recent\">{t('botlit.store.sort.recent', 'Recently Published')}</option>\n <option value=\"name\">{t('botlit.store.sort.name', 'Name (A–Z)')}</option>\n </select>\n </div>\n\n {/* Featured Section */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <GlassCard treatment=\"glass\" glow className=\"md:col-span-2 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"p-3 bg-action-primary-bg/20 rounded-lg\">\n <Store className=\"h-8 w-8 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary\">\n {t('botlit.store.featured.title', 'Welcome to the BotManor Store')}\n </h3>\n <p className=\"text-sm text-text-secondary mt-1\">\n {t(\n 'botlit.store.featured.description',\n 'Discover production-ready agents, tool packs, and configurations built by the community and BotManor team. Install packages to jumpstart your AI applications.'\n )}\n </p>\n <div className=\"flex gap-4 mt-4\">\n <div className=\"text-center\">\n <p className=\"text-2xl font-bold tabular-nums\">{packages.length}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('botlit.store.featured.packages', 'Packages')}\n </p>\n </div>\n <div className=\"text-center\">\n <p className=\"text-2xl font-bold tabular-nums\">{installed.length}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('botlit.store.featured.installed', 'Installed')}\n </p>\n </div>\n </div>\n </div>\n </div>\n </GlassCard>\n <Card>\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"text-sm\">\n {t('botlit.store.featured.quickInstall', 'Quick Install')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {packages.slice(0, 3).map((pkg: StorePackageRecord) => (\n <div\n key={pkg.id}\n className=\"flex items-center justify-between p-2 bg-bg-sunken rounded\"\n >\n <div className=\"flex items-center gap-2\">\n <KindIcon kind={pkg.kind} className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm truncate max-w-[150px]\">{storePackageName(pkg)}</span>\n </div>\n {installedSlugs.has(pkg.slug) ? (\n <Badge variant=\"success\" className=\"text-xs\">\n <Check size={12} className=\"mr-1\" />\n {t('botlit.store.install.installedBadge', 'Installed')}\n </Badge>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 text-xs\"\n onClick={(e) => void handleInstall(pkg, e)}\n isLoading={installingSlug === pkg.slug}\n >\n {t('botlit.store.install.action', 'Install')}\n </Button>\n )}\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n {/* Packages Grid */}\n {loading ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"h-56 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"store packages\" error={error} onRetry={() => void refetch()} />\n ) : packages.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {packages.map((pkg: StorePackageRecord) => (\n <Link key={pkg.id} to={getPath(`store/package/${pkg.slug}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <KindIcon kind={pkg.kind} className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <CardTitle className=\"text-base\">{storePackageName(pkg)}</CardTitle>\n <CardDescription className=\"text-xs\">\n {pkg.slug} v{pkg.version}\n </CardDescription>\n </div>\n </div>\n {installedSlugs.has(pkg.slug) && (\n <Badge variant=\"success\" className=\"text-xs\">\n <Check size={10} className=\"mr-1\" />\n {t('botlit.store.install.installedBadge', 'Installed')}\n </Badge>\n )}\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary line-clamp-2\">\n {storePackageDescription(pkg)}\n </p>\n\n {/* Footer */}\n <div className=\"pt-3 border-t border-border-subtle flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {kindLabel[pkg.kind] ?? pkg.kind}\n </Badge>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(pkg.publishedAt)}\n </span>\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title={t('botlit.store.empty.title', 'No packages found')}\n description={\n search || selectedKind\n ? t(\n 'botlit.store.empty.descriptionFiltered',\n 'Try adjusting your search or filters.'\n )\n : t(\n 'botlit.store.empty.descriptionNoPackages',\n 'No packages available in the store yet.'\n )\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}