@burdenoff/microfe-botmanor 2026.1109.2 → 2026.1110.2

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