@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.
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/BotmanorRoot.js.map +1 -1
- package/dist/botlit/BotmanorRootInner.js +4 -4
- package/dist/botlit/BotmanorRootInner.js.map +1 -1
- package/dist/botlit/components/ErrorState.js +33 -29
- package/dist/botlit/components/ErrorState.js.map +1 -1
- package/dist/botlit/components/RouteLoader.js +52 -48
- package/dist/botlit/components/RouteLoader.js.map +1 -1
- package/dist/botlit/components/VersionHistoryPanel.js +74 -77
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/components/WorkspaceRequired.js +31 -30
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useConversations.js.map +1 -1
- package/dist/botlit/hooks/useLLMProviders.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/A2ARegistryPage.js +116 -124
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +169 -172
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +96 -90
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.js +228 -231
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.js +84 -87
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +144 -147
- 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 +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelsPage.js +156 -149
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/ChatPage.js +126 -129
- package/dist/botlit/pages/ChatPage.js.map +1 -1
- package/dist/botlit/pages/DashboardPage.js +111 -114
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +163 -159
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +3 -3
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.js +84 -78
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +159 -154
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.js +119 -114
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.js +102 -109
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +144 -159
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.js +122 -105
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +176 -175
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/providers/BotlitProvider.js.map +1 -1
- package/dist/botlit/store/botlitStore.js +1 -1
- package/dist/botlit/store/botlitStore.js.map +1 -1
- package/dist/botlit/utils/navigation.js.map +1 -1
- package/dist/shared/hooks/useTr.js +14 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/package.json +33 -9
|
@@ -1,180 +1,181 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
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
|
|
13
|
-
import { useMemo as
|
|
14
|
-
import { PagePurpose as
|
|
15
|
-
import { jsx as
|
|
16
|
-
import { Link as
|
|
17
|
-
import { Activity as
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
]
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
36
|
-
case
|
|
37
|
-
case
|
|
38
|
-
case
|
|
39
|
-
case
|
|
40
|
-
default: return /* @__PURE__ */
|
|
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
|
-
},
|
|
47
|
+
}, I = ({ status: e, labels: t }) => /* @__PURE__ */ x(u, {
|
|
43
48
|
variant: {
|
|
44
|
-
[
|
|
45
|
-
[
|
|
46
|
-
[
|
|
47
|
-
[
|
|
48
|
-
[
|
|
49
|
-
[
|
|
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__ */
|
|
53
|
-
}),
|
|
54
|
-
let { getPath:
|
|
55
|
-
search:
|
|
56
|
-
status:
|
|
57
|
-
}), [
|
|
58
|
-
return /* @__PURE__ */
|
|
59
|
-
title: "Executions",
|
|
60
|
-
description: "Monitor agent execution history, performance, and costs",
|
|
61
|
-
actions: /* @__PURE__ */
|
|
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__ */
|
|
64
|
-
onClick: () => void
|
|
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__ */
|
|
72
|
+
children: /* @__PURE__ */ x("div", {
|
|
68
73
|
className: "space-y-6",
|
|
69
74
|
children: [
|
|
70
|
-
/* @__PURE__ */ y
|
|
71
|
-
icon: /* @__PURE__ */
|
|
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
|
-
|
|
79
|
+
U.total > 0 && /* @__PURE__ */ x("div", {
|
|
75
80
|
className: "space-y-2",
|
|
76
|
-
children: [/* @__PURE__ */
|
|
81
|
+
children: [/* @__PURE__ */ x("div", {
|
|
77
82
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
78
83
|
children: [
|
|
79
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ b(s, {
|
|
80
85
|
treatment: "glass",
|
|
81
86
|
glow: !0,
|
|
82
|
-
children: /* @__PURE__ */
|
|
87
|
+
children: /* @__PURE__ */ b(c, {
|
|
83
88
|
className: "pt-6",
|
|
84
|
-
children: /* @__PURE__ */
|
|
89
|
+
children: /* @__PURE__ */ x("div", {
|
|
85
90
|
className: "flex items-center justify-between",
|
|
86
|
-
children: [/* @__PURE__ */
|
|
91
|
+
children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
|
|
87
92
|
className: "text-sm text-text-secondary",
|
|
88
|
-
children: "Executions"
|
|
89
|
-
}), /* @__PURE__ */
|
|
93
|
+
children: u("botlit.executions.rollup.executions", "Executions")
|
|
94
|
+
}), /* @__PURE__ */ b("p", {
|
|
90
95
|
className: "text-2xl font-bold tabular-nums",
|
|
91
|
-
children:
|
|
92
|
-
})] }), /* @__PURE__ */
|
|
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__ */
|
|
101
|
+
/* @__PURE__ */ b(s, {
|
|
97
102
|
treatment: "metric",
|
|
98
|
-
children: /* @__PURE__ */
|
|
103
|
+
children: /* @__PURE__ */ b(c, {
|
|
99
104
|
className: "pt-6",
|
|
100
|
-
children: /* @__PURE__ */
|
|
105
|
+
children: /* @__PURE__ */ x("div", {
|
|
101
106
|
className: "flex items-center justify-between",
|
|
102
|
-
children: [/* @__PURE__ */
|
|
107
|
+
children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
|
|
103
108
|
className: "text-sm text-text-secondary",
|
|
104
|
-
children: "Success Rate"
|
|
105
|
-
}), /* @__PURE__ */
|
|
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: [(
|
|
108
|
-
})] }), /* @__PURE__ */
|
|
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__ */
|
|
117
|
+
/* @__PURE__ */ b(s, {
|
|
113
118
|
treatment: "metric",
|
|
114
|
-
children: /* @__PURE__ */
|
|
119
|
+
children: /* @__PURE__ */ b(c, {
|
|
115
120
|
className: "pt-6",
|
|
116
|
-
children: /* @__PURE__ */
|
|
121
|
+
children: /* @__PURE__ */ x("div", {
|
|
117
122
|
className: "flex items-center justify-between",
|
|
118
|
-
children: [/* @__PURE__ */
|
|
123
|
+
children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
|
|
119
124
|
className: "text-sm text-text-secondary",
|
|
120
|
-
children: "Avg Duration"
|
|
121
|
-
}), /* @__PURE__ */
|
|
125
|
+
children: u("botlit.executions.rollup.avgDuration", "Avg Duration")
|
|
126
|
+
}), /* @__PURE__ */ b("p", {
|
|
122
127
|
className: "text-2xl font-bold tabular-nums",
|
|
123
|
-
children:
|
|
124
|
-
})] }), /* @__PURE__ */
|
|
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__ */
|
|
133
|
+
/* @__PURE__ */ b(s, {
|
|
129
134
|
treatment: "metric",
|
|
130
|
-
children: /* @__PURE__ */
|
|
135
|
+
children: /* @__PURE__ */ b(c, {
|
|
131
136
|
className: "pt-6",
|
|
132
|
-
children: /* @__PURE__ */
|
|
137
|
+
children: /* @__PURE__ */ x("div", {
|
|
133
138
|
className: "flex items-center justify-between",
|
|
134
|
-
children: [/* @__PURE__ */
|
|
139
|
+
children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
|
|
135
140
|
className: "text-sm text-text-secondary",
|
|
136
|
-
children: "Total Cost"
|
|
137
|
-
}), /* @__PURE__ */
|
|
141
|
+
children: u("botlit.executions.rollup.totalCost", "Total Cost")
|
|
142
|
+
}), /* @__PURE__ */ b("p", {
|
|
138
143
|
className: "text-2xl font-bold tabular-nums",
|
|
139
|
-
children:
|
|
140
|
-
})] }), /* @__PURE__ */
|
|
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__ */
|
|
155
|
+
/* @__PURE__ */ x("div", {
|
|
155
156
|
className: "flex flex-wrap items-center gap-4",
|
|
156
|
-
children: [/* @__PURE__ */
|
|
157
|
+
children: [/* @__PURE__ */ x("div", {
|
|
157
158
|
className: "relative flex-1 max-w-md",
|
|
158
|
-
children: [/* @__PURE__ */
|
|
159
|
-
placeholder: "Search by run, agent, bot or input…",
|
|
160
|
-
value:
|
|
161
|
-
onChange: (e) =>
|
|
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__ */
|
|
165
|
+
}), /* @__PURE__ */ b("div", {
|
|
165
166
|
className: "flex flex-wrap gap-2",
|
|
166
|
-
children:
|
|
167
|
-
variant:
|
|
167
|
+
children: N.map((e) => /* @__PURE__ */ x(l, {
|
|
168
|
+
variant: j.includes(e) ? "default" : "outline",
|
|
168
169
|
size: "sm",
|
|
169
|
-
onClick: () =>
|
|
170
|
-
children: [/* @__PURE__ */
|
|
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:
|
|
173
|
+
children: R[e]
|
|
173
174
|
})]
|
|
174
175
|
}, e))
|
|
175
176
|
})]
|
|
176
177
|
}),
|
|
177
|
-
|
|
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__ */
|
|
186
|
-
}) :
|
|
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:
|
|
189
|
-
onRetry: () => void
|
|
190
|
-
}) :
|
|
189
|
+
error: V,
|
|
190
|
+
onRetry: () => void H()
|
|
191
|
+
}) : z.length > 0 ? /* @__PURE__ */ x("div", {
|
|
191
192
|
className: "space-y-2",
|
|
192
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
-
}),
|
|
221
|
-
to:
|
|
222
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
225
|
+
children: /* @__PURE__ */ b(c, {
|
|
225
226
|
className: "py-3",
|
|
226
|
-
children: /* @__PURE__ */
|
|
227
|
+
children: /* @__PURE__ */ x("div", {
|
|
227
228
|
className: "grid grid-cols-12 gap-4 items-center",
|
|
228
229
|
children: [
|
|
229
|
-
/* @__PURE__ */
|
|
230
|
+
/* @__PURE__ */ b("div", {
|
|
230
231
|
className: "col-span-2",
|
|
231
|
-
children: /* @__PURE__ */
|
|
232
|
+
children: /* @__PURE__ */ b(I, {
|
|
233
|
+
status: e.status,
|
|
234
|
+
labels: R
|
|
235
|
+
})
|
|
232
236
|
}),
|
|
233
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ x("div", {
|
|
234
238
|
className: "col-span-3",
|
|
235
|
-
children: [/* @__PURE__ */
|
|
239
|
+
children: [/* @__PURE__ */ b("p", {
|
|
236
240
|
className: "font-medium truncate",
|
|
237
241
|
children: e.appId ?? "—"
|
|
238
|
-
}), /* @__PURE__ */
|
|
242
|
+
}), /* @__PURE__ */ b("p", {
|
|
239
243
|
className: "text-sm text-text-secondary truncate",
|
|
240
244
|
children: e.agentId ?? "—"
|
|
241
245
|
})]
|
|
242
246
|
}),
|
|
243
|
-
/* @__PURE__ */
|
|
247
|
+
/* @__PURE__ */ b("div", {
|
|
244
248
|
className: "col-span-2",
|
|
245
|
-
children: /* @__PURE__ */
|
|
249
|
+
children: /* @__PURE__ */ x("div", {
|
|
246
250
|
className: "flex items-center gap-1",
|
|
247
|
-
children: [/* @__PURE__ */
|
|
251
|
+
children: [/* @__PURE__ */ b(T, {
|
|
248
252
|
size: 14,
|
|
249
253
|
className: "text-text-secondary"
|
|
250
|
-
}), /* @__PURE__ */
|
|
254
|
+
}), /* @__PURE__ */ b("span", { children: r(e.duration) })]
|
|
251
255
|
})
|
|
252
256
|
}),
|
|
253
|
-
/* @__PURE__ */
|
|
257
|
+
/* @__PURE__ */ b("div", {
|
|
254
258
|
className: "col-span-2",
|
|
255
|
-
children: /* @__PURE__ */
|
|
259
|
+
children: /* @__PURE__ */ x("div", {
|
|
256
260
|
className: "flex items-center gap-1",
|
|
257
|
-
children: [/* @__PURE__ */
|
|
261
|
+
children: [/* @__PURE__ */ b(M, {
|
|
258
262
|
size: 14,
|
|
259
263
|
className: "text-text-secondary"
|
|
260
|
-
}), /* @__PURE__ */
|
|
264
|
+
}), /* @__PURE__ */ b("span", { children: i(e.tokensUsed) })]
|
|
261
265
|
})
|
|
262
266
|
}),
|
|
263
|
-
/* @__PURE__ */
|
|
267
|
+
/* @__PURE__ */ b("div", {
|
|
264
268
|
className: "col-span-1",
|
|
265
|
-
children: /* @__PURE__ */
|
|
269
|
+
children: /* @__PURE__ */ x("div", {
|
|
266
270
|
className: "flex items-center gap-1",
|
|
267
|
-
children: [/* @__PURE__ */
|
|
271
|
+
children: [/* @__PURE__ */ b(E, {
|
|
268
272
|
size: 14,
|
|
269
273
|
className: "text-text-secondary"
|
|
270
|
-
}), /* @__PURE__ */
|
|
274
|
+
}), /* @__PURE__ */ b("span", { children: n(e.cost) })]
|
|
271
275
|
})
|
|
272
276
|
}),
|
|
273
|
-
/* @__PURE__ */
|
|
277
|
+
/* @__PURE__ */ b("div", {
|
|
274
278
|
className: "col-span-2 text-sm text-text-secondary",
|
|
275
|
-
children:
|
|
279
|
+
children: a(e.createdAt)
|
|
276
280
|
})
|
|
277
281
|
]
|
|
278
282
|
})
|
|
279
283
|
})
|
|
280
284
|
})
|
|
281
285
|
}, e.id))]
|
|
282
|
-
}) : /* @__PURE__ */
|
|
286
|
+
}) : /* @__PURE__ */ b(d, {
|
|
283
287
|
illustration: "empty-search",
|
|
284
|
-
title: "No executions found",
|
|
285
|
-
description:
|
|
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 {
|
|
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":"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"}
|
|
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
|
|
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
|
|
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
|
|
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" }),
|