@burdenoff/microfe-botmanor 2026.1027.2 → 2026.1027.3

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