@burdenoff/microfe-botmanor 2026.1109.2 → 2026.1110.2
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.
- package/dist/botlit/components/Badge.js +2 -2
- package/dist/botlit/components/Badge.js.map +1 -1
- package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
- package/dist/botlit/components/LoadMore.d.ts +9 -0
- package/dist/botlit/components/LoadMore.js +22 -0
- package/dist/botlit/components/LoadMore.js.map +1 -0
- package/dist/botlit/components/index.d.ts +1 -0
- package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useAgents.d.ts +2 -6
- package/dist/botlit/hooks/useAgents.js +71 -95
- package/dist/botlit/hooks/useAgents.js.map +1 -1
- package/dist/botlit/hooks/useBots.d.ts +2 -6
- package/dist/botlit/hooks/useBots.js +51 -75
- package/dist/botlit/hooks/useBots.js.map +1 -1
- package/dist/botlit/hooks/useExecutions.d.ts +2 -2
- package/dist/botlit/hooks/useExecutions.js +30 -34
- package/dist/botlit/hooks/useExecutions.js.map +1 -1
- package/dist/botlit/hooks/useStore.d.ts +3 -3
- package/dist/botlit/hooks/useStore.js +41 -50
- package/dist/botlit/hooks/useStore.js.map +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +1 -1
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +157 -156
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +24 -24
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +147 -146
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +2 -2
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +141 -134
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +1 -1
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +2 -2
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +1 -1
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +150 -143
- package/dist/botlit/pages/StorePage.js.map +1 -1
- 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
|
|
5
|
-
import { BotmanorPermissionGate as
|
|
6
|
-
import { Card as
|
|
7
|
-
import { Button as
|
|
8
|
-
import { Input as
|
|
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 {
|
|
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 {
|
|
14
|
-
import {
|
|
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
|
|
19
|
-
import { jsx as
|
|
20
|
-
import { Link as
|
|
21
|
-
import { Bot as
|
|
22
|
-
import { toast as
|
|
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
|
|
25
|
+
var B = ({ kind: e, className: t }) => {
|
|
25
26
|
switch (e) {
|
|
26
|
-
case "APP": return /* @__PURE__ */
|
|
27
|
+
case "APP": return /* @__PURE__ */ T(N, { className: t });
|
|
27
28
|
case "AGENT":
|
|
28
|
-
case "A2A_AGENT": return /* @__PURE__ */
|
|
29
|
+
case "A2A_AGENT": return /* @__PURE__ */ T(O, { className: t });
|
|
29
30
|
case "MCP_PACK":
|
|
30
|
-
case "TOOL": return /* @__PURE__ */
|
|
31
|
+
case "TOOL": return /* @__PURE__ */ T(R, { className: t });
|
|
31
32
|
case "PROMPT_TEMPLATE":
|
|
32
|
-
case "PROMPT": return /* @__PURE__ */
|
|
33
|
-
case "SKILL": return /* @__PURE__ */
|
|
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__ */
|
|
37
|
-
case "POLICY_BUNDLE": return /* @__PURE__ */
|
|
38
|
-
default: return /* @__PURE__ */
|
|
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
|
|
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
|
|
62
|
-
let
|
|
63
|
-
search:
|
|
64
|
-
kind:
|
|
65
|
-
sortBy:
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
]), { data:
|
|
71
|
-
t.preventDefault(), t.stopPropagation(),
|
|
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
|
|
74
|
+
await oe({
|
|
74
75
|
packageId: e.id,
|
|
75
76
|
mode: b.Linked
|
|
76
|
-
}),
|
|
77
|
+
}), z.success(O("botlit.store.install.success", "Installed \"{{name}}\"", { name: g(e) })), ae();
|
|
77
78
|
} catch (e) {
|
|
78
|
-
|
|
79
|
+
z.error(e instanceof Error ? e.message : O("botlit.store.install.error", "Failed to install package"));
|
|
79
80
|
} finally {
|
|
80
|
-
|
|
81
|
+
G(null);
|
|
81
82
|
}
|
|
82
|
-
},
|
|
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__ */
|
|
90
|
-
title:
|
|
91
|
-
description:
|
|
92
|
-
actions: /* @__PURE__ */
|
|
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__ */
|
|
95
|
+
children: [/* @__PURE__ */ T(l, {
|
|
95
96
|
variant: "outline",
|
|
96
|
-
children: /* @__PURE__ */
|
|
97
|
-
to:
|
|
98
|
-
children:
|
|
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__ */
|
|
101
|
+
}), /* @__PURE__ */ T(l, {
|
|
101
102
|
variant: "outline",
|
|
102
|
-
leftIcon: /* @__PURE__ */
|
|
103
|
-
children:
|
|
103
|
+
leftIcon: /* @__PURE__ */ T(j, { size: 16 }),
|
|
104
|
+
children: O("botlit.store.actions.publishPackage", "Publish Package")
|
|
104
105
|
})]
|
|
105
106
|
}),
|
|
106
|
-
children: /* @__PURE__ */
|
|
107
|
+
children: /* @__PURE__ */ E("div", {
|
|
107
108
|
className: "space-y-6",
|
|
108
109
|
children: [
|
|
109
|
-
/* @__PURE__ */
|
|
110
|
-
icon: /* @__PURE__ */
|
|
111
|
-
children:
|
|
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__ */
|
|
114
|
+
/* @__PURE__ */ E("div", {
|
|
114
115
|
className: "flex flex-wrap items-center gap-4",
|
|
115
116
|
children: [
|
|
116
|
-
/* @__PURE__ */
|
|
117
|
+
/* @__PURE__ */ E("div", {
|
|
117
118
|
className: "relative flex-1 max-w-md",
|
|
118
|
-
children: [/* @__PURE__ */
|
|
119
|
-
placeholder:
|
|
120
|
-
value:
|
|
121
|
-
onChange: (e) =>
|
|
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__ */
|
|
126
|
+
/* @__PURE__ */ E("div", {
|
|
126
127
|
className: "flex gap-2",
|
|
127
|
-
children: [/* @__PURE__ */
|
|
128
|
-
variant:
|
|
128
|
+
children: [/* @__PURE__ */ T(l, {
|
|
129
|
+
variant: I === null ? "default" : "outline",
|
|
129
130
|
size: "sm",
|
|
130
|
-
onClick: () =>
|
|
131
|
-
children:
|
|
132
|
-
}),
|
|
133
|
-
variant:
|
|
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: () =>
|
|
136
|
-
leftIcon: /* @__PURE__ */
|
|
136
|
+
onClick: () => R(e),
|
|
137
|
+
leftIcon: /* @__PURE__ */ T(B, {
|
|
137
138
|
kind: e,
|
|
138
139
|
className: "h-4 w-4"
|
|
139
140
|
}),
|
|
140
|
-
children:
|
|
141
|
+
children: M[e]
|
|
141
142
|
}, e))]
|
|
142
143
|
}),
|
|
143
|
-
/* @__PURE__ */
|
|
144
|
-
"aria-label":
|
|
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:
|
|
147
|
-
onChange: (e) =>
|
|
148
|
-
children: [/* @__PURE__ */
|
|
147
|
+
value: H,
|
|
148
|
+
onChange: (e) => U(e.target.value),
|
|
149
|
+
children: [/* @__PURE__ */ T("option", {
|
|
149
150
|
value: "recent",
|
|
150
|
-
children:
|
|
151
|
-
}), /* @__PURE__ */
|
|
151
|
+
children: O("botlit.store.sort.recent", "Recently Published")
|
|
152
|
+
}), /* @__PURE__ */ T("option", {
|
|
152
153
|
value: "name",
|
|
153
|
-
children:
|
|
154
|
+
children: O("botlit.store.sort.name", "Name (A–Z)")
|
|
154
155
|
})]
|
|
155
156
|
})
|
|
156
157
|
]
|
|
157
158
|
}),
|
|
158
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ E("div", {
|
|
159
160
|
className: "grid grid-cols-1 md:grid-cols-3 gap-4",
|
|
160
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
165
|
+
children: /* @__PURE__ */ E("div", {
|
|
165
166
|
className: "flex items-start gap-4",
|
|
166
|
-
children: [/* @__PURE__ */
|
|
167
|
+
children: [/* @__PURE__ */ T("div", {
|
|
167
168
|
className: "p-3 bg-action-primary-bg/20 rounded-lg",
|
|
168
|
-
children: /* @__PURE__ */
|
|
169
|
-
}), /* @__PURE__ */
|
|
170
|
-
/* @__PURE__ */
|
|
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:
|
|
173
|
+
children: O("botlit.store.featured.title", "Welcome to the BotManor Store")
|
|
173
174
|
}),
|
|
174
|
-
/* @__PURE__ */
|
|
175
|
+
/* @__PURE__ */ T("p", {
|
|
175
176
|
className: "text-sm text-text-secondary mt-1",
|
|
176
|
-
children:
|
|
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__ */
|
|
179
|
+
/* @__PURE__ */ E("div", {
|
|
179
180
|
className: "flex gap-4 mt-4",
|
|
180
|
-
children: [/* @__PURE__ */
|
|
181
|
+
children: [/* @__PURE__ */ E("div", {
|
|
181
182
|
className: "text-center",
|
|
182
|
-
children: [/* @__PURE__ */
|
|
183
|
+
children: [/* @__PURE__ */ T("p", {
|
|
183
184
|
className: "text-2xl font-bold tabular-nums",
|
|
184
|
-
children:
|
|
185
|
-
}), /* @__PURE__ */
|
|
185
|
+
children: q.length
|
|
186
|
+
}), /* @__PURE__ */ T("p", {
|
|
186
187
|
className: "text-xs text-text-secondary",
|
|
187
|
-
children:
|
|
188
|
+
children: O("botlit.store.featured.packages", "Packages")
|
|
188
189
|
})]
|
|
189
|
-
}), /* @__PURE__ */
|
|
190
|
+
}), /* @__PURE__ */ E("div", {
|
|
190
191
|
className: "text-center",
|
|
191
|
-
children: [/* @__PURE__ */
|
|
192
|
+
children: [/* @__PURE__ */ T("p", {
|
|
192
193
|
className: "text-2xl font-bold tabular-nums",
|
|
193
194
|
children: Q.length
|
|
194
|
-
}), /* @__PURE__ */
|
|
195
|
+
}), /* @__PURE__ */ T("p", {
|
|
195
196
|
className: "text-xs text-text-secondary",
|
|
196
|
-
children:
|
|
197
|
+
children: O("botlit.store.featured.installed", "Installed")
|
|
197
198
|
})]
|
|
198
199
|
})]
|
|
199
200
|
})
|
|
200
201
|
] })]
|
|
201
202
|
})
|
|
202
|
-
}), /* @__PURE__ */
|
|
203
|
+
}), /* @__PURE__ */ E(i, { children: [/* @__PURE__ */ T(s, {
|
|
203
204
|
className: "pb-2",
|
|
204
|
-
children: /* @__PURE__ */
|
|
205
|
+
children: /* @__PURE__ */ T(c, {
|
|
205
206
|
className: "text-sm",
|
|
206
|
-
children:
|
|
207
|
+
children: O("botlit.store.featured.quickInstall", "Quick Install")
|
|
207
208
|
})
|
|
208
|
-
}), /* @__PURE__ */
|
|
209
|
+
}), /* @__PURE__ */ T(a, {
|
|
209
210
|
className: "space-y-2",
|
|
210
|
-
children:
|
|
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__ */
|
|
213
|
+
children: [/* @__PURE__ */ E("div", {
|
|
213
214
|
className: "flex items-center gap-2",
|
|
214
|
-
children: [/* @__PURE__ */
|
|
215
|
+
children: [/* @__PURE__ */ T(B, {
|
|
215
216
|
kind: e.kind,
|
|
216
217
|
className: "h-4 w-4 text-text-secondary"
|
|
217
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
222
|
+
}), $.has(e.slug) ? /* @__PURE__ */ E(d, {
|
|
222
223
|
variant: "success",
|
|
223
224
|
className: "text-xs",
|
|
224
|
-
children: [/* @__PURE__ */
|
|
225
|
+
children: [/* @__PURE__ */ T(k, {
|
|
225
226
|
size: 12,
|
|
226
227
|
className: "mr-1"
|
|
227
|
-
}),
|
|
228
|
-
}) : /* @__PURE__ */
|
|
229
|
-
permission:
|
|
230
|
-
children: /* @__PURE__ */
|
|
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
|
|
235
|
-
isLoading:
|
|
236
|
-
children:
|
|
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
|
-
|
|
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__ */
|
|
252
|
-
}) :
|
|
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:
|
|
255
|
-
onRetry: () => void
|
|
256
|
-
}) :
|
|
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:
|
|
259
|
-
to:
|
|
260
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
263
|
+
children: [/* @__PURE__ */ T(s, { children: /* @__PURE__ */ E("div", {
|
|
263
264
|
className: "flex items-start justify-between",
|
|
264
|
-
children: [/* @__PURE__ */
|
|
265
|
+
children: [/* @__PURE__ */ E("div", {
|
|
265
266
|
className: "flex items-center gap-3",
|
|
266
|
-
children: [/* @__PURE__ */
|
|
267
|
+
children: [/* @__PURE__ */ T("div", {
|
|
267
268
|
className: "p-2 bg-action-primary-bg/10 rounded-lg",
|
|
268
|
-
children: /* @__PURE__ */
|
|
269
|
+
children: /* @__PURE__ */ T(B, {
|
|
269
270
|
kind: e.kind,
|
|
270
271
|
className: "h-5 w-5 text-primary"
|
|
271
272
|
})
|
|
272
|
-
}), /* @__PURE__ */
|
|
273
|
+
}), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T(c, {
|
|
273
274
|
className: "text-base",
|
|
274
275
|
children: g(e)
|
|
275
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
284
|
+
}), $.has(e.slug) && /* @__PURE__ */ E(d, {
|
|
284
285
|
variant: "success",
|
|
285
286
|
className: "text-xs",
|
|
286
|
-
children: [/* @__PURE__ */
|
|
287
|
+
children: [/* @__PURE__ */ T(k, {
|
|
287
288
|
size: 10,
|
|
288
289
|
className: "mr-1"
|
|
289
|
-
}),
|
|
290
|
+
}), O("botlit.store.install.installedBadge", "Installed")]
|
|
290
291
|
})]
|
|
291
|
-
}) }), /* @__PURE__ */
|
|
292
|
+
}) }), /* @__PURE__ */ T(a, { children: /* @__PURE__ */ E("div", {
|
|
292
293
|
className: "space-y-3",
|
|
293
|
-
children: [/* @__PURE__ */
|
|
294
|
+
children: [/* @__PURE__ */ T("p", {
|
|
294
295
|
className: "text-sm text-text-secondary line-clamp-2",
|
|
295
296
|
children: h(e)
|
|
296
|
-
}), /* @__PURE__ */
|
|
297
|
+
}), /* @__PURE__ */ E("div", {
|
|
297
298
|
className: "pt-3 border-t border-border-subtle flex items-center justify-between",
|
|
298
|
-
children: [/* @__PURE__ */
|
|
299
|
+
children: [/* @__PURE__ */ T(d, {
|
|
299
300
|
variant: "outline",
|
|
300
301
|
className: "text-xs",
|
|
301
|
-
children:
|
|
302
|
-
}), /* @__PURE__ */
|
|
302
|
+
children: M[e.kind] ?? e.kind
|
|
303
|
+
}), /* @__PURE__ */ T("span", {
|
|
303
304
|
className: "text-xs text-text-secondary",
|
|
304
|
-
children:
|
|
305
|
+
children: y(e.publishedAt)
|
|
305
306
|
})]
|
|
306
307
|
})]
|
|
307
308
|
}) })]
|
|
308
309
|
})
|
|
309
310
|
}, e.id))
|
|
310
|
-
}) : /* @__PURE__ */
|
|
311
|
+
}) : /* @__PURE__ */ T(f, {
|
|
311
312
|
illustration: "empty-search",
|
|
312
|
-
title:
|
|
313
|
-
description:
|
|
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 {
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;AAiDA,IAAMG,KAAsD,EAAE,SAAM,mBAAgB;CAClF,QAAQC,GAAR;EACE,KAAK,OACH,OAAO,kBAACC,GAAD,EAAoB,aAAY,CAAA;EACzC,KAAK;EACL,KAAK,aACH,OAAO,kBAACC,GAAD,EAAgB,aAAY,CAAA;EACrC,KAAK;EACL,KAAK,QACH,OAAO,kBAACC,GAAD,EAAmB,aAAY,CAAA;EACxC,KAAK;EACL,KAAK,UACH,OAAO,kBAACC,GAAD,EAAqB,aAAY,CAAA;EAC1C,KAAK,SACH,OAAO,kBAACC,GAAD,EAAqB,aAAY,CAAA;EAC1C,KAAK;EACL,KAAK;EACL,KAAK,eACH,OAAO,kBAACC,GAAD,EAAqB,aAAY,CAAA;EAC1C,KAAK,iBACH,OAAO,kBAACC,GAAD,EAAmB,aAAY,CAAA;EACxC,SACE,OAAO,kBAACN,GAAD,EAAoB,aAAY,CAAA;CAC3C;AACF;AAEA,SAASO,EAAa,GAAqD;CACzE,OAAO;EACL,KAAKC,EAAE,8BAA8B,KAAK;EAC1C,OAAOA,EAAE,gCAAgC,OAAO;EAChD,UAAUA,EAAE,mCAAmC,UAAU;EACzD,iBAAiBA,EAAE,0CAA0C,iBAAiB;EAC9E,QAAQA,EAAE,iCAAiC,QAAQ;EACnD,OAAOA,EAAE,gCAAgC,OAAO;EAChD,mBAAmBA,EAAE,4CAA4C,mBAAmB;EACpF,eAAeA,EAAE,wCAAwC,eAAe;EACxE,kBAAkBA,EAAE,2CAA2C,kBAAkB;EACjF,WAAWA,EAAE,oCAAoC,WAAW;EAC5D,aAAaA,EAAE,sCAAsC,aAAa;EAClE,gBAAgBA,EAAE,yCAAyC,gBAAgB;EAC3E,aAAaA,EAAE,sCAAsC,aAAa;EAClE,UAAUA,EAAE,mCAAmC,UAAU;EACzD,MAAMA,EAAE,+BAA+B,MAAM;EAC7C,UAAUA,EAAE,mCAAmC,UAAU;CAC3D;AACF;AAEA,IAAaC,UAAsB;CACjC,IAAMD,IAAIE,EAAM,GACV,EAAE,eAAYC,EAAU,GACxBC,IAAYL,EAAaC,CAAC,GAC1B,CAACK,GAAQC,KAAaC,EAAS,EAAE,GACjC,CAACC,GAAcC,KAAmBF,EAA6B,IAAI,GACnE,CAACG,GAAQC,KAAaJ,EAAsB,QAAQ,GACpD,CAACK,GAAgBC,KAAqBN,EAAwB,IAAI,GAElEO,IAAcC,SACX;EAAE;EAAQ,MAAMP,IAAe,CAACA,CAAY,IAAI,KAAA;EAAW;CAAO,IACzE;EAACH;EAAQG;EAAcE;CAAM,CAC/B,GACM,EAAE,MAAMM,GAAU,YAAS,UAAO,eAAYC,EAAiBH,CAAW,GAC1E,EAAE,MAAMI,GAAW,SAASC,OAAqBC,EAAqB,GACtE,EAAE,gBAAYC,EAAkB,GAEhCC,IAAiBP,QAEnB,IAAI,IACFG,EACG,KAAK,MAAUK,EAAM,SAAS,IAAI,CAAC,CACnC,QAAQ,MAAyB,OAAOC,KAAS,QAAQ,CAC9D,GACF,CAACN,CAAS,CACZ,GAEMO,KAAgB,OAAO,GAAyB,MAAkB;EAGtE,AAFAC,EAAE,eAAe,GACjBA,EAAE,gBAAgB,GAClBb,EAAkBc,EAAI,IAAI;EAC1B,IAAI;GAOF,AANA,MAAMC,GAAQ;IAAE,WAAWD,EAAI;IAAI,MAAMxC,EAAe;GAAO,CAAC,GAChE2C,EAAM,QACJ9B,EAAE,gCAAgC,0BAAwB,EACxD,MAAM+B,EAAiBJ,CAAG,EAC5B,CAAC,CACH,GACAR,GAAsB;EACxB,SAASa,GAAK;GACZ,EAAM,MACJA,aAAe,QACXA,EAAI,UACJhC,EAAE,8BAA8B,2BAA2B,CACjE;EACF,UAAU;GACR,EAAkB,IAAI;EACxB;CACF,GAEMiC,KAAuB;EAC3B7C,EAAe;EACfA,EAAe;EACfA,EAAe;EACfA,EAAe;EACfA,EAAe;CACjB;CAEA,OACE,kBAAC+C,GAAD;EACE,OAAOnC,EAAE,sBAAsB,gBAAgB;EAC/C,aAAaA,EACX,4BACA,kEACF;EACA,SACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAACoC,GAAD;IAAQ,SAAQ;IACd,UAAA,kBAACC,GAAD;KAAM,IAAIC,EAAQ,iBAAiB;KAChC,UAAAtC,EAAE,sCAAsC,8BAA8B,EACrE,OAAOkB,EAAU,OACnB,CAAC;IACG,CAAA;GACA,CAAA,GACR,kBAACkB,GAAD;IAAQ,SAAQ;IAAU,UAAU,kBAACG,GAAD,EAAc,MAAM,GAAK,CAAA;IAC1D,UAAAvC,EAAE,uCAAuC,iBAAiB;GACrD,CAAA,CACL;;EAGP,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAACwC,GAAD;KAAa,MAAM,kBAACC,GAAD,EAAO,MAAM,GAAK,CAAA;KAClC,UAAAzC,EACC,wBACA,2VACF;IACW,CAAA;IAGb,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,kBAACX,GAAD,EAAY,WAAU,uEAAwE,CAAA,GAC9F,kBAACsD,IAAD;QACE,aAAa3C,EAAE,kCAAkC,oBAAoB;QACrE,OAAOK;QACP,WAAW,MAAMC,EAAU,EAAE,OAAO,KAAK;QACzC,WAAU;OACX,CAAA,CACE;;MAGL,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,kBAAC8B,GAAD;QACE,SAAS5B,MAAiB,OAAO,YAAY;QAC7C,MAAK;QACL,eAAeC,EAAgB,IAAI;QAElC,UAAAT,EAAE,4BAA4B,KAAK;OAC9B,CAAA,GACPiC,GAAM,KAAK,MACV,kBAACG,GAAD;QAEE,SAAS5B,MAAiBjB,IAAO,YAAY;QAC7C,MAAK;QACL,eAAekB,EAAgBlB,CAAI;QACnC,UAAU,kBAACD,GAAD;SAAgB;SAAM,WAAU;QAAW,CAAA;QAEpD,UAAAc,EAAUb;OACL,GAPDA,CAOC,CACT,CACE;;MAGL,kBAAC,UAAD;OACE,cAAYS,EAAE,kCAAkC,eAAe;OAC/D,WAAU;OACV,OAAOU;OACP,WAAW,MAAMC,EAAU,EAAE,OAAO,KAAoB;OAJ1D,UAAA,CAME,kBAAC,UAAD;QAAQ,OAAM;QAAU,UAAAX,EAAE,4BAA4B,oBAAoB;OAAU,CAAA,GACpF,kBAAC,UAAD;QAAQ,OAAM;QAAQ,UAAAA,EAAE,0BAA0B,YAAY;OAAU,CAAA,CAClE;;KACL;;IAGL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC4C,GAAD;MAAW,WAAU;MAAQ,MAAA;MAAK,WAAU;MAC1C,UAAA,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;QACb,UAAA,kBAACH,GAAD,EAAO,WAAU,uBAAwB,CAAA;OACtC,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA;QACE,kBAAC,MAAD;SAAI,WAAU;SACX,UAAAzC,EAAE,+BAA+B,+BAA+B;QAC/D,CAAA;QACJ,kBAAC,KAAD;SAAG,WAAU;SACV,UAAAA,EACC,qCACA,gKACF;QACC,CAAA;QACH,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,kBAAC,OAAD;UAAK,WAAU;UAAf,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;WAAmC,UAAAgB,EAAS;UAAU,CAAA,GACnE,kBAAC,KAAD;WAAG,WAAU;WACV,UAAAhB,EAAE,kCAAkC,UAAU;UAC9C,CAAA,CACA;SACL,CAAA,GAAA,kBAAC,OAAD;UAAK,WAAU;UAAf,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;WAAmC,UAAAkB,EAAU;UAAU,CAAA,GACpE,kBAAC,KAAD;WAAG,WAAU;WACV,UAAAlB,EAAE,mCAAmC,WAAW;UAChD,CAAA,CACA;SACF,CAAA,CAAA;;OACF,EAAA,CAAA,CACF;;KACI,CAAA,GACX,kBAAC6C,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD;MAAY,WAAU;MACpB,UAAA,kBAACC,GAAD;OAAW,WAAU;OAClB,UAAA/C,EAAE,sCAAsC,eAAe;MAC/C,CAAA;KACD,CAAA,GACZ,kBAACgD,GAAD;MAAa,WAAU;MACpB,UAAAhC,EAAS,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,MACzB,kBAAC,OAAD;OAEE,WAAU;OAFZ,UAAA,CAIE,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC1B,GAAD;SAAU,MAAMqC,EAAI;SAAM,WAAU;QAA+B,CAAA,GACnE,kBAAC,QAAD;SAAM,WAAU;SAAkC,UAAAI,EAAiBJ,CAAG;QAAQ,CAAA,CAC3E;OACJ,CAAA,GAAAL,EAAe,IAAIK,EAAI,IAAI,IAC1B,kBAACsB,GAAD;QAAO,SAAQ;QAAU,WAAU;QAAnC,UAAA,CACE,kBAACC,GAAD;SAAO,MAAM;SAAI,WAAU;QAAQ,CAAA,GAClClD,EAAE,uCAAuC,WAAW,CAChD;OAEP,CAAA,IAAA,kBAACmD,GAAD;QAAwB,YAAYC,EAAqB;QACvD,UAAA,kBAAChB,GAAD;SACE,MAAK;SACL,SAAQ;SACR,WAAU;SACV,UAAU,MAAM,KAAKX,GAAcE,GAAKD,CAAC;SACzC,WAAWd,MAAmBe,EAAI;SAEjC,UAAA3B,EAAE,+BAA+B,SAAS;QACrC,CAAA;OACc,CAAA,CAEvB;MAzBE,GAAA2B,EAAI,EAyBN,CACN;KACU,CAAA,CACT,EAAA,CAAA,CACH;;IAGJ0B,IACC,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAA;MAAC;MAAG;MAAG;MAAG;MAAG;MAAG;KAAC,CAAC,CAAC,KAAK,MACvB,kBAAC,OAAD,EAEE,WAAU,8DACX,GAFMC,CAEN,CACF;IACE,CAAA,IACHC,IACF,kBAACC,GAAD;KAAY,UAAS;KAAwB;KAAO,eAAe,KAAKC,EAAQ;IAAI,CAAA,IAClFzC,EAAS,SAAS,IACpB,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAAA,EAAS,KAAK,MACb,kBAACqB,GAAD;MAAmB,IAAIC,EAAQ,iBAAiBX,EAAI,MAAM;MACxD,UAAA,kBAACkB,GAAD;OAAM,WAAU;OAAhB,UAAA,CACE,kBAACC,GAAD,EAAA,UACE,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,kBAAC,OAAD;UAAK,WAAU;UACb,UAAA,kBAACxD,GAAD;WAAU,MAAMqC,EAAI;WAAM,WAAU;UAAwB,CAAA;SACzD,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAACoB,GAAD;UAAW,WAAU;UAAa,UAAAhB,EAAiBJ,CAAG;SAAa,CAAA,GACnE,kBAAC+B,GAAD;UAAiB,WAAU;UAA3B,UAAA;WACG/B,EAAI;WAAK;WAAGA,EAAI;UACF;SACd,CAAA,CAAA,EAAA,CAAA,CACF;QACJ,CAAA,GAAAL,EAAe,IAAIK,EAAI,IAAI,KAC1B,kBAACsB,GAAD;SAAO,SAAQ;SAAU,WAAU;SAAnC,UAAA,CACE,kBAACC,GAAD;UAAO,MAAM;UAAI,WAAU;SAAQ,CAAA,GAClClD,EAAE,uCAAuC,WAAW,CAChD;QAEN,CAAA,CAAA;OACK,CAAA,EAAA,CAAA,GACZ,kBAACgD,GAAD,EAAA,UACE,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SACV,UAAAW,EAAwBhC,CAAG;QAC3B,CAAA,GAGH,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,kBAACsB,GAAD;UAAO,SAAQ;UAAU,WAAU;UAChC,UAAA7C,EAAUuB,EAAI,SAASA,EAAI;SACvB,CAAA,GACP,kBAAC,QAAD;UAAM,WAAU;UACb,UAAAiC,EAAmBjC,EAAI,WAAW;SAC/B,CAAA,CACH;QACF,CAAA,CAAA;OACM,CAAA,EAAA,CAAA,CACT;;KACF,GAzCKA,EAAI,EAyCT,CACP;IACE,CAAA,IAEL,kBAACkC,GAAD;KACE,cAAa;KACb,OAAO7D,EAAE,4BAA4B,mBAAmB;KACxD,aACEK,KAAUG,IACNR,EACE,0CACA,uCACF,IACAA,EACE,4CACA,yCACF;IAEP,CAAA;GAEA;;CACK,CAAA;AAEhB"}
|
|
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