@burdenoff/microfe-botmanor 2026.1109.2 → 2026.1110.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/botlit/components/Badge.js +2 -2
- package/dist/botlit/components/Badge.js.map +1 -1
- package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
- package/dist/botlit/components/LoadMore.d.ts +9 -0
- package/dist/botlit/components/LoadMore.js +22 -0
- package/dist/botlit/components/LoadMore.js.map +1 -0
- package/dist/botlit/components/index.d.ts +1 -0
- package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useAgents.d.ts +2 -6
- package/dist/botlit/hooks/useAgents.js +71 -95
- package/dist/botlit/hooks/useAgents.js.map +1 -1
- package/dist/botlit/hooks/useBots.d.ts +2 -6
- package/dist/botlit/hooks/useBots.js +51 -75
- package/dist/botlit/hooks/useBots.js.map +1 -1
- package/dist/botlit/hooks/useExecutions.d.ts +2 -2
- package/dist/botlit/hooks/useExecutions.js +30 -34
- package/dist/botlit/hooks/useExecutions.js.map +1 -1
- package/dist/botlit/hooks/useStore.d.ts +3 -3
- package/dist/botlit/hooks/useStore.js +41 -50
- package/dist/botlit/hooks/useStore.js.map +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +1 -1
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +157 -156
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +24 -24
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +147 -146
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +2 -2
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +141 -134
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +1 -1
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +2 -2
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +1 -1
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +150 -143
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,178 +7,179 @@ import { Input as o } from "../components/Input.js";
|
|
|
7
7
|
import { Badge as s } from "../components/Badge.js";
|
|
8
8
|
import { EmptyState as c } from "../components/EmptyState.js";
|
|
9
9
|
import { ErrorState as l } from "../components/ErrorState.js";
|
|
10
|
+
import { LoadMore as u } from "../components/LoadMore.js";
|
|
11
|
+
import { summariseExecutions as d, useExecutions as f } from "../hooks/useExecutions.js";
|
|
10
12
|
import "../hooks/index.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
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";
|
|
13
|
+
import { formatCurrency as p, formatDuration as m, formatNumber as h, formatRelativeTime as g } from "../utils/formatters.js";
|
|
14
|
+
import { ExecutionStatus as _ } from "../../generated/wspace-types.js";
|
|
15
|
+
import { useMemo as v, useState as y } from "react";
|
|
16
|
+
import { PagePurpose as b } from "@burdenoff/fe-libs/ui";
|
|
17
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
18
|
+
import { Link as C } from "react-router";
|
|
19
|
+
import { Activity as w, CheckCircle as T, Clock as E, DollarSign as D, Hourglass as O, RefreshCw as k, Search as A, TrendingUp as j, XCircle as M, Zap as N } from "lucide-react";
|
|
19
20
|
// src/botlit/pages/ExecutionsPage.tsx
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
var P = [
|
|
22
|
+
_.Completed,
|
|
23
|
+
_.Running,
|
|
24
|
+
_.Pending,
|
|
25
|
+
_.Failed,
|
|
26
|
+
_.Timeout,
|
|
27
|
+
_.Cancelled
|
|
27
28
|
];
|
|
28
|
-
function
|
|
29
|
+
function F(e) {
|
|
29
30
|
return {
|
|
30
|
-
[
|
|
31
|
-
[
|
|
32
|
-
[
|
|
33
|
-
[
|
|
34
|
-
[
|
|
35
|
-
[
|
|
31
|
+
[_.Completed]: e("botlit.executions.status.completed", "Completed"),
|
|
32
|
+
[_.Running]: e("botlit.executions.status.running", "Running"),
|
|
33
|
+
[_.Pending]: e("botlit.executions.status.pending", "Pending"),
|
|
34
|
+
[_.Failed]: e("botlit.executions.status.failed", "Failed"),
|
|
35
|
+
[_.Timeout]: e("botlit.executions.status.timedOut", "Timed out"),
|
|
36
|
+
[_.Cancelled]: e("botlit.executions.status.cancelled", "Cancelled")
|
|
36
37
|
};
|
|
37
38
|
}
|
|
38
|
-
var
|
|
39
|
+
var I = ({ status: e, className: t }) => {
|
|
39
40
|
switch (e) {
|
|
40
|
-
case
|
|
41
|
-
case
|
|
42
|
-
case
|
|
43
|
-
case
|
|
44
|
-
case
|
|
45
|
-
default: return /* @__PURE__ */
|
|
41
|
+
case _.Completed: return /* @__PURE__ */ x(T, { className: t ?? "h-4 w-4 text-status-success-text" });
|
|
42
|
+
case _.Failed:
|
|
43
|
+
case _.Timeout: return /* @__PURE__ */ x(M, { className: t ?? "h-4 w-4 text-status-error-text" });
|
|
44
|
+
case _.Running: return /* @__PURE__ */ x(k, { className: t ?? "h-4 w-4 text-status-info-text motion-safe:animate-spin" });
|
|
45
|
+
case _.Pending: return /* @__PURE__ */ x(O, { className: t ?? "h-4 w-4 text-status-warning-text" });
|
|
46
|
+
default: return /* @__PURE__ */ x(w, { className: t ?? "h-4 w-4 text-text-secondary" });
|
|
46
47
|
}
|
|
47
|
-
},
|
|
48
|
+
}, L = ({ status: e, labels: t }) => {
|
|
48
49
|
let n = {
|
|
49
|
-
[
|
|
50
|
-
[
|
|
51
|
-
[
|
|
52
|
-
[
|
|
53
|
-
[
|
|
54
|
-
[
|
|
50
|
+
[_.Completed]: "success",
|
|
51
|
+
[_.Failed]: "destructive",
|
|
52
|
+
[_.Timeout]: "destructive",
|
|
53
|
+
[_.Running]: "default",
|
|
54
|
+
[_.Pending]: "warning",
|
|
55
|
+
[_.Cancelled]: "secondary"
|
|
55
56
|
};
|
|
56
|
-
return /* @__PURE__ */
|
|
57
|
+
return /* @__PURE__ */ S(s, {
|
|
57
58
|
variant: n[e] ?? "secondary",
|
|
58
59
|
className: "flex items-center gap-1",
|
|
59
|
-
children: [/* @__PURE__ */
|
|
60
|
+
children: [/* @__PURE__ */ x(I, { status: e }), t[e] ?? e]
|
|
60
61
|
});
|
|
61
|
-
},
|
|
62
|
-
let s = t(), { getPath:
|
|
63
|
-
search:
|
|
64
|
-
status:
|
|
65
|
-
}), [
|
|
66
|
-
return /* @__PURE__ */
|
|
62
|
+
}, R = () => {
|
|
63
|
+
let s = t(), { getPath: _ } = e(), [T, O] = y(""), [M, R] = y([]), z = F(s), B = v(() => ({
|
|
64
|
+
search: T,
|
|
65
|
+
status: M
|
|
66
|
+
}), [T, M]), { data: V, loading: H, error: U, refetch: W, hasMore: G, loadingMore: K, loadMore: q } = f(B), J = v(() => d(V), [V]);
|
|
67
|
+
return /* @__PURE__ */ x(n, {
|
|
67
68
|
title: s("botlit.executions.title", "Executions"),
|
|
68
69
|
description: s("botlit.executions.description", "Monitor agent execution history, performance, and costs"),
|
|
69
|
-
actions: /* @__PURE__ */
|
|
70
|
+
actions: /* @__PURE__ */ x(a, {
|
|
70
71
|
variant: "outline",
|
|
71
|
-
leftIcon: /* @__PURE__ */
|
|
72
|
-
onClick: () => void
|
|
72
|
+
leftIcon: /* @__PURE__ */ x(k, { size: 16 }),
|
|
73
|
+
onClick: () => void W(),
|
|
73
74
|
children: s("botlit.executions.actions.refresh", "Refresh")
|
|
74
75
|
}),
|
|
75
|
-
children: /* @__PURE__ */
|
|
76
|
+
children: /* @__PURE__ */ S("div", {
|
|
76
77
|
className: "space-y-6",
|
|
77
78
|
children: [
|
|
78
|
-
/* @__PURE__ */ b
|
|
79
|
-
icon: /* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ x(b, {
|
|
80
|
+
icon: /* @__PURE__ */ x(w, { size: 18 }),
|
|
80
81
|
children: s("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.")
|
|
81
82
|
}),
|
|
82
|
-
|
|
83
|
+
J.total > 0 && /* @__PURE__ */ S("div", {
|
|
83
84
|
className: "space-y-2",
|
|
84
|
-
children: [/* @__PURE__ */
|
|
85
|
+
children: [/* @__PURE__ */ S("div", {
|
|
85
86
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
86
87
|
children: [
|
|
87
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ x(r, {
|
|
88
89
|
treatment: "glass",
|
|
89
90
|
glow: !0,
|
|
90
|
-
children: /* @__PURE__ */
|
|
91
|
+
children: /* @__PURE__ */ x(i, {
|
|
91
92
|
className: "pt-6",
|
|
92
|
-
children: /* @__PURE__ */
|
|
93
|
+
children: /* @__PURE__ */ S("div", {
|
|
93
94
|
className: "flex items-center justify-between",
|
|
94
|
-
children: [/* @__PURE__ */
|
|
95
|
+
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
|
|
95
96
|
className: "text-sm text-text-secondary",
|
|
96
97
|
children: s("botlit.executions.rollup.executions", "Executions")
|
|
97
|
-
}), /* @__PURE__ */
|
|
98
|
+
}), /* @__PURE__ */ x("p", {
|
|
98
99
|
className: "text-2xl font-bold tabular-nums",
|
|
99
|
-
children:
|
|
100
|
-
})] }), /* @__PURE__ */
|
|
100
|
+
children: h(J.total)
|
|
101
|
+
})] }), /* @__PURE__ */ x(w, { className: "h-8 w-8 text-text-secondary" })]
|
|
101
102
|
})
|
|
102
103
|
})
|
|
103
104
|
}),
|
|
104
|
-
/* @__PURE__ */
|
|
105
|
+
/* @__PURE__ */ x(r, {
|
|
105
106
|
treatment: "metric",
|
|
106
|
-
children: /* @__PURE__ */
|
|
107
|
+
children: /* @__PURE__ */ x(i, {
|
|
107
108
|
className: "pt-6",
|
|
108
|
-
children: /* @__PURE__ */
|
|
109
|
+
children: /* @__PURE__ */ S("div", {
|
|
109
110
|
className: "flex items-center justify-between",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
111
|
+
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
|
|
111
112
|
className: "text-sm text-text-secondary",
|
|
112
113
|
children: s("botlit.executions.rollup.successRate", "Success Rate")
|
|
113
|
-
}), /* @__PURE__ */
|
|
114
|
+
}), /* @__PURE__ */ S("p", {
|
|
114
115
|
className: "text-2xl font-bold tabular-nums text-status-success-text",
|
|
115
|
-
children: [(
|
|
116
|
-
})] }), /* @__PURE__ */
|
|
116
|
+
children: [(J.successRate * 100).toFixed(1), "%"]
|
|
117
|
+
})] }), /* @__PURE__ */ x(j, { className: "h-8 w-8 text-status-success-text" })]
|
|
117
118
|
})
|
|
118
119
|
})
|
|
119
120
|
}),
|
|
120
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ x(r, {
|
|
121
122
|
treatment: "metric",
|
|
122
|
-
children: /* @__PURE__ */
|
|
123
|
+
children: /* @__PURE__ */ x(i, {
|
|
123
124
|
className: "pt-6",
|
|
124
|
-
children: /* @__PURE__ */
|
|
125
|
+
children: /* @__PURE__ */ S("div", {
|
|
125
126
|
className: "flex items-center justify-between",
|
|
126
|
-
children: [/* @__PURE__ */
|
|
127
|
+
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
|
|
127
128
|
className: "text-sm text-text-secondary",
|
|
128
129
|
children: s("botlit.executions.rollup.avgDuration", "Avg Duration")
|
|
129
|
-
}), /* @__PURE__ */
|
|
130
|
+
}), /* @__PURE__ */ x("p", {
|
|
130
131
|
className: "text-2xl font-bold tabular-nums",
|
|
131
|
-
children:
|
|
132
|
-
})] }), /* @__PURE__ */
|
|
132
|
+
children: m(J.avgDurationMs)
|
|
133
|
+
})] }), /* @__PURE__ */ x(E, { className: "h-8 w-8 text-text-secondary" })]
|
|
133
134
|
})
|
|
134
135
|
})
|
|
135
136
|
}),
|
|
136
|
-
/* @__PURE__ */
|
|
137
|
+
/* @__PURE__ */ x(r, {
|
|
137
138
|
treatment: "metric",
|
|
138
|
-
children: /* @__PURE__ */
|
|
139
|
+
children: /* @__PURE__ */ x(i, {
|
|
139
140
|
className: "pt-6",
|
|
140
|
-
children: /* @__PURE__ */
|
|
141
|
+
children: /* @__PURE__ */ S("div", {
|
|
141
142
|
className: "flex items-center justify-between",
|
|
142
|
-
children: [/* @__PURE__ */
|
|
143
|
+
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
|
|
143
144
|
className: "text-sm text-text-secondary",
|
|
144
145
|
children: s("botlit.executions.rollup.totalCost", "Total Cost")
|
|
145
|
-
}), /* @__PURE__ */
|
|
146
|
+
}), /* @__PURE__ */ x("p", {
|
|
146
147
|
className: "text-2xl font-bold tabular-nums",
|
|
147
|
-
children:
|
|
148
|
-
})] }), /* @__PURE__ */
|
|
148
|
+
children: p(J.totalCost)
|
|
149
|
+
})] }), /* @__PURE__ */ x(D, { className: "h-8 w-8 text-text-secondary" })]
|
|
149
150
|
})
|
|
150
151
|
})
|
|
151
152
|
})
|
|
152
153
|
]
|
|
153
|
-
}), /* @__PURE__ */
|
|
154
|
+
}), /* @__PURE__ */ x("p", {
|
|
154
155
|
className: "text-xs text-text-secondary",
|
|
155
|
-
children: s("botlit.executions.rollup.calculatedAcross", "Calculated across the {{count}} runs shown below.", { count:
|
|
156
|
+
children: s("botlit.executions.rollup.calculatedAcross", "Calculated across the {{count}} runs shown below.", { count: J.total })
|
|
156
157
|
})]
|
|
157
158
|
}),
|
|
158
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ S("div", {
|
|
159
160
|
className: "flex flex-wrap items-center gap-4",
|
|
160
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ S("div", {
|
|
161
162
|
className: "relative flex-1 max-w-md",
|
|
162
|
-
children: [/* @__PURE__ */
|
|
163
|
+
children: [/* @__PURE__ */ x(A, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x(o, {
|
|
163
164
|
placeholder: s("botlit.executions.filters.searchPlaceholder", "Search by run, agent, bot or input…"),
|
|
164
|
-
value:
|
|
165
|
-
onChange: (e) =>
|
|
165
|
+
value: T,
|
|
166
|
+
onChange: (e) => O(e.target.value),
|
|
166
167
|
className: "pl-9"
|
|
167
168
|
})]
|
|
168
|
-
}), /* @__PURE__ */
|
|
169
|
+
}), /* @__PURE__ */ x("div", {
|
|
169
170
|
className: "flex flex-wrap gap-2",
|
|
170
|
-
children:
|
|
171
|
-
variant:
|
|
171
|
+
children: P.map((e) => /* @__PURE__ */ S(a, {
|
|
172
|
+
variant: M.includes(e) ? "default" : "outline",
|
|
172
173
|
size: "sm",
|
|
173
|
-
onClick: () =>
|
|
174
|
-
children: [/* @__PURE__ */
|
|
174
|
+
onClick: () => R((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]),
|
|
175
|
+
children: [/* @__PURE__ */ x(I, { status: e }), /* @__PURE__ */ x("span", {
|
|
175
176
|
className: "ml-1",
|
|
176
|
-
children:
|
|
177
|
+
children: z[e]
|
|
177
178
|
})]
|
|
178
179
|
}, e))
|
|
179
180
|
})]
|
|
180
181
|
}),
|
|
181
|
-
|
|
182
|
+
H ? /* @__PURE__ */ x("div", {
|
|
182
183
|
className: "space-y-4",
|
|
183
184
|
children: [
|
|
184
185
|
1,
|
|
@@ -186,115 +187,121 @@ var F = ({ status: e, className: t }) => {
|
|
|
186
187
|
3,
|
|
187
188
|
4,
|
|
188
189
|
5
|
|
189
|
-
].map((e) => /* @__PURE__ */
|
|
190
|
-
}) :
|
|
190
|
+
].map((e) => /* @__PURE__ */ x("div", { className: "h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
191
|
+
}) : U ? /* @__PURE__ */ x(l, {
|
|
191
192
|
resource: "executions",
|
|
192
|
-
error:
|
|
193
|
-
onRetry: () => void
|
|
194
|
-
}) :
|
|
193
|
+
error: U,
|
|
194
|
+
onRetry: () => void W()
|
|
195
|
+
}) : V.length > 0 ? /* @__PURE__ */ S("div", {
|
|
195
196
|
className: "space-y-2",
|
|
196
|
-
children: [/* @__PURE__ */
|
|
197
|
+
children: [/* @__PURE__ */ S("div", {
|
|
197
198
|
className: "grid grid-cols-12 gap-4 px-4 py-2 text-sm font-medium text-text-secondary border-b border-border-subtle",
|
|
198
199
|
children: [
|
|
199
|
-
/* @__PURE__ */
|
|
200
|
+
/* @__PURE__ */ x("div", {
|
|
200
201
|
className: "col-span-2",
|
|
201
202
|
children: s("botlit.executions.table.status", "Status")
|
|
202
203
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
204
|
+
/* @__PURE__ */ x("div", {
|
|
204
205
|
className: "col-span-3",
|
|
205
206
|
children: s("botlit.executions.table.botAgent", "Bot / Agent")
|
|
206
207
|
}),
|
|
207
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ x("div", {
|
|
208
209
|
className: "col-span-2",
|
|
209
210
|
children: s("botlit.executions.table.duration", "Duration")
|
|
210
211
|
}),
|
|
211
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ x("div", {
|
|
212
213
|
className: "col-span-2",
|
|
213
214
|
children: s("botlit.executions.table.tokens", "Tokens")
|
|
214
215
|
}),
|
|
215
|
-
/* @__PURE__ */
|
|
216
|
+
/* @__PURE__ */ x("div", {
|
|
216
217
|
className: "col-span-1",
|
|
217
218
|
children: s("botlit.executions.table.cost", "Cost")
|
|
218
219
|
}),
|
|
219
|
-
/* @__PURE__ */
|
|
220
|
+
/* @__PURE__ */ x("div", {
|
|
220
221
|
className: "col-span-2",
|
|
221
222
|
children: s("botlit.executions.table.started", "Started")
|
|
222
223
|
})
|
|
223
224
|
]
|
|
224
|
-
}),
|
|
225
|
-
to:
|
|
226
|
-
children: /* @__PURE__ */
|
|
225
|
+
}), V.map((e) => /* @__PURE__ */ x(C, {
|
|
226
|
+
to: _(`executions/${e.id}`),
|
|
227
|
+
children: /* @__PURE__ */ x(r, {
|
|
227
228
|
className: "hover:border-primary/50 transition-colors cursor-pointer",
|
|
228
|
-
children: /* @__PURE__ */
|
|
229
|
+
children: /* @__PURE__ */ x(i, {
|
|
229
230
|
className: "py-3",
|
|
230
|
-
children: /* @__PURE__ */
|
|
231
|
+
children: /* @__PURE__ */ S("div", {
|
|
231
232
|
className: "grid grid-cols-12 gap-4 items-center",
|
|
232
233
|
children: [
|
|
233
|
-
/* @__PURE__ */
|
|
234
|
+
/* @__PURE__ */ x("div", {
|
|
234
235
|
className: "col-span-2",
|
|
235
|
-
children: /* @__PURE__ */
|
|
236
|
+
children: /* @__PURE__ */ x(L, {
|
|
236
237
|
status: e.status,
|
|
237
|
-
labels:
|
|
238
|
+
labels: z
|
|
238
239
|
})
|
|
239
240
|
}),
|
|
240
|
-
/* @__PURE__ */
|
|
241
|
+
/* @__PURE__ */ S("div", {
|
|
241
242
|
className: "col-span-3",
|
|
242
|
-
children: [/* @__PURE__ */
|
|
243
|
+
children: [/* @__PURE__ */ x("p", {
|
|
243
244
|
className: "font-medium truncate",
|
|
244
245
|
children: e.appId ?? "—"
|
|
245
|
-
}), /* @__PURE__ */
|
|
246
|
+
}), /* @__PURE__ */ x("p", {
|
|
246
247
|
className: "text-sm text-text-secondary truncate",
|
|
247
248
|
children: e.agentId ?? "—"
|
|
248
249
|
})]
|
|
249
250
|
}),
|
|
250
|
-
/* @__PURE__ */
|
|
251
|
+
/* @__PURE__ */ x("div", {
|
|
251
252
|
className: "col-span-2",
|
|
252
|
-
children: /* @__PURE__ */
|
|
253
|
+
children: /* @__PURE__ */ S("div", {
|
|
253
254
|
className: "flex items-center gap-1",
|
|
254
|
-
children: [/* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ x(E, {
|
|
255
256
|
size: 14,
|
|
256
257
|
className: "text-text-secondary"
|
|
257
|
-
}), /* @__PURE__ */
|
|
258
|
+
}), /* @__PURE__ */ x("span", { children: m(e.duration) })]
|
|
258
259
|
})
|
|
259
260
|
}),
|
|
260
|
-
/* @__PURE__ */
|
|
261
|
+
/* @__PURE__ */ x("div", {
|
|
261
262
|
className: "col-span-2",
|
|
262
|
-
children: /* @__PURE__ */
|
|
263
|
+
children: /* @__PURE__ */ S("div", {
|
|
263
264
|
className: "flex items-center gap-1",
|
|
264
|
-
children: [/* @__PURE__ */
|
|
265
|
+
children: [/* @__PURE__ */ x(N, {
|
|
265
266
|
size: 14,
|
|
266
267
|
className: "text-text-secondary"
|
|
267
|
-
}), /* @__PURE__ */
|
|
268
|
+
}), /* @__PURE__ */ x("span", { children: h(e.tokensUsed) })]
|
|
268
269
|
})
|
|
269
270
|
}),
|
|
270
|
-
/* @__PURE__ */
|
|
271
|
+
/* @__PURE__ */ x("div", {
|
|
271
272
|
className: "col-span-1",
|
|
272
|
-
children: /* @__PURE__ */
|
|
273
|
+
children: /* @__PURE__ */ S("div", {
|
|
273
274
|
className: "flex items-center gap-1",
|
|
274
|
-
children: [/* @__PURE__ */
|
|
275
|
+
children: [/* @__PURE__ */ x(D, {
|
|
275
276
|
size: 14,
|
|
276
277
|
className: "text-text-secondary"
|
|
277
|
-
}), /* @__PURE__ */
|
|
278
|
+
}), /* @__PURE__ */ x("span", { children: p(e.cost) })]
|
|
278
279
|
})
|
|
279
280
|
}),
|
|
280
|
-
/* @__PURE__ */
|
|
281
|
+
/* @__PURE__ */ x("div", {
|
|
281
282
|
className: "col-span-2 text-sm text-text-secondary",
|
|
282
|
-
children:
|
|
283
|
+
children: g(e.createdAt)
|
|
283
284
|
})
|
|
284
285
|
]
|
|
285
286
|
})
|
|
286
287
|
})
|
|
287
288
|
})
|
|
288
289
|
}, e.id))]
|
|
289
|
-
}) : /* @__PURE__ */
|
|
290
|
+
}) : /* @__PURE__ */ x(c, {
|
|
290
291
|
illustration: "empty-search",
|
|
291
292
|
title: s("botlit.executions.empty.title", "No executions found"),
|
|
292
|
-
description:
|
|
293
|
+
description: M.length > 0 || T ? s("botlit.executions.empty.descriptionFiltered", "No executions match your filters. Try adjusting your search.") : s("botlit.executions.empty.descriptionNoData", "Executions will appear here when agents process requests.")
|
|
294
|
+
}),
|
|
295
|
+
/* @__PURE__ */ x(u, {
|
|
296
|
+
hasMore: G,
|
|
297
|
+
loadingMore: K,
|
|
298
|
+
onLoadMore: () => void q(),
|
|
299
|
+
loadedCount: V.length
|
|
293
300
|
})
|
|
294
301
|
]
|
|
295
302
|
})
|
|
296
303
|
});
|
|
297
304
|
};
|
|
298
|
-
export {
|
|
305
|
+
export { R as ExecutionsPage };
|
|
299
306
|
|
|
300
307
|
//# sourceMappingURL=ExecutionsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionsPage.js","names":["GqlExecutionStatus","SearchIcon","EXECUTION_STATUSES","ExecutionStatus","useStatusLabels","t","StatusIcon","status","CheckCircle","className","XCircle","RefreshCw","Hourglass","Activity","StatusBadge","variants","Badge","labels","ExecutionsPage","useTr","useBotlit","search","setSearch","useState","statusFilter","setStatusFilter","statusLabels","filter","useMemo","executions","useExecutions","rollup","summariseExecutions","PageLayout","Button","refetch","PagePurpose","Card","CardContent","formatNumber","TrendingUp","formatDuration","Clock","formatCurrency","DollarSign","Search","Input","prev","s","loading","i","error","ErrorState","Link","getPath","execution","Zap","formatRelativeTime","EmptyState"],"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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"}
|
|
1
|
+
{"version":3,"file":"ExecutionsPage.js","names":["GqlExecutionStatus","SearchIcon","EXECUTION_STATUSES","ExecutionStatus","useStatusLabels","t","StatusIcon","status","CheckCircle","className","XCircle","RefreshCw","Hourglass","Activity","StatusBadge","variants","Badge","labels","ExecutionsPage","useTr","useBotlit","search","setSearch","useState","statusFilter","setStatusFilter","statusLabels","filter","useMemo","executions","useExecutions","rollup","summariseExecutions","PageLayout","Button","refetch","PagePurpose","Card","CardContent","formatNumber","TrendingUp","formatDuration","Clock","formatCurrency","DollarSign","Search","Input","prev","s","loading","i","error","ErrorState","Link","getPath","execution","Zap","formatRelativeTime","EmptyState","LoadMore","loadMore"],"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 { LoadMore } from '../components/LoadMore';\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 {\n data: executions,\n loading,\n error,\n refetch,\n hasMore,\n loadingMore,\n loadMore,\n } = 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 <LoadMore\n hasMore={hasMore}\n loadingMore={loadingMore}\n onLoadMore={() => void loadMore()}\n loadedCount={executions.length}\n />\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|