@burdenoff/microfe-botmanor 2026.813.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/botlit/BotlitRoutes.js +357 -0
- package/dist/botlit/BotlitRoutes.js.map +1 -0
- package/dist/botlit/BotmanorRoot.js +12 -0
- package/dist/botlit/BotmanorRoot.js.map +1 -0
- package/dist/botlit/BotmanorRootInner.js +101 -0
- package/dist/botlit/BotmanorRootInner.js.map +1 -0
- package/dist/botlit/components/Badge.js +39 -0
- package/dist/botlit/components/Badge.js.map +1 -0
- package/dist/botlit/components/Button.js +46 -0
- package/dist/botlit/components/Button.js.map +1 -0
- package/dist/botlit/components/Card.js +31 -0
- package/dist/botlit/components/Card.js.map +1 -0
- package/dist/botlit/components/ChannelSelectorSheet.js +130 -0
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -0
- package/dist/botlit/components/EmptyState.js +35 -0
- package/dist/botlit/components/EmptyState.js.map +1 -0
- package/dist/botlit/components/ErrorState.js +33 -0
- package/dist/botlit/components/ErrorState.js.map +1 -0
- package/dist/botlit/components/Input.js +59 -0
- package/dist/botlit/components/Input.js.map +1 -0
- package/dist/botlit/components/PageLayout.js +34 -0
- package/dist/botlit/components/PageLayout.js.map +1 -0
- package/dist/botlit/components/QuotaExhaustedDialog.js +20 -0
- package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -0
- package/dist/botlit/components/RouteLoader.js +52 -0
- package/dist/botlit/components/RouteLoader.js.map +1 -0
- package/dist/botlit/components/VersionHistoryPanel.js +144 -0
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -0
- package/dist/botlit/components/WorkspaceRequired.js +70 -0
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -0
- package/dist/botlit/hooks/index.js +16 -0
- package/dist/botlit/hooks/internal/mutationInput.js +16 -0
- package/dist/botlit/hooks/internal/mutationInput.js.map +1 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +99 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -0
- package/dist/botlit/hooks/useA2A.js +184 -0
- package/dist/botlit/hooks/useA2A.js.map +1 -0
- package/dist/botlit/hooks/useAgents.js +469 -0
- package/dist/botlit/hooks/useAgents.js.map +1 -0
- package/dist/botlit/hooks/useBots.js +306 -0
- package/dist/botlit/hooks/useBots.js.map +1 -0
- package/dist/botlit/hooks/useBuckets.js +119 -0
- package/dist/botlit/hooks/useBuckets.js.map +1 -0
- package/dist/botlit/hooks/useChannels.js +213 -0
- package/dist/botlit/hooks/useChannels.js.map +1 -0
- package/dist/botlit/hooks/useConversations.js +64 -0
- package/dist/botlit/hooks/useConversations.js.map +1 -0
- package/dist/botlit/hooks/useExecutions.js +86 -0
- package/dist/botlit/hooks/useExecutions.js.map +1 -0
- package/dist/botlit/hooks/useKnowledgeBases.js +113 -0
- package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -0
- package/dist/botlit/hooks/useLLMProviders.js +83 -0
- package/dist/botlit/hooks/useLLMProviders.js.map +1 -0
- package/dist/botlit/hooks/useMCPServers.js +134 -0
- package/dist/botlit/hooks/useMCPServers.js.map +1 -0
- package/dist/botlit/hooks/usePolicies.js +120 -0
- package/dist/botlit/hooks/usePolicies.js.map +1 -0
- package/dist/botlit/hooks/usePromptTemplates.js +161 -0
- package/dist/botlit/hooks/usePromptTemplates.js.map +1 -0
- package/dist/botlit/hooks/useRetrievalProfiles.js +146 -0
- package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -0
- package/dist/botlit/hooks/useSkills.js +132 -0
- package/dist/botlit/hooks/useSkills.js.map +1 -0
- package/dist/botlit/hooks/useStore.js +167 -0
- package/dist/botlit/hooks/useStore.js.map +1 -0
- package/dist/botlit/hooks/useUserPlatformConnection.js +172 -0
- package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -0
- package/dist/botlit/index.js +11 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js +589 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -0
- package/dist/botlit/pages/A2ARegistryPage.js +240 -0
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -0
- package/dist/botlit/pages/AgentBuilderPage.js +486 -0
- package/dist/botlit/pages/AgentBuilderPage.js.map +1 -0
- package/dist/botlit/pages/AgentDetailPage.js +517 -0
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -0
- package/dist/botlit/pages/AgentsListPage.js +294 -0
- package/dist/botlit/pages/AgentsListPage.js.map +1 -0
- package/dist/botlit/pages/BotChannelsTab.js +530 -0
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -0
- package/dist/botlit/pages/BotDetailPage.js +872 -0
- package/dist/botlit/pages/BotDetailPage.js.map +1 -0
- package/dist/botlit/pages/BotWorkflowTab.js +229 -0
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -0
- package/dist/botlit/pages/BotsListPage.js +313 -0
- package/dist/botlit/pages/BotsListPage.js.map +1 -0
- package/dist/botlit/pages/BucketsPage.js +604 -0
- package/dist/botlit/pages/BucketsPage.js.map +1 -0
- package/dist/botlit/pages/ChannelDetailPage.js +955 -0
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -0
- package/dist/botlit/pages/ChannelRoutesPage.js +218 -0
- package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -0
- package/dist/botlit/pages/ChannelsPage.js +304 -0
- package/dist/botlit/pages/ChannelsPage.js.map +1 -0
- package/dist/botlit/pages/ChatPage.js +247 -0
- package/dist/botlit/pages/ChatPage.js.map +1 -0
- package/dist/botlit/pages/DashboardPage.js +318 -0
- package/dist/botlit/pages/DashboardPage.js.map +1 -0
- package/dist/botlit/pages/ExecutionDetailPage.js +313 -0
- package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -0
- package/dist/botlit/pages/ExecutionsPage.js +294 -0
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -0
- package/dist/botlit/pages/InstalledPackagesPage.js +619 -0
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -0
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js +473 -0
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -0
- package/dist/botlit/pages/KnowledgeBasesPage.js +150 -0
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -0
- package/dist/botlit/pages/MCPServerDetailPage.js +550 -0
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -0
- package/dist/botlit/pages/MCPServersPage.js +321 -0
- package/dist/botlit/pages/MCPServersPage.js.map +1 -0
- package/dist/botlit/pages/PoliciesPage.js +224 -0
- package/dist/botlit/pages/PoliciesPage.js.map +1 -0
- package/dist/botlit/pages/PolicyDetailPage.js +861 -0
- package/dist/botlit/pages/PolicyDetailPage.js.map +1 -0
- package/dist/botlit/pages/PromptStudioPage.js +236 -0
- package/dist/botlit/pages/PromptStudioPage.js.map +1 -0
- package/dist/botlit/pages/PromptTemplateDetailPage.js +812 -0
- package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -0
- package/dist/botlit/pages/PromptTemplatesPage.js +269 -0
- package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -0
- package/dist/botlit/pages/RetrievalProfileDetailPage.js +559 -0
- package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -0
- package/dist/botlit/pages/RetrievalProfilesPage.js +219 -0
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -0
- package/dist/botlit/pages/SettingsPage.js +655 -0
- package/dist/botlit/pages/SettingsPage.js.map +1 -0
- package/dist/botlit/pages/SkillDetailPage.js +778 -0
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -0
- package/dist/botlit/pages/SkillsPage.js +206 -0
- package/dist/botlit/pages/SkillsPage.js.map +1 -0
- package/dist/botlit/pages/StorePackageDetailPage.js +462 -0
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -0
- package/dist/botlit/pages/StorePage.js +315 -0
- package/dist/botlit/pages/StorePage.js.map +1 -0
- package/dist/botlit/providers/BotlitProvider.js +93 -0
- package/dist/botlit/providers/BotlitProvider.js.map +1 -0
- package/dist/botlit/store/botlitStore.js +101 -0
- package/dist/botlit/store/botlitStore.js.map +1 -0
- package/dist/botlit/utils/cn.js +10 -0
- package/dist/botlit/utils/cn.js.map +1 -0
- package/dist/botlit/utils/formatters.js +37 -0
- package/dist/botlit/utils/formatters.js.map +1 -0
- package/dist/botlit/utils/navigation.js +9 -0
- package/dist/botlit/utils/navigation.js.map +1 -0
- package/dist/botlit/utils/unions.js +14 -0
- package/dist/botlit/utils/unions.js.map +1 -0
- package/dist/generated/global-operations.js +66 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.js +8 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.js +1591 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.js +12 -0
- package/dist/generated/wspace-types.js.map +1 -0
- package/dist/index.js +13 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +133 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { useBotlit as e } from "../providers/BotlitProvider.js";
|
|
2
|
+
import { useBotlitStore as t } from "../store/botlitStore.js";
|
|
3
|
+
import { useBots as n, useDeleteBot as r } from "../hooks/useBots.js";
|
|
4
|
+
import { cn as i } from "../utils/cn.js";
|
|
5
|
+
import { formatNumber as a, formatRelativeTime as o } from "../utils/formatters.js";
|
|
6
|
+
import { PageLayout as s } from "../components/PageLayout.js";
|
|
7
|
+
import { Card as c, CardContent as l } from "../components/Card.js";
|
|
8
|
+
import { Button as u } from "../components/Button.js";
|
|
9
|
+
import { StatusBadge as d } from "../components/Badge.js";
|
|
10
|
+
import { isNative as f, nativeConfirm as p, nativeImpact as m, nativeNotify as h } from "../../utils/nativeBridge.js";
|
|
11
|
+
import { EmptyState as g } from "../components/EmptyState.js";
|
|
12
|
+
import { Input as _ } from "../components/Input.js";
|
|
13
|
+
import { useState as v } from "react";
|
|
14
|
+
import { GlassCard as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
|
|
15
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
16
|
+
import { Link as C } from "react-router";
|
|
17
|
+
import { Bot as w, Edit as T, Grid3X3 as E, List as D, MoreVertical as O, Plus as k, Search as A, Trash2 as j, Workflow as M } from "lucide-react";
|
|
18
|
+
import { useI18n as N } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
19
|
+
import { toast as P } from "sonner";
|
|
20
|
+
//#region src/botlit/pages/BotsListPage.tsx
|
|
21
|
+
var F = () => {
|
|
22
|
+
let { t: F } = N(), I = (e, t) => {
|
|
23
|
+
let n = F(e);
|
|
24
|
+
return n === e ? t : n;
|
|
25
|
+
}, { navigateTo: L, getPath: R } = e(), { data: z, loading: B } = n(), [V] = r(), { viewMode: H, setViewMode: U, botFilter: W, updateBotFilter: G } = t(), [K, q] = v(null), J = (e) => {
|
|
26
|
+
G({ search: e.target.value });
|
|
27
|
+
}, Y = async (e) => {
|
|
28
|
+
let t = `${I("botlit.botsList.delete.confirmPrefix", "Are you sure you want to delete")} "${e.name}"?`, n = await p({
|
|
29
|
+
title: "Delete bot?",
|
|
30
|
+
message: t,
|
|
31
|
+
okButtonTitle: "Delete",
|
|
32
|
+
cancelButtonTitle: "Cancel"
|
|
33
|
+
});
|
|
34
|
+
if (n === null ? confirm(t) : n) {
|
|
35
|
+
m("medium");
|
|
36
|
+
try {
|
|
37
|
+
await V(e.id), P.success(`${I("botlit.botsList.delete.successPrefix", "Bot")} "${e.name}" ${I("botlit.botsList.delete.successSuffix", "deleted successfully")}`), f() && h("success");
|
|
38
|
+
} catch (e) {
|
|
39
|
+
let t = e instanceof Error ? e.message : I("botlit.botsList.delete.error", "Failed to delete bot");
|
|
40
|
+
P.error(t), f() && h("error");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
q(null);
|
|
44
|
+
}, X = z?.filter((e) => {
|
|
45
|
+
if (W.search) {
|
|
46
|
+
let t = W.search.toLowerCase();
|
|
47
|
+
return e.name.toLowerCase().includes(t) || (e.description?.toLowerCase().includes(t) ?? !1);
|
|
48
|
+
}
|
|
49
|
+
return !0;
|
|
50
|
+
});
|
|
51
|
+
return /* @__PURE__ */ x(s, {
|
|
52
|
+
title: I("botlit.botsList.title", "Bots"),
|
|
53
|
+
description: I("botlit.botsList.description", "Manage your AI-powered bots"),
|
|
54
|
+
actions: /* @__PURE__ */ x(u, {
|
|
55
|
+
leftIcon: /* @__PURE__ */ x(k, { size: 16 }),
|
|
56
|
+
onClick: () => L("bots/new"),
|
|
57
|
+
children: I("botlit.botsList.actions.createBot", "Create Bot")
|
|
58
|
+
}),
|
|
59
|
+
children: /* @__PURE__ */ S("div", {
|
|
60
|
+
className: "space-y-6",
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ x(b, {
|
|
63
|
+
icon: /* @__PURE__ */ x(w, { size: 18 }),
|
|
64
|
+
children: I("botlit.botsList.purpose", "A bot is the deployable, user-facing surface for your AI — it wraps one or more agents and exposes them to people through chat, channels (Slack, web widget, WhatsApp) and APIs. Create a bot here when you are ready to put an agent in front of real users, then connect channels and watch its executions.")
|
|
65
|
+
}),
|
|
66
|
+
z && z.length > 0 ? /* @__PURE__ */ S("div", {
|
|
67
|
+
className: "grid grid-cols-2 gap-4 sm:grid-cols-3",
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ S(y, {
|
|
70
|
+
treatment: "glass",
|
|
71
|
+
glow: !0,
|
|
72
|
+
className: "p-4",
|
|
73
|
+
children: [/* @__PURE__ */ x("p", {
|
|
74
|
+
className: "text-sm text-text-secondary",
|
|
75
|
+
children: I("botlit.botsList.summary.total", "Total bots")
|
|
76
|
+
}), /* @__PURE__ */ x("p", {
|
|
77
|
+
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
78
|
+
children: z.length
|
|
79
|
+
})]
|
|
80
|
+
}),
|
|
81
|
+
/* @__PURE__ */ S(y, {
|
|
82
|
+
treatment: "metric",
|
|
83
|
+
className: "p-4",
|
|
84
|
+
children: [/* @__PURE__ */ x("p", {
|
|
85
|
+
className: "text-sm text-text-secondary",
|
|
86
|
+
children: I("botlit.botsList.summary.active", "Active")
|
|
87
|
+
}), /* @__PURE__ */ x("p", {
|
|
88
|
+
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
89
|
+
children: z.filter((e) => e.status === "ACTIVE").length
|
|
90
|
+
})]
|
|
91
|
+
}),
|
|
92
|
+
/* @__PURE__ */ S(y, {
|
|
93
|
+
treatment: "metric",
|
|
94
|
+
className: "col-span-2 p-4 sm:col-span-1",
|
|
95
|
+
children: [/* @__PURE__ */ x("p", {
|
|
96
|
+
className: "text-sm text-text-secondary",
|
|
97
|
+
children: I("botlit.botsList.summary.executions", "Total executions")
|
|
98
|
+
}), /* @__PURE__ */ x("p", {
|
|
99
|
+
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
100
|
+
children: a(z.reduce((e, t) => e + (t.executionCount ?? 0), 0))
|
|
101
|
+
})]
|
|
102
|
+
})
|
|
103
|
+
]
|
|
104
|
+
}) : null,
|
|
105
|
+
/* @__PURE__ */ S("div", {
|
|
106
|
+
className: "flex items-center justify-between gap-4",
|
|
107
|
+
children: [/* @__PURE__ */ S("div", {
|
|
108
|
+
className: "relative flex-1 max-w-md",
|
|
109
|
+
children: [/* @__PURE__ */ x(A, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x(_, {
|
|
110
|
+
placeholder: I("botlit.botsList.searchPlaceholder", "Search bots..."),
|
|
111
|
+
value: W.search || "",
|
|
112
|
+
onChange: J,
|
|
113
|
+
className: "pl-9"
|
|
114
|
+
})]
|
|
115
|
+
}), /* @__PURE__ */ S("div", {
|
|
116
|
+
className: "flex items-center gap-2",
|
|
117
|
+
children: [/* @__PURE__ */ x(u, {
|
|
118
|
+
variant: H === "grid" ? "secondary" : "ghost",
|
|
119
|
+
size: "icon",
|
|
120
|
+
onClick: () => U("grid"),
|
|
121
|
+
children: /* @__PURE__ */ x(E, { size: 18 })
|
|
122
|
+
}), /* @__PURE__ */ x(u, {
|
|
123
|
+
variant: H === "list" ? "secondary" : "ghost",
|
|
124
|
+
size: "icon",
|
|
125
|
+
onClick: () => U("list"),
|
|
126
|
+
children: /* @__PURE__ */ x(D, { size: 18 })
|
|
127
|
+
})]
|
|
128
|
+
})]
|
|
129
|
+
}),
|
|
130
|
+
B ? /* @__PURE__ */ x("div", {
|
|
131
|
+
className: i("gap-4", H === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : "flex flex-col"),
|
|
132
|
+
children: [
|
|
133
|
+
1,
|
|
134
|
+
2,
|
|
135
|
+
3,
|
|
136
|
+
4,
|
|
137
|
+
5,
|
|
138
|
+
6
|
|
139
|
+
].map((e) => /* @__PURE__ */ x("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
140
|
+
}) : X && X.length > 0 ? H === "grid" ? /* @__PURE__ */ x("div", {
|
|
141
|
+
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
142
|
+
children: X.map((e) => /* @__PURE__ */ x(c, {
|
|
143
|
+
className: "group hover:shadow-md transition-shadow cursor-pointer relative",
|
|
144
|
+
onClick: () => L(`bots/${e.id}`),
|
|
145
|
+
children: /* @__PURE__ */ S(l, {
|
|
146
|
+
className: "pt-6",
|
|
147
|
+
children: [
|
|
148
|
+
/* @__PURE__ */ S("div", {
|
|
149
|
+
className: "flex items-start justify-between",
|
|
150
|
+
children: [/* @__PURE__ */ S("div", {
|
|
151
|
+
className: "flex items-center gap-3",
|
|
152
|
+
children: [/* @__PURE__ */ x("span", {
|
|
153
|
+
className: "text-4xl",
|
|
154
|
+
children: e.icon || "🤖"
|
|
155
|
+
}), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h3", {
|
|
156
|
+
className: "font-semibold text-text-primary",
|
|
157
|
+
children: e.name
|
|
158
|
+
}), /* @__PURE__ */ x(d, { status: e.status })] })]
|
|
159
|
+
}), /* @__PURE__ */ S("div", {
|
|
160
|
+
className: "relative",
|
|
161
|
+
children: [/* @__PURE__ */ x(u, {
|
|
162
|
+
variant: "ghost",
|
|
163
|
+
size: "icon",
|
|
164
|
+
className: "opacity-0 group-hover:opacity-100 transition-opacity",
|
|
165
|
+
onClick: (t) => {
|
|
166
|
+
t.stopPropagation(), q(K === e.id ? null : e.id);
|
|
167
|
+
},
|
|
168
|
+
children: /* @__PURE__ */ x(O, { size: 16 })
|
|
169
|
+
}), K === e.id && /* @__PURE__ */ S("div", {
|
|
170
|
+
className: "absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10",
|
|
171
|
+
children: [
|
|
172
|
+
/* @__PURE__ */ S("button", {
|
|
173
|
+
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
174
|
+
onClick: (t) => {
|
|
175
|
+
t.stopPropagation(), L(`bots/${e.id}/edit`), q(null);
|
|
176
|
+
},
|
|
177
|
+
children: [/* @__PURE__ */ x(T, { size: 16 }), I("botlit.botsList.menu.editBot", "Edit Bot")]
|
|
178
|
+
}),
|
|
179
|
+
/* @__PURE__ */ S("button", {
|
|
180
|
+
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
181
|
+
onClick: (t) => {
|
|
182
|
+
t.stopPropagation(), L(`bots/${e.id}?tab=workflow`), q(null);
|
|
183
|
+
},
|
|
184
|
+
children: [/* @__PURE__ */ x(M, { size: 16 }), I("botlit.botsList.menu.design", "Design workflow")]
|
|
185
|
+
}),
|
|
186
|
+
/* @__PURE__ */ S("button", {
|
|
187
|
+
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
188
|
+
onClick: (t) => {
|
|
189
|
+
t.stopPropagation(), L(`bots/${e.id}/agents`), q(null);
|
|
190
|
+
},
|
|
191
|
+
children: [/* @__PURE__ */ x(w, { size: 16 }), I("botlit.botsList.menu.viewAgents", "View Agents")]
|
|
192
|
+
}),
|
|
193
|
+
/* @__PURE__ */ S("button", {
|
|
194
|
+
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2",
|
|
195
|
+
onClick: (t) => {
|
|
196
|
+
t.stopPropagation(), Y(e);
|
|
197
|
+
},
|
|
198
|
+
children: [/* @__PURE__ */ x(j, { size: 16 }), I("botlit.common.delete", "Delete")]
|
|
199
|
+
})
|
|
200
|
+
]
|
|
201
|
+
})]
|
|
202
|
+
})]
|
|
203
|
+
}),
|
|
204
|
+
/* @__PURE__ */ x("p", {
|
|
205
|
+
className: "mt-3 text-sm text-text-secondary line-clamp-2",
|
|
206
|
+
children: e.description
|
|
207
|
+
}),
|
|
208
|
+
/* @__PURE__ */ x("div", {
|
|
209
|
+
className: "mt-4 flex items-center gap-4 text-xs text-text-secondary",
|
|
210
|
+
children: /* @__PURE__ */ S("span", {
|
|
211
|
+
className: "flex items-center gap-1",
|
|
212
|
+
children: [
|
|
213
|
+
/* @__PURE__ */ x(w, { size: 14 }),
|
|
214
|
+
e.executionCount || 0,
|
|
215
|
+
" ",
|
|
216
|
+
I("botlit.common.executions", "executions")
|
|
217
|
+
]
|
|
218
|
+
})
|
|
219
|
+
}),
|
|
220
|
+
/* @__PURE__ */ S("div", {
|
|
221
|
+
className: "mt-3 pt-3 border-t border-border-subtle flex items-center justify-between gap-2",
|
|
222
|
+
children: [/* @__PURE__ */ S("span", {
|
|
223
|
+
className: "text-xs text-text-secondary",
|
|
224
|
+
children: [
|
|
225
|
+
I("botlit.botsList.createdLabel", "Created"),
|
|
226
|
+
" ",
|
|
227
|
+
o(e.createdAt)
|
|
228
|
+
]
|
|
229
|
+
}), /* @__PURE__ */ x(u, {
|
|
230
|
+
variant: "ghost",
|
|
231
|
+
size: "sm",
|
|
232
|
+
leftIcon: /* @__PURE__ */ x(M, { size: 14 }),
|
|
233
|
+
onClick: (t) => {
|
|
234
|
+
t.stopPropagation(), L(`bots/${e.id}?tab=workflow`);
|
|
235
|
+
},
|
|
236
|
+
children: I("botlit.botsList.actions.design", "Design")
|
|
237
|
+
})]
|
|
238
|
+
})
|
|
239
|
+
]
|
|
240
|
+
})
|
|
241
|
+
}, e.id))
|
|
242
|
+
}) : /* @__PURE__ */ x("div", {
|
|
243
|
+
className: "space-y-2",
|
|
244
|
+
children: X.map((e) => /* @__PURE__ */ x(c, {
|
|
245
|
+
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
246
|
+
onClick: () => L(`bots/${e.id}`),
|
|
247
|
+
children: /* @__PURE__ */ x(l, {
|
|
248
|
+
className: "py-4",
|
|
249
|
+
children: /* @__PURE__ */ S("div", {
|
|
250
|
+
className: "flex items-center justify-between",
|
|
251
|
+
children: [/* @__PURE__ */ S("div", {
|
|
252
|
+
className: "flex items-center gap-4",
|
|
253
|
+
children: [/* @__PURE__ */ x("span", {
|
|
254
|
+
className: "text-3xl",
|
|
255
|
+
children: e.icon || "🤖"
|
|
256
|
+
}), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
|
|
257
|
+
className: "flex items-center gap-2",
|
|
258
|
+
children: [/* @__PURE__ */ x("h3", {
|
|
259
|
+
className: "font-semibold text-text-primary",
|
|
260
|
+
children: e.name
|
|
261
|
+
}), /* @__PURE__ */ x(d, { status: e.status })]
|
|
262
|
+
}), /* @__PURE__ */ x("p", {
|
|
263
|
+
className: "text-sm text-text-secondary line-clamp-1",
|
|
264
|
+
children: e.description
|
|
265
|
+
})] })]
|
|
266
|
+
}), /* @__PURE__ */ S("div", {
|
|
267
|
+
className: "flex items-center gap-6 text-sm text-text-secondary",
|
|
268
|
+
children: [
|
|
269
|
+
/* @__PURE__ */ S("span", { children: [
|
|
270
|
+
a(e.executionCount),
|
|
271
|
+
" ",
|
|
272
|
+
I("botlit.common.executions", "executions")
|
|
273
|
+
] }),
|
|
274
|
+
/* @__PURE__ */ x(u, {
|
|
275
|
+
variant: "ghost",
|
|
276
|
+
size: "sm",
|
|
277
|
+
leftIcon: /* @__PURE__ */ x(M, { size: 14 }),
|
|
278
|
+
onClick: (t) => {
|
|
279
|
+
t.stopPropagation(), L(`bots/${e.id}?tab=workflow`);
|
|
280
|
+
},
|
|
281
|
+
children: I("botlit.botsList.actions.design", "Design")
|
|
282
|
+
}),
|
|
283
|
+
/* @__PURE__ */ x(u, {
|
|
284
|
+
variant: "ghost",
|
|
285
|
+
size: "sm",
|
|
286
|
+
children: /* @__PURE__ */ x(C, {
|
|
287
|
+
to: R(`bots/${e.id}`),
|
|
288
|
+
children: I("botlit.common.view", "View")
|
|
289
|
+
})
|
|
290
|
+
})
|
|
291
|
+
]
|
|
292
|
+
})]
|
|
293
|
+
})
|
|
294
|
+
})
|
|
295
|
+
}, e.id))
|
|
296
|
+
}) : /* @__PURE__ */ x(g, {
|
|
297
|
+
illustration: "empty-agents",
|
|
298
|
+
title: I("botlit.botsList.empty.title", "No bots yet"),
|
|
299
|
+
description: I("botlit.botsList.empty.description", "Create your first AI-powered bot to get started with building agents and automations."),
|
|
300
|
+
action: /* @__PURE__ */ x(u, {
|
|
301
|
+
leftIcon: /* @__PURE__ */ x(k, { size: 16 }),
|
|
302
|
+
onClick: () => L("bots/new"),
|
|
303
|
+
children: I("botlit.botsList.actions.createBot", "Create Bot")
|
|
304
|
+
})
|
|
305
|
+
})
|
|
306
|
+
]
|
|
307
|
+
})
|
|
308
|
+
});
|
|
309
|
+
};
|
|
310
|
+
//#endregion
|
|
311
|
+
export { F as BotsListPage };
|
|
312
|
+
|
|
313
|
+
//# sourceMappingURL=BotsListPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BotsListPage.js","names":[],"sources":["../../../src/botlit/pages/BotsListPage.tsx"],"sourcesContent":["/**\n * Bots List Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { Link } from 'react-router';\nimport {\n Plus,\n Search,\n Grid3X3,\n List,\n MoreVertical,\n Bot,\n Trash2,\n Edit,\n Workflow,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { toast } from 'sonner';\nimport { isNative, nativeConfirm, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardContent } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input } from '../components/Input';\nimport { StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useBots, useDeleteBot } from '../hooks/useBots';\nimport { useBotlitStore } from '../store/botlitStore';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime, formatNumber } from '../utils/formatters';\nimport { cn } from '../utils/cn';\n// Real GraphQL BotApp fields: id, name, slug, description, type, status, visibility, icon, routingStrategy, defaultAgentId, executionCount, createdAt, tagIds\n\nexport const BotsListPage: FC = () => {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { navigateTo, getPath } = useBotlit();\n const { data: bots, loading } = useBots();\n const [deleteBot] = useDeleteBot();\n const { viewMode, setViewMode, botFilter, updateBotFilter } = useBotlitStore();\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n updateBotFilter({ search: e.target.value });\n };\n\n const handleDelete = async (bot: { id: string; name: string }) => {\n const confirmMsg = `${t('botlit.botsList.delete.confirmPrefix', 'Are you sure you want to delete')} \"${bot.name}\"?`;\n const native = await nativeConfirm({\n title: 'Delete bot?',\n message: confirmMsg,\n okButtonTitle: 'Delete',\n cancelButtonTitle: 'Cancel',\n });\n const ok = native === null ? confirm(confirmMsg) : native;\n if (ok) {\n nativeImpact('medium');\n try {\n await deleteBot(bot.id);\n toast.success(\n `${t('botlit.botsList.delete.successPrefix', 'Bot')} \"${bot.name}\" ${t('botlit.botsList.delete.successSuffix', 'deleted successfully')}`\n );\n if (isNative()) void nativeNotify('success');\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botsList.delete.error', 'Failed to delete bot');\n toast.error(message);\n if (isNative()) void nativeNotify('error');\n }\n }\n setMenuOpen(null);\n };\n\n const filteredBots = bots?.filter((bot) => {\n if (botFilter.search) {\n const search = botFilter.search.toLowerCase();\n return (\n bot.name.toLowerCase().includes(search) ||\n (bot.description?.toLowerCase().includes(search) ?? false)\n );\n }\n return true;\n });\n\n return (\n <PageLayout\n title={t('botlit.botsList.title', 'Bots')}\n description={t('botlit.botsList.description', 'Manage your AI-powered bots')}\n actions={\n <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('bots/new')}>\n {t('botlit.botsList.actions.createBot', 'Create Bot')}\n </Button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Bot size={18} />}>\n {t(\n 'botlit.botsList.purpose',\n 'A bot is the deployable, user-facing surface for your AI — it wraps one or more agents and exposes them to people through chat, channels (Slack, web widget, WhatsApp) and APIs. Create a bot here when you are ready to put an agent in front of real users, then connect channels and watch its executions.'\n )}\n </PagePurpose>\n\n {/* Summary */}\n {bots && bots.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botsList.summary.total', 'Total bots')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {bots.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botsList.summary.active', 'Active')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {bots.filter((b: { status?: string }) => b.status === 'ACTIVE').length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"col-span-2 p-4 sm:col-span-1\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botsList.summary.executions', 'Total executions')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {formatNumber(bots.reduce((sum, bot) => sum + (bot.executionCount ?? 0), 0))}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Toolbar */}\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={t('botlit.botsList.searchPlaceholder', 'Search bots...')}\n value={botFilter.search || ''}\n onChange={handleSearch}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n size=\"icon\"\n onClick={() => setViewMode('grid')}\n >\n <Grid3X3 size={18} />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n size=\"icon\"\n onClick={() => setViewMode('list')}\n >\n <List size={18} />\n </Button>\n </div>\n </div>\n\n {/* Content */}\n {loading ? (\n <div\n className={cn(\n 'gap-4',\n viewMode === 'grid'\n ? 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3'\n : 'flex flex-col'\n )}\n >\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : filteredBots && filteredBots.length > 0 ? (\n viewMode === 'grid' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {filteredBots.map((bot) => (\n <Card\n key={bot.id}\n className=\"group hover:shadow-md transition-shadow cursor-pointer relative\"\n onClick={() => navigateTo(`bots/${bot.id}`)}\n >\n <CardContent className=\"pt-6\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-4xl\">{bot.icon || '🤖'}</span>\n <div>\n <h3 className=\"font-semibold text-text-primary\">{bot.name}</h3>\n <StatusBadge status={bot.status} />\n </div>\n </div>\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuOpen(menuOpen === bot.id ? null : bot.id);\n }}\n >\n <MoreVertical size={16} />\n </Button>\n {menuOpen === bot.id && (\n <div className=\"absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10\">\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`bots/${bot.id}/edit`);\n setMenuOpen(null);\n }}\n >\n <Edit size={16} />\n {t('botlit.botsList.menu.editBot', 'Edit Bot')}\n </button>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`bots/${bot.id}?tab=workflow`);\n setMenuOpen(null);\n }}\n >\n <Workflow size={16} />\n {t('botlit.botsList.menu.design', 'Design workflow')}\n </button>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`bots/${bot.id}/agents`);\n setMenuOpen(null);\n }}\n >\n <Bot size={16} />\n {t('botlit.botsList.menu.viewAgents', 'View Agents')}\n </button>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n handleDelete(bot);\n }}\n >\n <Trash2 size={16} />\n {t('botlit.common.delete', 'Delete')}\n </button>\n </div>\n )}\n </div>\n </div>\n <p className=\"mt-3 text-sm text-text-secondary line-clamp-2\">\n {bot.description}\n </p>\n <div className=\"mt-4 flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Bot size={14} />\n {bot.executionCount || 0} {t('botlit.common.executions', 'executions')}\n </span>\n </div>\n <div className=\"mt-3 pt-3 border-t border-border-subtle flex items-center justify-between gap-2\">\n <span className=\"text-xs text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(bot.createdAt)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Workflow size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`bots/${bot.id}?tab=workflow`);\n }}\n >\n {t('botlit.botsList.actions.design', 'Design')}\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2\">\n {filteredBots.map((bot) => (\n <Card\n key={bot.id}\n className=\"hover:shadow-md transition-shadow cursor-pointer\"\n onClick={() => navigateTo(`bots/${bot.id}`)}\n >\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-3xl\">{bot.icon || '🤖'}</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-text-primary\">{bot.name}</h3>\n <StatusBadge status={bot.status} />\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {bot.description}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-6 text-sm text-text-secondary\">\n <span>\n {formatNumber(bot.executionCount)}{' '}\n {t('botlit.common.executions', 'executions')}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Workflow size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`bots/${bot.id}?tab=workflow`);\n }}\n >\n {t('botlit.botsList.actions.design', 'Design')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\">\n <Link to={getPath(`bots/${bot.id}`)}>\n {t('botlit.common.view', 'View')}\n </Link>\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )\n ) : (\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.botsList.empty.title', 'No bots yet')}\n description={t(\n 'botlit.botsList.empty.description',\n 'Create your first AI-powered bot to get started with building agents and automations.'\n )}\n action={\n <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('bots/new')}>\n {t('botlit.botsList.actions.createBot', 'Create Bot')}\n </Button>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|