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