@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.
Files changed (73) hide show
  1. package/dist/botlit/BotlitRoutes.js +34 -45
  2. package/dist/botlit/BotlitRoutes.js.map +1 -1
  3. package/dist/botlit/components/Badge.js +2 -2
  4. package/dist/botlit/components/Badge.js.map +1 -1
  5. package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
  6. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
  7. package/dist/botlit/components/LoadMore.d.ts +9 -0
  8. package/dist/botlit/components/LoadMore.js +22 -0
  9. package/dist/botlit/components/LoadMore.js.map +1 -0
  10. package/dist/botlit/components/index.d.ts +1 -0
  11. package/dist/botlit/hooks/index.d.ts +1 -2
  12. package/dist/botlit/hooks/index.js +15 -16
  13. package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
  14. package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
  15. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  16. package/dist/botlit/hooks/useAgents.d.ts +2 -6
  17. package/dist/botlit/hooks/useAgents.js +71 -95
  18. package/dist/botlit/hooks/useAgents.js.map +1 -1
  19. package/dist/botlit/hooks/useBots.d.ts +2 -6
  20. package/dist/botlit/hooks/useBots.js +51 -75
  21. package/dist/botlit/hooks/useBots.js.map +1 -1
  22. package/dist/botlit/hooks/useBuckets.d.ts +5 -0
  23. package/dist/botlit/hooks/useBuckets.js +72 -38
  24. package/dist/botlit/hooks/useBuckets.js.map +1 -1
  25. package/dist/botlit/hooks/useExecutions.d.ts +2 -2
  26. package/dist/botlit/hooks/useExecutions.js +30 -34
  27. package/dist/botlit/hooks/useExecutions.js.map +1 -1
  28. package/dist/botlit/hooks/useStore.d.ts +3 -3
  29. package/dist/botlit/hooks/useStore.js +41 -50
  30. package/dist/botlit/hooks/useStore.js.map +1 -1
  31. package/dist/botlit/index.d.ts +0 -1
  32. package/dist/botlit/index.js +5 -6
  33. package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
  34. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  35. package/dist/botlit/pages/AgentDetailPage.js +1 -1
  36. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  37. package/dist/botlit/pages/AgentsListPage.js +157 -156
  38. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  39. package/dist/botlit/pages/BotChannelsTab.js +24 -24
  40. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  41. package/dist/botlit/pages/BotsListPage.js +147 -146
  42. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  43. package/dist/botlit/pages/BucketDetailPage.d.ts +2 -0
  44. package/dist/botlit/pages/BucketDetailPage.js +251 -0
  45. package/dist/botlit/pages/BucketDetailPage.js.map +1 -0
  46. package/dist/botlit/pages/BucketsPage.js +3 -3
  47. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  48. package/dist/botlit/pages/ChannelDetailPage.js +2 -2
  49. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  50. package/dist/botlit/pages/ExecutionsPage.js +141 -134
  51. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  52. package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
  53. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  54. package/dist/botlit/pages/MCPServersPage.js +1 -1
  55. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  56. package/dist/botlit/pages/SettingsPage.js +2 -2
  57. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  58. package/dist/botlit/pages/SkillDetailPage.js +1 -1
  59. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  60. package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
  61. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  62. package/dist/botlit/pages/StorePage.js +150 -143
  63. package/dist/botlit/pages/StorePage.js.map +1 -1
  64. package/dist/botlit/pages/index.d.ts +1 -2
  65. package/dist/generated/wspace-operations.js +67 -67
  66. package/dist/generated/wspace-operations.js.map +1 -1
  67. package/dist/index.js +5 -6
  68. package/package.json +1 -1
  69. package/dist/botlit/hooks/useConversations.d.ts +0 -42
  70. package/dist/botlit/hooks/useConversations.js +0 -63
  71. package/dist/botlit/hooks/useConversations.js.map +0 -1
  72. package/dist/botlit/pages/ConversationDetailPage.d.ts +0 -2
  73. package/dist/botlit/pages/ConversationsPage.d.ts +0 -2
@@ -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 { ErrorState as m } from "../components/ErrorState.js";
12
- import { useAgents as h, useDeleteAgent as g } from "../hooks/useAgents.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";
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 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, useParams as O } from "react-router";
22
- import { Bot as ee, Grid3X3 as te, List as ne, MessageSquare as k, MoreVertical as A, Play as j, Plus as M, Search as N, Settings as P, ShieldCheck as F, Trash2 as I } from "lucide-react";
23
- import { toast as L } from "sonner";
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 R = () => {
26
- let R = i(), { botId: z } = O(), { navigateTo: B, getPath: V } = v(), { data: H, loading: U, error: W, refetch: G } = h(), [K] = g(), { viewMode: q, setViewMode: J, agentFilter: Y, updateAgentFilter: X } = _(), [Z, Q] = S(null), re = (e) => {
27
- X({ search: e.target.value });
28
- }, ie = async (i) => {
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: R("botlit.agentsList.delete.title", "Delete agent?"),
31
- message: R("botlit.agentsList.delete.message", "Are you sure you want to delete \"{{name}}\"?", { name: i.name }),
32
- okButtonTitle: R("botlit.agentsList.delete.okButton", "Delete"),
33
- cancelButtonTitle: R("botlit.agentsList.delete.cancelButton", "Cancel")
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(R("botlit.agentsList.delete.message", "Are you sure you want to delete \"{{name}}\"?", { name: i.name })) : a) {
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 K(i.id), L.success(R("botlit.agentsList.delete.success", "Agent \"{{name}}\" deleted successfully", { name: i.name })), e() && r("success");
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 : R("botlit.agentsList.delete.error", "Failed to delete agent");
41
- L.error(n), e() && r("error");
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
- Q(null);
45
- }, $ = H.filter((e) => {
46
- if (Y.search) {
47
- let t = Y.search.toLowerCase();
48
- return e.name.toLowerCase().includes(t) || (e.description?.toLowerCase().includes(t) ?? !1);
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__ */ T(c, {
52
+ children: [/* @__PURE__ */ E(c, {
58
53
  variant: "outline",
59
- leftIcon: /* @__PURE__ */ T(F, { size: 16 }),
60
- onClick: () => B("agents/approvals"),
61
- children: R("botlit.agentsList.actions.approvals", "Approvals")
62
- }), /* @__PURE__ */ T(d, {
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__ */ T(c, {
65
- leftIcon: /* @__PURE__ */ T(M, { size: 16 }),
66
- onClick: () => B(z ? `bots/${z}/agents/new` : "agents/new"),
67
- children: R("botlit.agentsList.actions.createAgent", "Create Agent")
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__ */ E("div", {
66
+ children: /* @__PURE__ */ D("div", {
72
67
  className: "space-y-6",
73
68
  children: [
74
- /* @__PURE__ */ T(w, {
75
- icon: /* @__PURE__ */ T(ee, { size: 18 }),
76
- children: R("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.")
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
- H.length > 0 ? /* @__PURE__ */ E("div", {
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__ */ E(C, {
76
+ /* @__PURE__ */ D(w, {
82
77
  treatment: "glass",
83
78
  glow: !0,
84
79
  className: "p-4",
85
- children: [/* @__PURE__ */ T("p", {
80
+ children: [/* @__PURE__ */ E("p", {
86
81
  className: "text-sm text-text-secondary",
87
- children: R("botlit.agentsList.summary.total", "Total agents")
88
- }), /* @__PURE__ */ T("p", {
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: H.length
85
+ children: J.length
91
86
  })]
92
87
  }),
93
- /* @__PURE__ */ E(C, {
88
+ /* @__PURE__ */ D(w, {
94
89
  treatment: "metric",
95
90
  className: "p-4",
96
- children: [/* @__PURE__ */ T("p", {
91
+ children: [/* @__PURE__ */ E("p", {
97
92
  className: "text-sm text-text-secondary",
98
- children: R("botlit.agentsList.summary.active", "Active")
99
- }), /* @__PURE__ */ T("p", {
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: H.filter((e) => e.status === "ACTIVE").length
96
+ children: J.filter((e) => e.status === "ACTIVE").length
102
97
  })]
103
98
  }),
104
- /* @__PURE__ */ E(C, {
99
+ /* @__PURE__ */ D(w, {
105
100
  treatment: "metric",
106
101
  className: "col-span-2 p-4 sm:col-span-1",
107
- children: [/* @__PURE__ */ T("p", {
102
+ children: [/* @__PURE__ */ E("p", {
108
103
  className: "text-sm text-text-secondary",
109
- children: R("botlit.agentsList.summary.executions", "Total executions")
110
- }), /* @__PURE__ */ T("p", {
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: y(H.reduce((e, t) => e + (t.executionCount ?? 0), 0))
107
+ children: b(J.reduce((e, t) => e + (t.executionCount ?? 0), 0))
113
108
  })]
114
109
  })
115
110
  ]
116
111
  }) : null,
117
- /* @__PURE__ */ E("div", {
112
+ /* @__PURE__ */ D("div", {
118
113
  className: "flex items-center justify-between gap-4",
119
- children: [/* @__PURE__ */ E("div", {
114
+ children: [/* @__PURE__ */ D("div", {
120
115
  className: "relative flex-1 max-w-md",
121
- children: [/* @__PURE__ */ T(N, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ T(l, {
122
- placeholder: R("botlit.agentsList.searchPlaceholder", "Search agents..."),
123
- value: Y.search || "",
124
- onChange: re,
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__ */ E("div", {
122
+ }), /* @__PURE__ */ D("div", {
128
123
  className: "flex items-center gap-2",
129
- children: [/* @__PURE__ */ T(c, {
130
- variant: q === "grid" ? "secondary" : "ghost",
124
+ children: [/* @__PURE__ */ E(c, {
125
+ variant: W === "grid" ? "secondary" : "ghost",
131
126
  size: "icon",
132
- onClick: () => J("grid"),
133
- children: /* @__PURE__ */ T(te, { size: 18 })
134
- }), /* @__PURE__ */ T(c, {
135
- variant: q === "list" ? "secondary" : "ghost",
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: () => J("list"),
138
- children: /* @__PURE__ */ T(ne, { size: 18 })
132
+ onClick: () => G("list"),
133
+ children: /* @__PURE__ */ E(A, { size: 18 })
139
134
  })]
140
135
  })]
141
136
  }),
142
- U ? /* @__PURE__ */ T("div", {
143
- className: x("gap-4", q === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : "flex flex-col"),
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__ */ T("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
152
- }) : W ? /* @__PURE__ */ T(m, {
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: W,
155
- onRetry: () => void G()
156
- }) : $.length > 0 ? q === "grid" ? /* @__PURE__ */ T("div", {
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: $.map((e) => /* @__PURE__ */ T(o, {
153
+ children: J.map((e) => /* @__PURE__ */ E(o, {
159
154
  className: "group hover:shadow-md transition-shadow cursor-pointer relative",
160
- onClick: () => B(`agents/${e.id}`),
161
- children: /* @__PURE__ */ E(s, {
155
+ onClick: () => H(`agents/${e.id}`),
156
+ children: /* @__PURE__ */ D(s, {
162
157
  className: "pt-6",
163
158
  children: [
164
- /* @__PURE__ */ E("div", {
159
+ /* @__PURE__ */ D("div", {
165
160
  className: "flex items-start justify-between",
166
- children: [/* @__PURE__ */ E("div", {
161
+ children: [/* @__PURE__ */ D("div", {
167
162
  className: "flex items-center gap-3",
168
- children: [/* @__PURE__ */ T("span", {
163
+ children: [/* @__PURE__ */ E("span", {
169
164
  className: "text-4xl",
170
165
  children: "🤖"
171
- }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("h3", {
166
+ }), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ E("h3", {
172
167
  className: "font-semibold text-text-primary",
173
168
  children: e.name
174
- }), /* @__PURE__ */ T("div", {
169
+ }), /* @__PURE__ */ E("div", {
175
170
  className: "flex items-center gap-2 mt-1",
176
- children: /* @__PURE__ */ T(f, { status: e.status })
171
+ children: /* @__PURE__ */ E(f, { status: e.status })
177
172
  })] })]
178
- }), /* @__PURE__ */ E("div", {
173
+ }), /* @__PURE__ */ D("div", {
179
174
  className: "relative",
180
- children: [/* @__PURE__ */ T(c, {
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(Z === e.id ? null : e.id);
180
+ t.stopPropagation(), $(Q === e.id ? null : e.id);
186
181
  },
187
- children: /* @__PURE__ */ T(A, { size: 16 })
188
- }), Z === e.id && /* @__PURE__ */ E("div", {
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__ */ T(d, {
186
+ /* @__PURE__ */ E(d, {
192
187
  permission: u.AGENT_EXECUTE,
193
- children: /* @__PURE__ */ E("button", {
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(), B(`agents/${e.id}/chat`), Q(null);
191
+ t.stopPropagation(), H(`agents/${e.id}/chat`), $(null);
197
192
  },
198
- children: [/* @__PURE__ */ T(j, { size: 16 }), R("botlit.agentsList.menu.testAgent", "Test Agent")]
193
+ children: [/* @__PURE__ */ E(N, { size: 16 }), B("botlit.agentsList.menu.testAgent", "Test Agent")]
199
194
  })
200
195
  }),
201
- /* @__PURE__ */ T(d, {
196
+ /* @__PURE__ */ E(d, {
202
197
  permission: u.AGENT_UPDATE,
203
- children: /* @__PURE__ */ E("button", {
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(), B(`agents/${e.id}/edit`), Q(null);
201
+ t.stopPropagation(), H(`agents/${e.id}/edit`), $(null);
207
202
  },
208
- children: [/* @__PURE__ */ T(P, { size: 16 }), R("botlit.agentsList.menu.editAgent", "Edit Agent")]
203
+ children: [/* @__PURE__ */ E(I, { size: 16 }), B("botlit.agentsList.menu.editAgent", "Edit Agent")]
209
204
  })
210
205
  }),
211
- /* @__PURE__ */ T(d, {
206
+ /* @__PURE__ */ E(d, {
212
207
  permission: u.AGENT_DELETE,
213
- children: /* @__PURE__ */ E("button", {
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(), ie(e);
211
+ t.stopPropagation(), se(e);
217
212
  },
218
- children: [/* @__PURE__ */ T(I, { size: 16 }), R("botlit.agentsList.menu.delete", "Delete")]
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__ */ T("p", {
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__ */ T("div", {
224
+ /* @__PURE__ */ E("div", {
230
225
  className: "mt-4 flex items-center gap-4 text-xs text-text-secondary",
231
- children: /* @__PURE__ */ E("span", {
226
+ children: /* @__PURE__ */ D("span", {
232
227
  className: "flex items-center gap-1",
233
228
  children: [
234
- /* @__PURE__ */ T(k, { size: 14 }),
235
- y(e.executionCount),
229
+ /* @__PURE__ */ E(j, { size: 14 }),
230
+ b(e.executionCount),
236
231
  " ",
237
- R("botlit.agentsList.card.executions", "executions")
232
+ B("botlit.agentsList.card.executions", "executions")
238
233
  ]
239
234
  })
240
235
  }),
241
- /* @__PURE__ */ E("div", {
236
+ /* @__PURE__ */ D("div", {
242
237
  className: "mt-3 pt-3 border-t border-border-subtle flex items-center justify-between",
243
- children: [/* @__PURE__ */ E("span", {
238
+ children: [/* @__PURE__ */ D("span", {
244
239
  className: "text-xs text-text-secondary",
245
240
  children: [
246
- R("botlit.agentsList.card.created", "Created"),
241
+ B("botlit.agentsList.card.created", "Created"),
247
242
  " ",
248
- b(e.createdAt)
243
+ x(e.createdAt)
249
244
  ]
250
- }), /* @__PURE__ */ T(d, {
245
+ }), /* @__PURE__ */ E(d, {
251
246
  permission: u.AGENT_EXECUTE,
252
- children: /* @__PURE__ */ T(c, {
247
+ children: /* @__PURE__ */ E(c, {
253
248
  size: "sm",
254
249
  variant: "ghost",
255
- leftIcon: /* @__PURE__ */ T(j, { size: 14 }),
250
+ leftIcon: /* @__PURE__ */ E(N, { size: 14 }),
256
251
  onClick: (t) => {
257
- t.stopPropagation(), B(`agents/${e.id}/chat`);
252
+ t.stopPropagation(), H(`agents/${e.id}/chat`);
258
253
  },
259
- children: R("botlit.agentsList.card.test", "Test")
254
+ children: B("botlit.agentsList.card.test", "Test")
260
255
  })
261
256
  })]
262
257
  })
263
258
  ]
264
259
  })
265
260
  }, e.id))
266
- }) : /* @__PURE__ */ T("div", {
261
+ }) : /* @__PURE__ */ E("div", {
267
262
  className: "space-y-2",
268
- children: $.map((e) => /* @__PURE__ */ T(o, {
263
+ children: J.map((e) => /* @__PURE__ */ E(o, {
269
264
  className: "hover:shadow-md transition-shadow cursor-pointer",
270
- onClick: () => B(`agents/${e.id}`),
271
- children: /* @__PURE__ */ T(s, {
265
+ onClick: () => H(`agents/${e.id}`),
266
+ children: /* @__PURE__ */ E(s, {
272
267
  className: "py-4",
273
- children: /* @__PURE__ */ E("div", {
268
+ children: /* @__PURE__ */ D("div", {
274
269
  className: "flex items-center justify-between",
275
- children: [/* @__PURE__ */ E("div", {
270
+ children: [/* @__PURE__ */ D("div", {
276
271
  className: "flex items-center gap-4",
277
- children: [/* @__PURE__ */ T("span", {
272
+ children: [/* @__PURE__ */ E("span", {
278
273
  className: "text-3xl",
279
274
  children: "🤖"
280
- }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ E("div", {
275
+ }), /* @__PURE__ */ D("div", { children: [/* @__PURE__ */ D("div", {
281
276
  className: "flex items-center gap-2",
282
- children: [/* @__PURE__ */ T("h3", {
277
+ children: [/* @__PURE__ */ E("h3", {
283
278
  className: "font-semibold text-text-primary",
284
279
  children: e.name
285
- }), /* @__PURE__ */ T(f, { status: e.status })]
286
- }), /* @__PURE__ */ T("p", {
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__ */ E("div", {
285
+ }), /* @__PURE__ */ D("div", {
291
286
  className: "flex items-center gap-4 text-sm text-text-secondary",
292
287
  children: [
293
- /* @__PURE__ */ E("span", { children: [y(e.executionCount), " executions"] }),
294
- /* @__PURE__ */ T("span", { children: b(e.createdAt) }),
295
- /* @__PURE__ */ T(d, {
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__ */ T(c, {
292
+ children: /* @__PURE__ */ E(c, {
298
293
  variant: "outline",
299
294
  size: "sm",
300
- leftIcon: /* @__PURE__ */ T(j, { size: 14 }),
301
- children: /* @__PURE__ */ T(D, {
302
- to: V(`agents/${e.id}/chat`),
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__ */ T(p, {
307
+ }) : /* @__PURE__ */ E(p, {
313
308
  illustration: "empty-agents",
314
- title: R("botlit.agentsList.empty.title", "No agents yet"),
315
- description: R("botlit.agentsList.empty.description", "Create your first AI agent to start building intelligent automations."),
316
- action: /* @__PURE__ */ T(d, {
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__ */ T(c, {
319
- leftIcon: /* @__PURE__ */ T(M, { size: 16 }),
320
- onClick: () => B(z ? `bots/${z}/agents/new` : "agents/new"),
321
- children: R("botlit.agentsList.actions.createAgent", "Create Agent")
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 { R as AgentsListPage };
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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"}