@burdenoff/microfe-botmanor 2026.821.1 → 2026.925.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 (65) hide show
  1. package/dist/botlit/BotlitRoutes.js.map +1 -1
  2. package/dist/botlit/BotmanorRoot.js.map +1 -1
  3. package/dist/botlit/BotmanorRootInner.js +4 -4
  4. package/dist/botlit/BotmanorRootInner.js.map +1 -1
  5. package/dist/botlit/components/ErrorState.js +33 -29
  6. package/dist/botlit/components/ErrorState.js.map +1 -1
  7. package/dist/botlit/components/RouteLoader.js +52 -48
  8. package/dist/botlit/components/RouteLoader.js.map +1 -1
  9. package/dist/botlit/components/VersionHistoryPanel.js +74 -77
  10. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  11. package/dist/botlit/components/WorkspaceRequired.js +31 -30
  12. package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
  13. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  14. package/dist/botlit/hooks/useConversations.js.map +1 -1
  15. package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
  16. package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
  17. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  18. package/dist/botlit/pages/A2ARegistryPage.js +116 -124
  19. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  20. package/dist/botlit/pages/AgentDetailPage.js +169 -172
  21. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  22. package/dist/botlit/pages/AgentsListPage.js +96 -90
  23. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  24. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  25. package/dist/botlit/pages/BotDetailPage.js +228 -231
  26. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  27. package/dist/botlit/pages/BotWorkflowTab.js +84 -87
  28. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  29. package/dist/botlit/pages/BotsListPage.js +144 -147
  30. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  31. package/dist/botlit/pages/BucketsPage.js +3 -3
  32. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  33. package/dist/botlit/pages/ChannelDetailPage.js +1 -1
  34. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  35. package/dist/botlit/pages/ChannelsPage.js +156 -149
  36. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  37. package/dist/botlit/pages/ChatPage.js +126 -129
  38. package/dist/botlit/pages/ChatPage.js.map +1 -1
  39. package/dist/botlit/pages/DashboardPage.js +111 -114
  40. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  41. package/dist/botlit/pages/ExecutionsPage.js +163 -159
  42. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  43. package/dist/botlit/pages/InstalledPackagesPage.js +3 -3
  44. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  45. package/dist/botlit/pages/KnowledgeBasesPage.js +84 -78
  46. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  47. package/dist/botlit/pages/MCPServersPage.js +159 -154
  48. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  49. package/dist/botlit/pages/PoliciesPage.js +119 -114
  50. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  51. package/dist/botlit/pages/RetrievalProfilesPage.js +102 -109
  52. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  53. package/dist/botlit/pages/SettingsPage.js +144 -159
  54. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  55. package/dist/botlit/pages/SkillsPage.js +122 -105
  56. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  57. package/dist/botlit/pages/StorePage.js +176 -175
  58. package/dist/botlit/pages/StorePage.js.map +1 -1
  59. package/dist/botlit/providers/BotlitProvider.js.map +1 -1
  60. package/dist/botlit/store/botlitStore.js +1 -1
  61. package/dist/botlit/store/botlitStore.js.map +1 -1
  62. package/dist/botlit/utils/navigation.js.map +1 -1
  63. package/dist/shared/hooks/useTr.js +14 -0
  64. package/dist/shared/hooks/useTr.js.map +1 -0
  65. package/package.json +33 -9
@@ -1,180 +1,181 @@
1
- import { useBotlit as e } from "../providers/BotlitProvider.js";
2
- import { formatCurrency as t, formatDuration as n, formatNumber as r, formatRelativeTime as i } from "../utils/formatters.js";
3
- import { PageLayout as a } from "../components/PageLayout.js";
4
- import { Card as o, CardContent as s } from "../components/Card.js";
5
- import { Button as c } from "../components/Button.js";
6
- import { Badge as l } from "../components/Badge.js";
7
- import { EmptyState as u } from "../components/EmptyState.js";
8
- import { Input as d } from "../components/Input.js";
9
- import { ErrorState as f } from "../components/ErrorState.js";
10
- import { summariseExecutions as p, useExecutions as m } from "../hooks/useExecutions.js";
1
+ import { useTr as e } from "../../shared/hooks/useTr.js";
2
+ import { useBotlit as t } from "../providers/BotlitProvider.js";
3
+ import { formatCurrency as n, formatDuration as r, formatNumber as i, formatRelativeTime as a } from "../utils/formatters.js";
4
+ import { PageLayout as o } from "../components/PageLayout.js";
5
+ import { Card as s, CardContent as c } from "../components/Card.js";
6
+ import { Button as l } from "../components/Button.js";
7
+ import { Badge as u } from "../components/Badge.js";
8
+ import { EmptyState as d } from "../components/EmptyState.js";
9
+ import { Input as f } from "../components/Input.js";
10
+ import { ErrorState as p } from "../components/ErrorState.js";
11
+ import { summariseExecutions as m, useExecutions as h } from "../hooks/useExecutions.js";
11
12
  import "../hooks/index.js";
12
- import { ExecutionStatus as h } from "../../generated/wspace-types.js";
13
- import { useMemo as g, useState as _ } from "react";
14
- import { PagePurpose as v } from "@burdenoff/fe-libs/ui";
15
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
16
- import { Link as x } from "react-router";
17
- import { Activity as S, CheckCircle as C, Clock as w, DollarSign as T, Hourglass as E, RefreshCw as D, Search as O, TrendingUp as k, XCircle as A, Zap as j } from "lucide-react";
13
+ import { ExecutionStatus as g } from "../../generated/wspace-types.js";
14
+ import { useMemo as _, useState as v } from "react";
15
+ import { PagePurpose as y } from "@burdenoff/fe-libs/ui";
16
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
17
+ import { Link as S } from "react-router";
18
+ import { Activity as C, CheckCircle as w, Clock as T, DollarSign as E, Hourglass as D, RefreshCw as O, Search as k, TrendingUp as A, XCircle as j, Zap as M } from "lucide-react";
18
19
  //#region src/botlit/pages/ExecutionsPage.tsx
19
- var M = [
20
- h.Completed,
21
- h.Running,
22
- h.Pending,
23
- h.Failed,
24
- h.Timeout,
25
- h.Cancelled
26
- ], N = {
27
- [h.Completed]: "Completed",
28
- [h.Running]: "Running",
29
- [h.Pending]: "Pending",
30
- [h.Failed]: "Failed",
31
- [h.Timeout]: "Timed out",
32
- [h.Cancelled]: "Cancelled"
33
- }, P = ({ status: e, className: t }) => {
20
+ var N = [
21
+ g.Completed,
22
+ g.Running,
23
+ g.Pending,
24
+ g.Failed,
25
+ g.Timeout,
26
+ g.Cancelled
27
+ ];
28
+ function P(e) {
29
+ return {
30
+ [g.Completed]: e("botlit.executions.status.completed", "Completed"),
31
+ [g.Running]: e("botlit.executions.status.running", "Running"),
32
+ [g.Pending]: e("botlit.executions.status.pending", "Pending"),
33
+ [g.Failed]: e("botlit.executions.status.failed", "Failed"),
34
+ [g.Timeout]: e("botlit.executions.status.timedOut", "Timed out"),
35
+ [g.Cancelled]: e("botlit.executions.status.cancelled", "Cancelled")
36
+ };
37
+ }
38
+ var F = ({ status: e, className: t }) => {
34
39
  switch (e) {
35
- case h.Completed: return /* @__PURE__ */ y(C, { className: t ?? "h-4 w-4 text-status-success-text" });
36
- case h.Failed:
37
- case h.Timeout: return /* @__PURE__ */ y(A, { className: t ?? "h-4 w-4 text-status-error-text" });
38
- case h.Running: return /* @__PURE__ */ y(D, { className: t ?? "h-4 w-4 text-status-info-text motion-safe:animate-spin" });
39
- case h.Pending: return /* @__PURE__ */ y(E, { className: t ?? "h-4 w-4 text-status-warning-text" });
40
- default: return /* @__PURE__ */ y(S, { className: t ?? "h-4 w-4 text-text-secondary" });
40
+ case g.Completed: return /* @__PURE__ */ b(w, { className: t ?? "h-4 w-4 text-status-success-text" });
41
+ case g.Failed:
42
+ case g.Timeout: return /* @__PURE__ */ b(j, { className: t ?? "h-4 w-4 text-status-error-text" });
43
+ case g.Running: return /* @__PURE__ */ b(O, { className: t ?? "h-4 w-4 text-status-info-text motion-safe:animate-spin" });
44
+ case g.Pending: return /* @__PURE__ */ b(D, { className: t ?? "h-4 w-4 text-status-warning-text" });
45
+ default: return /* @__PURE__ */ b(C, { className: t ?? "h-4 w-4 text-text-secondary" });
41
46
  }
42
- }, F = ({ status: e }) => /* @__PURE__ */ b(l, {
47
+ }, I = ({ status: e, labels: t }) => /* @__PURE__ */ x(u, {
43
48
  variant: {
44
- [h.Completed]: "success",
45
- [h.Failed]: "destructive",
46
- [h.Timeout]: "destructive",
47
- [h.Running]: "default",
48
- [h.Pending]: "warning",
49
- [h.Cancelled]: "secondary"
49
+ [g.Completed]: "success",
50
+ [g.Failed]: "destructive",
51
+ [g.Timeout]: "destructive",
52
+ [g.Running]: "default",
53
+ [g.Pending]: "warning",
54
+ [g.Cancelled]: "secondary"
50
55
  }[e] ?? "secondary",
51
56
  className: "flex items-center gap-1",
52
- children: [/* @__PURE__ */ y(P, { status: e }), N[e] ?? e]
53
- }), I = () => {
54
- let { getPath: l } = e(), [h, C] = _(""), [E, A] = _([]), { data: I, loading: L, error: R, refetch: z } = m(g(() => ({
55
- search: h,
56
- status: E
57
- }), [h, E])), B = g(() => p(I), [I]);
58
- return /* @__PURE__ */ y(a, {
59
- title: "Executions",
60
- description: "Monitor agent execution history, performance, and costs",
61
- actions: /* @__PURE__ */ y(c, {
57
+ children: [/* @__PURE__ */ b(F, { status: e }), t[e] ?? e]
58
+ }), L = () => {
59
+ let u = e(), { getPath: g } = t(), [w, D] = v(""), [j, L] = v([]), R = P(u), { data: z, loading: B, error: V, refetch: H } = h(_(() => ({
60
+ search: w,
61
+ status: j
62
+ }), [w, j])), U = _(() => m(z), [z]);
63
+ return /* @__PURE__ */ b(o, {
64
+ title: u("botlit.executions.title", "Executions"),
65
+ description: u("botlit.executions.description", "Monitor agent execution history, performance, and costs"),
66
+ actions: /* @__PURE__ */ b(l, {
62
67
  variant: "outline",
63
- leftIcon: /* @__PURE__ */ y(D, { size: 16 }),
64
- onClick: () => void z(),
65
- children: "Refresh"
68
+ leftIcon: /* @__PURE__ */ b(O, { size: 16 }),
69
+ onClick: () => void H(),
70
+ children: u("botlit.executions.actions.refresh", "Refresh")
66
71
  }),
67
- children: /* @__PURE__ */ b("div", {
72
+ children: /* @__PURE__ */ x("div", {
68
73
  className: "space-y-6",
69
74
  children: [
70
- /* @__PURE__ */ y(v, {
71
- icon: /* @__PURE__ */ y(S, { size: 18 }),
72
- children: "An execution is a single run of an agent — one request in, one response out. This page is your observability and cost dashboard: see which runs succeeded or failed, how long they took, how many tokens they burned and what they cost. Use it to spot failing agents, runaway spend and latency regressions, then open any run to inspect its full trace."
75
+ /* @__PURE__ */ b(y, {
76
+ icon: /* @__PURE__ */ b(C, { size: 18 }),
77
+ children: u("botlit.executions.purpose", "An execution is a single run of an agent — one request in, one response out. This page is your observability and cost dashboard: see which runs succeeded or failed, how long they took, how many tokens they burned and what they cost. Use it to spot failing agents, runaway spend and latency regressions, then open any run to inspect its full trace.")
73
78
  }),
74
- B.total > 0 && /* @__PURE__ */ b("div", {
79
+ U.total > 0 && /* @__PURE__ */ x("div", {
75
80
  className: "space-y-2",
76
- children: [/* @__PURE__ */ b("div", {
81
+ children: [/* @__PURE__ */ x("div", {
77
82
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
78
83
  children: [
79
- /* @__PURE__ */ y(o, {
84
+ /* @__PURE__ */ b(s, {
80
85
  treatment: "glass",
81
86
  glow: !0,
82
- children: /* @__PURE__ */ y(s, {
87
+ children: /* @__PURE__ */ b(c, {
83
88
  className: "pt-6",
84
- children: /* @__PURE__ */ b("div", {
89
+ children: /* @__PURE__ */ x("div", {
85
90
  className: "flex items-center justify-between",
86
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
91
+ children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
87
92
  className: "text-sm text-text-secondary",
88
- children: "Executions"
89
- }), /* @__PURE__ */ y("p", {
93
+ children: u("botlit.executions.rollup.executions", "Executions")
94
+ }), /* @__PURE__ */ b("p", {
90
95
  className: "text-2xl font-bold tabular-nums",
91
- children: r(B.total)
92
- })] }), /* @__PURE__ */ y(S, { className: "h-8 w-8 text-text-secondary" })]
96
+ children: i(U.total)
97
+ })] }), /* @__PURE__ */ b(C, { className: "h-8 w-8 text-text-secondary" })]
93
98
  })
94
99
  })
95
100
  }),
96
- /* @__PURE__ */ y(o, {
101
+ /* @__PURE__ */ b(s, {
97
102
  treatment: "metric",
98
- children: /* @__PURE__ */ y(s, {
103
+ children: /* @__PURE__ */ b(c, {
99
104
  className: "pt-6",
100
- children: /* @__PURE__ */ b("div", {
105
+ children: /* @__PURE__ */ x("div", {
101
106
  className: "flex items-center justify-between",
102
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
107
+ children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
103
108
  className: "text-sm text-text-secondary",
104
- children: "Success Rate"
105
- }), /* @__PURE__ */ b("p", {
109
+ children: u("botlit.executions.rollup.successRate", "Success Rate")
110
+ }), /* @__PURE__ */ x("p", {
106
111
  className: "text-2xl font-bold tabular-nums text-status-success-text",
107
- children: [(B.successRate * 100).toFixed(1), "%"]
108
- })] }), /* @__PURE__ */ y(k, { className: "h-8 w-8 text-status-success-text" })]
112
+ children: [(U.successRate * 100).toFixed(1), "%"]
113
+ })] }), /* @__PURE__ */ b(A, { className: "h-8 w-8 text-status-success-text" })]
109
114
  })
110
115
  })
111
116
  }),
112
- /* @__PURE__ */ y(o, {
117
+ /* @__PURE__ */ b(s, {
113
118
  treatment: "metric",
114
- children: /* @__PURE__ */ y(s, {
119
+ children: /* @__PURE__ */ b(c, {
115
120
  className: "pt-6",
116
- children: /* @__PURE__ */ b("div", {
121
+ children: /* @__PURE__ */ x("div", {
117
122
  className: "flex items-center justify-between",
118
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
123
+ children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
119
124
  className: "text-sm text-text-secondary",
120
- children: "Avg Duration"
121
- }), /* @__PURE__ */ y("p", {
125
+ children: u("botlit.executions.rollup.avgDuration", "Avg Duration")
126
+ }), /* @__PURE__ */ b("p", {
122
127
  className: "text-2xl font-bold tabular-nums",
123
- children: n(B.avgDurationMs)
124
- })] }), /* @__PURE__ */ y(w, { className: "h-8 w-8 text-text-secondary" })]
128
+ children: r(U.avgDurationMs)
129
+ })] }), /* @__PURE__ */ b(T, { className: "h-8 w-8 text-text-secondary" })]
125
130
  })
126
131
  })
127
132
  }),
128
- /* @__PURE__ */ y(o, {
133
+ /* @__PURE__ */ b(s, {
129
134
  treatment: "metric",
130
- children: /* @__PURE__ */ y(s, {
135
+ children: /* @__PURE__ */ b(c, {
131
136
  className: "pt-6",
132
- children: /* @__PURE__ */ b("div", {
137
+ children: /* @__PURE__ */ x("div", {
133
138
  className: "flex items-center justify-between",
134
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
139
+ children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
135
140
  className: "text-sm text-text-secondary",
136
- children: "Total Cost"
137
- }), /* @__PURE__ */ y("p", {
141
+ children: u("botlit.executions.rollup.totalCost", "Total Cost")
142
+ }), /* @__PURE__ */ b("p", {
138
143
  className: "text-2xl font-bold tabular-nums",
139
- children: t(B.totalCost)
140
- })] }), /* @__PURE__ */ y(T, { className: "h-8 w-8 text-text-secondary" })]
144
+ children: n(U.totalCost)
145
+ })] }), /* @__PURE__ */ b(E, { className: "h-8 w-8 text-text-secondary" })]
141
146
  })
142
147
  })
143
148
  })
144
149
  ]
145
150
  }), /* @__PURE__ */ b("p", {
146
151
  className: "text-xs text-text-secondary",
147
- children: [
148
- "Calculated across the ",
149
- r(B.total),
150
- " runs shown below."
151
- ]
152
+ children: u("botlit.executions.rollup.calculatedAcross", "Calculated across the {{count}} runs shown below.", { count: U.total })
152
153
  })]
153
154
  }),
154
- /* @__PURE__ */ b("div", {
155
+ /* @__PURE__ */ x("div", {
155
156
  className: "flex flex-wrap items-center gap-4",
156
- children: [/* @__PURE__ */ b("div", {
157
+ children: [/* @__PURE__ */ x("div", {
157
158
  className: "relative flex-1 max-w-md",
158
- children: [/* @__PURE__ */ y(O, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ y(d, {
159
- placeholder: "Search by run, agent, bot or input…",
160
- value: h,
161
- onChange: (e) => C(e.target.value),
159
+ children: [/* @__PURE__ */ b(k, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ b(f, {
160
+ placeholder: u("botlit.executions.filters.searchPlaceholder", "Search by run, agent, bot or input…"),
161
+ value: w,
162
+ onChange: (e) => D(e.target.value),
162
163
  className: "pl-9"
163
164
  })]
164
- }), /* @__PURE__ */ y("div", {
165
+ }), /* @__PURE__ */ b("div", {
165
166
  className: "flex flex-wrap gap-2",
166
- children: M.map((e) => /* @__PURE__ */ b(c, {
167
- variant: E.includes(e) ? "default" : "outline",
167
+ children: N.map((e) => /* @__PURE__ */ x(l, {
168
+ variant: j.includes(e) ? "default" : "outline",
168
169
  size: "sm",
169
- onClick: () => A((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]),
170
- children: [/* @__PURE__ */ y(P, { status: e }), /* @__PURE__ */ y("span", {
170
+ onClick: () => L((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]),
171
+ children: [/* @__PURE__ */ b(F, { status: e }), /* @__PURE__ */ b("span", {
171
172
  className: "ml-1",
172
- children: N[e]
173
+ children: R[e]
173
174
  })]
174
175
  }, e))
175
176
  })]
176
177
  }),
177
- L ? /* @__PURE__ */ y("div", {
178
+ B ? /* @__PURE__ */ b("div", {
178
179
  className: "space-y-4",
179
180
  children: [
180
181
  1,
@@ -182,113 +183,116 @@ var M = [
182
183
  3,
183
184
  4,
184
185
  5
185
- ].map((e) => /* @__PURE__ */ y("div", { className: "h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
186
- }) : R ? /* @__PURE__ */ y(f, {
186
+ ].map((e) => /* @__PURE__ */ b("div", { className: "h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
187
+ }) : V ? /* @__PURE__ */ b(p, {
187
188
  resource: "executions",
188
- error: R,
189
- onRetry: () => void z()
190
- }) : I.length > 0 ? /* @__PURE__ */ b("div", {
189
+ error: V,
190
+ onRetry: () => void H()
191
+ }) : z.length > 0 ? /* @__PURE__ */ x("div", {
191
192
  className: "space-y-2",
192
- children: [/* @__PURE__ */ b("div", {
193
+ children: [/* @__PURE__ */ x("div", {
193
194
  className: "grid grid-cols-12 gap-4 px-4 py-2 text-sm font-medium text-text-secondary border-b border-border-subtle",
194
195
  children: [
195
- /* @__PURE__ */ y("div", {
196
+ /* @__PURE__ */ b("div", {
196
197
  className: "col-span-2",
197
- children: "Status"
198
+ children: u("botlit.executions.table.status", "Status")
198
199
  }),
199
- /* @__PURE__ */ y("div", {
200
+ /* @__PURE__ */ b("div", {
200
201
  className: "col-span-3",
201
- children: "Bot / Agent"
202
+ children: u("botlit.executions.table.botAgent", "Bot / Agent")
202
203
  }),
203
- /* @__PURE__ */ y("div", {
204
+ /* @__PURE__ */ b("div", {
204
205
  className: "col-span-2",
205
- children: "Duration"
206
+ children: u("botlit.executions.table.duration", "Duration")
206
207
  }),
207
- /* @__PURE__ */ y("div", {
208
+ /* @__PURE__ */ b("div", {
208
209
  className: "col-span-2",
209
- children: "Tokens"
210
+ children: u("botlit.executions.table.tokens", "Tokens")
210
211
  }),
211
- /* @__PURE__ */ y("div", {
212
+ /* @__PURE__ */ b("div", {
212
213
  className: "col-span-1",
213
- children: "Cost"
214
+ children: u("botlit.executions.table.cost", "Cost")
214
215
  }),
215
- /* @__PURE__ */ y("div", {
216
+ /* @__PURE__ */ b("div", {
216
217
  className: "col-span-2",
217
- children: "Started"
218
+ children: u("botlit.executions.table.started", "Started")
218
219
  })
219
220
  ]
220
- }), I.map((e) => /* @__PURE__ */ y(x, {
221
- to: l(`executions/${e.id}`),
222
- children: /* @__PURE__ */ y(o, {
221
+ }), z.map((e) => /* @__PURE__ */ b(S, {
222
+ to: g(`executions/${e.id}`),
223
+ children: /* @__PURE__ */ b(s, {
223
224
  className: "hover:border-primary/50 transition-colors cursor-pointer",
224
- children: /* @__PURE__ */ y(s, {
225
+ children: /* @__PURE__ */ b(c, {
225
226
  className: "py-3",
226
- children: /* @__PURE__ */ b("div", {
227
+ children: /* @__PURE__ */ x("div", {
227
228
  className: "grid grid-cols-12 gap-4 items-center",
228
229
  children: [
229
- /* @__PURE__ */ y("div", {
230
+ /* @__PURE__ */ b("div", {
230
231
  className: "col-span-2",
231
- children: /* @__PURE__ */ y(F, { status: e.status })
232
+ children: /* @__PURE__ */ b(I, {
233
+ status: e.status,
234
+ labels: R
235
+ })
232
236
  }),
233
- /* @__PURE__ */ b("div", {
237
+ /* @__PURE__ */ x("div", {
234
238
  className: "col-span-3",
235
- children: [/* @__PURE__ */ y("p", {
239
+ children: [/* @__PURE__ */ b("p", {
236
240
  className: "font-medium truncate",
237
241
  children: e.appId ?? "—"
238
- }), /* @__PURE__ */ y("p", {
242
+ }), /* @__PURE__ */ b("p", {
239
243
  className: "text-sm text-text-secondary truncate",
240
244
  children: e.agentId ?? "—"
241
245
  })]
242
246
  }),
243
- /* @__PURE__ */ y("div", {
247
+ /* @__PURE__ */ b("div", {
244
248
  className: "col-span-2",
245
- children: /* @__PURE__ */ b("div", {
249
+ children: /* @__PURE__ */ x("div", {
246
250
  className: "flex items-center gap-1",
247
- children: [/* @__PURE__ */ y(w, {
251
+ children: [/* @__PURE__ */ b(T, {
248
252
  size: 14,
249
253
  className: "text-text-secondary"
250
- }), /* @__PURE__ */ y("span", { children: n(e.duration) })]
254
+ }), /* @__PURE__ */ b("span", { children: r(e.duration) })]
251
255
  })
252
256
  }),
253
- /* @__PURE__ */ y("div", {
257
+ /* @__PURE__ */ b("div", {
254
258
  className: "col-span-2",
255
- children: /* @__PURE__ */ b("div", {
259
+ children: /* @__PURE__ */ x("div", {
256
260
  className: "flex items-center gap-1",
257
- children: [/* @__PURE__ */ y(j, {
261
+ children: [/* @__PURE__ */ b(M, {
258
262
  size: 14,
259
263
  className: "text-text-secondary"
260
- }), /* @__PURE__ */ y("span", { children: r(e.tokensUsed) })]
264
+ }), /* @__PURE__ */ b("span", { children: i(e.tokensUsed) })]
261
265
  })
262
266
  }),
263
- /* @__PURE__ */ y("div", {
267
+ /* @__PURE__ */ b("div", {
264
268
  className: "col-span-1",
265
- children: /* @__PURE__ */ b("div", {
269
+ children: /* @__PURE__ */ x("div", {
266
270
  className: "flex items-center gap-1",
267
- children: [/* @__PURE__ */ y(T, {
271
+ children: [/* @__PURE__ */ b(E, {
268
272
  size: 14,
269
273
  className: "text-text-secondary"
270
- }), /* @__PURE__ */ y("span", { children: t(e.cost) })]
274
+ }), /* @__PURE__ */ b("span", { children: n(e.cost) })]
271
275
  })
272
276
  }),
273
- /* @__PURE__ */ y("div", {
277
+ /* @__PURE__ */ b("div", {
274
278
  className: "col-span-2 text-sm text-text-secondary",
275
- children: i(e.createdAt)
279
+ children: a(e.createdAt)
276
280
  })
277
281
  ]
278
282
  })
279
283
  })
280
284
  })
281
285
  }, e.id))]
282
- }) : /* @__PURE__ */ y(u, {
286
+ }) : /* @__PURE__ */ b(d, {
283
287
  illustration: "empty-search",
284
- title: "No executions found",
285
- description: E.length > 0 || h ? "No executions match your filters. Try adjusting your search." : "Executions will appear here when agents process requests."
288
+ title: u("botlit.executions.empty.title", "No executions found"),
289
+ description: j.length > 0 || w ? u("botlit.executions.empty.descriptionFiltered", "No executions match your filters. Try adjusting your search.") : u("botlit.executions.empty.descriptionNoData", "Executions will appear here when agents process requests.")
286
290
  })
287
291
  ]
288
292
  })
289
293
  });
290
294
  };
291
295
  //#endregion
292
- export { I as ExecutionsPage };
296
+ export { L as ExecutionsPage };
293
297
 
294
298
  //# sourceMappingURL=ExecutionsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExecutionsPage.js","names":[],"sources":["../../../src/botlit/pages/ExecutionsPage.tsx"],"sourcesContent":["/**\n * Executions Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Search as SearchIcon,\n Activity,\n CheckCircle,\n XCircle,\n Clock,\n DollarSign,\n Zap,\n RefreshCw,\n TrendingUp,\n Hourglass,\n} from 'lucide-react';\nimport { PagePurpose } 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 { Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport { useExecutions, summariseExecutions, type ExecutionRecord } from '../hooks';\nimport {\n formatNumber,\n formatRelativeTime,\n formatCurrency,\n formatDuration,\n MISSING_VALUE,\n} from '../utils/formatters';\nimport { ExecutionStatus as GqlExecutionStatus } from '../../generated/wspace-types';\n\n/**\n * The statuses wspace-botlit-svc actually reports. These MUST match the\n * `ExecutionStatus` enum in the supergraph — sending anything else fails\n * GraphQL validation at the gateway.\n */\nconst EXECUTION_STATUSES: GqlExecutionStatus[] = [\n GqlExecutionStatus.Completed,\n GqlExecutionStatus.Running,\n GqlExecutionStatus.Pending,\n GqlExecutionStatus.Failed,\n GqlExecutionStatus.Timeout,\n GqlExecutionStatus.Cancelled,\n];\n\nconst STATUS_LABELS: Record<GqlExecutionStatus, string> = {\n [GqlExecutionStatus.Completed]: 'Completed',\n [GqlExecutionStatus.Running]: 'Running',\n [GqlExecutionStatus.Pending]: 'Pending',\n [GqlExecutionStatus.Failed]: 'Failed',\n [GqlExecutionStatus.Timeout]: 'Timed out',\n [GqlExecutionStatus.Cancelled]: 'Cancelled',\n};\n\nconst StatusIcon: FC<{ status: string; className?: string }> = ({ status, className }) => {\n switch (status) {\n case GqlExecutionStatus.Completed:\n return <CheckCircle className={className ?? 'h-4 w-4 text-status-success-text'} />;\n case GqlExecutionStatus.Failed:\n case GqlExecutionStatus.Timeout:\n return <XCircle className={className ?? 'h-4 w-4 text-status-error-text'} />;\n case GqlExecutionStatus.Running:\n return (\n <RefreshCw\n className={className ?? 'h-4 w-4 text-status-info-text motion-safe:animate-spin'}\n />\n );\n case GqlExecutionStatus.Pending:\n return <Hourglass className={className ?? 'h-4 w-4 text-status-warning-text'} />;\n default:\n return <Activity className={className ?? 'h-4 w-4 text-text-secondary'} />;\n }\n};\n\nconst StatusBadge: FC<{ status: string }> = ({ status }) => {\n const variants: Record<string, 'success' | 'destructive' | 'warning' | 'secondary' | 'default'> =\n {\n [GqlExecutionStatus.Completed]: 'success',\n [GqlExecutionStatus.Failed]: 'destructive',\n [GqlExecutionStatus.Timeout]: 'destructive',\n [GqlExecutionStatus.Running]: 'default',\n [GqlExecutionStatus.Pending]: 'warning',\n [GqlExecutionStatus.Cancelled]: 'secondary',\n };\n\n return (\n <Badge variant={variants[status] ?? 'secondary'} className=\"flex items-center gap-1\">\n <StatusIcon status={status} />\n {STATUS_LABELS[status as GqlExecutionStatus] ?? status}\n </Badge>\n );\n};\n\nexport const ExecutionsPage: FC = () => {\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState<GqlExecutionStatus[]>([]);\n\n const filter = useMemo(\n () => ({ search, status: statusFilter as string[] }),\n [search, statusFilter]\n );\n const { data: executions, loading, error, refetch } = useExecutions(filter);\n\n // No server-side aggregate exists for executions — these numbers describe the\n // runs currently loaded, and the caption below says so.\n const rollup = useMemo(() => summariseExecutions(executions), [executions]);\n\n return (\n <PageLayout\n title=\"Executions\"\n description=\"Monitor agent execution history, performance, and costs\"\n actions={\n <Button variant=\"outline\" leftIcon={<RefreshCw size={16} />} onClick={() => void refetch()}>\n Refresh\n </Button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Activity size={18} />}>\n An execution is a single run of an agent — one request in, one response out. This page is\n your observability and cost dashboard: see which runs succeeded or failed, how long they\n took, how many tokens they burned and what they cost. Use it to spot failing agents,\n runaway spend and latency regressions, then open any run to inspect its full trace.\n </PagePurpose>\n\n {/* Stats over the loaded runs */}\n {rollup.total > 0 && (\n <div className=\"space-y-2\">\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">Executions</p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatNumber(rollup.total)}\n </p>\n </div>\n <Activity className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">Success Rate</p>\n <p className=\"text-2xl font-bold tabular-nums text-status-success-text\">\n {(rollup.successRate * 100).toFixed(1)}%\n </p>\n </div>\n <TrendingUp className=\"h-8 w-8 text-status-success-text\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">Avg Duration</p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatDuration(rollup.avgDurationMs)}\n </p>\n </div>\n <Clock className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">Total Cost</p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatCurrency(rollup.totalCost)}\n </p>\n </div>\n <DollarSign className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n </div>\n <p className=\"text-xs text-text-secondary\">\n Calculated across the {formatNumber(rollup.total)} runs shown below.\n </p>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search by run, agent, bot or input…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {EXECUTION_STATUSES.map((status) => (\n <Button\n key={status}\n variant={statusFilter.includes(status) ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() =>\n setStatusFilter((prev) =>\n prev.includes(status) ? prev.filter((s) => s !== status) : [...prev, status]\n )\n }\n >\n <StatusIcon status={status} />\n <span className=\"ml-1\">{STATUS_LABELS[status]}</span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Executions List */}\n {loading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className=\"h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"executions\" error={error} onRetry={() => void refetch()} />\n ) : executions.length > 0 ? (\n <div className=\"space-y-2\">\n {/* Table Header */}\n <div className=\"grid grid-cols-12 gap-4 px-4 py-2 text-sm font-medium text-text-secondary border-b border-border-subtle\">\n <div className=\"col-span-2\">Status</div>\n <div className=\"col-span-3\">Bot / Agent</div>\n <div className=\"col-span-2\">Duration</div>\n <div className=\"col-span-2\">Tokens</div>\n <div className=\"col-span-1\">Cost</div>\n <div className=\"col-span-2\">Started</div>\n </div>\n\n {/* Table Rows */}\n {executions.map((execution: ExecutionRecord) => (\n <Link key={execution.id} to={getPath(`executions/${execution.id}`)}>\n <Card className=\"hover:border-primary/50 transition-colors cursor-pointer\">\n <CardContent className=\"py-3\">\n <div className=\"grid grid-cols-12 gap-4 items-center\">\n <div className=\"col-span-2\">\n <StatusBadge status={execution.status} />\n </div>\n <div className=\"col-span-3\">\n <p className=\"font-medium truncate\">{execution.appId ?? MISSING_VALUE}</p>\n <p className=\"text-sm text-text-secondary truncate\">\n {execution.agentId ?? MISSING_VALUE}\n </p>\n </div>\n <div className=\"col-span-2\">\n <div className=\"flex items-center gap-1\">\n <Clock size={14} className=\"text-text-secondary\" />\n <span>{formatDuration(execution.duration)}</span>\n </div>\n </div>\n <div className=\"col-span-2\">\n <div className=\"flex items-center gap-1\">\n <Zap size={14} className=\"text-text-secondary\" />\n <span>{formatNumber(execution.tokensUsed)}</span>\n </div>\n </div>\n <div className=\"col-span-1\">\n <div className=\"flex items-center gap-1\">\n <DollarSign size={14} className=\"text-text-secondary\" />\n <span>{formatCurrency(execution.cost)}</span>\n </div>\n </div>\n <div className=\"col-span-2 text-sm text-text-secondary\">\n {formatRelativeTime(execution.createdAt)}\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No executions found\"\n description={\n statusFilter.length > 0 || search\n ? 'No executions match your filters. Try adjusting your search.'\n : 'Executions will appear here when agents process requests.'\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AA4CA,IAAM,IAA2C;CAC/C,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACpB,EAEK,IAAoD;EACvD,EAAmB,YAAY;EAC/B,EAAmB,UAAU;EAC7B,EAAmB,UAAU;EAC7B,EAAmB,SAAS;EAC5B,EAAmB,UAAU;EAC7B,EAAmB,YAAY;CACjC,EAEK,KAA0D,EAAE,WAAQ,mBAAgB;AACxF,SAAQ,GAAR;EACE,KAAK,EAAmB,UACtB,QAAO,kBAAC,GAAD,EAAa,WAAW,KAAa,oCAAsC,CAAA;EACpF,KAAK,EAAmB;EACxB,KAAK,EAAmB,QACtB,QAAO,kBAAC,GAAD,EAAS,WAAW,KAAa,kCAAoC,CAAA;EAC9E,KAAK,EAAmB,QACtB,QACE,kBAAC,GAAD,EACE,WAAW,KAAa,0DACxB,CAAA;EAEN,KAAK,EAAmB,QACtB,QAAO,kBAAC,GAAD,EAAW,WAAW,KAAa,oCAAsC,CAAA;EAClF,QACE,QAAO,kBAAC,GAAD,EAAU,WAAW,KAAa,+BAAiC,CAAA;;GAI1E,KAAuC,EAAE,gBAY3C,kBAAC,GAAD;CAAO,SAVP;GACG,EAAmB,YAAY;GAC/B,EAAmB,SAAS;GAC5B,EAAmB,UAAU;GAC7B,EAAmB,UAAU;GAC7B,EAAmB,UAAU;GAC7B,EAAmB,YAAY;EACjC,CAGwB,MAAW;CAAa,WAAU;WAA3D,CACE,kBAAC,GAAD,EAAoB,WAAU,CAAA,EAC7B,EAAc,MAAiC,EAC1C;IAIC,UAA2B;CACtC,IAAM,EAAE,eAAY,GAAW,EACzB,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,CAAC,GAAc,KAAmB,EAA+B,EAAE,CAAC,EAMpE,EAAE,MAAM,GAAY,YAAS,UAAO,eAAY,EAJvC,SACN;EAAE;EAAQ,QAAQ;EAA0B,GACnD,CAAC,GAAQ,EAAa,CACvB,CAC0E,EAIrE,IAAS,QAAc,EAAoB,EAAW,EAAE,CAAC,EAAW,CAAC;AAE3E,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,GAAD;GAAQ,SAAQ;GAAU,UAAU,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;GAAE,eAAe,KAAK,GAAS;aAAE;GAEnF,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KAAa,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;eAAE;KAK7B,CAAA;IAGb,EAAO,QAAQ,KACd,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAM,WAAU;QAAQ,MAAA;kBACtB,kBAAC,GAAD;SAAa,WAAU;mBACrB,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAc,CAAA,EACzD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAa,EAAO,MAAM;WACzB,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,CAChD;;SACM,CAAA;QACT,CAAA;OACP,kBAAC,GAAD;QAAM,WAAU;kBACd,kBAAC,GAAD;SAAa,WAAU;mBACrB,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAgB,CAAA,EAC3D,kBAAC,KAAD;WAAG,WAAU;qBAAb,EACI,EAAO,cAAc,KAAK,QAAQ,EAAE,EAAC,IACrC;aACA,EAAA,CAAA,EACN,kBAAC,GAAD,EAAY,WAAU,oCAAqC,CAAA,CACvD;;SACM,CAAA;QACT,CAAA;OACP,kBAAC,GAAD;QAAM,WAAU;kBACd,kBAAC,GAAD;SAAa,WAAU;mBACrB,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAgB,CAAA,EAC3D,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAe,EAAO,cAAc;WACnC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA,CAC7C;;SACM,CAAA;QACT,CAAA;OACP,kBAAC,GAAD;QAAM,WAAU;kBACd,kBAAC,GAAD;SAAa,WAAU;mBACrB,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAc,CAAA,EACzD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAe,EAAO,UAAU;WAC/B,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD,EAAY,WAAU,+BAAgC,CAAA,CAClD;;SACM,CAAA;QACT,CAAA;OACH;SACN,kBAAC,KAAD;MAAG,WAAU;gBAAb;OAA2C;OAClB,EAAa,EAAO,MAAM;OAAC;OAChD;QACA;;IAIR,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,wEAAyE,CAAA,EAC/F,kBAAC,GAAD;OACE,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;OAC1C,WAAU;OACV,CAAA,CACE;SACN,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAmB,KAAK,MACvB,kBAAC,GAAD;OAEE,SAAS,EAAa,SAAS,EAAO,GAAG,YAAY;OACrD,MAAK;OACL,eACE,GAAiB,MACf,EAAK,SAAS,EAAO,GAAG,EAAK,QAAQ,MAAM,MAAM,EAAO,GAAG,CAAC,GAAG,GAAM,EAAO,CAC7E;iBAPL,CAUE,kBAAC,GAAD,EAAoB,WAAU,CAAA,EAC9B,kBAAC,QAAD;QAAM,WAAU;kBAAQ,EAAc;QAAe,CAAA,CAC9C;SAXF,EAWE,CACT;MACE,CAAA,CACF;;IAGL,IACC,kBAAC,OAAD;KAAK,WAAU;eACZ;MAAC;MAAG;MAAG;MAAG;MAAG;MAAE,CAAC,KAAK,MACpB,kBAAC,OAAD,EAEE,WAAU,+DACV,EAFK,EAEL,CACF;KACE,CAAA,GACJ,IACF,kBAAC,GAAD;KAAY,UAAS;KAAoB;KAAO,eAAe,KAAK,GAAS;KAAI,CAAA,GAC/E,EAAW,SAAS,IACtB,kBAAC,OAAD;KAAK,WAAU;eAAf,CAEE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAa;QAAY,CAAA;OACxC,kBAAC,OAAD;QAAK,WAAU;kBAAa;QAAiB,CAAA;OAC7C,kBAAC,OAAD;QAAK,WAAU;kBAAa;QAAc,CAAA;OAC1C,kBAAC,OAAD;QAAK,WAAU;kBAAa;QAAY,CAAA;OACxC,kBAAC,OAAD;QAAK,WAAU;kBAAa;QAAU,CAAA;OACtC,kBAAC,OAAD;QAAK,WAAU;kBAAa;QAAa,CAAA;OACrC;SAGL,EAAW,KAAK,MACf,kBAAC,GAAD;MAAyB,IAAI,EAAQ,cAAc,EAAU,KAAK;gBAChE,kBAAC,GAAD;OAAM,WAAU;iBACd,kBAAC,GAAD;QAAa,WAAU;kBACrB,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,GAAD,EAAa,QAAQ,EAAU,QAAU,CAAA;WACrC,CAAA;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,KAAD;YAAG,WAAU;sBAAwB,EAAU,SAAA;YAA2B,CAAA,EAC1E,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAU,WAAA;YACT,CAAA,CACA;;UACN,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,GAAD;aAAO,MAAM;aAAI,WAAU;aAAwB,CAAA,EACnD,kBAAC,QAAD,EAAA,UAAO,EAAe,EAAU,SAAS,EAAQ,CAAA,CAC7C;;WACF,CAAA;UACN,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,GAAD;aAAK,MAAM;aAAI,WAAU;aAAwB,CAAA,EACjD,kBAAC,QAAD,EAAA,UAAO,EAAa,EAAU,WAAW,EAAQ,CAAA,CAC7C;;WACF,CAAA;UACN,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,GAAD;aAAY,MAAM;aAAI,WAAU;aAAwB,CAAA,EACxD,kBAAC,QAAD,EAAA,UAAO,EAAe,EAAU,KAAK,EAAQ,CAAA,CACzC;;WACF,CAAA;UACN,kBAAC,OAAD;WAAK,WAAU;qBACZ,EAAmB,EAAU,UAAU;WACpC,CAAA;UACF;;QACM,CAAA;OACT,CAAA;MACF,EArCI,EAAU,GAqCd,CACP,CACE;SAEN,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aACE,EAAa,SAAS,KAAK,IACvB,iEACA;KAEN,CAAA;IAEA;;EACK,CAAA"}
1
+ {"version":3,"file":"ExecutionsPage.js","names":[],"sources":["../../../src/botlit/pages/ExecutionsPage.tsx"],"sourcesContent":["/**\n * Executions Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Search as SearchIcon,\n Activity,\n CheckCircle,\n XCircle,\n Clock,\n DollarSign,\n Zap,\n RefreshCw,\n TrendingUp,\n Hourglass,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose } 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 { Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport { useExecutions, summariseExecutions, type ExecutionRecord } from '../hooks';\nimport {\n formatNumber,\n formatRelativeTime,\n formatCurrency,\n formatDuration,\n MISSING_VALUE,\n} from '../utils/formatters';\nimport { ExecutionStatus as GqlExecutionStatus } from '../../generated/wspace-types';\n\n/**\n * The statuses wspace-botlit-svc actually reports. These MUST match the\n * `ExecutionStatus` enum in the supergraph — sending anything else fails\n * GraphQL validation at the gateway.\n */\nconst EXECUTION_STATUSES: GqlExecutionStatus[] = [\n GqlExecutionStatus.Completed,\n GqlExecutionStatus.Running,\n GqlExecutionStatus.Pending,\n GqlExecutionStatus.Failed,\n GqlExecutionStatus.Timeout,\n GqlExecutionStatus.Cancelled,\n];\n\nfunction useStatusLabels(t: ReturnType<typeof useTr>): Record<GqlExecutionStatus, string> {\n return {\n [GqlExecutionStatus.Completed]: t('botlit.executions.status.completed', 'Completed'),\n [GqlExecutionStatus.Running]: t('botlit.executions.status.running', 'Running'),\n [GqlExecutionStatus.Pending]: t('botlit.executions.status.pending', 'Pending'),\n [GqlExecutionStatus.Failed]: t('botlit.executions.status.failed', 'Failed'),\n [GqlExecutionStatus.Timeout]: t('botlit.executions.status.timedOut', 'Timed out'),\n [GqlExecutionStatus.Cancelled]: t('botlit.executions.status.cancelled', 'Cancelled'),\n };\n}\n\nconst StatusIcon: FC<{ status: string; className?: string }> = ({ status, className }) => {\n switch (status) {\n case GqlExecutionStatus.Completed:\n return <CheckCircle className={className ?? 'h-4 w-4 text-status-success-text'} />;\n case GqlExecutionStatus.Failed:\n case GqlExecutionStatus.Timeout:\n return <XCircle className={className ?? 'h-4 w-4 text-status-error-text'} />;\n case GqlExecutionStatus.Running:\n return (\n <RefreshCw\n className={className ?? 'h-4 w-4 text-status-info-text motion-safe:animate-spin'}\n />\n );\n case GqlExecutionStatus.Pending:\n return <Hourglass className={className ?? 'h-4 w-4 text-status-warning-text'} />;\n default:\n return <Activity className={className ?? 'h-4 w-4 text-text-secondary'} />;\n }\n};\n\nconst StatusBadge: FC<{ status: string; labels: Record<GqlExecutionStatus, string> }> = ({\n status,\n labels,\n}) => {\n const variants: Record<string, 'success' | 'destructive' | 'warning' | 'secondary' | 'default'> =\n {\n [GqlExecutionStatus.Completed]: 'success',\n [GqlExecutionStatus.Failed]: 'destructive',\n [GqlExecutionStatus.Timeout]: 'destructive',\n [GqlExecutionStatus.Running]: 'default',\n [GqlExecutionStatus.Pending]: 'warning',\n [GqlExecutionStatus.Cancelled]: 'secondary',\n };\n\n return (\n <Badge variant={variants[status] ?? 'secondary'} className=\"flex items-center gap-1\">\n <StatusIcon status={status} />\n {labels[status as GqlExecutionStatus] ?? status}\n </Badge>\n );\n};\n\nexport const ExecutionsPage: FC = () => {\n const t = useTr();\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState<GqlExecutionStatus[]>([]);\n const statusLabels = useStatusLabels(t);\n\n const filter = useMemo(\n () => ({ search, status: statusFilter as string[] }),\n [search, statusFilter]\n );\n const { data: executions, loading, error, refetch } = useExecutions(filter);\n\n // No server-side aggregate exists for executions — these numbers describe the\n // runs currently loaded, and the caption below says so.\n const rollup = useMemo(() => summariseExecutions(executions), [executions]);\n\n return (\n <PageLayout\n title={t('botlit.executions.title', 'Executions')}\n description={t(\n 'botlit.executions.description',\n 'Monitor agent execution history, performance, and costs'\n )}\n actions={\n <Button variant=\"outline\" leftIcon={<RefreshCw size={16} />} onClick={() => void refetch()}>\n {t('botlit.executions.actions.refresh', 'Refresh')}\n </Button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Activity size={18} />}>\n {t(\n 'botlit.executions.purpose',\n 'An execution is a single run of an agent — one request in, one response out. This page is your observability and cost dashboard: see which runs succeeded or failed, how long they took, how many tokens they burned and what they cost. Use it to spot failing agents, runaway spend and latency regressions, then open any run to inspect its full trace.'\n )}\n </PagePurpose>\n\n {/* Stats over the loaded runs */}\n {rollup.total > 0 && (\n <div className=\"space-y-2\">\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.executions.rollup.executions', 'Executions')}\n </p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatNumber(rollup.total)}\n </p>\n </div>\n <Activity className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.executions.rollup.successRate', 'Success Rate')}\n </p>\n <p className=\"text-2xl font-bold tabular-nums text-status-success-text\">\n {(rollup.successRate * 100).toFixed(1)}%\n </p>\n </div>\n <TrendingUp className=\"h-8 w-8 text-status-success-text\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.executions.rollup.avgDuration', 'Avg Duration')}\n </p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatDuration(rollup.avgDurationMs)}\n </p>\n </div>\n <Clock className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.executions.rollup.totalCost', 'Total Cost')}\n </p>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatCurrency(rollup.totalCost)}\n </p>\n </div>\n <DollarSign className=\"h-8 w-8 text-text-secondary\" />\n </div>\n </CardContent>\n </Card>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'botlit.executions.rollup.calculatedAcross',\n 'Calculated across the {{count}} runs shown below.',\n {\n count: rollup.total,\n }\n )}\n </p>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={t(\n 'botlit.executions.filters.searchPlaceholder',\n 'Search by run, agent, bot or input…'\n )}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {EXECUTION_STATUSES.map((status) => (\n <Button\n key={status}\n variant={statusFilter.includes(status) ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() =>\n setStatusFilter((prev) =>\n prev.includes(status) ? prev.filter((s) => s !== status) : [...prev, status]\n )\n }\n >\n <StatusIcon status={status} />\n <span className=\"ml-1\">{statusLabels[status]}</span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Executions List */}\n {loading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className=\"h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"executions\" error={error} onRetry={() => void refetch()} />\n ) : executions.length > 0 ? (\n <div className=\"space-y-2\">\n {/* Table Header */}\n <div className=\"grid grid-cols-12 gap-4 px-4 py-2 text-sm font-medium text-text-secondary border-b border-border-subtle\">\n <div className=\"col-span-2\">{t('botlit.executions.table.status', 'Status')}</div>\n <div className=\"col-span-3\">\n {t('botlit.executions.table.botAgent', 'Bot / Agent')}\n </div>\n <div className=\"col-span-2\">{t('botlit.executions.table.duration', 'Duration')}</div>\n <div className=\"col-span-2\">{t('botlit.executions.table.tokens', 'Tokens')}</div>\n <div className=\"col-span-1\">{t('botlit.executions.table.cost', 'Cost')}</div>\n <div className=\"col-span-2\">{t('botlit.executions.table.started', 'Started')}</div>\n </div>\n\n {/* Table Rows */}\n {executions.map((execution: ExecutionRecord) => (\n <Link key={execution.id} to={getPath(`executions/${execution.id}`)}>\n <Card className=\"hover:border-primary/50 transition-colors cursor-pointer\">\n <CardContent className=\"py-3\">\n <div className=\"grid grid-cols-12 gap-4 items-center\">\n <div className=\"col-span-2\">\n <StatusBadge status={execution.status} labels={statusLabels} />\n </div>\n <div className=\"col-span-3\">\n <p className=\"font-medium truncate\">{execution.appId ?? MISSING_VALUE}</p>\n <p className=\"text-sm text-text-secondary truncate\">\n {execution.agentId ?? MISSING_VALUE}\n </p>\n </div>\n <div className=\"col-span-2\">\n <div className=\"flex items-center gap-1\">\n <Clock size={14} className=\"text-text-secondary\" />\n <span>{formatDuration(execution.duration)}</span>\n </div>\n </div>\n <div className=\"col-span-2\">\n <div className=\"flex items-center gap-1\">\n <Zap size={14} className=\"text-text-secondary\" />\n <span>{formatNumber(execution.tokensUsed)}</span>\n </div>\n </div>\n <div className=\"col-span-1\">\n <div className=\"flex items-center gap-1\">\n <DollarSign size={14} className=\"text-text-secondary\" />\n <span>{formatCurrency(execution.cost)}</span>\n </div>\n </div>\n <div className=\"col-span-2 text-sm text-text-secondary\">\n {formatRelativeTime(execution.createdAt)}\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title={t('botlit.executions.empty.title', 'No executions found')}\n description={\n statusFilter.length > 0 || search\n ? t(\n 'botlit.executions.empty.descriptionFiltered',\n 'No executions match your filters. Try adjusting your search.'\n )\n : t(\n 'botlit.executions.empty.descriptionNoData',\n 'Executions will appear here when agents process requests.'\n )\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -287,7 +287,7 @@ var L = () => {
287
287
  })
288
288
  }) : /* @__PURE__ */ S(n, {
289
289
  title: "Installed Packages",
290
- description: "Manage packages installed from the Botlit Store",
290
+ description: "Manage packages installed from the BotManor Store",
291
291
  actions: /* @__PURE__ */ S("div", {
292
292
  className: "flex gap-2",
293
293
  children: [/* @__PURE__ */ x(c, {
@@ -306,7 +306,7 @@ var L = () => {
306
306
  /* @__PURE__ */ x(ne, {
307
307
  className: "mb-6",
308
308
  icon: /* @__PURE__ */ x(E, { size: 18 }),
309
- children: "These are the packages you have installed from the Botlit Store and how they are wired into your workspace. Manage each one’s installation mode (linked, so it auto-updates, or forked as an independent copy), pin specific versions per environment, and update or uninstall — this is your dependency manager for everything you pulled from the store."
309
+ children: "These are the packages you have installed from the BotManor Store and how they are wired into your workspace. Manage each one’s installation mode (linked, so it auto-updates, or forked as an independent copy), pin specific versions per environment, and update or uninstall — this is your dependency manager for everything you pulled from the store."
310
310
  }),
311
311
  z ? /* @__PURE__ */ x(f, {
312
312
  resource: "installed packages",
@@ -415,7 +415,7 @@ var L = () => {
415
415
  }) : /* @__PURE__ */ x(u, {
416
416
  illustration: "empty-generic",
417
417
  title: W || K !== "all" ? "No matching packages" : "No packages installed",
418
- description: W || K !== "all" ? "Try adjusting your search or type filter." : "Browse the Botlit Store to find agents, skills, and tools to install.",
418
+ description: W || K !== "all" ? "Try adjusting your search or type filter." : "Browse the BotManor Store to find agents, skills, and tools to install.",
419
419
  action: /* @__PURE__ */ x(c, {
420
420
  onClick: () => A("store"),
421
421
  leftIcon: /* @__PURE__ */ x(ae, { className: "h-4 w-4" }),