@burdenoff/microfe-botmanor 2026.1109.1 → 2026.1110.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/botlit/BotlitRoutes.js +34 -45
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/components/Badge.js +2 -2
- package/dist/botlit/components/Badge.js.map +1 -1
- package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
- package/dist/botlit/components/LoadMore.d.ts +9 -0
- package/dist/botlit/components/LoadMore.js +22 -0
- package/dist/botlit/components/LoadMore.js.map +1 -0
- package/dist/botlit/components/index.d.ts +1 -0
- package/dist/botlit/hooks/index.d.ts +1 -2
- package/dist/botlit/hooks/index.js +15 -16
- package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useAgents.d.ts +2 -6
- package/dist/botlit/hooks/useAgents.js +71 -95
- package/dist/botlit/hooks/useAgents.js.map +1 -1
- package/dist/botlit/hooks/useBots.d.ts +2 -6
- package/dist/botlit/hooks/useBots.js +51 -75
- package/dist/botlit/hooks/useBots.js.map +1 -1
- package/dist/botlit/hooks/useBuckets.d.ts +5 -0
- package/dist/botlit/hooks/useBuckets.js +72 -38
- package/dist/botlit/hooks/useBuckets.js.map +1 -1
- package/dist/botlit/hooks/useExecutions.d.ts +2 -2
- package/dist/botlit/hooks/useExecutions.js +30 -34
- package/dist/botlit/hooks/useExecutions.js.map +1 -1
- package/dist/botlit/hooks/useStore.d.ts +3 -3
- package/dist/botlit/hooks/useStore.js +41 -50
- package/dist/botlit/hooks/useStore.js.map +1 -1
- package/dist/botlit/index.d.ts +0 -1
- package/dist/botlit/index.js +5 -6
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +1 -1
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +157 -156
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +24 -24
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +147 -146
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketDetailPage.d.ts +2 -0
- package/dist/botlit/pages/BucketDetailPage.js +251 -0
- package/dist/botlit/pages/BucketDetailPage.js.map +1 -0
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +2 -2
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +141 -134
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +1 -1
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +2 -2
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +1 -1
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +150 -143
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/pages/index.d.ts +1 -2
- package/dist/generated/wspace-operations.js +67 -67
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/index.js +5 -6
- package/package.json +1 -1
- package/dist/botlit/hooks/useConversations.d.ts +0 -42
- package/dist/botlit/hooks/useConversations.js +0 -63
- package/dist/botlit/hooks/useConversations.js.map +0 -1
- package/dist/botlit/pages/ConversationDetailPage.d.ts +0 -2
- package/dist/botlit/pages/ConversationsPage.d.ts +0 -2
|
@@ -8,24 +8,25 @@ import { BOTMANOR_PERMISSIONS as u } from "../permissions/botmanorPermissions.js
|
|
|
8
8
|
import { BotmanorPermissionGate as d } from "../permissions/useBotmanorPermissions.js";
|
|
9
9
|
import { StatusBadge as f } from "../components/Badge.js";
|
|
10
10
|
import { EmptyState as p } from "../components/EmptyState.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
11
|
+
import { LoadMore as m } from "../components/LoadMore.js";
|
|
12
|
+
import { useBots as h, useDeleteBot as g } from "../hooks/useBots.js";
|
|
13
|
+
import { useBotlitStore as _ } from "../store/botlitStore.js";
|
|
14
|
+
import { useBotlit as v } from "../providers/BotlitProvider.js";
|
|
15
|
+
import { formatNumber as y, formatRelativeTime as b } from "../utils/formatters.js";
|
|
16
|
+
import { cn as x } from "../utils/cn.js";
|
|
16
17
|
import "../permissions/index.js";
|
|
17
|
-
import { useState as
|
|
18
|
-
import { GlassCard as
|
|
19
|
-
import { jsx as
|
|
20
|
-
import { Link as
|
|
21
|
-
import { Bot as
|
|
22
|
-
import { toast as
|
|
18
|
+
import { useState as S } from "react";
|
|
19
|
+
import { GlassCard as C, PagePurpose as w } from "@burdenoff/fe-libs/ui";
|
|
20
|
+
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
21
|
+
import { Link as D } from "react-router";
|
|
22
|
+
import { Bot as O, Edit as k, Grid3X3 as A, List as j, MoreVertical as M, Plus as N, Search as P, Trash2 as F, Workflow as I } from "lucide-react";
|
|
23
|
+
import { toast as L } from "sonner";
|
|
23
24
|
// src/botlit/pages/BotsListPage.tsx
|
|
24
|
-
var
|
|
25
|
-
let
|
|
26
|
-
|
|
27
|
-
},
|
|
28
|
-
let a = `${
|
|
25
|
+
var R = () => {
|
|
26
|
+
let R = e(), { navigateTo: z, getPath: B } = v(), { viewMode: V, setViewMode: H, botFilter: U, updateBotFilter: W } = _(), { data: G, loading: K, hasMore: q, loadingMore: J, loadMore: Y } = h(U), [X] = g(), [Z, Q] = S(null), $ = (e) => {
|
|
27
|
+
W({ search: e.target.value });
|
|
28
|
+
}, ee = async (e) => {
|
|
29
|
+
let a = `${R("botlit.botsList.delete.confirmPrefix", "Are you sure you want to delete")} "${e.name}"?`, o = await n({
|
|
29
30
|
title: "Delete bot?",
|
|
30
31
|
message: a,
|
|
31
32
|
okButtonTitle: "Delete",
|
|
@@ -34,104 +35,98 @@ var L = () => {
|
|
|
34
35
|
if (o === null ? confirm(a) : o) {
|
|
35
36
|
r("medium");
|
|
36
37
|
try {
|
|
37
|
-
await
|
|
38
|
+
await X(e.id), L.success(`${R("botlit.botsList.delete.successPrefix", "Bot")} "${e.name}" ${R("botlit.botsList.delete.successSuffix", "deleted successfully")}`), t() && i("success");
|
|
38
39
|
} catch (e) {
|
|
39
|
-
let n = e instanceof Error ? e.message :
|
|
40
|
-
|
|
40
|
+
let n = e instanceof Error ? e.message : R("botlit.botsList.delete.error", "Failed to delete bot");
|
|
41
|
+
L.error(n), t() && i("error");
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return !0;
|
|
50
|
-
});
|
|
51
|
-
return /* @__PURE__ */ w(a, {
|
|
52
|
-
title: L("botlit.botsList.title", "Bots"),
|
|
53
|
-
description: L("botlit.botsList.description", "Manage your AI-powered bots"),
|
|
54
|
-
actions: /* @__PURE__ */ w(d, {
|
|
44
|
+
Q(null);
|
|
45
|
+
};
|
|
46
|
+
return /* @__PURE__ */ T(a, {
|
|
47
|
+
title: R("botlit.botsList.title", "Bots"),
|
|
48
|
+
description: R("botlit.botsList.description", "Manage your AI-powered bots"),
|
|
49
|
+
actions: /* @__PURE__ */ T(d, {
|
|
55
50
|
permission: u.APP_CREATE,
|
|
56
|
-
children: /* @__PURE__ */
|
|
57
|
-
leftIcon: /* @__PURE__ */
|
|
58
|
-
onClick: () =>
|
|
59
|
-
children:
|
|
51
|
+
children: /* @__PURE__ */ T(c, {
|
|
52
|
+
leftIcon: /* @__PURE__ */ T(N, { size: 16 }),
|
|
53
|
+
onClick: () => z("bots/new"),
|
|
54
|
+
children: R("botlit.botsList.actions.createBot", "Create Bot")
|
|
60
55
|
})
|
|
61
56
|
}),
|
|
62
|
-
children: /* @__PURE__ */
|
|
57
|
+
children: /* @__PURE__ */ E("div", {
|
|
63
58
|
className: "space-y-6",
|
|
64
59
|
children: [
|
|
65
|
-
/* @__PURE__ */ w
|
|
66
|
-
icon: /* @__PURE__ */
|
|
67
|
-
children:
|
|
60
|
+
/* @__PURE__ */ T(w, {
|
|
61
|
+
icon: /* @__PURE__ */ T(O, { size: 18 }),
|
|
62
|
+
children: R("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.")
|
|
68
63
|
}),
|
|
69
|
-
|
|
64
|
+
G && G.length > 0 ? /* @__PURE__ */ E("div", {
|
|
70
65
|
className: "grid grid-cols-2 gap-4 sm:grid-cols-3",
|
|
71
66
|
children: [
|
|
72
|
-
/* @__PURE__ */
|
|
67
|
+
/* @__PURE__ */ E(C, {
|
|
73
68
|
treatment: "glass",
|
|
74
69
|
glow: !0,
|
|
75
70
|
className: "p-4",
|
|
76
|
-
children: [/* @__PURE__ */
|
|
71
|
+
children: [/* @__PURE__ */ T("p", {
|
|
77
72
|
className: "text-sm text-text-secondary",
|
|
78
|
-
children:
|
|
79
|
-
}), /* @__PURE__ */
|
|
73
|
+
children: R("botlit.botsList.summary.total", "Total bots")
|
|
74
|
+
}), /* @__PURE__ */ T("p", {
|
|
80
75
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
81
|
-
children:
|
|
76
|
+
children: G.length
|
|
82
77
|
})]
|
|
83
78
|
}),
|
|
84
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ E(C, {
|
|
85
80
|
treatment: "metric",
|
|
86
81
|
className: "p-4",
|
|
87
|
-
children: [/* @__PURE__ */
|
|
82
|
+
children: [/* @__PURE__ */ T("p", {
|
|
88
83
|
className: "text-sm text-text-secondary",
|
|
89
|
-
children:
|
|
90
|
-
}), /* @__PURE__ */
|
|
84
|
+
children: R("botlit.botsList.summary.active", "Active")
|
|
85
|
+
}), /* @__PURE__ */ T("p", {
|
|
91
86
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
92
|
-
children:
|
|
87
|
+
children: G.filter((e) => e.status === "ACTIVE").length
|
|
93
88
|
})]
|
|
94
89
|
}),
|
|
95
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ E(C, {
|
|
96
91
|
treatment: "metric",
|
|
97
92
|
className: "col-span-2 p-4 sm:col-span-1",
|
|
98
|
-
children: [/* @__PURE__ */
|
|
93
|
+
children: [/* @__PURE__ */ T("p", {
|
|
99
94
|
className: "text-sm text-text-secondary",
|
|
100
|
-
children:
|
|
101
|
-
}), /* @__PURE__ */
|
|
95
|
+
children: R("botlit.botsList.summary.executions", "Total executions")
|
|
96
|
+
}), /* @__PURE__ */ T("p", {
|
|
102
97
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
103
|
-
children:
|
|
98
|
+
children: y(G.reduce((e, t) => e + (t.executionCount ?? 0), 0))
|
|
104
99
|
})]
|
|
105
100
|
})
|
|
106
101
|
]
|
|
107
102
|
}) : null,
|
|
108
|
-
/* @__PURE__ */
|
|
103
|
+
/* @__PURE__ */ E("div", {
|
|
109
104
|
className: "flex items-center justify-between gap-4",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
105
|
+
children: [/* @__PURE__ */ E("div", {
|
|
111
106
|
className: "relative flex-1 max-w-md",
|
|
112
|
-
children: [/* @__PURE__ */
|
|
113
|
-
placeholder:
|
|
114
|
-
value:
|
|
115
|
-
onChange:
|
|
107
|
+
children: [/* @__PURE__ */ T(P, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ T(l, {
|
|
108
|
+
placeholder: R("botlit.botsList.searchPlaceholder", "Search bots..."),
|
|
109
|
+
value: U.search || "",
|
|
110
|
+
onChange: $,
|
|
116
111
|
className: "pl-9"
|
|
117
112
|
})]
|
|
118
|
-
}), /* @__PURE__ */
|
|
113
|
+
}), /* @__PURE__ */ E("div", {
|
|
119
114
|
className: "flex items-center gap-2",
|
|
120
|
-
children: [/* @__PURE__ */
|
|
121
|
-
variant:
|
|
115
|
+
children: [/* @__PURE__ */ T(c, {
|
|
116
|
+
variant: V === "grid" ? "secondary" : "ghost",
|
|
122
117
|
size: "icon",
|
|
123
|
-
onClick: () =>
|
|
124
|
-
children: /* @__PURE__ */
|
|
125
|
-
}), /* @__PURE__ */
|
|
126
|
-
variant:
|
|
118
|
+
onClick: () => H("grid"),
|
|
119
|
+
children: /* @__PURE__ */ T(A, { size: 18 })
|
|
120
|
+
}), /* @__PURE__ */ T(c, {
|
|
121
|
+
variant: V === "list" ? "secondary" : "ghost",
|
|
127
122
|
size: "icon",
|
|
128
|
-
onClick: () =>
|
|
129
|
-
children: /* @__PURE__ */
|
|
123
|
+
onClick: () => H("list"),
|
|
124
|
+
children: /* @__PURE__ */ T(j, { size: 18 })
|
|
130
125
|
})]
|
|
131
126
|
})]
|
|
132
127
|
}),
|
|
133
|
-
|
|
134
|
-
className:
|
|
128
|
+
K ? /* @__PURE__ */ T("div", {
|
|
129
|
+
className: x("gap-4", V === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : "flex flex-col"),
|
|
135
130
|
children: [
|
|
136
131
|
1,
|
|
137
132
|
2,
|
|
@@ -139,162 +134,162 @@ var L = () => {
|
|
|
139
134
|
4,
|
|
140
135
|
5,
|
|
141
136
|
6
|
|
142
|
-
].map((e) => /* @__PURE__ */
|
|
143
|
-
}) :
|
|
137
|
+
].map((e) => /* @__PURE__ */ T("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
138
|
+
}) : G.length > 0 ? V === "grid" ? /* @__PURE__ */ T("div", {
|
|
144
139
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
145
|
-
children:
|
|
140
|
+
children: G.map((e) => /* @__PURE__ */ T(o, {
|
|
146
141
|
className: "group hover:shadow-md transition-shadow cursor-pointer relative",
|
|
147
|
-
onClick: () =>
|
|
148
|
-
children: /* @__PURE__ */
|
|
142
|
+
onClick: () => z(`bots/${e.id}`),
|
|
143
|
+
children: /* @__PURE__ */ E(s, {
|
|
149
144
|
className: "pt-6",
|
|
150
145
|
children: [
|
|
151
|
-
/* @__PURE__ */
|
|
146
|
+
/* @__PURE__ */ E("div", {
|
|
152
147
|
className: "flex items-start justify-between",
|
|
153
|
-
children: [/* @__PURE__ */
|
|
148
|
+
children: [/* @__PURE__ */ E("div", {
|
|
154
149
|
className: "flex items-center gap-3",
|
|
155
|
-
children: [/* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ T("span", {
|
|
156
151
|
className: "text-4xl",
|
|
157
152
|
children: e.icon || "🤖"
|
|
158
|
-
}), /* @__PURE__ */
|
|
153
|
+
}), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("h3", {
|
|
159
154
|
className: "font-semibold text-text-primary",
|
|
160
155
|
children: e.name
|
|
161
|
-
}), /* @__PURE__ */
|
|
162
|
-
}), /* @__PURE__ */
|
|
156
|
+
}), /* @__PURE__ */ T(f, { status: e.status })] })]
|
|
157
|
+
}), /* @__PURE__ */ E("div", {
|
|
163
158
|
className: "relative",
|
|
164
|
-
children: [/* @__PURE__ */
|
|
159
|
+
children: [/* @__PURE__ */ T(c, {
|
|
165
160
|
variant: "ghost",
|
|
166
161
|
size: "icon",
|
|
167
162
|
className: "opacity-0 group-hover:opacity-100 transition-opacity",
|
|
168
163
|
onClick: (t) => {
|
|
169
|
-
t.stopPropagation(),
|
|
164
|
+
t.stopPropagation(), Q(Z === e.id ? null : e.id);
|
|
170
165
|
},
|
|
171
|
-
children: /* @__PURE__ */
|
|
172
|
-
}),
|
|
166
|
+
children: /* @__PURE__ */ T(M, { size: 16 })
|
|
167
|
+
}), Z === e.id && /* @__PURE__ */ E("div", {
|
|
173
168
|
className: "absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10",
|
|
174
169
|
children: [
|
|
175
|
-
/* @__PURE__ */
|
|
170
|
+
/* @__PURE__ */ T(d, {
|
|
176
171
|
permission: u.APP_UPDATE,
|
|
177
|
-
children: /* @__PURE__ */
|
|
172
|
+
children: /* @__PURE__ */ E("button", {
|
|
178
173
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
179
174
|
onClick: (t) => {
|
|
180
|
-
t.stopPropagation(),
|
|
175
|
+
t.stopPropagation(), z(`bots/${e.id}/edit`), Q(null);
|
|
181
176
|
},
|
|
182
|
-
children: [/* @__PURE__ */
|
|
177
|
+
children: [/* @__PURE__ */ T(k, { size: 16 }), R("botlit.botsList.menu.editBot", "Edit Bot")]
|
|
183
178
|
})
|
|
184
179
|
}),
|
|
185
|
-
/* @__PURE__ */
|
|
180
|
+
/* @__PURE__ */ E("button", {
|
|
186
181
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
187
182
|
onClick: (t) => {
|
|
188
|
-
t.stopPropagation(),
|
|
183
|
+
t.stopPropagation(), z(`bots/${e.id}?tab=workflow`), Q(null);
|
|
189
184
|
},
|
|
190
|
-
children: [/* @__PURE__ */
|
|
185
|
+
children: [/* @__PURE__ */ T(I, { size: 16 }), R("botlit.botsList.menu.design", "Design workflow")]
|
|
191
186
|
}),
|
|
192
|
-
/* @__PURE__ */
|
|
187
|
+
/* @__PURE__ */ E("button", {
|
|
193
188
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
194
189
|
onClick: (t) => {
|
|
195
|
-
t.stopPropagation(),
|
|
190
|
+
t.stopPropagation(), z(`bots/${e.id}/agents`), Q(null);
|
|
196
191
|
},
|
|
197
|
-
children: [/* @__PURE__ */
|
|
192
|
+
children: [/* @__PURE__ */ T(O, { size: 16 }), R("botlit.botsList.menu.viewAgents", "View Agents")]
|
|
198
193
|
}),
|
|
199
|
-
/* @__PURE__ */
|
|
194
|
+
/* @__PURE__ */ T(d, {
|
|
200
195
|
permission: u.APP_DELETE,
|
|
201
|
-
children: /* @__PURE__ */
|
|
196
|
+
children: /* @__PURE__ */ E("button", {
|
|
202
197
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2",
|
|
203
198
|
onClick: (t) => {
|
|
204
|
-
t.stopPropagation(),
|
|
199
|
+
t.stopPropagation(), ee(e);
|
|
205
200
|
},
|
|
206
|
-
children: [/* @__PURE__ */
|
|
201
|
+
children: [/* @__PURE__ */ T(F, { size: 16 }), R("botlit.common.delete", "Delete")]
|
|
207
202
|
})
|
|
208
203
|
})
|
|
209
204
|
]
|
|
210
205
|
})]
|
|
211
206
|
})]
|
|
212
207
|
}),
|
|
213
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ T("p", {
|
|
214
209
|
className: "mt-3 text-sm text-text-secondary line-clamp-2",
|
|
215
210
|
children: e.description
|
|
216
211
|
}),
|
|
217
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ T("div", {
|
|
218
213
|
className: "mt-4 flex items-center gap-4 text-xs text-text-secondary",
|
|
219
|
-
children: /* @__PURE__ */
|
|
214
|
+
children: /* @__PURE__ */ E("span", {
|
|
220
215
|
className: "flex items-center gap-1",
|
|
221
216
|
children: [
|
|
222
|
-
/* @__PURE__ */
|
|
217
|
+
/* @__PURE__ */ T(O, { size: 14 }),
|
|
223
218
|
e.executionCount || 0,
|
|
224
219
|
" ",
|
|
225
|
-
|
|
220
|
+
R("botlit.common.executions", "executions")
|
|
226
221
|
]
|
|
227
222
|
})
|
|
228
223
|
}),
|
|
229
|
-
/* @__PURE__ */
|
|
224
|
+
/* @__PURE__ */ E("div", {
|
|
230
225
|
className: "mt-3 pt-3 border-t border-border-subtle flex items-center justify-between gap-2",
|
|
231
|
-
children: [/* @__PURE__ */
|
|
226
|
+
children: [/* @__PURE__ */ E("span", {
|
|
232
227
|
className: "text-xs text-text-secondary",
|
|
233
228
|
children: [
|
|
234
|
-
|
|
229
|
+
R("botlit.botsList.createdLabel", "Created"),
|
|
235
230
|
" ",
|
|
236
|
-
|
|
231
|
+
b(e.createdAt)
|
|
237
232
|
]
|
|
238
|
-
}), /* @__PURE__ */
|
|
233
|
+
}), /* @__PURE__ */ T(c, {
|
|
239
234
|
variant: "ghost",
|
|
240
235
|
size: "sm",
|
|
241
|
-
leftIcon: /* @__PURE__ */
|
|
236
|
+
leftIcon: /* @__PURE__ */ T(I, { size: 14 }),
|
|
242
237
|
onClick: (t) => {
|
|
243
|
-
t.stopPropagation(),
|
|
238
|
+
t.stopPropagation(), z(`bots/${e.id}?tab=workflow`);
|
|
244
239
|
},
|
|
245
|
-
children:
|
|
240
|
+
children: R("botlit.botsList.actions.design", "Design")
|
|
246
241
|
})]
|
|
247
242
|
})
|
|
248
243
|
]
|
|
249
244
|
})
|
|
250
245
|
}, e.id))
|
|
251
|
-
}) : /* @__PURE__ */
|
|
246
|
+
}) : /* @__PURE__ */ T("div", {
|
|
252
247
|
className: "space-y-2",
|
|
253
|
-
children:
|
|
248
|
+
children: G.map((e) => /* @__PURE__ */ T(o, {
|
|
254
249
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
255
|
-
onClick: () =>
|
|
256
|
-
children: /* @__PURE__ */
|
|
250
|
+
onClick: () => z(`bots/${e.id}`),
|
|
251
|
+
children: /* @__PURE__ */ T(s, {
|
|
257
252
|
className: "py-4",
|
|
258
|
-
children: /* @__PURE__ */
|
|
253
|
+
children: /* @__PURE__ */ E("div", {
|
|
259
254
|
className: "flex items-center justify-between",
|
|
260
|
-
children: [/* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ E("div", {
|
|
261
256
|
className: "flex items-center gap-4",
|
|
262
|
-
children: [/* @__PURE__ */
|
|
257
|
+
children: [/* @__PURE__ */ T("span", {
|
|
263
258
|
className: "text-3xl",
|
|
264
259
|
children: e.icon || "🤖"
|
|
265
|
-
}), /* @__PURE__ */
|
|
260
|
+
}), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ E("div", {
|
|
266
261
|
className: "flex items-center gap-2",
|
|
267
|
-
children: [/* @__PURE__ */
|
|
262
|
+
children: [/* @__PURE__ */ T("h3", {
|
|
268
263
|
className: "font-semibold text-text-primary",
|
|
269
264
|
children: e.name
|
|
270
|
-
}), /* @__PURE__ */
|
|
271
|
-
}), /* @__PURE__ */
|
|
265
|
+
}), /* @__PURE__ */ T(f, { status: e.status })]
|
|
266
|
+
}), /* @__PURE__ */ T("p", {
|
|
272
267
|
className: "text-sm text-text-secondary line-clamp-1",
|
|
273
268
|
children: e.description
|
|
274
269
|
})] })]
|
|
275
|
-
}), /* @__PURE__ */
|
|
270
|
+
}), /* @__PURE__ */ E("div", {
|
|
276
271
|
className: "flex items-center gap-6 text-sm text-text-secondary",
|
|
277
272
|
children: [
|
|
278
|
-
/* @__PURE__ */
|
|
279
|
-
|
|
273
|
+
/* @__PURE__ */ E("span", { children: [
|
|
274
|
+
y(e.executionCount),
|
|
280
275
|
" ",
|
|
281
|
-
|
|
276
|
+
R("botlit.common.executions", "executions")
|
|
282
277
|
] }),
|
|
283
|
-
/* @__PURE__ */
|
|
278
|
+
/* @__PURE__ */ T(c, {
|
|
284
279
|
variant: "ghost",
|
|
285
280
|
size: "sm",
|
|
286
|
-
leftIcon: /* @__PURE__ */
|
|
281
|
+
leftIcon: /* @__PURE__ */ T(I, { size: 14 }),
|
|
287
282
|
onClick: (t) => {
|
|
288
|
-
t.stopPropagation(),
|
|
283
|
+
t.stopPropagation(), z(`bots/${e.id}?tab=workflow`);
|
|
289
284
|
},
|
|
290
|
-
children:
|
|
285
|
+
children: R("botlit.botsList.actions.design", "Design")
|
|
291
286
|
}),
|
|
292
|
-
/* @__PURE__ */
|
|
287
|
+
/* @__PURE__ */ T(c, {
|
|
293
288
|
variant: "ghost",
|
|
294
289
|
size: "sm",
|
|
295
|
-
children: /* @__PURE__ */
|
|
296
|
-
to:
|
|
297
|
-
children:
|
|
290
|
+
children: /* @__PURE__ */ T(D, {
|
|
291
|
+
to: B(`bots/${e.id}`),
|
|
292
|
+
children: R("botlit.common.view", "View")
|
|
298
293
|
})
|
|
299
294
|
})
|
|
300
295
|
]
|
|
@@ -302,23 +297,29 @@ var L = () => {
|
|
|
302
297
|
})
|
|
303
298
|
})
|
|
304
299
|
}, e.id))
|
|
305
|
-
}) : /* @__PURE__ */
|
|
300
|
+
}) : /* @__PURE__ */ T(p, {
|
|
306
301
|
illustration: "empty-agents",
|
|
307
|
-
title:
|
|
308
|
-
description:
|
|
309
|
-
action: /* @__PURE__ */
|
|
302
|
+
title: R("botlit.botsList.empty.title", "No bots yet"),
|
|
303
|
+
description: R("botlit.botsList.empty.description", "Create your first AI-powered bot to get started with building agents and automations."),
|
|
304
|
+
action: /* @__PURE__ */ T(d, {
|
|
310
305
|
permission: u.APP_CREATE,
|
|
311
|
-
children: /* @__PURE__ */
|
|
312
|
-
leftIcon: /* @__PURE__ */
|
|
313
|
-
onClick: () =>
|
|
314
|
-
children:
|
|
306
|
+
children: /* @__PURE__ */ T(c, {
|
|
307
|
+
leftIcon: /* @__PURE__ */ T(N, { size: 16 }),
|
|
308
|
+
onClick: () => z("bots/new"),
|
|
309
|
+
children: R("botlit.botsList.actions.createBot", "Create Bot")
|
|
315
310
|
})
|
|
316
311
|
})
|
|
312
|
+
}),
|
|
313
|
+
/* @__PURE__ */ T(m, {
|
|
314
|
+
hasMore: q,
|
|
315
|
+
loadingMore: J,
|
|
316
|
+
onLoadMore: () => void Y(),
|
|
317
|
+
loadedCount: G.length
|
|
317
318
|
})
|
|
318
319
|
]
|
|
319
320
|
})
|
|
320
321
|
});
|
|
321
322
|
};
|
|
322
|
-
export {
|
|
323
|
+
export { R as BotsListPage };
|
|
323
324
|
|
|
324
325
|
//# sourceMappingURL=BotsListPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BotsListPage.js","names":["BotsListPage","t","useTr","useBotlit","bots","useBots","deleteBot","useDeleteBot","useBotlitStore","menuOpen","setMenuOpen","useState","handleSearch","handleDelete","confirmMsg","bot","native","nativeConfirm","toast","isNative","nativeNotify","err","message","filteredBots","botFilter","search","PageLayout","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Button","Plus","navigateTo","PagePurpose","Bot","GlassCard","b","formatNumber","sum","Search","Input","viewMode","setViewMode","Grid3X3","List","loading","cn","i","Card","CardContent","StatusBadge","e","MoreVertical","Edit","Workflow","Trash2","formatRelativeTime","Link","getPath","EmptyState"],"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":";;;;;;;;;;;;;;;;;;;;;;;AAqCA,IAAaA,UAAyB;CACpC,IAAMC,IAAIC,EAAM,GACV,EAAE,eAAY,eAAYC,EAAU,GACpC,EAAE,MAAMC,GAAM,eAAYC,EAAQ,GAClC,CAACC,KAAaC,EAAa,GAC3B,EAAE,aAAU,gBAAa,cAAW,uBAAoBC,EAAe,GACvE,CAACC,GAAUC,KAAeC,EAAwB,IAAI,GAEtDC,KAAgB,MAA2C;EAC/D,EAAgB,EAAE,QAAQ,EAAE,OAAO,MAAM,CAAC;CAC5C,GAEMC,IAAe,OAAO,MAAsC;EAChE,IAAMC,IAAa,GAAGb,EAAE,wCAAwC,iCAAiC,EAAE,IAAIc,EAAI,KAAK,KAC1GC,IAAS,MAAMC,EAAc;GACjC,OAAO;GACP,SAASH;GACT,eAAe;GACf,mBAAmB;EACrB,CAAC;EAED,IADWE,MAAW,OAAO,QAAQF,CAAU,IAAIE,GAC3C;GACN,EAAa,QAAQ;GACrB,IAAI;IAKF,AAJA,MAAMV,EAAUS,EAAI,EAAE,GACtBG,EAAM,QACJ,GAAGjB,EAAE,wCAAwC,KAAK,EAAE,IAAIc,EAAI,KAAK,IAAId,EAAE,wCAAwC,sBAAsB,GACvI,GACIkB,EAAS,KAAGC,EAAkB,SAAS;GAC7C,SAASC,GAAc;IACrB,IAAMC,IACJD,aAAe,QACXA,EAAI,UACJpB,EAAE,gCAAgC,sBAAsB;IAE9D,AADAiB,EAAM,MAAMI,CAAO,GACfH,EAAS,KAAGC,EAAkB,OAAO;GAC3C;EACF;EACA,EAAY,IAAI;CAClB,GAEMG,IAAenB,GAAM,QAAQ,MAAQ;EACzC,IAAIoB,EAAU,QAAQ;GACpB,IAAMC,IAASD,EAAU,OAAO,YAAY;GAC5C,OACET,EAAI,KAAK,YAAY,CAAC,CAAC,SAASU,CAAM,MACrCV,EAAI,aAAa,YAAY,CAAC,CAAC,SAASU,CAAM,KAAK;EAExD;EACA,OAAO;CACT,CAAC;CAED,OACE,kBAACC,GAAD;EACE,OAAOzB,EAAE,yBAAyB,MAAM;EACxC,aAAaA,EAAE,+BAA+B,6BAA6B;EAC3E,SACE,kBAAC0B,GAAD;GAAwB,YAAYC,EAAqB;GACvD,UAAA,kBAACC,GAAD;IAAQ,UAAU,kBAACC,GAAD,EAAM,MAAM,GAAK,CAAA;IAAG,eAAeC,EAAW,UAAU;IACvE,UAAA9B,EAAE,qCAAqC,YAAY;GAC9C,CAAA;EACc,CAAA;EAG1B,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC+B,GAAD;KAAa,MAAM,kBAACC,GAAD,EAAK,MAAM,GAAK,CAAA;KAChC,UAAAhC,EACC,2BACA,+SACF;IACW,CAAA;IAGZG,KAAQA,EAAK,SAAS,IACrB,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAAC8B,GAAD;OAAW,WAAU;OAAQ,MAAA;OAAK,WAAU;OAA5C,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;QACV,UAAAjC,EAAE,iCAAiC,YAAY;OAC/C,CAAA,GACH,kBAAC,KAAD;QAAG,WAAU;QACV,UAAAG,EAAK;OACL,CAAA,CACM;;MACX,kBAAC8B,GAAD;OAAW,WAAU;OAAS,WAAU;OAAxC,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;QACV,UAAAjC,EAAE,kCAAkC,QAAQ;OAC5C,CAAA,GACH,kBAAC,KAAD;QAAG,WAAU;QACV,UAAAG,EAAK,QAAQ,MAA2B+B,EAAE,WAAW,QAAQ,CAAC,CAAC;OAC/D,CAAA,CACM;;MACX,kBAACD,GAAD;OAAW,WAAU;OAAS,WAAU;OAAxC,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;QACV,UAAAjC,EAAE,sCAAsC,kBAAkB;OAC1D,CAAA,GACH,kBAAC,KAAD;QAAG,WAAU;QACV,UAAAmC,EAAahC,EAAK,QAAQ,GAAK,MAAQiC,KAAOtB,EAAI,kBAAkB,IAAI,CAAC,CAAC;OAC1E,CAAA,CACM;;KACR;IACH,CAAA,IAAA;IAGJ,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACuB,GAAD,EAAQ,WAAU,uEAAwE,CAAA,GAC1F,kBAACC,GAAD;OACE,aAAatC,EAAE,qCAAqC,gBAAgB;OACpE,OAAOuB,EAAU,UAAU;OAC3B,UAAUZ;OACV,WAAU;MACX,CAAA,CACE;KACL,CAAA,GAAA,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACiB,GAAD;OACE,SAASW,MAAa,SAAS,cAAc;OAC7C,MAAK;OACL,eAAeC,EAAY,MAAM;OAEjC,UAAA,kBAACC,GAAD,EAAS,MAAM,GAAK,CAAA;MACd,CAAA,GACR,kBAACb,GAAD;OACE,SAASW,MAAa,SAAS,cAAc;OAC7C,MAAK;OACL,eAAeC,EAAY,MAAM;OAEjC,UAAA,kBAACE,GAAD,EAAM,MAAM,GAAK,CAAA;MACX,CAAA,CACL;KACF,CAAA,CAAA;;IAGJC,IACC,kBAAC,OAAD;KACE,WAAWC,EACT,SACAL,MAAa,SACT,mDACA,eACN;KAEC,UAAA;MAAC;MAAG;MAAG;MAAG;MAAG;MAAG;KAAC,CAAC,CAAC,KAAK,MACvB,kBAAC,OAAD,EAEE,WAAU,8DACX,GAFMM,CAEN,CACF;IACE,CAAA,IACHvB,KAAgBA,EAAa,SAAS,IACxCiB,MAAa,SACX,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAAjB,EAAa,KAAK,MACjB,kBAACwB,GAAD;MAEE,WAAU;MACV,eAAehB,EAAW,QAAQhB,EAAI,IAAI;MAE1C,UAAA,kBAACiC,GAAD;OAAa,WAAU;OAAvB,UAAA;QACE,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,kBAAC,OAAD;UAAK,WAAU;UAAf,UAAA,CACE,kBAAC,QAAD;WAAM,WAAU;WAAY,UAAAjC,EAAI,QAAQ;UAAW,CAAA,GACnD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;WAAI,WAAU;WAAmC,UAAAA,EAAI;UAAS,CAAA,GAC9D,kBAACkC,GAAD,EAAa,QAAQlC,EAAI,OAAS,CAAA,CAC/B,EAAA,CAAA,CACF;SACL,CAAA,GAAA,kBAAC,OAAD;UAAK,WAAU;UAAf,UAAA,CACE,kBAACc,GAAD;WACE,SAAQ;WACR,MAAK;WACL,WAAU;WACV,UAAU,MAAM;YAEd,AADAqB,EAAE,gBAAgB,GAClBxC,EAAYD,MAAaM,EAAI,KAAK,OAAOA,EAAI,EAAE;WACjD;WAEA,UAAA,kBAACoC,GAAD,EAAc,MAAM,GAAK,CAAA;UACnB,CAAA,GACP1C,MAAaM,EAAI,MAChB,kBAAC,OAAD;WAAK,WAAU;WAAf,UAAA;YACE,kBAACY,GAAD;aAAwB,YAAYC,EAAqB;aACvD,UAAA,kBAAC,UAAD;cACE,WAAU;cACV,UAAU,MAAM;eAGd,AAFAsB,EAAE,gBAAgB,GAClBnB,EAAW,QAAQhB,EAAI,GAAG,MAAM,GAChCL,EAAY,IAAI;cAClB;cANF,UAAA,CAQE,kBAAC0C,GAAD,EAAM,MAAM,GAAK,CAAA,GAChBnD,EAAE,gCAAgC,UAAU,CACvC;;YACc,CAAA;YACxB,kBAAC,UAAD;aACE,WAAU;aACV,UAAU,MAAM;cAGd,AAFAiD,EAAE,gBAAgB,GAClBnB,EAAW,QAAQhB,EAAI,GAAG,cAAc,GACxCL,EAAY,IAAI;aAClB;aANF,UAAA,CAQE,kBAAC2C,GAAD,EAAU,MAAM,GAAK,CAAA,GACpBpD,EAAE,+BAA+B,iBAAiB,CAC7C;;YACR,kBAAC,UAAD;aACE,WAAU;aACV,UAAU,MAAM;cAGd,AAFAiD,EAAE,gBAAgB,GAClBnB,EAAW,QAAQhB,EAAI,GAAG,QAAQ,GAClCL,EAAY,IAAI;aAClB;aANF,UAAA,CAQE,kBAACuB,GAAD,EAAK,MAAM,GAAK,CAAA,GACfhC,EAAE,mCAAmC,aAAa,CAC7C;;YACR,kBAAC0B,GAAD;aAAwB,YAAYC,EAAqB;aACvD,UAAA,kBAAC,UAAD;cACE,WAAU;cACV,UAAU,MAAM;eAEd,AADAsB,EAAE,gBAAgB,GAClBrC,EAAaE,CAAG;cAClB;cALF,UAAA,CAOE,kBAACuC,GAAD,EAAQ,MAAM,GAAK,CAAA,GAClBrD,EAAE,wBAAwB,QAAQ,CAC7B;;YACc,CAAA;WACrB;UAEJ,CAAA,CAAA;SACF,CAAA,CAAA;;QACL,kBAAC,KAAD;SAAG,WAAU;SACV,UAAAc,EAAI;QACJ,CAAA;QACH,kBAAC,OAAD;SAAK,WAAU;SACb,UAAA,kBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA;WACE,kBAACkB,GAAD,EAAK,MAAM,GAAK,CAAA;WACflB,EAAI,kBAAkB;WAAE;WAAEd,EAAE,4BAA4B,YAAY;UACjE;;QACH,CAAA;QACL,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,kBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA;WACGA,EAAE,gCAAgC,SAAS;WAAG;WAC9CsD,EAAmBxC,EAAI,SAAS;UAC7B;SACN,CAAA,GAAA,kBAACc,GAAD;UACE,SAAQ;UACR,MAAK;UACL,UAAU,kBAACwB,GAAD,EAAU,MAAM,GAAK,CAAA;UAC/B,UAAU,MAAM;WAEd,AADAH,EAAE,gBAAgB,GAClBnB,EAAW,QAAQhB,EAAI,GAAG,cAAc;UAC1C;UAEC,UAAAd,EAAE,kCAAkC,QAAQ;SACvC,CAAA,CACL;;OACM;;KACT,GAzGCc,EAAI,EAyGL,CACP;IACE,CAAA,IAEL,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAAQ,EAAa,KAAK,MACjB,kBAACwB,GAAD;MAEE,WAAU;MACV,eAAehB,EAAW,QAAQhB,EAAI,IAAI;MAE1C,UAAA,kBAACiC,GAAD;OAAa,WAAU;OACrB,UAAA,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,kBAAC,QAAD;UAAM,WAAU;UAAY,UAAAjC,EAAI,QAAQ;SAAW,CAAA,GACnD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;UAAK,WAAU;UAAf,UAAA,CACE,kBAAC,MAAD;WAAI,WAAU;WAAmC,UAAAA,EAAI;UAAS,CAAA,GAC9D,kBAACkC,GAAD,EAAa,QAAQlC,EAAI,OAAS,CAAA,CAC/B;SACL,CAAA,GAAA,kBAAC,KAAD;UAAG,WAAU;UACV,UAAAA,EAAI;SACJ,CAAA,CACA,EAAA,CAAA,CACF;QACL,CAAA,GAAA,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA;UACE,kBAAC,QAAD,EAAA,UAAA;WACGqB,EAAarB,EAAI,cAAc;WAAG;WAClCd,EAAE,4BAA4B,YAAY;UACvC,EAAA,CAAA;UACN,kBAAC4B,GAAD;WACE,SAAQ;WACR,MAAK;WACL,UAAU,kBAACwB,GAAD,EAAU,MAAM,GAAK,CAAA;WAC/B,UAAU,MAAM;YAEd,AADAH,EAAE,gBAAgB,GAClBnB,EAAW,QAAQhB,EAAI,GAAG,cAAc;WAC1C;WAEC,UAAAd,EAAE,kCAAkC,QAAQ;UACvC,CAAA;UACR,kBAAC4B,GAAD;WAAQ,SAAQ;WAAQ,MAAK;WAC3B,UAAA,kBAAC2B,GAAD;YAAM,IAAIC,EAAQ,QAAQ1C,EAAI,IAAI;YAC/B,UAAAd,EAAE,sBAAsB,MAAM;WAC3B,CAAA;UACA,CAAA;SACL;QACF,CAAA,CAAA;;MACM,CAAA;KACT,GA1CCc,EAAI,EA0CL,CACP;IACE,CAAA,IAGP,kBAAC2C,GAAD;KACE,cAAa;KACb,OAAOzD,EAAE,+BAA+B,aAAa;KACrD,aAAaA,EACX,qCACA,uFACF;KACA,QACE,kBAAC0B,GAAD;MAAwB,YAAYC,EAAqB;MACvD,UAAA,kBAACC,GAAD;OAAQ,UAAU,kBAACC,GAAD,EAAM,MAAM,GAAK,CAAA;OAAG,eAAeC,EAAW,UAAU;OACvE,UAAA9B,EAAE,qCAAqC,YAAY;MAC9C,CAAA;KACc,CAAA;IAE3B,CAAA;GAEA;;CACK,CAAA;AAEhB"}
|
|
1
|
+
{"version":3,"file":"BotsListPage.js","names":["BotsListPage","t","useTr","useBotlit","useBotlitStore","bots","useBots","botFilter","deleteBot","useDeleteBot","menuOpen","setMenuOpen","useState","handleSearch","handleDelete","confirmMsg","bot","native","nativeConfirm","toast","isNative","nativeNotify","err","message","PageLayout","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Button","Plus","navigateTo","PagePurpose","Bot","GlassCard","b","formatNumber","sum","Search","Input","viewMode","setViewMode","Grid3X3","List","loading","cn","i","Card","CardContent","StatusBadge","e","MoreVertical","Edit","Workflow","Trash2","formatRelativeTime","Link","getPath","EmptyState","LoadMore","loadMore"],"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 { LoadMore } from '../components/LoadMore';\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 { viewMode, setViewMode, botFilter, updateBotFilter } = useBotlitStore();\n const { data: bots, loading, hasMore, loadingMore, loadMore } = useBots(botFilter);\n const [deleteBot] = useDeleteBot();\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 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 ) : bots.length > 0 ? (\n viewMode === 'grid' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {bots.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 {bots.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 <LoadMore\n hasMore={hasMore}\n loadingMore={loadingMore}\n onLoadMore={() => void loadMore()}\n loadedCount={bots.length}\n />\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|