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