@burdenoff/microfe-botmanor 2026.1027.2 → 2026.1028.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) 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/RetentionStatusPanel.js +95 -0
  7. package/dist/botlit/components/RetentionStatusPanel.js.map +1 -0
  8. package/dist/botlit/components/VersionHistoryPanel.js +92 -83
  9. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  10. package/dist/botlit/hooks/index.js +1 -0
  11. package/dist/botlit/hooks/useRetention.js +31 -0
  12. package/dist/botlit/hooks/useRetention.js.map +1 -0
  13. package/dist/botlit/pages/A2AAgentDetailPage.js +212 -203
  14. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  15. package/dist/botlit/pages/A2ARegistryPage.js +129 -117
  16. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  17. package/dist/botlit/pages/AgentApprovalsPage.js +122 -110
  18. package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
  19. package/dist/botlit/pages/AgentBuilderPage.js +18 -18
  20. package/dist/botlit/pages/AgentDetailPage.js +298 -273
  21. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  22. package/dist/botlit/pages/AgentsListPage.js +145 -121
  23. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  24. package/dist/botlit/pages/BotChannelsTab.js +238 -226
  25. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  26. package/dist/botlit/pages/BotDetailPage.js +307 -288
  27. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  28. package/dist/botlit/pages/BotWorkflowTab.js +125 -116
  29. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  30. package/dist/botlit/pages/BotsListPage.js +159 -144
  31. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  32. package/dist/botlit/pages/BucketsPage.js +279 -258
  33. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  34. package/dist/botlit/pages/ChannelDetailPage.js +346 -328
  35. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  36. package/dist/botlit/pages/ChannelRoutesPage.js +10 -10
  37. package/dist/botlit/pages/ChannelsPage.js +163 -148
  38. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  39. package/dist/botlit/pages/DashboardPage.js +129 -114
  40. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  41. package/dist/botlit/pages/ExecutionDetailPage.js +145 -139
  42. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
  43. package/dist/botlit/pages/ExecutionsPage.js +14 -14
  44. package/dist/botlit/pages/InstalledPackagesPage.js +245 -227
  45. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  46. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +168 -156
  47. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
  48. package/dist/botlit/pages/KnowledgeBasesPage.js +91 -79
  49. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  50. package/dist/botlit/pages/MCPServerDetailPage.js +200 -188
  51. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
  52. package/dist/botlit/pages/MCPServersPage.js +170 -155
  53. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  54. package/dist/botlit/pages/PoliciesPage.js +115 -104
  55. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  56. package/dist/botlit/pages/PolicyDetailPage.js +368 -324
  57. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
  58. package/dist/botlit/pages/PromptStudioPage.js +106 -97
  59. package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
  60. package/dist/botlit/pages/PromptTemplateDetailPage.js +359 -347
  61. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
  62. package/dist/botlit/pages/PromptTemplatesPage.js +127 -112
  63. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
  64. package/dist/botlit/pages/RetrievalProfileDetailPage.js +219 -210
  65. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
  66. package/dist/botlit/pages/RetrievalProfilesPage.js +112 -103
  67. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  68. package/dist/botlit/pages/SettingsPage.js +264 -252
  69. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  70. package/dist/botlit/pages/SkillDetailPage.js +235 -226
  71. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  72. package/dist/botlit/pages/SkillsPage.js +115 -106
  73. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  74. package/dist/botlit/pages/StorePackageDetailPage.js +194 -188
  75. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  76. package/dist/botlit/pages/StorePage.js +161 -155
  77. package/dist/botlit/pages/StorePage.js.map +1 -1
  78. package/dist/botlit/permissions/PermissionRequired.js +45 -0
  79. package/dist/botlit/permissions/PermissionRequired.js.map +1 -0
  80. package/dist/botlit/permissions/botmanorPermissions.js +72 -0
  81. package/dist/botlit/permissions/botmanorPermissions.js.map +1 -0
  82. package/dist/botlit/permissions/index.js +3 -0
  83. package/dist/botlit/permissions/useBotmanorPermissions.js +19 -0
  84. package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -0
  85. package/dist/botlit/utils/policyConfig.js +67 -42
  86. package/dist/botlit/utils/policyConfig.js.map +1 -1
  87. package/dist/generated/global-types.js.map +1 -1
  88. package/dist/generated/wspace-operations.js +90 -54
  89. package/dist/generated/wspace-operations.js.map +1 -1
  90. package/dist/generated/wspace-types.js.map +1 -1
  91. package/package.json +1 -1
@@ -4,128 +4,134 @@ import { useBotlitStore as n } from "../store/botlitStore.js";
4
4
  import { useBots as r, useDeleteBot as i } from "../hooks/useBots.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 { useState as y } from "react";
15
- import { GlassCard as b, PagePurpose as x } from "@burdenoff/fe-libs/ui";
16
- import { jsx as S, jsxs as C } from "react/jsx-runtime";
17
- import { Link as w } from "react-router";
18
- import { Bot as T, Edit as E, Grid3X3 as D, List as O, MoreVertical as k, Plus as A, Search as j, Trash2 as M, Workflow as N } from "lucide-react";
19
- import { toast as P } from "sonner";
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 { 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";
20
23
  //#region src/botlit/pages/BotsListPage.tsx
21
- var F = () => {
22
- let F = e(), { navigateTo: I, getPath: L } = t(), { data: R, loading: z } = r(), [B] = i(), { viewMode: V, setViewMode: H, botFilter: U, updateBotFilter: W } = n(), [G, K] = y(null), q = (e) => {
23
- W({ search: e.target.value });
24
- }, J = async (e) => {
25
- let t = `${F("botlit.botsList.delete.confirmPrefix", "Are you sure you want to delete")} "${e.name}"?`, n = await m({
24
+ var L = () => {
25
+ let L = e(), { navigateTo: R, getPath: z } = t(), { data: B, loading: V } = r(), [H] = i(), { viewMode: U, setViewMode: W, botFilter: G, updateBotFilter: K } = n(), [q, J] = x(null), Y = (e) => {
26
+ K({ search: e.target.value });
27
+ }, X = async (e) => {
28
+ let t = `${L("botlit.botsList.delete.confirmPrefix", "Are you sure you want to delete")} "${e.name}"?`, n = await g({
26
29
  title: "Delete bot?",
27
30
  message: t,
28
31
  okButtonTitle: "Delete",
29
32
  cancelButtonTitle: "Cancel"
30
33
  });
31
34
  if (n === null ? confirm(t) : n) {
32
- h("medium");
35
+ _("medium");
33
36
  try {
34
- await B(e.id), P.success(`${F("botlit.botsList.delete.successPrefix", "Bot")} "${e.name}" ${F("botlit.botsList.delete.successSuffix", "deleted successfully")}`), p() && g("success");
37
+ await H(e.id), I.success(`${L("botlit.botsList.delete.successPrefix", "Bot")} "${e.name}" ${L("botlit.botsList.delete.successSuffix", "deleted successfully")}`), h() && v("success");
35
38
  } catch (e) {
36
- let t = e instanceof Error ? e.message : F("botlit.botsList.delete.error", "Failed to delete bot");
37
- P.error(t), p() && g("error");
39
+ let t = e instanceof Error ? e.message : L("botlit.botsList.delete.error", "Failed to delete bot");
40
+ I.error(t), h() && v("error");
38
41
  }
39
42
  }
40
- K(null);
41
- }, Y = R?.filter((e) => {
42
- if (U.search) {
43
- let t = U.search.toLowerCase();
43
+ J(null);
44
+ }, Z = B?.filter((e) => {
45
+ if (G.search) {
46
+ let t = G.search.toLowerCase();
44
47
  return e.name.toLowerCase().includes(t) || (e.description?.toLowerCase().includes(t) ?? !1);
45
48
  }
46
49
  return !0;
47
50
  });
48
- return /* @__PURE__ */ S(c, {
49
- title: F("botlit.botsList.title", "Bots"),
50
- description: F("botlit.botsList.description", "Manage your AI-powered bots"),
51
- actions: /* @__PURE__ */ S(d, {
52
- leftIcon: /* @__PURE__ */ S(A, { size: 16 }),
53
- onClick: () => I("bots/new"),
54
- children: F("botlit.botsList.actions.createBot", "Create Bot")
51
+ return /* @__PURE__ */ w(u, {
52
+ title: L("botlit.botsList.title", "Bots"),
53
+ description: L("botlit.botsList.description", "Manage your AI-powered bots"),
54
+ actions: /* @__PURE__ */ w(l, {
55
+ permission: c.APP_CREATE,
56
+ children: /* @__PURE__ */ w(d, {
57
+ leftIcon: /* @__PURE__ */ w(M, { size: 16 }),
58
+ onClick: () => R("bots/new"),
59
+ children: L("botlit.botsList.actions.createBot", "Create Bot")
60
+ })
55
61
  }),
56
- children: /* @__PURE__ */ C("div", {
62
+ children: /* @__PURE__ */ T("div", {
57
63
  className: "space-y-6",
58
64
  children: [
59
- /* @__PURE__ */ S(x, {
60
- icon: /* @__PURE__ */ S(T, { size: 18 }),
61
- children: F("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.")
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.")
62
68
  }),
63
- R && R.length > 0 ? /* @__PURE__ */ C("div", {
69
+ B && B.length > 0 ? /* @__PURE__ */ T("div", {
64
70
  className: "grid grid-cols-2 gap-4 sm:grid-cols-3",
65
71
  children: [
66
- /* @__PURE__ */ C(b, {
72
+ /* @__PURE__ */ T(S, {
67
73
  treatment: "glass",
68
74
  glow: !0,
69
75
  className: "p-4",
70
- children: [/* @__PURE__ */ S("p", {
76
+ children: [/* @__PURE__ */ w("p", {
71
77
  className: "text-sm text-text-secondary",
72
- children: F("botlit.botsList.summary.total", "Total bots")
73
- }), /* @__PURE__ */ S("p", {
78
+ children: L("botlit.botsList.summary.total", "Total bots")
79
+ }), /* @__PURE__ */ w("p", {
74
80
  className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
75
- children: R.length
81
+ children: B.length
76
82
  })]
77
83
  }),
78
- /* @__PURE__ */ C(b, {
84
+ /* @__PURE__ */ T(S, {
79
85
  treatment: "metric",
80
86
  className: "p-4",
81
- children: [/* @__PURE__ */ S("p", {
87
+ children: [/* @__PURE__ */ w("p", {
82
88
  className: "text-sm text-text-secondary",
83
- children: F("botlit.botsList.summary.active", "Active")
84
- }), /* @__PURE__ */ S("p", {
89
+ children: L("botlit.botsList.summary.active", "Active")
90
+ }), /* @__PURE__ */ w("p", {
85
91
  className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
86
- children: R.filter((e) => e.status === "ACTIVE").length
92
+ children: B.filter((e) => e.status === "ACTIVE").length
87
93
  })]
88
94
  }),
89
- /* @__PURE__ */ C(b, {
95
+ /* @__PURE__ */ T(S, {
90
96
  treatment: "metric",
91
97
  className: "col-span-2 p-4 sm:col-span-1",
92
- children: [/* @__PURE__ */ S("p", {
98
+ children: [/* @__PURE__ */ w("p", {
93
99
  className: "text-sm text-text-secondary",
94
- children: F("botlit.botsList.summary.executions", "Total executions")
95
- }), /* @__PURE__ */ S("p", {
100
+ children: L("botlit.botsList.summary.executions", "Total executions")
101
+ }), /* @__PURE__ */ w("p", {
96
102
  className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
97
- children: o(R.reduce((e, t) => e + (t.executionCount ?? 0), 0))
103
+ children: o(B.reduce((e, t) => e + (t.executionCount ?? 0), 0))
98
104
  })]
99
105
  })
100
106
  ]
101
107
  }) : null,
102
- /* @__PURE__ */ C("div", {
108
+ /* @__PURE__ */ T("div", {
103
109
  className: "flex items-center justify-between gap-4",
104
- children: [/* @__PURE__ */ C("div", {
110
+ children: [/* @__PURE__ */ T("div", {
105
111
  className: "relative flex-1 max-w-md",
106
- children: [/* @__PURE__ */ S(j, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ S(v, {
107
- placeholder: F("botlit.botsList.searchPlaceholder", "Search bots..."),
108
- value: U.search || "",
109
- onChange: q,
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(b, {
113
+ placeholder: L("botlit.botsList.searchPlaceholder", "Search bots..."),
114
+ value: G.search || "",
115
+ onChange: Y,
110
116
  className: "pl-9"
111
117
  })]
112
- }), /* @__PURE__ */ C("div", {
118
+ }), /* @__PURE__ */ T("div", {
113
119
  className: "flex items-center gap-2",
114
- children: [/* @__PURE__ */ S(d, {
115
- variant: V === "grid" ? "secondary" : "ghost",
120
+ children: [/* @__PURE__ */ w(d, {
121
+ variant: U === "grid" ? "secondary" : "ghost",
116
122
  size: "icon",
117
- onClick: () => H("grid"),
118
- children: /* @__PURE__ */ S(D, { size: 18 })
119
- }), /* @__PURE__ */ S(d, {
120
- variant: V === "list" ? "secondary" : "ghost",
123
+ onClick: () => W("grid"),
124
+ children: /* @__PURE__ */ w(k, { size: 18 })
125
+ }), /* @__PURE__ */ w(d, {
126
+ variant: U === "list" ? "secondary" : "ghost",
121
127
  size: "icon",
122
- onClick: () => H("list"),
123
- children: /* @__PURE__ */ S(O, { size: 18 })
128
+ onClick: () => W("list"),
129
+ children: /* @__PURE__ */ w(A, { size: 18 })
124
130
  })]
125
131
  })]
126
132
  }),
127
- z ? /* @__PURE__ */ S("div", {
128
- className: a("gap-4", V === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : "flex flex-col"),
133
+ V ? /* @__PURE__ */ w("div", {
134
+ className: a("gap-4", U === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : "flex flex-col"),
129
135
  children: [
130
136
  1,
131
137
  2,
@@ -133,156 +139,162 @@ var F = () => {
133
139
  4,
134
140
  5,
135
141
  6
136
- ].map((e) => /* @__PURE__ */ S("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
137
- }) : Y && Y.length > 0 ? V === "grid" ? /* @__PURE__ */ S("div", {
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", {
138
144
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
139
- children: Y.map((e) => /* @__PURE__ */ S(l, {
145
+ children: Z.map((e) => /* @__PURE__ */ w(f, {
140
146
  className: "group hover:shadow-md transition-shadow cursor-pointer relative",
141
- onClick: () => I(`bots/${e.id}`),
142
- children: /* @__PURE__ */ C(u, {
147
+ onClick: () => R(`bots/${e.id}`),
148
+ children: /* @__PURE__ */ T(p, {
143
149
  className: "pt-6",
144
150
  children: [
145
- /* @__PURE__ */ C("div", {
151
+ /* @__PURE__ */ T("div", {
146
152
  className: "flex items-start justify-between",
147
- children: [/* @__PURE__ */ C("div", {
153
+ children: [/* @__PURE__ */ T("div", {
148
154
  className: "flex items-center gap-3",
149
- children: [/* @__PURE__ */ S("span", {
155
+ children: [/* @__PURE__ */ w("span", {
150
156
  className: "text-4xl",
151
157
  children: e.icon || "🤖"
152
- }), /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("h3", {
158
+ }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h3", {
153
159
  className: "font-semibold text-text-primary",
154
160
  children: e.name
155
- }), /* @__PURE__ */ S(f, { status: e.status })] })]
156
- }), /* @__PURE__ */ C("div", {
161
+ }), /* @__PURE__ */ w(m, { status: e.status })] })]
162
+ }), /* @__PURE__ */ T("div", {
157
163
  className: "relative",
158
- children: [/* @__PURE__ */ S(d, {
164
+ children: [/* @__PURE__ */ w(d, {
159
165
  variant: "ghost",
160
166
  size: "icon",
161
167
  className: "opacity-0 group-hover:opacity-100 transition-opacity",
162
168
  onClick: (t) => {
163
- t.stopPropagation(), K(G === e.id ? null : e.id);
169
+ t.stopPropagation(), J(q === e.id ? null : e.id);
164
170
  },
165
- children: /* @__PURE__ */ S(k, { size: 16 })
166
- }), G === e.id && /* @__PURE__ */ C("div", {
171
+ children: /* @__PURE__ */ w(j, { size: 16 })
172
+ }), q === e.id && /* @__PURE__ */ T("div", {
167
173
  className: "absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10",
168
174
  children: [
169
- /* @__PURE__ */ C("button", {
170
- className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
171
- onClick: (t) => {
172
- t.stopPropagation(), I(`bots/${e.id}/edit`), K(null);
173
- },
174
- children: [/* @__PURE__ */ S(E, { size: 16 }), F("botlit.botsList.menu.editBot", "Edit Bot")]
175
+ /* @__PURE__ */ w(l, {
176
+ permission: c.APP_UPDATE,
177
+ children: /* @__PURE__ */ T("button", {
178
+ className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
179
+ onClick: (t) => {
180
+ t.stopPropagation(), R(`bots/${e.id}/edit`), J(null);
181
+ },
182
+ children: [/* @__PURE__ */ w(O, { size: 16 }), L("botlit.botsList.menu.editBot", "Edit Bot")]
183
+ })
175
184
  }),
176
- /* @__PURE__ */ C("button", {
185
+ /* @__PURE__ */ T("button", {
177
186
  className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
178
187
  onClick: (t) => {
179
- t.stopPropagation(), I(`bots/${e.id}?tab=workflow`), K(null);
188
+ t.stopPropagation(), R(`bots/${e.id}?tab=workflow`), J(null);
180
189
  },
181
- children: [/* @__PURE__ */ S(N, { size: 16 }), F("botlit.botsList.menu.design", "Design workflow")]
190
+ children: [/* @__PURE__ */ w(F, { size: 16 }), L("botlit.botsList.menu.design", "Design workflow")]
182
191
  }),
183
- /* @__PURE__ */ C("button", {
192
+ /* @__PURE__ */ T("button", {
184
193
  className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
185
194
  onClick: (t) => {
186
- t.stopPropagation(), I(`bots/${e.id}/agents`), K(null);
195
+ t.stopPropagation(), R(`bots/${e.id}/agents`), J(null);
187
196
  },
188
- children: [/* @__PURE__ */ S(T, { size: 16 }), F("botlit.botsList.menu.viewAgents", "View Agents")]
197
+ children: [/* @__PURE__ */ w(D, { size: 16 }), L("botlit.botsList.menu.viewAgents", "View Agents")]
189
198
  }),
190
- /* @__PURE__ */ C("button", {
191
- className: "w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2",
192
- onClick: (t) => {
193
- t.stopPropagation(), J(e);
194
- },
195
- children: [/* @__PURE__ */ S(M, { size: 16 }), F("botlit.common.delete", "Delete")]
199
+ /* @__PURE__ */ w(l, {
200
+ permission: c.APP_DELETE,
201
+ children: /* @__PURE__ */ T("button", {
202
+ className: "w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2",
203
+ onClick: (t) => {
204
+ t.stopPropagation(), X(e);
205
+ },
206
+ children: [/* @__PURE__ */ w(P, { size: 16 }), L("botlit.common.delete", "Delete")]
207
+ })
196
208
  })
197
209
  ]
198
210
  })]
199
211
  })]
200
212
  }),
201
- /* @__PURE__ */ S("p", {
213
+ /* @__PURE__ */ w("p", {
202
214
  className: "mt-3 text-sm text-text-secondary line-clamp-2",
203
215
  children: e.description
204
216
  }),
205
- /* @__PURE__ */ S("div", {
217
+ /* @__PURE__ */ w("div", {
206
218
  className: "mt-4 flex items-center gap-4 text-xs text-text-secondary",
207
- children: /* @__PURE__ */ C("span", {
219
+ children: /* @__PURE__ */ T("span", {
208
220
  className: "flex items-center gap-1",
209
221
  children: [
210
- /* @__PURE__ */ S(T, { size: 14 }),
222
+ /* @__PURE__ */ w(D, { size: 14 }),
211
223
  e.executionCount || 0,
212
224
  " ",
213
- F("botlit.common.executions", "executions")
225
+ L("botlit.common.executions", "executions")
214
226
  ]
215
227
  })
216
228
  }),
217
- /* @__PURE__ */ C("div", {
229
+ /* @__PURE__ */ T("div", {
218
230
  className: "mt-3 pt-3 border-t border-border-subtle flex items-center justify-between gap-2",
219
- children: [/* @__PURE__ */ C("span", {
231
+ children: [/* @__PURE__ */ T("span", {
220
232
  className: "text-xs text-text-secondary",
221
233
  children: [
222
- F("botlit.botsList.createdLabel", "Created"),
234
+ L("botlit.botsList.createdLabel", "Created"),
223
235
  " ",
224
236
  s(e.createdAt)
225
237
  ]
226
- }), /* @__PURE__ */ S(d, {
238
+ }), /* @__PURE__ */ w(d, {
227
239
  variant: "ghost",
228
240
  size: "sm",
229
- leftIcon: /* @__PURE__ */ S(N, { size: 14 }),
241
+ leftIcon: /* @__PURE__ */ w(F, { size: 14 }),
230
242
  onClick: (t) => {
231
- t.stopPropagation(), I(`bots/${e.id}?tab=workflow`);
243
+ t.stopPropagation(), R(`bots/${e.id}?tab=workflow`);
232
244
  },
233
- children: F("botlit.botsList.actions.design", "Design")
245
+ children: L("botlit.botsList.actions.design", "Design")
234
246
  })]
235
247
  })
236
248
  ]
237
249
  })
238
250
  }, e.id))
239
- }) : /* @__PURE__ */ S("div", {
251
+ }) : /* @__PURE__ */ w("div", {
240
252
  className: "space-y-2",
241
- children: Y.map((e) => /* @__PURE__ */ S(l, {
253
+ children: Z.map((e) => /* @__PURE__ */ w(f, {
242
254
  className: "hover:shadow-md transition-shadow cursor-pointer",
243
- onClick: () => I(`bots/${e.id}`),
244
- children: /* @__PURE__ */ S(u, {
255
+ onClick: () => R(`bots/${e.id}`),
256
+ children: /* @__PURE__ */ w(p, {
245
257
  className: "py-4",
246
- children: /* @__PURE__ */ C("div", {
258
+ children: /* @__PURE__ */ T("div", {
247
259
  className: "flex items-center justify-between",
248
- children: [/* @__PURE__ */ C("div", {
260
+ children: [/* @__PURE__ */ T("div", {
249
261
  className: "flex items-center gap-4",
250
- children: [/* @__PURE__ */ S("span", {
262
+ children: [/* @__PURE__ */ w("span", {
251
263
  className: "text-3xl",
252
264
  children: e.icon || "🤖"
253
- }), /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ C("div", {
265
+ }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("div", {
254
266
  className: "flex items-center gap-2",
255
- children: [/* @__PURE__ */ S("h3", {
267
+ children: [/* @__PURE__ */ w("h3", {
256
268
  className: "font-semibold text-text-primary",
257
269
  children: e.name
258
- }), /* @__PURE__ */ S(f, { status: e.status })]
259
- }), /* @__PURE__ */ S("p", {
270
+ }), /* @__PURE__ */ w(m, { status: e.status })]
271
+ }), /* @__PURE__ */ w("p", {
260
272
  className: "text-sm text-text-secondary line-clamp-1",
261
273
  children: e.description
262
274
  })] })]
263
- }), /* @__PURE__ */ C("div", {
275
+ }), /* @__PURE__ */ T("div", {
264
276
  className: "flex items-center gap-6 text-sm text-text-secondary",
265
277
  children: [
266
- /* @__PURE__ */ C("span", { children: [
278
+ /* @__PURE__ */ T("span", { children: [
267
279
  o(e.executionCount),
268
280
  " ",
269
- F("botlit.common.executions", "executions")
281
+ L("botlit.common.executions", "executions")
270
282
  ] }),
271
- /* @__PURE__ */ S(d, {
283
+ /* @__PURE__ */ w(d, {
272
284
  variant: "ghost",
273
285
  size: "sm",
274
- leftIcon: /* @__PURE__ */ S(N, { size: 14 }),
286
+ leftIcon: /* @__PURE__ */ w(F, { size: 14 }),
275
287
  onClick: (t) => {
276
- t.stopPropagation(), I(`bots/${e.id}?tab=workflow`);
288
+ t.stopPropagation(), R(`bots/${e.id}?tab=workflow`);
277
289
  },
278
- children: F("botlit.botsList.actions.design", "Design")
290
+ children: L("botlit.botsList.actions.design", "Design")
279
291
  }),
280
- /* @__PURE__ */ S(d, {
292
+ /* @__PURE__ */ w(d, {
281
293
  variant: "ghost",
282
294
  size: "sm",
283
- children: /* @__PURE__ */ S(w, {
284
- to: L(`bots/${e.id}`),
285
- children: F("botlit.common.view", "View")
295
+ children: /* @__PURE__ */ w(E, {
296
+ to: z(`bots/${e.id}`),
297
+ children: L("botlit.common.view", "View")
286
298
  })
287
299
  })
288
300
  ]
@@ -290,14 +302,17 @@ var F = () => {
290
302
  })
291
303
  })
292
304
  }, e.id))
293
- }) : /* @__PURE__ */ S(_, {
305
+ }) : /* @__PURE__ */ w(y, {
294
306
  illustration: "empty-agents",
295
- title: F("botlit.botsList.empty.title", "No bots yet"),
296
- description: F("botlit.botsList.empty.description", "Create your first AI-powered bot to get started with building agents and automations."),
297
- action: /* @__PURE__ */ S(d, {
298
- leftIcon: /* @__PURE__ */ S(A, { size: 16 }),
299
- onClick: () => I("bots/new"),
300
- children: F("botlit.botsList.actions.createBot", "Create Bot")
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(l, {
310
+ permission: c.APP_CREATE,
311
+ children: /* @__PURE__ */ w(d, {
312
+ leftIcon: /* @__PURE__ */ w(M, { size: 16 }),
313
+ onClick: () => R("bots/new"),
314
+ children: L("botlit.botsList.actions.createBot", "Create Bot")
315
+ })
301
316
  })
302
317
  })
303
318
  ]
@@ -305,6 +320,6 @@ var F = () => {
305
320
  });
306
321
  };
307
322
  //#endregion
308
- export { F as BotsListPage };
323
+ export { L as BotsListPage };
309
324
 
310
325
  //# sourceMappingURL=BotsListPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotsListPage.js","names":[],"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';\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 <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('bots/new')}>\n {t('botlit.botsList.actions.createBot', 'Create Bot')}\n </Button>\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 <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 <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 <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 </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 <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('bots/new')}>\n {t('botlit.botsList.actions.createBot', 'Create Bot')}\n </Button>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoCA,IAAa,UAAyB;CACpC,IAAM,IAAI,GAAO,EACX,EAAE,eAAY,eAAY,GAAW,EACrC,EAAE,MAAM,GAAM,eAAY,GAAS,EACnC,CAAC,KAAa,GAAc,EAC5B,EAAE,aAAU,gBAAa,cAAW,uBAAoB,GAAgB,EACxE,CAAC,GAAU,KAAe,EAAwB,KAAK,EAEvD,KAAgB,MAA2C;AAC/D,IAAgB,EAAE,QAAQ,EAAE,OAAO,OAAO,CAAC;IAGvC,IAAe,OAAO,MAAsC;EAChE,IAAM,IAAa,GAAG,EAAE,wCAAwC,kCAAkC,CAAC,IAAI,EAAI,KAAK,KAC1G,IAAS,MAAM,EAAc;GACjC,OAAO;GACP,SAAS;GACT,eAAe;GACf,mBAAmB;GACpB,CAAC;AAEF,MADW,MAAW,OAAO,QAAQ,EAAW,GAAG,GAC3C;AACN,KAAa,SAAS;AACtB,OAAI;AAKF,IAJA,MAAM,EAAU,EAAI,GAAG,EACvB,EAAM,QACJ,GAAG,EAAE,wCAAwC,MAAM,CAAC,IAAI,EAAI,KAAK,IAAI,EAAE,wCAAwC,uBAAuB,GACvI,EACG,GAAU,IAAO,EAAa,UAAU;YACrC,GAAc;IACrB,IAAM,IACJ,aAAe,QACX,EAAI,UACJ,EAAE,gCAAgC,uBAAuB;AAE/D,IADA,EAAM,MAAM,EAAQ,EAChB,GAAU,IAAO,EAAa,QAAQ;;;AAG9C,IAAY,KAAK;IAGb,IAAe,GAAM,QAAQ,MAAQ;AACzC,MAAI,EAAU,QAAQ;GACpB,IAAM,IAAS,EAAU,OAAO,aAAa;AAC7C,UACE,EAAI,KAAK,aAAa,CAAC,SAAS,EAAO,KACtC,EAAI,aAAa,aAAa,CAAC,SAAS,EAAO,IAAI;;AAGxD,SAAO;GACP;AAEF,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,yBAAyB,OAAO;EACzC,aAAa,EAAE,+BAA+B,8BAA8B;EAC5E,SACE,kBAAC,GAAD;GAAQ,UAAU,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;GAAE,eAAe,EAAW,WAAW;aACxE,EAAE,qCAAqC,aAAa;GAC9C,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KAAa,MAAM,kBAAC,GAAD,EAAK,MAAM,IAAM,CAAA;eACjC,EACC,2BACA,gTACD;KACW,CAAA;IAGb,KAAQ,EAAK,SAAS,IACrB,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OAAW,WAAU;OAAQ,MAAA;OAAK,WAAU;iBAA5C,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAE,iCAAiC,aAAa;QAC/C,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAK;QACJ,CAAA,CACM;;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAE,kCAAkC,SAAS;QAC5C,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAK,QAAQ,MAA2B,EAAE,WAAW,SAAS,CAAC;QAC9D,CAAA,CACM;;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAE,sCAAsC,mBAAmB;QAC1D,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAa,EAAK,QAAQ,GAAK,MAAQ,KAAO,EAAI,kBAAkB,IAAI,EAAE,CAAC;QAC1E,CAAA,CACM;;MACR;SACJ;IAGJ,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;OACE,aAAa,EAAE,qCAAqC,iBAAiB;OACrE,OAAO,EAAU,UAAU;OAC3B,UAAU;OACV,WAAU;OACV,CAAA,CACE;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,SAAS,MAAa,SAAS,cAAc;OAC7C,MAAK;OACL,eAAe,EAAY,OAAO;iBAElC,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;OACd,CAAA,EACT,kBAAC,GAAD;OACE,SAAS,MAAa,SAAS,cAAc;OAC7C,MAAK;OACL,eAAe,EAAY,OAAO;iBAElC,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;OACX,CAAA,CACL;QACF;;IAGL,IACC,kBAAC,OAAD;KACE,WAAW,EACT,SACA,MAAa,SACT,mDACA,gBACL;eAEA;MAAC;MAAG;MAAG;MAAG;MAAG;MAAG;MAAE,CAAC,KAAK,MACvB,kBAAC,OAAD,EAEE,WAAU,+DACV,EAFK,EAEL,CACF;KACE,CAAA,GACJ,KAAgB,EAAa,SAAS,IACxC,MAAa,SACX,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAa,KAAK,MACjB,kBAAC,GAAD;MAEE,WAAU;MACV,eAAe,EAAW,QAAQ,EAAI,KAAK;gBAE3C,kBAAC,GAAD;OAAa,WAAU;iBAAvB;QACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAY,EAAI,QAAQ;WAAY,CAAA,EACpD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAmC,EAAI;WAAU,CAAA,EAC/D,kBAAC,GAAD,EAAa,QAAQ,EAAI,QAAU,CAAA,CAC/B,EAAA,CAAA,CACF;aACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WACE,SAAQ;WACR,MAAK;WACL,WAAU;WACV,UAAU,MAAM;AAEd,YADA,EAAE,iBAAiB,EACnB,EAAY,MAAa,EAAI,KAAK,OAAO,EAAI,GAAG;;qBAGlD,kBAAC,GAAD,EAAc,MAAM,IAAM,CAAA;WACnB,CAAA,EACR,MAAa,EAAI,MAChB,kBAAC,OAAD;WAAK,WAAU;qBAAf;YACE,kBAAC,UAAD;aACE,WAAU;aACV,UAAU,MAAM;AAGd,cAFA,EAAE,iBAAiB,EACnB,EAAW,QAAQ,EAAI,GAAG,OAAO,EACjC,EAAY,KAAK;;uBALrB,CAQE,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA,EACjB,EAAE,gCAAgC,WAAW,CACvC;;YACT,kBAAC,UAAD;aACE,WAAU;aACV,UAAU,MAAM;AAGd,cAFA,EAAE,iBAAiB,EACnB,EAAW,QAAQ,EAAI,GAAG,eAAe,EACzC,EAAY,KAAK;;uBALrB,CAQE,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA,EACrB,EAAE,+BAA+B,kBAAkB,CAC7C;;YACT,kBAAC,UAAD;aACE,WAAU;aACV,UAAU,MAAM;AAGd,cAFA,EAAE,iBAAiB,EACnB,EAAW,QAAQ,EAAI,GAAG,SAAS,EACnC,EAAY,KAAK;;uBALrB,CAQE,kBAAC,GAAD,EAAK,MAAM,IAAM,CAAA,EAChB,EAAE,mCAAmC,cAAc,CAC7C;;YACT,kBAAC,UAAD;aACE,WAAU;aACV,UAAU,MAAM;AAEd,cADA,EAAE,iBAAiB,EACnB,EAAa,EAAI;;uBAJrB,CAOE,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA,EACnB,EAAE,wBAAwB,SAAS,CAC7B;;YACL;aAEJ;YACF;;QACN,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAI;SACH,CAAA;QACJ,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,QAAD;UAAM,WAAU;oBAAhB;WACE,kBAAC,GAAD,EAAK,MAAM,IAAM,CAAA;WAChB,EAAI,kBAAkB;WAAE;WAAE,EAAE,4BAA4B,aAAa;WACjE;;SACH,CAAA;QACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAAhB;WACG,EAAE,gCAAgC,UAAU;WAAE;WAC9C,EAAmB,EAAI,UAAU;WAC7B;aACP,kBAAC,GAAD;UACE,SAAQ;UACR,MAAK;UACL,UAAU,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;UAChC,UAAU,MAAM;AAEd,WADA,EAAE,iBAAiB,EACnB,EAAW,QAAQ,EAAI,GAAG,eAAe;;oBAG1C,EAAE,kCAAkC,SAAS;UACvC,CAAA,CACL;;QACM;;MACT,EArGA,EAAI,GAqGJ,CACP;KACE,CAAA,GAEN,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAa,KAAK,MACjB,kBAAC,GAAD;MAEE,WAAU;MACV,eAAe,EAAW,QAAQ,EAAI,KAAK;gBAE3C,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAAY,EAAI,QAAQ;UAAY,CAAA,EACpD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAmC,EAAI;WAAU,CAAA,EAC/D,kBAAC,GAAD,EAAa,QAAQ,EAAI,QAAU,CAAA,CAC/B;aACN,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAI;UACH,CAAA,CACA,EAAA,CAAA,CACF;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,QAAD,EAAA,UAAA;WACG,EAAa,EAAI,eAAe;WAAE;WAClC,EAAE,4BAA4B,aAAa;WACvC,EAAA,CAAA;UACP,kBAAC,GAAD;WACE,SAAQ;WACR,MAAK;WACL,UAAU,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;WAChC,UAAU,MAAM;AAEd,YADA,EAAE,iBAAiB,EACnB,EAAW,QAAQ,EAAI,GAAG,eAAe;;qBAG1C,EAAE,kCAAkC,SAAS;WACvC,CAAA;UACT,kBAAC,GAAD;WAAQ,SAAQ;WAAQ,MAAK;qBAC3B,kBAAC,GAAD;YAAM,IAAI,EAAQ,QAAQ,EAAI,KAAK;sBAChC,EAAE,sBAAsB,OAAO;YAC3B,CAAA;WACA,CAAA;UACL;WACF;;OACM,CAAA;MACT,EA1CA,EAAI,GA0CJ,CACP;KACE,CAAA,GAGR,kBAAC,GAAD;KACE,cAAa;KACb,OAAO,EAAE,+BAA+B,cAAc;KACtD,aAAa,EACX,qCACA,wFACD;KACD,QACE,kBAAC,GAAD;MAAQ,UAAU,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;MAAE,eAAe,EAAW,WAAW;gBACxE,EAAE,qCAAqC,aAAa;MAC9C,CAAA;KAEX,CAAA;IAEA;;EACK,CAAA"}
1
+ {"version":3,"file":"BotsListPage.js","names":[],"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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"}