@burdenoff/microfe-botmanor 2026.1027.2 → 2026.1027.3
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 +142 -132
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/components/AgentApprovalPanel.js +144 -126
- package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
- package/dist/botlit/components/ModelRegistrationPanel.js +4 -4
- package/dist/botlit/components/VersionHistoryPanel.js +92 -83
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js +212 -203
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/A2ARegistryPage.js +129 -117
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentApprovalsPage.js +122 -110
- package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
- package/dist/botlit/pages/AgentBuilderPage.js +18 -18
- package/dist/botlit/pages/AgentDetailPage.js +298 -273
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +145 -121
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +238 -226
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.js +307 -288
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.js +125 -116
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +159 -144
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +279 -258
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +346 -328
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelRoutesPage.js +10 -10
- package/dist/botlit/pages/ChannelsPage.js +163 -148
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/DashboardPage.js +129 -114
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionDetailPage.js +145 -139
- package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +14 -14
- package/dist/botlit/pages/InstalledPackagesPage.js +245 -227
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js +168 -156
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.js +91 -79
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServerDetailPage.js +200 -188
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +170 -155
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.js +113 -104
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/PolicyDetailPage.js +145 -133
- package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptStudioPage.js +106 -97
- package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplateDetailPage.js +359 -347
- package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplatesPage.js +127 -112
- package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfileDetailPage.js +219 -210
- package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.js +112 -103
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +264 -252
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +235 -226
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.js +115 -106
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +194 -188
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +161 -155
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/permissions/PermissionRequired.js +45 -0
- package/dist/botlit/permissions/PermissionRequired.js.map +1 -0
- package/dist/botlit/permissions/botmanorPermissions.js +72 -0
- package/dist/botlit/permissions/botmanorPermissions.js.map +1 -0
- package/dist/botlit/permissions/index.js +3 -0
- package/dist/botlit/permissions/useBotmanorPermissions.js +19 -0
- package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -0
- package/package.json +1 -1
|
@@ -4,128 +4,134 @@ import { useBotlitStore as n } from "../store/botlitStore.js";
|
|
|
4
4
|
import { useBots as r, useDeleteBot as i } from "../hooks/useBots.js";
|
|
5
5
|
import { cn as a } from "../utils/cn.js";
|
|
6
6
|
import { formatNumber as o, formatRelativeTime as s } from "../utils/formatters.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { BOTMANOR_PERMISSIONS as c } from "../permissions/botmanorPermissions.js";
|
|
8
|
+
import { BotmanorPermissionGate as l } from "../permissions/useBotmanorPermissions.js";
|
|
9
|
+
import { PageLayout as u } from "../components/PageLayout.js";
|
|
9
10
|
import { Button as d } from "../components/Button.js";
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
11
|
+
import "../permissions/index.js";
|
|
12
|
+
import { Card as f, CardContent as p } from "../components/Card.js";
|
|
13
|
+
import { StatusBadge as m } from "../components/Badge.js";
|
|
14
|
+
import { isNative as h, nativeConfirm as g, nativeImpact as _, nativeNotify as v } from "../../utils/nativeBridge.js";
|
|
15
|
+
import { EmptyState as y } from "../components/EmptyState.js";
|
|
16
|
+
import { Input as b } from "../components/Input.js";
|
|
17
|
+
import { useState as x } from "react";
|
|
18
|
+
import { GlassCard as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
|
|
19
|
+
import { jsx as w, jsxs as T } from "react/jsx-runtime";
|
|
20
|
+
import { Link as E } from "react-router";
|
|
21
|
+
import { Bot as D, Edit as O, Grid3X3 as k, List as A, MoreVertical as j, Plus as M, Search as N, Trash2 as P, Workflow as F } from "lucide-react";
|
|
22
|
+
import { toast as I } from "sonner";
|
|
20
23
|
//#region src/botlit/pages/BotsListPage.tsx
|
|
21
|
-
var
|
|
22
|
-
let
|
|
23
|
-
|
|
24
|
-
},
|
|
25
|
-
let t = `${
|
|
24
|
+
var L = () => {
|
|
25
|
+
let L = e(), { navigateTo: R, getPath: z } = t(), { data: B, loading: V } = r(), [H] = i(), { viewMode: U, setViewMode: W, botFilter: G, updateBotFilter: K } = n(), [q, J] = x(null), Y = (e) => {
|
|
26
|
+
K({ search: e.target.value });
|
|
27
|
+
}, X = async (e) => {
|
|
28
|
+
let t = `${L("botlit.botsList.delete.confirmPrefix", "Are you sure you want to delete")} "${e.name}"?`, n = await g({
|
|
26
29
|
title: "Delete bot?",
|
|
27
30
|
message: t,
|
|
28
31
|
okButtonTitle: "Delete",
|
|
29
32
|
cancelButtonTitle: "Cancel"
|
|
30
33
|
});
|
|
31
34
|
if (n === null ? confirm(t) : n) {
|
|
32
|
-
|
|
35
|
+
_("medium");
|
|
33
36
|
try {
|
|
34
|
-
await
|
|
37
|
+
await H(e.id), I.success(`${L("botlit.botsList.delete.successPrefix", "Bot")} "${e.name}" ${L("botlit.botsList.delete.successSuffix", "deleted successfully")}`), h() && v("success");
|
|
35
38
|
} catch (e) {
|
|
36
|
-
let t = e instanceof Error ? e.message :
|
|
37
|
-
|
|
39
|
+
let t = e instanceof Error ? e.message : L("botlit.botsList.delete.error", "Failed to delete bot");
|
|
40
|
+
I.error(t), h() && v("error");
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
|
-
|
|
41
|
-
},
|
|
42
|
-
if (
|
|
43
|
-
let t =
|
|
43
|
+
J(null);
|
|
44
|
+
}, Z = B?.filter((e) => {
|
|
45
|
+
if (G.search) {
|
|
46
|
+
let t = G.search.toLowerCase();
|
|
44
47
|
return e.name.toLowerCase().includes(t) || (e.description?.toLowerCase().includes(t) ?? !1);
|
|
45
48
|
}
|
|
46
49
|
return !0;
|
|
47
50
|
});
|
|
48
|
-
return /* @__PURE__ */
|
|
49
|
-
title:
|
|
50
|
-
description:
|
|
51
|
-
actions: /* @__PURE__ */
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
return /* @__PURE__ */ w(u, {
|
|
52
|
+
title: L("botlit.botsList.title", "Bots"),
|
|
53
|
+
description: L("botlit.botsList.description", "Manage your AI-powered bots"),
|
|
54
|
+
actions: /* @__PURE__ */ w(l, {
|
|
55
|
+
permission: c.APP_CREATE,
|
|
56
|
+
children: /* @__PURE__ */ w(d, {
|
|
57
|
+
leftIcon: /* @__PURE__ */ w(M, { size: 16 }),
|
|
58
|
+
onClick: () => R("bots/new"),
|
|
59
|
+
children: L("botlit.botsList.actions.createBot", "Create Bot")
|
|
60
|
+
})
|
|
55
61
|
}),
|
|
56
|
-
children: /* @__PURE__ */
|
|
62
|
+
children: /* @__PURE__ */ T("div", {
|
|
57
63
|
className: "space-y-6",
|
|
58
64
|
children: [
|
|
59
|
-
/* @__PURE__ */
|
|
60
|
-
icon: /* @__PURE__ */
|
|
61
|
-
children:
|
|
65
|
+
/* @__PURE__ */ w(C, {
|
|
66
|
+
icon: /* @__PURE__ */ w(D, { size: 18 }),
|
|
67
|
+
children: L("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.")
|
|
62
68
|
}),
|
|
63
|
-
|
|
69
|
+
B && B.length > 0 ? /* @__PURE__ */ T("div", {
|
|
64
70
|
className: "grid grid-cols-2 gap-4 sm:grid-cols-3",
|
|
65
71
|
children: [
|
|
66
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ T(S, {
|
|
67
73
|
treatment: "glass",
|
|
68
74
|
glow: !0,
|
|
69
75
|
className: "p-4",
|
|
70
|
-
children: [/* @__PURE__ */
|
|
76
|
+
children: [/* @__PURE__ */ w("p", {
|
|
71
77
|
className: "text-sm text-text-secondary",
|
|
72
|
-
children:
|
|
73
|
-
}), /* @__PURE__ */
|
|
78
|
+
children: L("botlit.botsList.summary.total", "Total bots")
|
|
79
|
+
}), /* @__PURE__ */ w("p", {
|
|
74
80
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
75
|
-
children:
|
|
81
|
+
children: B.length
|
|
76
82
|
})]
|
|
77
83
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ T(S, {
|
|
79
85
|
treatment: "metric",
|
|
80
86
|
className: "p-4",
|
|
81
|
-
children: [/* @__PURE__ */
|
|
87
|
+
children: [/* @__PURE__ */ w("p", {
|
|
82
88
|
className: "text-sm text-text-secondary",
|
|
83
|
-
children:
|
|
84
|
-
}), /* @__PURE__ */
|
|
89
|
+
children: L("botlit.botsList.summary.active", "Active")
|
|
90
|
+
}), /* @__PURE__ */ w("p", {
|
|
85
91
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
86
|
-
children:
|
|
92
|
+
children: B.filter((e) => e.status === "ACTIVE").length
|
|
87
93
|
})]
|
|
88
94
|
}),
|
|
89
|
-
/* @__PURE__ */
|
|
95
|
+
/* @__PURE__ */ T(S, {
|
|
90
96
|
treatment: "metric",
|
|
91
97
|
className: "col-span-2 p-4 sm:col-span-1",
|
|
92
|
-
children: [/* @__PURE__ */
|
|
98
|
+
children: [/* @__PURE__ */ w("p", {
|
|
93
99
|
className: "text-sm text-text-secondary",
|
|
94
|
-
children:
|
|
95
|
-
}), /* @__PURE__ */
|
|
100
|
+
children: L("botlit.botsList.summary.executions", "Total executions")
|
|
101
|
+
}), /* @__PURE__ */ w("p", {
|
|
96
102
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
97
|
-
children: o(
|
|
103
|
+
children: o(B.reduce((e, t) => e + (t.executionCount ?? 0), 0))
|
|
98
104
|
})]
|
|
99
105
|
})
|
|
100
106
|
]
|
|
101
107
|
}) : null,
|
|
102
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ T("div", {
|
|
103
109
|
className: "flex items-center justify-between gap-4",
|
|
104
|
-
children: [/* @__PURE__ */
|
|
110
|
+
children: [/* @__PURE__ */ T("div", {
|
|
105
111
|
className: "relative flex-1 max-w-md",
|
|
106
|
-
children: [/* @__PURE__ */
|
|
107
|
-
placeholder:
|
|
108
|
-
value:
|
|
109
|
-
onChange:
|
|
112
|
+
children: [/* @__PURE__ */ w(N, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ w(b, {
|
|
113
|
+
placeholder: L("botlit.botsList.searchPlaceholder", "Search bots..."),
|
|
114
|
+
value: G.search || "",
|
|
115
|
+
onChange: Y,
|
|
110
116
|
className: "pl-9"
|
|
111
117
|
})]
|
|
112
|
-
}), /* @__PURE__ */
|
|
118
|
+
}), /* @__PURE__ */ T("div", {
|
|
113
119
|
className: "flex items-center gap-2",
|
|
114
|
-
children: [/* @__PURE__ */
|
|
115
|
-
variant:
|
|
120
|
+
children: [/* @__PURE__ */ w(d, {
|
|
121
|
+
variant: U === "grid" ? "secondary" : "ghost",
|
|
116
122
|
size: "icon",
|
|
117
|
-
onClick: () =>
|
|
118
|
-
children: /* @__PURE__ */
|
|
119
|
-
}), /* @__PURE__ */
|
|
120
|
-
variant:
|
|
123
|
+
onClick: () => W("grid"),
|
|
124
|
+
children: /* @__PURE__ */ w(k, { size: 18 })
|
|
125
|
+
}), /* @__PURE__ */ w(d, {
|
|
126
|
+
variant: U === "list" ? "secondary" : "ghost",
|
|
121
127
|
size: "icon",
|
|
122
|
-
onClick: () =>
|
|
123
|
-
children: /* @__PURE__ */
|
|
128
|
+
onClick: () => W("list"),
|
|
129
|
+
children: /* @__PURE__ */ w(A, { size: 18 })
|
|
124
130
|
})]
|
|
125
131
|
})]
|
|
126
132
|
}),
|
|
127
|
-
|
|
128
|
-
className: a("gap-4",
|
|
133
|
+
V ? /* @__PURE__ */ w("div", {
|
|
134
|
+
className: a("gap-4", U === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : "flex flex-col"),
|
|
129
135
|
children: [
|
|
130
136
|
1,
|
|
131
137
|
2,
|
|
@@ -133,156 +139,162 @@ var F = () => {
|
|
|
133
139
|
4,
|
|
134
140
|
5,
|
|
135
141
|
6
|
|
136
|
-
].map((e) => /* @__PURE__ */
|
|
137
|
-
}) :
|
|
142
|
+
].map((e) => /* @__PURE__ */ w("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
143
|
+
}) : Z && Z.length > 0 ? U === "grid" ? /* @__PURE__ */ w("div", {
|
|
138
144
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
139
|
-
children:
|
|
145
|
+
children: Z.map((e) => /* @__PURE__ */ w(f, {
|
|
140
146
|
className: "group hover:shadow-md transition-shadow cursor-pointer relative",
|
|
141
|
-
onClick: () =>
|
|
142
|
-
children: /* @__PURE__ */
|
|
147
|
+
onClick: () => R(`bots/${e.id}`),
|
|
148
|
+
children: /* @__PURE__ */ T(p, {
|
|
143
149
|
className: "pt-6",
|
|
144
150
|
children: [
|
|
145
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ T("div", {
|
|
146
152
|
className: "flex items-start justify-between",
|
|
147
|
-
children: [/* @__PURE__ */
|
|
153
|
+
children: [/* @__PURE__ */ T("div", {
|
|
148
154
|
className: "flex items-center gap-3",
|
|
149
|
-
children: [/* @__PURE__ */
|
|
155
|
+
children: [/* @__PURE__ */ w("span", {
|
|
150
156
|
className: "text-4xl",
|
|
151
157
|
children: e.icon || "🤖"
|
|
152
|
-
}), /* @__PURE__ */
|
|
158
|
+
}), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h3", {
|
|
153
159
|
className: "font-semibold text-text-primary",
|
|
154
160
|
children: e.name
|
|
155
|
-
}), /* @__PURE__ */
|
|
156
|
-
}), /* @__PURE__ */
|
|
161
|
+
}), /* @__PURE__ */ w(m, { status: e.status })] })]
|
|
162
|
+
}), /* @__PURE__ */ T("div", {
|
|
157
163
|
className: "relative",
|
|
158
|
-
children: [/* @__PURE__ */
|
|
164
|
+
children: [/* @__PURE__ */ w(d, {
|
|
159
165
|
variant: "ghost",
|
|
160
166
|
size: "icon",
|
|
161
167
|
className: "opacity-0 group-hover:opacity-100 transition-opacity",
|
|
162
168
|
onClick: (t) => {
|
|
163
|
-
t.stopPropagation(),
|
|
169
|
+
t.stopPropagation(), J(q === e.id ? null : e.id);
|
|
164
170
|
},
|
|
165
|
-
children: /* @__PURE__ */
|
|
166
|
-
}),
|
|
171
|
+
children: /* @__PURE__ */ w(j, { size: 16 })
|
|
172
|
+
}), q === e.id && /* @__PURE__ */ T("div", {
|
|
167
173
|
className: "absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10",
|
|
168
174
|
children: [
|
|
169
|
-
/* @__PURE__ */
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
+
/* @__PURE__ */ w(l, {
|
|
176
|
+
permission: c.APP_UPDATE,
|
|
177
|
+
children: /* @__PURE__ */ T("button", {
|
|
178
|
+
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
179
|
+
onClick: (t) => {
|
|
180
|
+
t.stopPropagation(), R(`bots/${e.id}/edit`), J(null);
|
|
181
|
+
},
|
|
182
|
+
children: [/* @__PURE__ */ w(O, { size: 16 }), L("botlit.botsList.menu.editBot", "Edit Bot")]
|
|
183
|
+
})
|
|
175
184
|
}),
|
|
176
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ T("button", {
|
|
177
186
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
178
187
|
onClick: (t) => {
|
|
179
|
-
t.stopPropagation(),
|
|
188
|
+
t.stopPropagation(), R(`bots/${e.id}?tab=workflow`), J(null);
|
|
180
189
|
},
|
|
181
|
-
children: [/* @__PURE__ */
|
|
190
|
+
children: [/* @__PURE__ */ w(F, { size: 16 }), L("botlit.botsList.menu.design", "Design workflow")]
|
|
182
191
|
}),
|
|
183
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ T("button", {
|
|
184
193
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
185
194
|
onClick: (t) => {
|
|
186
|
-
t.stopPropagation(),
|
|
195
|
+
t.stopPropagation(), R(`bots/${e.id}/agents`), J(null);
|
|
187
196
|
},
|
|
188
|
-
children: [/* @__PURE__ */
|
|
197
|
+
children: [/* @__PURE__ */ w(D, { size: 16 }), L("botlit.botsList.menu.viewAgents", "View Agents")]
|
|
189
198
|
}),
|
|
190
|
-
/* @__PURE__ */
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
199
|
+
/* @__PURE__ */ w(l, {
|
|
200
|
+
permission: c.APP_DELETE,
|
|
201
|
+
children: /* @__PURE__ */ T("button", {
|
|
202
|
+
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2",
|
|
203
|
+
onClick: (t) => {
|
|
204
|
+
t.stopPropagation(), X(e);
|
|
205
|
+
},
|
|
206
|
+
children: [/* @__PURE__ */ w(P, { size: 16 }), L("botlit.common.delete", "Delete")]
|
|
207
|
+
})
|
|
196
208
|
})
|
|
197
209
|
]
|
|
198
210
|
})]
|
|
199
211
|
})]
|
|
200
212
|
}),
|
|
201
|
-
/* @__PURE__ */
|
|
213
|
+
/* @__PURE__ */ w("p", {
|
|
202
214
|
className: "mt-3 text-sm text-text-secondary line-clamp-2",
|
|
203
215
|
children: e.description
|
|
204
216
|
}),
|
|
205
|
-
/* @__PURE__ */
|
|
217
|
+
/* @__PURE__ */ w("div", {
|
|
206
218
|
className: "mt-4 flex items-center gap-4 text-xs text-text-secondary",
|
|
207
|
-
children: /* @__PURE__ */
|
|
219
|
+
children: /* @__PURE__ */ T("span", {
|
|
208
220
|
className: "flex items-center gap-1",
|
|
209
221
|
children: [
|
|
210
|
-
/* @__PURE__ */
|
|
222
|
+
/* @__PURE__ */ w(D, { size: 14 }),
|
|
211
223
|
e.executionCount || 0,
|
|
212
224
|
" ",
|
|
213
|
-
|
|
225
|
+
L("botlit.common.executions", "executions")
|
|
214
226
|
]
|
|
215
227
|
})
|
|
216
228
|
}),
|
|
217
|
-
/* @__PURE__ */
|
|
229
|
+
/* @__PURE__ */ T("div", {
|
|
218
230
|
className: "mt-3 pt-3 border-t border-border-subtle flex items-center justify-between gap-2",
|
|
219
|
-
children: [/* @__PURE__ */
|
|
231
|
+
children: [/* @__PURE__ */ T("span", {
|
|
220
232
|
className: "text-xs text-text-secondary",
|
|
221
233
|
children: [
|
|
222
|
-
|
|
234
|
+
L("botlit.botsList.createdLabel", "Created"),
|
|
223
235
|
" ",
|
|
224
236
|
s(e.createdAt)
|
|
225
237
|
]
|
|
226
|
-
}), /* @__PURE__ */
|
|
238
|
+
}), /* @__PURE__ */ w(d, {
|
|
227
239
|
variant: "ghost",
|
|
228
240
|
size: "sm",
|
|
229
|
-
leftIcon: /* @__PURE__ */
|
|
241
|
+
leftIcon: /* @__PURE__ */ w(F, { size: 14 }),
|
|
230
242
|
onClick: (t) => {
|
|
231
|
-
t.stopPropagation(),
|
|
243
|
+
t.stopPropagation(), R(`bots/${e.id}?tab=workflow`);
|
|
232
244
|
},
|
|
233
|
-
children:
|
|
245
|
+
children: L("botlit.botsList.actions.design", "Design")
|
|
234
246
|
})]
|
|
235
247
|
})
|
|
236
248
|
]
|
|
237
249
|
})
|
|
238
250
|
}, e.id))
|
|
239
|
-
}) : /* @__PURE__ */
|
|
251
|
+
}) : /* @__PURE__ */ w("div", {
|
|
240
252
|
className: "space-y-2",
|
|
241
|
-
children:
|
|
253
|
+
children: Z.map((e) => /* @__PURE__ */ w(f, {
|
|
242
254
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
243
|
-
onClick: () =>
|
|
244
|
-
children: /* @__PURE__ */
|
|
255
|
+
onClick: () => R(`bots/${e.id}`),
|
|
256
|
+
children: /* @__PURE__ */ w(p, {
|
|
245
257
|
className: "py-4",
|
|
246
|
-
children: /* @__PURE__ */
|
|
258
|
+
children: /* @__PURE__ */ T("div", {
|
|
247
259
|
className: "flex items-center justify-between",
|
|
248
|
-
children: [/* @__PURE__ */
|
|
260
|
+
children: [/* @__PURE__ */ T("div", {
|
|
249
261
|
className: "flex items-center gap-4",
|
|
250
|
-
children: [/* @__PURE__ */
|
|
262
|
+
children: [/* @__PURE__ */ w("span", {
|
|
251
263
|
className: "text-3xl",
|
|
252
264
|
children: e.icon || "🤖"
|
|
253
|
-
}), /* @__PURE__ */
|
|
265
|
+
}), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("div", {
|
|
254
266
|
className: "flex items-center gap-2",
|
|
255
|
-
children: [/* @__PURE__ */
|
|
267
|
+
children: [/* @__PURE__ */ w("h3", {
|
|
256
268
|
className: "font-semibold text-text-primary",
|
|
257
269
|
children: e.name
|
|
258
|
-
}), /* @__PURE__ */
|
|
259
|
-
}), /* @__PURE__ */
|
|
270
|
+
}), /* @__PURE__ */ w(m, { status: e.status })]
|
|
271
|
+
}), /* @__PURE__ */ w("p", {
|
|
260
272
|
className: "text-sm text-text-secondary line-clamp-1",
|
|
261
273
|
children: e.description
|
|
262
274
|
})] })]
|
|
263
|
-
}), /* @__PURE__ */
|
|
275
|
+
}), /* @__PURE__ */ T("div", {
|
|
264
276
|
className: "flex items-center gap-6 text-sm text-text-secondary",
|
|
265
277
|
children: [
|
|
266
|
-
/* @__PURE__ */
|
|
278
|
+
/* @__PURE__ */ T("span", { children: [
|
|
267
279
|
o(e.executionCount),
|
|
268
280
|
" ",
|
|
269
|
-
|
|
281
|
+
L("botlit.common.executions", "executions")
|
|
270
282
|
] }),
|
|
271
|
-
/* @__PURE__ */
|
|
283
|
+
/* @__PURE__ */ w(d, {
|
|
272
284
|
variant: "ghost",
|
|
273
285
|
size: "sm",
|
|
274
|
-
leftIcon: /* @__PURE__ */
|
|
286
|
+
leftIcon: /* @__PURE__ */ w(F, { size: 14 }),
|
|
275
287
|
onClick: (t) => {
|
|
276
|
-
t.stopPropagation(),
|
|
288
|
+
t.stopPropagation(), R(`bots/${e.id}?tab=workflow`);
|
|
277
289
|
},
|
|
278
|
-
children:
|
|
290
|
+
children: L("botlit.botsList.actions.design", "Design")
|
|
279
291
|
}),
|
|
280
|
-
/* @__PURE__ */
|
|
292
|
+
/* @__PURE__ */ w(d, {
|
|
281
293
|
variant: "ghost",
|
|
282
294
|
size: "sm",
|
|
283
|
-
children: /* @__PURE__ */
|
|
284
|
-
to:
|
|
285
|
-
children:
|
|
295
|
+
children: /* @__PURE__ */ w(E, {
|
|
296
|
+
to: z(`bots/${e.id}`),
|
|
297
|
+
children: L("botlit.common.view", "View")
|
|
286
298
|
})
|
|
287
299
|
})
|
|
288
300
|
]
|
|
@@ -290,14 +302,17 @@ var F = () => {
|
|
|
290
302
|
})
|
|
291
303
|
})
|
|
292
304
|
}, e.id))
|
|
293
|
-
}) : /* @__PURE__ */
|
|
305
|
+
}) : /* @__PURE__ */ w(y, {
|
|
294
306
|
illustration: "empty-agents",
|
|
295
|
-
title:
|
|
296
|
-
description:
|
|
297
|
-
action: /* @__PURE__ */
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
307
|
+
title: L("botlit.botsList.empty.title", "No bots yet"),
|
|
308
|
+
description: L("botlit.botsList.empty.description", "Create your first AI-powered bot to get started with building agents and automations."),
|
|
309
|
+
action: /* @__PURE__ */ w(l, {
|
|
310
|
+
permission: c.APP_CREATE,
|
|
311
|
+
children: /* @__PURE__ */ w(d, {
|
|
312
|
+
leftIcon: /* @__PURE__ */ w(M, { size: 16 }),
|
|
313
|
+
onClick: () => R("bots/new"),
|
|
314
|
+
children: L("botlit.botsList.actions.createBot", "Create Bot")
|
|
315
|
+
})
|
|
301
316
|
})
|
|
302
317
|
})
|
|
303
318
|
]
|
|
@@ -305,6 +320,6 @@ var F = () => {
|
|
|
305
320
|
});
|
|
306
321
|
};
|
|
307
322
|
//#endregion
|
|
308
|
-
export {
|
|
323
|
+
export { L as BotsListPage };
|
|
309
324
|
|
|
310
325
|
//# sourceMappingURL=BotsListPage.js.map
|
|
@@ -1 +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 { useTr } from '../../shared/hooks/useTr';\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 = useTr();\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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"}
|
|
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 { useTr } from '../../shared/hooks/useTr';\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';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\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 = useTr();\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 <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('bots/new')}>\n {t('botlit.botsList.actions.createBot', 'Create Bot')}\n </Button>\n </BotmanorPermissionGate>\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 <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\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 </BotmanorPermissionGate>\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 <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_DELETE}>\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 </BotmanorPermissionGate>\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 <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('bots/new')}>\n {t('botlit.botsList.actions.createBot', 'Create Bot')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|