@burdenoff/microfe-botmanor 2026.1109.2 → 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/components/Badge.js +2 -2
- package/dist/botlit/components/Badge.js.map +1 -1
- package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
- package/dist/botlit/components/LoadMore.d.ts +9 -0
- package/dist/botlit/components/LoadMore.js +22 -0
- package/dist/botlit/components/LoadMore.js.map +1 -0
- package/dist/botlit/components/index.d.ts +1 -0
- package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useAgents.d.ts +2 -6
- package/dist/botlit/hooks/useAgents.js +71 -95
- package/dist/botlit/hooks/useAgents.js.map +1 -1
- package/dist/botlit/hooks/useBots.d.ts +2 -6
- package/dist/botlit/hooks/useBots.js +51 -75
- package/dist/botlit/hooks/useBots.js.map +1 -1
- package/dist/botlit/hooks/useExecutions.d.ts +2 -2
- package/dist/botlit/hooks/useExecutions.js +30 -34
- package/dist/botlit/hooks/useExecutions.js.map +1 -1
- package/dist/botlit/hooks/useStore.d.ts +3 -3
- package/dist/botlit/hooks/useStore.js +41 -50
- package/dist/botlit/hooks/useStore.js.map +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +1 -1
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +157 -156
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +24 -24
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +147 -146
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +2 -2
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +141 -134
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +1 -1
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +2 -2
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +1 -1
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +150 -143
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,139 +8,134 @@ 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 {
|
|
16
|
-
import {
|
|
11
|
+
import { LoadMore as m } from "../components/LoadMore.js";
|
|
12
|
+
import { ErrorState as h } from "../components/ErrorState.js";
|
|
13
|
+
import { useAgents as g, useDeleteAgent as _ } from "../hooks/useAgents.js";
|
|
14
|
+
import { useBotlitStore as v } from "../store/botlitStore.js";
|
|
15
|
+
import { useBotlit as y } from "../providers/BotlitProvider.js";
|
|
16
|
+
import { formatNumber as b, formatRelativeTime as x } from "../utils/formatters.js";
|
|
17
|
+
import { cn as S } from "../utils/cn.js";
|
|
17
18
|
import "../permissions/index.js";
|
|
18
|
-
import { useState as
|
|
19
|
-
import { GlassCard as
|
|
20
|
-
import { jsx as
|
|
21
|
-
import { Link as
|
|
22
|
-
import { Bot as
|
|
23
|
-
import { toast as
|
|
19
|
+
import { useState as C } from "react";
|
|
20
|
+
import { GlassCard as w, PagePurpose as T } from "@burdenoff/fe-libs/ui";
|
|
21
|
+
import { jsx as E, jsxs as D } from "react/jsx-runtime";
|
|
22
|
+
import { Link as O, useParams as ee } from "react-router";
|
|
23
|
+
import { Bot as te, Grid3X3 as k, List as A, MessageSquare as j, MoreVertical as M, Play as N, Plus as P, Search as F, Settings as I, ShieldCheck as L, Trash2 as R } from "lucide-react";
|
|
24
|
+
import { toast as z } from "sonner";
|
|
24
25
|
// src/botlit/pages/AgentsListPage.tsx
|
|
25
|
-
var
|
|
26
|
-
let
|
|
27
|
-
|
|
28
|
-
},
|
|
26
|
+
var B = () => {
|
|
27
|
+
let B = i(), { botId: V } = ee(), { navigateTo: H, getPath: U } = y(), { viewMode: W, setViewMode: G, agentFilter: K, updateAgentFilter: q } = v(), { data: J, loading: Y, error: X, refetch: Z, hasMore: ne, loadingMore: re, loadMore: ie } = g(K), [ae] = _(), [Q, $] = C(null), oe = (e) => {
|
|
28
|
+
q({ search: e.target.value });
|
|
29
|
+
}, se = async (i) => {
|
|
29
30
|
let a = await t({
|
|
30
|
-
title:
|
|
31
|
-
message:
|
|
32
|
-
okButtonTitle:
|
|
33
|
-
cancelButtonTitle:
|
|
31
|
+
title: B("botlit.agentsList.delete.title", "Delete agent?"),
|
|
32
|
+
message: B("botlit.agentsList.delete.message", "Are you sure you want to delete \"{{name}}\"?", { name: i.name }),
|
|
33
|
+
okButtonTitle: B("botlit.agentsList.delete.okButton", "Delete"),
|
|
34
|
+
cancelButtonTitle: B("botlit.agentsList.delete.cancelButton", "Cancel")
|
|
34
35
|
});
|
|
35
|
-
if (a === null ? confirm(
|
|
36
|
+
if (a === null ? confirm(B("botlit.agentsList.delete.message", "Are you sure you want to delete \"{{name}}\"?", { name: i.name })) : a) {
|
|
36
37
|
n("medium");
|
|
37
38
|
try {
|
|
38
|
-
await
|
|
39
|
+
await ae(i.id), z.success(B("botlit.agentsList.delete.success", "Agent \"{{name}}\" deleted successfully", { name: i.name })), e() && r("success");
|
|
39
40
|
} catch (t) {
|
|
40
|
-
let n = t instanceof Error ? t.message :
|
|
41
|
-
|
|
41
|
+
let n = t instanceof Error ? t.message : B("botlit.agentsList.delete.error", "Failed to delete agent");
|
|
42
|
+
z.error(n), e() && r("error");
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return !0;
|
|
51
|
-
});
|
|
52
|
-
return /* @__PURE__ */ T(a, {
|
|
53
|
-
title: z ? R("botlit.agentsList.titleBot", "Bot Agents") : R("botlit.agentsList.title", "All Agents"),
|
|
54
|
-
description: z ? R("botlit.agentsList.descriptionBot", "Manage agents for this bot") : R("botlit.agentsList.description", "View and manage all your AI agents"),
|
|
55
|
-
actions: /* @__PURE__ */ E("div", {
|
|
45
|
+
$(null);
|
|
46
|
+
};
|
|
47
|
+
return /* @__PURE__ */ E(a, {
|
|
48
|
+
title: V ? B("botlit.agentsList.titleBot", "Bot Agents") : B("botlit.agentsList.title", "All Agents"),
|
|
49
|
+
description: V ? B("botlit.agentsList.descriptionBot", "Manage agents for this bot") : B("botlit.agentsList.description", "View and manage all your AI agents"),
|
|
50
|
+
actions: /* @__PURE__ */ D("div", {
|
|
56
51
|
className: "flex gap-2",
|
|
57
|
-
children: [/* @__PURE__ */
|
|
52
|
+
children: [/* @__PURE__ */ E(c, {
|
|
58
53
|
variant: "outline",
|
|
59
|
-
leftIcon: /* @__PURE__ */
|
|
60
|
-
onClick: () =>
|
|
61
|
-
children:
|
|
62
|
-
}), /* @__PURE__ */
|
|
54
|
+
leftIcon: /* @__PURE__ */ E(L, { size: 16 }),
|
|
55
|
+
onClick: () => H("agents/approvals"),
|
|
56
|
+
children: B("botlit.agentsList.actions.approvals", "Approvals")
|
|
57
|
+
}), /* @__PURE__ */ E(d, {
|
|
63
58
|
permission: u.AGENT_CREATE,
|
|
64
|
-
children: /* @__PURE__ */
|
|
65
|
-
leftIcon: /* @__PURE__ */
|
|
66
|
-
onClick: () =>
|
|
67
|
-
children:
|
|
59
|
+
children: /* @__PURE__ */ E(c, {
|
|
60
|
+
leftIcon: /* @__PURE__ */ E(P, { size: 16 }),
|
|
61
|
+
onClick: () => H(V ? `bots/${V}/agents/new` : "agents/new"),
|
|
62
|
+
children: B("botlit.agentsList.actions.createAgent", "Create Agent")
|
|
68
63
|
})
|
|
69
64
|
})]
|
|
70
65
|
}),
|
|
71
|
-
children: /* @__PURE__ */
|
|
66
|
+
children: /* @__PURE__ */ D("div", {
|
|
72
67
|
className: "space-y-6",
|
|
73
68
|
children: [
|
|
74
|
-
/* @__PURE__ */ T
|
|
75
|
-
icon: /* @__PURE__ */
|
|
76
|
-
children:
|
|
69
|
+
/* @__PURE__ */ E(T, {
|
|
70
|
+
icon: /* @__PURE__ */ E(te, { size: 18 }),
|
|
71
|
+
children: B("botlit.agentsList.purpose", "Agents are the reasoning workers behind your bots — each one bundles a model, a system prompt, tools and knowledge into a callable AI. Build an agent here to handle a specific job (answer support questions, summarise documents, run a workflow), then test it in chat and connect it to a bot or channel.")
|
|
77
72
|
}),
|
|
78
|
-
|
|
73
|
+
J.length > 0 ? /* @__PURE__ */ D("div", {
|
|
79
74
|
className: "grid grid-cols-2 gap-4 sm:grid-cols-3",
|
|
80
75
|
children: [
|
|
81
|
-
/* @__PURE__ */
|
|
76
|
+
/* @__PURE__ */ D(w, {
|
|
82
77
|
treatment: "glass",
|
|
83
78
|
glow: !0,
|
|
84
79
|
className: "p-4",
|
|
85
|
-
children: [/* @__PURE__ */
|
|
80
|
+
children: [/* @__PURE__ */ E("p", {
|
|
86
81
|
className: "text-sm text-text-secondary",
|
|
87
|
-
children:
|
|
88
|
-
}), /* @__PURE__ */
|
|
82
|
+
children: B("botlit.agentsList.summary.total", "Total agents")
|
|
83
|
+
}), /* @__PURE__ */ E("p", {
|
|
89
84
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
90
|
-
children:
|
|
85
|
+
children: J.length
|
|
91
86
|
})]
|
|
92
87
|
}),
|
|
93
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ D(w, {
|
|
94
89
|
treatment: "metric",
|
|
95
90
|
className: "p-4",
|
|
96
|
-
children: [/* @__PURE__ */
|
|
91
|
+
children: [/* @__PURE__ */ E("p", {
|
|
97
92
|
className: "text-sm text-text-secondary",
|
|
98
|
-
children:
|
|
99
|
-
}), /* @__PURE__ */
|
|
93
|
+
children: B("botlit.agentsList.summary.active", "Active")
|
|
94
|
+
}), /* @__PURE__ */ E("p", {
|
|
100
95
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
101
|
-
children:
|
|
96
|
+
children: J.filter((e) => e.status === "ACTIVE").length
|
|
102
97
|
})]
|
|
103
98
|
}),
|
|
104
|
-
/* @__PURE__ */
|
|
99
|
+
/* @__PURE__ */ D(w, {
|
|
105
100
|
treatment: "metric",
|
|
106
101
|
className: "col-span-2 p-4 sm:col-span-1",
|
|
107
|
-
children: [/* @__PURE__ */
|
|
102
|
+
children: [/* @__PURE__ */ E("p", {
|
|
108
103
|
className: "text-sm text-text-secondary",
|
|
109
|
-
children:
|
|
110
|
-
}), /* @__PURE__ */
|
|
104
|
+
children: B("botlit.agentsList.summary.executions", "Total executions")
|
|
105
|
+
}), /* @__PURE__ */ E("p", {
|
|
111
106
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
112
|
-
children:
|
|
107
|
+
children: b(J.reduce((e, t) => e + (t.executionCount ?? 0), 0))
|
|
113
108
|
})]
|
|
114
109
|
})
|
|
115
110
|
]
|
|
116
111
|
}) : null,
|
|
117
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ D("div", {
|
|
118
113
|
className: "flex items-center justify-between gap-4",
|
|
119
|
-
children: [/* @__PURE__ */
|
|
114
|
+
children: [/* @__PURE__ */ D("div", {
|
|
120
115
|
className: "relative flex-1 max-w-md",
|
|
121
|
-
children: [/* @__PURE__ */
|
|
122
|
-
placeholder:
|
|
123
|
-
value:
|
|
124
|
-
onChange:
|
|
116
|
+
children: [/* @__PURE__ */ E(F, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ E(l, {
|
|
117
|
+
placeholder: B("botlit.agentsList.searchPlaceholder", "Search agents..."),
|
|
118
|
+
value: K.search || "",
|
|
119
|
+
onChange: oe,
|
|
125
120
|
className: "pl-9"
|
|
126
121
|
})]
|
|
127
|
-
}), /* @__PURE__ */
|
|
122
|
+
}), /* @__PURE__ */ D("div", {
|
|
128
123
|
className: "flex items-center gap-2",
|
|
129
|
-
children: [/* @__PURE__ */
|
|
130
|
-
variant:
|
|
124
|
+
children: [/* @__PURE__ */ E(c, {
|
|
125
|
+
variant: W === "grid" ? "secondary" : "ghost",
|
|
131
126
|
size: "icon",
|
|
132
|
-
onClick: () =>
|
|
133
|
-
children: /* @__PURE__ */
|
|
134
|
-
}), /* @__PURE__ */
|
|
135
|
-
variant:
|
|
127
|
+
onClick: () => G("grid"),
|
|
128
|
+
children: /* @__PURE__ */ E(k, { size: 18 })
|
|
129
|
+
}), /* @__PURE__ */ E(c, {
|
|
130
|
+
variant: W === "list" ? "secondary" : "ghost",
|
|
136
131
|
size: "icon",
|
|
137
|
-
onClick: () =>
|
|
138
|
-
children: /* @__PURE__ */
|
|
132
|
+
onClick: () => G("list"),
|
|
133
|
+
children: /* @__PURE__ */ E(A, { size: 18 })
|
|
139
134
|
})]
|
|
140
135
|
})]
|
|
141
136
|
}),
|
|
142
|
-
|
|
143
|
-
className:
|
|
137
|
+
Y ? /* @__PURE__ */ E("div", {
|
|
138
|
+
className: S("gap-4", W === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : "flex flex-col"),
|
|
144
139
|
children: [
|
|
145
140
|
1,
|
|
146
141
|
2,
|
|
@@ -148,158 +143,158 @@ var R = () => {
|
|
|
148
143
|
4,
|
|
149
144
|
5,
|
|
150
145
|
6
|
|
151
|
-
].map((e) => /* @__PURE__ */
|
|
152
|
-
}) :
|
|
146
|
+
].map((e) => /* @__PURE__ */ E("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
147
|
+
}) : X ? /* @__PURE__ */ E(h, {
|
|
153
148
|
resource: "agents",
|
|
154
|
-
error:
|
|
155
|
-
onRetry: () => void
|
|
156
|
-
}) :
|
|
149
|
+
error: X,
|
|
150
|
+
onRetry: () => void Z()
|
|
151
|
+
}) : J.length > 0 ? W === "grid" ? /* @__PURE__ */ E("div", {
|
|
157
152
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
158
|
-
children:
|
|
153
|
+
children: J.map((e) => /* @__PURE__ */ E(o, {
|
|
159
154
|
className: "group hover:shadow-md transition-shadow cursor-pointer relative",
|
|
160
|
-
onClick: () =>
|
|
161
|
-
children: /* @__PURE__ */
|
|
155
|
+
onClick: () => H(`agents/${e.id}`),
|
|
156
|
+
children: /* @__PURE__ */ D(s, {
|
|
162
157
|
className: "pt-6",
|
|
163
158
|
children: [
|
|
164
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ D("div", {
|
|
165
160
|
className: "flex items-start justify-between",
|
|
166
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ D("div", {
|
|
167
162
|
className: "flex items-center gap-3",
|
|
168
|
-
children: [/* @__PURE__ */
|
|
163
|
+
children: [/* @__PURE__ */ E("span", {
|
|
169
164
|
className: "text-4xl",
|
|
170
165
|
children: "🤖"
|
|
171
|
-
}), /* @__PURE__ */
|
|
166
|
+
}), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ E("h3", {
|
|
172
167
|
className: "font-semibold text-text-primary",
|
|
173
168
|
children: e.name
|
|
174
|
-
}), /* @__PURE__ */
|
|
169
|
+
}), /* @__PURE__ */ E("div", {
|
|
175
170
|
className: "flex items-center gap-2 mt-1",
|
|
176
|
-
children: /* @__PURE__ */
|
|
171
|
+
children: /* @__PURE__ */ E(f, { status: e.status })
|
|
177
172
|
})] })]
|
|
178
|
-
}), /* @__PURE__ */
|
|
173
|
+
}), /* @__PURE__ */ D("div", {
|
|
179
174
|
className: "relative",
|
|
180
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ E(c, {
|
|
181
176
|
variant: "ghost",
|
|
182
177
|
size: "icon",
|
|
183
178
|
className: "opacity-0 group-hover:opacity-100 transition-opacity",
|
|
184
179
|
onClick: (t) => {
|
|
185
|
-
t.stopPropagation(), Q
|
|
180
|
+
t.stopPropagation(), $(Q === e.id ? null : e.id);
|
|
186
181
|
},
|
|
187
|
-
children: /* @__PURE__ */
|
|
188
|
-
}),
|
|
182
|
+
children: /* @__PURE__ */ E(M, { size: 16 })
|
|
183
|
+
}), Q === e.id && /* @__PURE__ */ D("div", {
|
|
189
184
|
className: "absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10",
|
|
190
185
|
children: [
|
|
191
|
-
/* @__PURE__ */
|
|
186
|
+
/* @__PURE__ */ E(d, {
|
|
192
187
|
permission: u.AGENT_EXECUTE,
|
|
193
|
-
children: /* @__PURE__ */
|
|
188
|
+
children: /* @__PURE__ */ D("button", {
|
|
194
189
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
195
190
|
onClick: (t) => {
|
|
196
|
-
t.stopPropagation(),
|
|
191
|
+
t.stopPropagation(), H(`agents/${e.id}/chat`), $(null);
|
|
197
192
|
},
|
|
198
|
-
children: [/* @__PURE__ */
|
|
193
|
+
children: [/* @__PURE__ */ E(N, { size: 16 }), B("botlit.agentsList.menu.testAgent", "Test Agent")]
|
|
199
194
|
})
|
|
200
195
|
}),
|
|
201
|
-
/* @__PURE__ */
|
|
196
|
+
/* @__PURE__ */ E(d, {
|
|
202
197
|
permission: u.AGENT_UPDATE,
|
|
203
|
-
children: /* @__PURE__ */
|
|
198
|
+
children: /* @__PURE__ */ D("button", {
|
|
204
199
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
205
200
|
onClick: (t) => {
|
|
206
|
-
t.stopPropagation(),
|
|
201
|
+
t.stopPropagation(), H(`agents/${e.id}/edit`), $(null);
|
|
207
202
|
},
|
|
208
|
-
children: [/* @__PURE__ */
|
|
203
|
+
children: [/* @__PURE__ */ E(I, { size: 16 }), B("botlit.agentsList.menu.editAgent", "Edit Agent")]
|
|
209
204
|
})
|
|
210
205
|
}),
|
|
211
|
-
/* @__PURE__ */
|
|
206
|
+
/* @__PURE__ */ E(d, {
|
|
212
207
|
permission: u.AGENT_DELETE,
|
|
213
|
-
children: /* @__PURE__ */
|
|
208
|
+
children: /* @__PURE__ */ D("button", {
|
|
214
209
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2",
|
|
215
210
|
onClick: (t) => {
|
|
216
|
-
t.stopPropagation(),
|
|
211
|
+
t.stopPropagation(), se(e);
|
|
217
212
|
},
|
|
218
|
-
children: [/* @__PURE__ */
|
|
213
|
+
children: [/* @__PURE__ */ E(R, { size: 16 }), B("botlit.agentsList.menu.delete", "Delete")]
|
|
219
214
|
})
|
|
220
215
|
})
|
|
221
216
|
]
|
|
222
217
|
})]
|
|
223
218
|
})]
|
|
224
219
|
}),
|
|
225
|
-
/* @__PURE__ */
|
|
220
|
+
/* @__PURE__ */ E("p", {
|
|
226
221
|
className: "mt-3 text-sm text-text-secondary line-clamp-2",
|
|
227
222
|
children: e.description
|
|
228
223
|
}),
|
|
229
|
-
/* @__PURE__ */
|
|
224
|
+
/* @__PURE__ */ E("div", {
|
|
230
225
|
className: "mt-4 flex items-center gap-4 text-xs text-text-secondary",
|
|
231
|
-
children: /* @__PURE__ */
|
|
226
|
+
children: /* @__PURE__ */ D("span", {
|
|
232
227
|
className: "flex items-center gap-1",
|
|
233
228
|
children: [
|
|
234
|
-
/* @__PURE__ */
|
|
235
|
-
|
|
229
|
+
/* @__PURE__ */ E(j, { size: 14 }),
|
|
230
|
+
b(e.executionCount),
|
|
236
231
|
" ",
|
|
237
|
-
|
|
232
|
+
B("botlit.agentsList.card.executions", "executions")
|
|
238
233
|
]
|
|
239
234
|
})
|
|
240
235
|
}),
|
|
241
|
-
/* @__PURE__ */
|
|
236
|
+
/* @__PURE__ */ D("div", {
|
|
242
237
|
className: "mt-3 pt-3 border-t border-border-subtle flex items-center justify-between",
|
|
243
|
-
children: [/* @__PURE__ */
|
|
238
|
+
children: [/* @__PURE__ */ D("span", {
|
|
244
239
|
className: "text-xs text-text-secondary",
|
|
245
240
|
children: [
|
|
246
|
-
|
|
241
|
+
B("botlit.agentsList.card.created", "Created"),
|
|
247
242
|
" ",
|
|
248
|
-
|
|
243
|
+
x(e.createdAt)
|
|
249
244
|
]
|
|
250
|
-
}), /* @__PURE__ */
|
|
245
|
+
}), /* @__PURE__ */ E(d, {
|
|
251
246
|
permission: u.AGENT_EXECUTE,
|
|
252
|
-
children: /* @__PURE__ */
|
|
247
|
+
children: /* @__PURE__ */ E(c, {
|
|
253
248
|
size: "sm",
|
|
254
249
|
variant: "ghost",
|
|
255
|
-
leftIcon: /* @__PURE__ */
|
|
250
|
+
leftIcon: /* @__PURE__ */ E(N, { size: 14 }),
|
|
256
251
|
onClick: (t) => {
|
|
257
|
-
t.stopPropagation(),
|
|
252
|
+
t.stopPropagation(), H(`agents/${e.id}/chat`);
|
|
258
253
|
},
|
|
259
|
-
children:
|
|
254
|
+
children: B("botlit.agentsList.card.test", "Test")
|
|
260
255
|
})
|
|
261
256
|
})]
|
|
262
257
|
})
|
|
263
258
|
]
|
|
264
259
|
})
|
|
265
260
|
}, e.id))
|
|
266
|
-
}) : /* @__PURE__ */
|
|
261
|
+
}) : /* @__PURE__ */ E("div", {
|
|
267
262
|
className: "space-y-2",
|
|
268
|
-
children:
|
|
263
|
+
children: J.map((e) => /* @__PURE__ */ E(o, {
|
|
269
264
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
270
|
-
onClick: () =>
|
|
271
|
-
children: /* @__PURE__ */
|
|
265
|
+
onClick: () => H(`agents/${e.id}`),
|
|
266
|
+
children: /* @__PURE__ */ E(s, {
|
|
272
267
|
className: "py-4",
|
|
273
|
-
children: /* @__PURE__ */
|
|
268
|
+
children: /* @__PURE__ */ D("div", {
|
|
274
269
|
className: "flex items-center justify-between",
|
|
275
|
-
children: [/* @__PURE__ */
|
|
270
|
+
children: [/* @__PURE__ */ D("div", {
|
|
276
271
|
className: "flex items-center gap-4",
|
|
277
|
-
children: [/* @__PURE__ */
|
|
272
|
+
children: [/* @__PURE__ */ E("span", {
|
|
278
273
|
className: "text-3xl",
|
|
279
274
|
children: "🤖"
|
|
280
|
-
}), /* @__PURE__ */
|
|
275
|
+
}), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ D("div", {
|
|
281
276
|
className: "flex items-center gap-2",
|
|
282
|
-
children: [/* @__PURE__ */
|
|
277
|
+
children: [/* @__PURE__ */ E("h3", {
|
|
283
278
|
className: "font-semibold text-text-primary",
|
|
284
279
|
children: e.name
|
|
285
|
-
}), /* @__PURE__ */
|
|
286
|
-
}), /* @__PURE__ */
|
|
280
|
+
}), /* @__PURE__ */ E(f, { status: e.status })]
|
|
281
|
+
}), /* @__PURE__ */ E("p", {
|
|
287
282
|
className: "text-sm text-text-secondary line-clamp-1",
|
|
288
283
|
children: e.description
|
|
289
284
|
})] })]
|
|
290
|
-
}), /* @__PURE__ */
|
|
285
|
+
}), /* @__PURE__ */ D("div", {
|
|
291
286
|
className: "flex items-center gap-4 text-sm text-text-secondary",
|
|
292
287
|
children: [
|
|
293
|
-
/* @__PURE__ */
|
|
294
|
-
/* @__PURE__ */
|
|
295
|
-
/* @__PURE__ */
|
|
288
|
+
/* @__PURE__ */ D("span", { children: [b(e.executionCount), " executions"] }),
|
|
289
|
+
/* @__PURE__ */ E("span", { children: x(e.createdAt) }),
|
|
290
|
+
/* @__PURE__ */ E(d, {
|
|
296
291
|
permission: u.AGENT_EXECUTE,
|
|
297
|
-
children: /* @__PURE__ */
|
|
292
|
+
children: /* @__PURE__ */ E(c, {
|
|
298
293
|
variant: "outline",
|
|
299
294
|
size: "sm",
|
|
300
|
-
leftIcon: /* @__PURE__ */
|
|
301
|
-
children: /* @__PURE__ */
|
|
302
|
-
to:
|
|
295
|
+
leftIcon: /* @__PURE__ */ E(N, { size: 14 }),
|
|
296
|
+
children: /* @__PURE__ */ E(O, {
|
|
297
|
+
to: U(`agents/${e.id}/chat`),
|
|
303
298
|
children: "Test"
|
|
304
299
|
})
|
|
305
300
|
})
|
|
@@ -309,23 +304,29 @@ var R = () => {
|
|
|
309
304
|
})
|
|
310
305
|
})
|
|
311
306
|
}, e.id))
|
|
312
|
-
}) : /* @__PURE__ */
|
|
307
|
+
}) : /* @__PURE__ */ E(p, {
|
|
313
308
|
illustration: "empty-agents",
|
|
314
|
-
title:
|
|
315
|
-
description:
|
|
316
|
-
action: /* @__PURE__ */
|
|
309
|
+
title: B("botlit.agentsList.empty.title", "No agents yet"),
|
|
310
|
+
description: B("botlit.agentsList.empty.description", "Create your first AI agent to start building intelligent automations."),
|
|
311
|
+
action: /* @__PURE__ */ E(d, {
|
|
317
312
|
permission: u.AGENT_CREATE,
|
|
318
|
-
children: /* @__PURE__ */
|
|
319
|
-
leftIcon: /* @__PURE__ */
|
|
320
|
-
onClick: () =>
|
|
321
|
-
children:
|
|
313
|
+
children: /* @__PURE__ */ E(c, {
|
|
314
|
+
leftIcon: /* @__PURE__ */ E(P, { size: 16 }),
|
|
315
|
+
onClick: () => H(V ? `bots/${V}/agents/new` : "agents/new"),
|
|
316
|
+
children: B("botlit.agentsList.actions.createAgent", "Create Agent")
|
|
322
317
|
})
|
|
323
318
|
})
|
|
319
|
+
}),
|
|
320
|
+
/* @__PURE__ */ E(m, {
|
|
321
|
+
hasMore: ne,
|
|
322
|
+
loadingMore: re,
|
|
323
|
+
onLoadMore: () => void ie(),
|
|
324
|
+
loadedCount: J.length
|
|
324
325
|
})
|
|
325
326
|
]
|
|
326
327
|
})
|
|
327
328
|
});
|
|
328
329
|
};
|
|
329
|
-
export {
|
|
330
|
+
export { B as AgentsListPage };
|
|
330
331
|
|
|
331
332
|
//# sourceMappingURL=AgentsListPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentsListPage.js","names":["AgentsListPage","t","useTr","useParams","useBotlit","agents","useAgents","deleteAgent","useDeleteAgent","useBotlitStore","menuOpen","setMenuOpen","useState","handleSearch","handleDelete","confirmed","nativeConfirm","agent","toast","isNative","nativeNotify","err","message","filteredAgents","agentFilter","search","PageLayout","botId","Button","ShieldCheck","navigateTo","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Plus","PagePurpose","Bot","GlassCard","formatNumber","sum","Search","Input","viewMode","setViewMode","Grid3X3","List","loading","cn","i","error","ErrorState","refetch","Card","CardContent","StatusBadge","e","MoreVertical","Play","Settings","Trash2","MessageSquare","formatRelativeTime","Link","getPath","EmptyState"],"sources":["../../../src/botlit/pages/AgentsListPage.tsx"],"sourcesContent":["/**\n * Agents List Page\n * @module botlit/pages\n */\n\nimport type { ChangeEvent, FC } from 'react';\nimport { useState } from 'react';\nimport { useParams, Link } from 'react-router';\nimport {\n Bot,\n Plus,\n Search,\n Grid3X3,\n List,\n MoreVertical,\n MessageSquare,\n Trash2,\n Settings,\n Play,\n ShieldCheck,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { isNative, nativeConfirm, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport { useTr } from '../../shared/hooks/useTr';\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 { ErrorState } from '../components/ErrorState';\nimport { useAgents, useDeleteAgent, type AgentRecord } from '../hooks/useAgents';\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\nexport const AgentsListPage: FC = () => {\n const t = useTr();\n const { botId } = useParams();\n const { navigateTo, getPath } = useBotlit();\n const { data: agents, loading, error, refetch } = useAgents();\n const [deleteAgent] = useDeleteAgent();\n const { viewMode, setViewMode, agentFilter, updateAgentFilter } = useBotlitStore();\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\n\n const handleSearch = (e: ChangeEvent<HTMLInputElement>) => {\n updateAgentFilter({ search: e.target.value });\n };\n\n const handleDelete = async (agent: { id: string; name: string }) => {\n const confirmed = await nativeConfirm({\n title: t('botlit.agentsList.delete.title', 'Delete agent?'),\n message: t(\n 'botlit.agentsList.delete.message',\n 'Are you sure you want to delete \"{{name}}\"?',\n {\n name: agent.name,\n }\n ),\n okButtonTitle: t('botlit.agentsList.delete.okButton', 'Delete'),\n cancelButtonTitle: t('botlit.agentsList.delete.cancelButton', 'Cancel'),\n });\n const ok =\n confirmed === null\n ? confirm(\n t('botlit.agentsList.delete.message', 'Are you sure you want to delete \"{{name}}\"?', {\n name: agent.name,\n })\n )\n : confirmed;\n if (ok) {\n nativeImpact('medium');\n try {\n await deleteAgent(agent.id);\n toast.success(\n t('botlit.agentsList.delete.success', 'Agent \"{{name}}\" deleted successfully', {\n name: agent.name,\n })\n );\n if (isNative()) void nativeNotify('success');\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.agentsList.delete.error', 'Failed to delete agent');\n toast.error(message);\n if (isNative()) void nativeNotify('error');\n }\n }\n setMenuOpen(null);\n };\n\n const filteredAgents = agents.filter((agent) => {\n if (agentFilter.search) {\n const search = agentFilter.search.toLowerCase();\n return (\n agent.name.toLowerCase().includes(search) ||\n (agent.description?.toLowerCase().includes(search) ?? false)\n );\n }\n return true;\n });\n\n return (\n <PageLayout\n title={\n botId\n ? t('botlit.agentsList.titleBot', 'Bot Agents')\n : t('botlit.agentsList.title', 'All Agents')\n }\n description={\n botId\n ? t('botlit.agentsList.descriptionBot', 'Manage agents for this bot')\n : t('botlit.agentsList.description', 'View and manage all your AI agents')\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<ShieldCheck size={16} />}\n onClick={() => navigateTo('agents/approvals')}\n >\n {t('botlit.agentsList.actions.approvals', 'Approvals')}\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_CREATE}>\n <Button\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo(botId ? `bots/${botId}/agents/new` : 'agents/new')}\n >\n {t('botlit.agentsList.actions.createAgent', 'Create Agent')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Bot size={18} />}>\n {t(\n 'botlit.agentsList.purpose',\n 'Agents are the reasoning workers behind your bots — each one bundles a model, a system prompt, tools and knowledge into a callable AI. Build an agent here to handle a specific job (answer support questions, summarise documents, run a workflow), then test it in chat and connect it to a bot or channel.'\n )}\n </PagePurpose>\n\n {/* Summary */}\n {agents.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.agentsList.summary.total', 'Total agents')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {agents.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.agentsList.summary.active', 'Active')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {agents.filter((agent) => agent.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.agentsList.summary.executions', 'Total executions')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {formatNumber(agents.reduce((sum, agent) => sum + (agent.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.agentsList.searchPlaceholder', 'Search agents...')}\n value={agentFilter.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 ) : error ? (\n <ErrorState resource=\"agents\" error={error} onRetry={() => void refetch()} />\n ) : filteredAgents.length > 0 ? (\n viewMode === 'grid' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {filteredAgents.map((agent: AgentRecord) => (\n <Card\n key={agent.id}\n className=\"group hover:shadow-md transition-shadow cursor-pointer relative\"\n onClick={() => navigateTo(`agents/${agent.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\">🤖</span>\n <div>\n <h3 className=\"font-semibold text-text-primary\">{agent.name}</h3>\n <div className=\"flex items-center gap-2 mt-1\">\n <StatusBadge status={agent.status} />\n </div>\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 === agent.id ? null : agent.id);\n }}\n >\n <MoreVertical size={16} />\n </Button>\n {menuOpen === agent.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.AGENT_EXECUTE}>\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(`agents/${agent.id}/chat`);\n setMenuOpen(null);\n }}\n >\n <Play size={16} />\n {t('botlit.agentsList.menu.testAgent', 'Test Agent')}\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_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(`agents/${agent.id}/edit`);\n setMenuOpen(null);\n }}\n >\n <Settings size={16} />\n {t('botlit.agentsList.menu.editAgent', 'Edit Agent')}\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_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(agent);\n }}\n >\n <Trash2 size={16} />\n {t('botlit.agentsList.menu.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 {agent.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 <MessageSquare size={14} />\n {formatNumber(agent.executionCount)}{' '}\n {t('botlit.agentsList.card.executions', 'executions')}\n </span>\n </div>\n <div className=\"mt-3 pt-3 border-t border-border-subtle flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {t('botlit.agentsList.card.created', 'Created')}{' '}\n {formatRelativeTime(agent.createdAt)}\n </span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n leftIcon={<Play size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`agents/${agent.id}/chat`);\n }}\n >\n {t('botlit.agentsList.card.test', 'Test')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2\">\n {filteredAgents.map((agent: AgentRecord) => (\n <Card\n key={agent.id}\n className=\"hover:shadow-md transition-shadow cursor-pointer\"\n onClick={() => navigateTo(`agents/${agent.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\">🤖</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-text-primary\">{agent.name}</h3>\n <StatusBadge status={agent.status} />\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {agent.description}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-sm text-text-secondary\">\n <span>{formatNumber(agent.executionCount)} executions</span>\n <span>{formatRelativeTime(agent.createdAt)}</span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button variant=\"outline\" size=\"sm\" leftIcon={<Play size={14} />}>\n <Link to={getPath(`agents/${agent.id}/chat`)}>Test</Link>\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )\n ) : (\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.agentsList.empty.title', 'No agents yet')}\n description={t(\n 'botlit.agentsList.empty.description',\n 'Create your first AI agent to start building intelligent automations.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_CREATE}>\n <Button\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo(botId ? `bots/${botId}/agents/new` : 'agents/new')}\n >\n {t('botlit.agentsList.actions.createAgent', 'Create Agent')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentsListPage.js","names":["AgentsListPage","t","useTr","useParams","useBotlit","useBotlitStore","agents","useAgents","agentFilter","deleteAgent","useDeleteAgent","menuOpen","setMenuOpen","useState","handleSearch","handleDelete","confirmed","nativeConfirm","agent","toast","isNative","nativeNotify","err","message","PageLayout","botId","Button","ShieldCheck","navigateTo","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Plus","PagePurpose","Bot","GlassCard","formatNumber","sum","Search","Input","viewMode","setViewMode","Grid3X3","List","loading","cn","i","error","ErrorState","refetch","Card","CardContent","StatusBadge","e","MoreVertical","Play","Settings","Trash2","MessageSquare","formatRelativeTime","Link","getPath","EmptyState","LoadMore","loadMore"],"sources":["../../../src/botlit/pages/AgentsListPage.tsx"],"sourcesContent":["/**\n * Agents List Page\n * @module botlit/pages\n */\n\nimport type { ChangeEvent, FC } from 'react';\nimport { useState } from 'react';\nimport { useParams, Link } from 'react-router';\nimport {\n Bot,\n Plus,\n Search,\n Grid3X3,\n List,\n MoreVertical,\n MessageSquare,\n Trash2,\n Settings,\n Play,\n ShieldCheck,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { isNative, nativeConfirm, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport { useTr } from '../../shared/hooks/useTr';\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 { ErrorState } from '../components/ErrorState';\nimport { useAgents, useDeleteAgent, type AgentRecord } from '../hooks/useAgents';\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\nexport const AgentsListPage: FC = () => {\n const t = useTr();\n const { botId } = useParams();\n const { navigateTo, getPath } = useBotlit();\n const { viewMode, setViewMode, agentFilter, updateAgentFilter } = useBotlitStore();\n const {\n data: agents,\n loading,\n error,\n refetch,\n hasMore,\n loadingMore,\n loadMore,\n } = useAgents(agentFilter);\n const [deleteAgent] = useDeleteAgent();\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\n\n const handleSearch = (e: ChangeEvent<HTMLInputElement>) => {\n updateAgentFilter({ search: e.target.value });\n };\n\n const handleDelete = async (agent: { id: string; name: string }) => {\n const confirmed = await nativeConfirm({\n title: t('botlit.agentsList.delete.title', 'Delete agent?'),\n message: t(\n 'botlit.agentsList.delete.message',\n 'Are you sure you want to delete \"{{name}}\"?',\n {\n name: agent.name,\n }\n ),\n okButtonTitle: t('botlit.agentsList.delete.okButton', 'Delete'),\n cancelButtonTitle: t('botlit.agentsList.delete.cancelButton', 'Cancel'),\n });\n const ok =\n confirmed === null\n ? confirm(\n t('botlit.agentsList.delete.message', 'Are you sure you want to delete \"{{name}}\"?', {\n name: agent.name,\n })\n )\n : confirmed;\n if (ok) {\n nativeImpact('medium');\n try {\n await deleteAgent(agent.id);\n toast.success(\n t('botlit.agentsList.delete.success', 'Agent \"{{name}}\" deleted successfully', {\n name: agent.name,\n })\n );\n if (isNative()) void nativeNotify('success');\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.agentsList.delete.error', 'Failed to delete agent');\n toast.error(message);\n if (isNative()) void nativeNotify('error');\n }\n }\n setMenuOpen(null);\n };\n\n // The search term travels to the server via `useAgents(agentFilter)` —\n // narrowing here as well would hide matches on pages not yet loaded.\n const filteredAgents = agents;\n\n return (\n <PageLayout\n title={\n botId\n ? t('botlit.agentsList.titleBot', 'Bot Agents')\n : t('botlit.agentsList.title', 'All Agents')\n }\n description={\n botId\n ? t('botlit.agentsList.descriptionBot', 'Manage agents for this bot')\n : t('botlit.agentsList.description', 'View and manage all your AI agents')\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<ShieldCheck size={16} />}\n onClick={() => navigateTo('agents/approvals')}\n >\n {t('botlit.agentsList.actions.approvals', 'Approvals')}\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_CREATE}>\n <Button\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo(botId ? `bots/${botId}/agents/new` : 'agents/new')}\n >\n {t('botlit.agentsList.actions.createAgent', 'Create Agent')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Bot size={18} />}>\n {t(\n 'botlit.agentsList.purpose',\n 'Agents are the reasoning workers behind your bots — each one bundles a model, a system prompt, tools and knowledge into a callable AI. Build an agent here to handle a specific job (answer support questions, summarise documents, run a workflow), then test it in chat and connect it to a bot or channel.'\n )}\n </PagePurpose>\n\n {/* Summary */}\n {agents.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.agentsList.summary.total', 'Total agents')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {agents.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.agentsList.summary.active', 'Active')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {agents.filter((agent) => agent.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.agentsList.summary.executions', 'Total executions')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {formatNumber(agents.reduce((sum, agent) => sum + (agent.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.agentsList.searchPlaceholder', 'Search agents...')}\n value={agentFilter.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 ) : error ? (\n <ErrorState resource=\"agents\" error={error} onRetry={() => void refetch()} />\n ) : agents.length > 0 ? (\n viewMode === 'grid' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {agents.map((agent: AgentRecord) => (\n <Card\n key={agent.id}\n className=\"group hover:shadow-md transition-shadow cursor-pointer relative\"\n onClick={() => navigateTo(`agents/${agent.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\">🤖</span>\n <div>\n <h3 className=\"font-semibold text-text-primary\">{agent.name}</h3>\n <div className=\"flex items-center gap-2 mt-1\">\n <StatusBadge status={agent.status} />\n </div>\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 === agent.id ? null : agent.id);\n }}\n >\n <MoreVertical size={16} />\n </Button>\n {menuOpen === agent.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.AGENT_EXECUTE}>\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(`agents/${agent.id}/chat`);\n setMenuOpen(null);\n }}\n >\n <Play size={16} />\n {t('botlit.agentsList.menu.testAgent', 'Test Agent')}\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_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(`agents/${agent.id}/edit`);\n setMenuOpen(null);\n }}\n >\n <Settings size={16} />\n {t('botlit.agentsList.menu.editAgent', 'Edit Agent')}\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_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(agent);\n }}\n >\n <Trash2 size={16} />\n {t('botlit.agentsList.menu.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 {agent.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 <MessageSquare size={14} />\n {formatNumber(agent.executionCount)}{' '}\n {t('botlit.agentsList.card.executions', 'executions')}\n </span>\n </div>\n <div className=\"mt-3 pt-3 border-t border-border-subtle flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {t('botlit.agentsList.card.created', 'Created')}{' '}\n {formatRelativeTime(agent.createdAt)}\n </span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n leftIcon={<Play size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`agents/${agent.id}/chat`);\n }}\n >\n {t('botlit.agentsList.card.test', 'Test')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2\">\n {agents.map((agent: AgentRecord) => (\n <Card\n key={agent.id}\n className=\"hover:shadow-md transition-shadow cursor-pointer\"\n onClick={() => navigateTo(`agents/${agent.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\">🤖</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-text-primary\">{agent.name}</h3>\n <StatusBadge status={agent.status} />\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {agent.description}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-sm text-text-secondary\">\n <span>{formatNumber(agent.executionCount)} executions</span>\n <span>{formatRelativeTime(agent.createdAt)}</span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button variant=\"outline\" size=\"sm\" leftIcon={<Play size={14} />}>\n <Link to={getPath(`agents/${agent.id}/chat`)}>Test</Link>\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )\n ) : (\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.agentsList.empty.title', 'No agents yet')}\n description={t(\n 'botlit.agentsList.empty.description',\n 'Create your first AI agent to start building intelligent automations.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_CREATE}>\n <Button\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo(botId ? `bots/${botId}/agents/new` : 'agents/new')}\n >\n {t('botlit.agentsList.actions.createAgent', 'Create Agent')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n <LoadMore\n hasMore={hasMore}\n loadingMore={loadingMore}\n onLoadMore={() => void loadMore()}\n loadedCount={agents.length}\n />\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|