@burdenoff/microfe-botmanor 2026.1027.2 → 2026.1028.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/botlit/BotlitRoutes.js +142 -132
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/components/AgentApprovalPanel.js +144 -126
- package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
- package/dist/botlit/components/ModelRegistrationPanel.js +4 -4
- package/dist/botlit/components/RetentionStatusPanel.js +95 -0
- package/dist/botlit/components/RetentionStatusPanel.js.map +1 -0
- package/dist/botlit/components/VersionHistoryPanel.js +92 -83
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/hooks/index.js +1 -0
- package/dist/botlit/hooks/useRetention.js +31 -0
- package/dist/botlit/hooks/useRetention.js.map +1 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js +212 -203
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/A2ARegistryPage.js +129 -117
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentApprovalsPage.js +122 -110
- package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
- package/dist/botlit/pages/AgentBuilderPage.js +18 -18
- package/dist/botlit/pages/AgentDetailPage.js +298 -273
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +145 -121
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +238 -226
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.js +307 -288
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.js +125 -116
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +159 -144
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +279 -258
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +346 -328
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelRoutesPage.js +10 -10
- package/dist/botlit/pages/ChannelsPage.js +163 -148
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/DashboardPage.js +129 -114
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionDetailPage.js +145 -139
- package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +14 -14
- package/dist/botlit/pages/InstalledPackagesPage.js +245 -227
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js +168 -156
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.js +91 -79
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServerDetailPage.js +200 -188
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +170 -155
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.js +115 -104
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/PolicyDetailPage.js +368 -324
- package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptStudioPage.js +106 -97
- package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplateDetailPage.js +359 -347
- package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplatesPage.js +127 -112
- package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfileDetailPage.js +219 -210
- package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.js +112 -103
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +264 -252
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +235 -226
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.js +115 -106
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +194 -188
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +161 -155
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/permissions/PermissionRequired.js +45 -0
- package/dist/botlit/permissions/PermissionRequired.js.map +1 -0
- package/dist/botlit/permissions/botmanorPermissions.js +72 -0
- package/dist/botlit/permissions/botmanorPermissions.js.map +1 -0
- package/dist/botlit/permissions/index.js +3 -0
- package/dist/botlit/permissions/useBotmanorPermissions.js +19 -0
- package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -0
- package/dist/botlit/utils/policyConfig.js +67 -42
- package/dist/botlit/utils/policyConfig.js.map +1 -1
- package/dist/generated/global-types.js.map +1 -1
- package/dist/generated/wspace-operations.js +90 -54
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,223 +1,229 @@
|
|
|
1
1
|
import { useBotlit as e } from "../providers/BotlitProvider.js";
|
|
2
2
|
import { formatCurrency as t, formatDuration as n, formatNumber as r, formatRelativeTime as i } from "../utils/formatters.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
3
|
+
import { BOTMANOR_PERMISSIONS as a } from "../permissions/botmanorPermissions.js";
|
|
4
|
+
import { BotmanorPermissionGate as o } from "../permissions/useBotmanorPermissions.js";
|
|
5
|
+
import { PageLayout as s } from "../components/PageLayout.js";
|
|
6
|
+
import { Button as c } from "../components/Button.js";
|
|
7
|
+
import "../permissions/index.js";
|
|
8
|
+
import { Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p } from "../components/Card.js";
|
|
9
|
+
import { Badge as m } from "../components/Badge.js";
|
|
10
|
+
import { isNative as h, nativeCopyText as g, nativeToast as _ } from "../../utils/nativeBridge.js";
|
|
11
|
+
import { EmptyState as v } from "../components/EmptyState.js";
|
|
12
|
+
import { ErrorState as y } from "../components/ErrorState.js";
|
|
13
|
+
import { toUnion as b } from "../utils/unions.js";
|
|
14
|
+
import { useCreateExecution as x, useExecution as S } from "../hooks/useExecutions.js";
|
|
15
|
+
import { ExecutionStatus as C } from "../../generated/wspace-types.js";
|
|
16
|
+
import { PagePurpose as w } from "@burdenoff/fe-libs/ui";
|
|
17
|
+
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
18
|
+
import { useParams as D } from "react-router";
|
|
19
|
+
import { AlertTriangle as O, ArrowLeft as k, CheckCircle as A, Clock as j, Copy as M, DollarSign as N, Hourglass as P, Play as F, RefreshCw as I, XCircle as L, Zap as R } from "lucide-react";
|
|
20
|
+
import { toast as z } from "sonner";
|
|
18
21
|
//#region src/botlit/pages/ExecutionDetailPage.tsx
|
|
19
|
-
var
|
|
22
|
+
var B = [
|
|
20
23
|
"AGENT",
|
|
21
24
|
"APP",
|
|
22
25
|
"WORKFLOW"
|
|
23
|
-
],
|
|
26
|
+
], V = (e) => {
|
|
24
27
|
switch (e) {
|
|
25
|
-
case
|
|
28
|
+
case C.Completed: return /* @__PURE__ */ T(A, {
|
|
26
29
|
className: "text-status-success-text",
|
|
27
30
|
size: 20
|
|
28
31
|
});
|
|
29
|
-
case
|
|
30
|
-
case
|
|
32
|
+
case C.Failed:
|
|
33
|
+
case C.Timeout: return /* @__PURE__ */ T(L, {
|
|
31
34
|
className: "text-status-error-text",
|
|
32
35
|
size: 20
|
|
33
36
|
});
|
|
34
|
-
case
|
|
37
|
+
case C.Cancelled: return /* @__PURE__ */ T(L, {
|
|
35
38
|
className: "text-text-secondary",
|
|
36
39
|
size: 20
|
|
37
40
|
});
|
|
38
|
-
case
|
|
41
|
+
case C.Running: return /* @__PURE__ */ T(I, {
|
|
39
42
|
className: "text-status-info-text motion-safe:animate-spin",
|
|
40
43
|
size: 20
|
|
41
44
|
});
|
|
42
|
-
case
|
|
45
|
+
case C.Pending: return /* @__PURE__ */ T(P, {
|
|
43
46
|
className: "text-status-warning-text",
|
|
44
47
|
size: 20
|
|
45
48
|
});
|
|
46
|
-
default: return /* @__PURE__ */
|
|
49
|
+
default: return /* @__PURE__ */ T(O, {
|
|
47
50
|
className: "text-text-secondary",
|
|
48
51
|
size: 20
|
|
49
52
|
});
|
|
50
53
|
}
|
|
51
|
-
},
|
|
54
|
+
}, H = (e) => {
|
|
52
55
|
switch (e) {
|
|
53
|
-
case
|
|
54
|
-
case
|
|
55
|
-
case
|
|
56
|
-
case
|
|
57
|
-
case
|
|
56
|
+
case C.Completed: return "success";
|
|
57
|
+
case C.Failed:
|
|
58
|
+
case C.Timeout: return "destructive";
|
|
59
|
+
case C.Pending: return "warning";
|
|
60
|
+
case C.Running: return "default";
|
|
58
61
|
default: return "secondary";
|
|
59
62
|
}
|
|
60
|
-
},
|
|
61
|
-
let { executionId:
|
|
62
|
-
if (
|
|
63
|
+
}, U = () => {
|
|
64
|
+
let { executionId: C } = D(), { navigateTo: A } = e(), { data: P, loading: L, error: U, refetch: W } = S(C), [G, K] = x();
|
|
65
|
+
if (L) return /* @__PURE__ */ T(s, {
|
|
63
66
|
title: "Loading...",
|
|
64
|
-
children: /* @__PURE__ */
|
|
67
|
+
children: /* @__PURE__ */ T("div", { className: "h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" })
|
|
65
68
|
});
|
|
66
|
-
if (
|
|
69
|
+
if (U) return /* @__PURE__ */ T(s, {
|
|
67
70
|
title: "Execution",
|
|
68
|
-
children: /* @__PURE__ */
|
|
71
|
+
children: /* @__PURE__ */ T(y, {
|
|
69
72
|
resource: "this execution",
|
|
70
|
-
error:
|
|
71
|
-
onRetry: () => void
|
|
73
|
+
error: U,
|
|
74
|
+
onRetry: () => void W()
|
|
72
75
|
})
|
|
73
76
|
});
|
|
74
|
-
if (!
|
|
77
|
+
if (!P) return /* @__PURE__ */ T(s, {
|
|
75
78
|
title: "Execution Not Found",
|
|
76
|
-
children: /* @__PURE__ */
|
|
79
|
+
children: /* @__PURE__ */ T(v, {
|
|
77
80
|
illustration: "empty-search",
|
|
78
81
|
title: "Execution Not Found",
|
|
79
82
|
description: "The execution doesn't exist.",
|
|
80
|
-
action: /* @__PURE__ */
|
|
81
|
-
onClick: () =>
|
|
83
|
+
action: /* @__PURE__ */ T(c, {
|
|
84
|
+
onClick: () => A("executions"),
|
|
82
85
|
children: "Back to Executions"
|
|
83
86
|
})
|
|
84
87
|
})
|
|
85
88
|
});
|
|
86
|
-
let
|
|
89
|
+
let q = async () => {
|
|
87
90
|
try {
|
|
88
|
-
let e = await
|
|
89
|
-
workspaceId:
|
|
90
|
-
type:
|
|
91
|
-
input:
|
|
92
|
-
appId:
|
|
93
|
-
agentId:
|
|
94
|
-
metadata: { sourceExecutionId:
|
|
91
|
+
let e = await G({ input: {
|
|
92
|
+
workspaceId: P.workspaceId,
|
|
93
|
+
type: b(P.type, B, "AGENT"),
|
|
94
|
+
input: P.input,
|
|
95
|
+
appId: P.appId,
|
|
96
|
+
agentId: P.agentId,
|
|
97
|
+
metadata: { sourceExecutionId: P.id }
|
|
95
98
|
} });
|
|
96
|
-
|
|
99
|
+
z.success("Re-run started"), A(`executions/${e.id}`);
|
|
97
100
|
} catch (e) {
|
|
98
|
-
|
|
101
|
+
z.error(e instanceof Error ? e.message : "Failed to re-run execution");
|
|
99
102
|
}
|
|
100
103
|
};
|
|
101
|
-
return /* @__PURE__ */
|
|
102
|
-
title: /* @__PURE__ */
|
|
104
|
+
return /* @__PURE__ */ T(s, {
|
|
105
|
+
title: /* @__PURE__ */ E("div", {
|
|
103
106
|
className: "flex items-center gap-3",
|
|
104
107
|
children: [
|
|
105
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ T(c, {
|
|
106
109
|
variant: "ghost",
|
|
107
110
|
size: "icon",
|
|
108
|
-
onClick: () =>
|
|
109
|
-
children: /* @__PURE__ */
|
|
111
|
+
onClick: () => A("executions"),
|
|
112
|
+
children: /* @__PURE__ */ T(k, { size: 20 })
|
|
110
113
|
}),
|
|
111
|
-
|
|
112
|
-
/* @__PURE__ */
|
|
114
|
+
V(P.status),
|
|
115
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ E("div", {
|
|
113
116
|
className: "flex items-center gap-2",
|
|
114
|
-
children: [/* @__PURE__ */
|
|
117
|
+
children: [/* @__PURE__ */ E("span", { children: [
|
|
115
118
|
"Execution ",
|
|
116
|
-
|
|
119
|
+
P.id.slice(0, 8),
|
|
117
120
|
"…"
|
|
118
|
-
] }), /* @__PURE__ */
|
|
119
|
-
variant:
|
|
120
|
-
children:
|
|
121
|
+
] }), /* @__PURE__ */ T(m, {
|
|
122
|
+
variant: H(P.status),
|
|
123
|
+
children: P.status
|
|
121
124
|
})]
|
|
122
|
-
}), /* @__PURE__ */
|
|
125
|
+
}), /* @__PURE__ */ E("p", {
|
|
123
126
|
className: "text-sm font-normal text-text-secondary",
|
|
124
127
|
children: [
|
|
125
|
-
|
|
128
|
+
P.appId ?? "—",
|
|
126
129
|
" / ",
|
|
127
|
-
|
|
130
|
+
P.agentId ?? "—"
|
|
128
131
|
]
|
|
129
132
|
})] })
|
|
130
133
|
]
|
|
131
134
|
}),
|
|
132
|
-
actions: /* @__PURE__ */
|
|
135
|
+
actions: /* @__PURE__ */ E("div", {
|
|
133
136
|
className: "flex gap-2",
|
|
134
|
-
children: [/* @__PURE__ */
|
|
137
|
+
children: [/* @__PURE__ */ T(c, {
|
|
135
138
|
variant: "outline",
|
|
136
|
-
leftIcon: /* @__PURE__ */
|
|
139
|
+
leftIcon: /* @__PURE__ */ T(M, { size: 16 }),
|
|
137
140
|
onClick: () => {
|
|
138
|
-
|
|
141
|
+
g(P.id), h() && _("Copied");
|
|
139
142
|
},
|
|
140
143
|
children: "Copy ID"
|
|
141
|
-
}), /* @__PURE__ */
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
144
|
+
}), /* @__PURE__ */ T(o, {
|
|
145
|
+
permission: a.EXECUTION_CREATE,
|
|
146
|
+
children: /* @__PURE__ */ T(c, {
|
|
147
|
+
leftIcon: /* @__PURE__ */ T(F, { size: 16 }),
|
|
148
|
+
onClick: () => void q(),
|
|
149
|
+
isLoading: K.loading,
|
|
150
|
+
children: "Run again"
|
|
151
|
+
})
|
|
146
152
|
})]
|
|
147
153
|
}),
|
|
148
|
-
children: /* @__PURE__ */
|
|
154
|
+
children: /* @__PURE__ */ E("div", {
|
|
149
155
|
className: "space-y-6",
|
|
150
156
|
children: [
|
|
151
|
-
/* @__PURE__ */
|
|
152
|
-
icon: /* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ T(w, {
|
|
158
|
+
icon: /* @__PURE__ */ T(j, { size: 18 }),
|
|
153
159
|
children: "This is the record of one agent run — its status, how long it took, the tokens and cost it consumed, and the input and output that produced the result. Use it to debug a failure, understand an unexpected answer, or audit exactly what the agent did on a given request."
|
|
154
160
|
}),
|
|
155
|
-
/* @__PURE__ */
|
|
161
|
+
/* @__PURE__ */ E("div", {
|
|
156
162
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
157
163
|
children: [
|
|
158
|
-
/* @__PURE__ */
|
|
164
|
+
/* @__PURE__ */ T(l, {
|
|
159
165
|
treatment: "glass",
|
|
160
166
|
glow: !0,
|
|
161
|
-
children: /* @__PURE__ */
|
|
167
|
+
children: /* @__PURE__ */ E(u, {
|
|
162
168
|
className: "pt-6 text-center",
|
|
163
169
|
children: [
|
|
164
|
-
/* @__PURE__ */
|
|
165
|
-
/* @__PURE__ */
|
|
170
|
+
/* @__PURE__ */ T(j, { className: "h-6 w-6 mx-auto mb-2 text-text-secondary" }),
|
|
171
|
+
/* @__PURE__ */ T("p", {
|
|
166
172
|
className: "text-2xl font-bold tabular-nums",
|
|
167
|
-
children:
|
|
173
|
+
children: P.duration === null || P.duration === void 0 ? "—" : n(P.duration)
|
|
168
174
|
}),
|
|
169
|
-
/* @__PURE__ */
|
|
175
|
+
/* @__PURE__ */ T("p", {
|
|
170
176
|
className: "text-sm text-text-secondary",
|
|
171
177
|
children: "Duration"
|
|
172
178
|
})
|
|
173
179
|
]
|
|
174
180
|
})
|
|
175
181
|
}),
|
|
176
|
-
/* @__PURE__ */
|
|
182
|
+
/* @__PURE__ */ T(l, {
|
|
177
183
|
treatment: "metric",
|
|
178
|
-
children: /* @__PURE__ */
|
|
184
|
+
children: /* @__PURE__ */ E(u, {
|
|
179
185
|
className: "pt-6 text-center",
|
|
180
186
|
children: [
|
|
181
|
-
/* @__PURE__ */
|
|
182
|
-
/* @__PURE__ */
|
|
187
|
+
/* @__PURE__ */ T(R, { className: "h-6 w-6 mx-auto mb-2 text-text-secondary" }),
|
|
188
|
+
/* @__PURE__ */ T("p", {
|
|
183
189
|
className: "text-2xl font-bold tabular-nums",
|
|
184
|
-
children: r(
|
|
190
|
+
children: r(P.tokensUsed)
|
|
185
191
|
}),
|
|
186
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ T("p", {
|
|
187
193
|
className: "text-sm text-text-secondary",
|
|
188
194
|
children: "Tokens"
|
|
189
195
|
})
|
|
190
196
|
]
|
|
191
197
|
})
|
|
192
198
|
}),
|
|
193
|
-
/* @__PURE__ */
|
|
199
|
+
/* @__PURE__ */ T(l, {
|
|
194
200
|
treatment: "metric",
|
|
195
|
-
children: /* @__PURE__ */
|
|
201
|
+
children: /* @__PURE__ */ E(u, {
|
|
196
202
|
className: "pt-6 text-center",
|
|
197
203
|
children: [
|
|
198
|
-
/* @__PURE__ */
|
|
199
|
-
/* @__PURE__ */
|
|
204
|
+
/* @__PURE__ */ T(N, { className: "h-6 w-6 mx-auto mb-2 text-text-secondary" }),
|
|
205
|
+
/* @__PURE__ */ T("p", {
|
|
200
206
|
className: "text-2xl font-bold tabular-nums",
|
|
201
|
-
children: t(
|
|
207
|
+
children: t(P.cost)
|
|
202
208
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
209
|
+
/* @__PURE__ */ T("p", {
|
|
204
210
|
className: "text-sm text-text-secondary",
|
|
205
211
|
children: "Cost"
|
|
206
212
|
})
|
|
207
213
|
]
|
|
208
214
|
})
|
|
209
215
|
}),
|
|
210
|
-
/* @__PURE__ */
|
|
216
|
+
/* @__PURE__ */ T(l, {
|
|
211
217
|
treatment: "metric",
|
|
212
|
-
children: /* @__PURE__ */
|
|
218
|
+
children: /* @__PURE__ */ E(u, {
|
|
213
219
|
className: "pt-6 text-center",
|
|
214
220
|
children: [
|
|
215
|
-
/* @__PURE__ */
|
|
216
|
-
/* @__PURE__ */
|
|
221
|
+
/* @__PURE__ */ T(I, { className: "h-6 w-6 mx-auto mb-2 text-text-secondary" }),
|
|
222
|
+
/* @__PURE__ */ T("p", {
|
|
217
223
|
className: "text-2xl font-bold capitalize",
|
|
218
|
-
children:
|
|
224
|
+
children: P.type.toLowerCase()
|
|
219
225
|
}),
|
|
220
|
-
/* @__PURE__ */
|
|
226
|
+
/* @__PURE__ */ T("p", {
|
|
221
227
|
className: "text-sm text-text-secondary",
|
|
222
228
|
children: "Type"
|
|
223
229
|
})
|
|
@@ -226,88 +232,88 @@ var R = [
|
|
|
226
232
|
})
|
|
227
233
|
]
|
|
228
234
|
}),
|
|
229
|
-
(
|
|
235
|
+
(P.errorMessage || P.errorCode) && /* @__PURE__ */ E(l, { children: [/* @__PURE__ */ E(f, { children: [/* @__PURE__ */ E(p, {
|
|
230
236
|
className: "flex items-center gap-2 text-status-error-text",
|
|
231
|
-
children: [/* @__PURE__ */
|
|
232
|
-
}),
|
|
237
|
+
children: [/* @__PURE__ */ T(O, { size: 18 }), "Failure"]
|
|
238
|
+
}), P.errorCode && /* @__PURE__ */ T(d, { children: P.errorCode })] }), /* @__PURE__ */ E(u, {
|
|
233
239
|
className: "space-y-3",
|
|
234
|
-
children: [
|
|
240
|
+
children: [P.errorMessage && /* @__PURE__ */ T("p", {
|
|
235
241
|
className: "text-sm text-text-primary",
|
|
236
|
-
children:
|
|
237
|
-
}),
|
|
242
|
+
children: P.errorMessage
|
|
243
|
+
}), P.errorDetails && /* @__PURE__ */ T("pre", {
|
|
238
244
|
className: "max-h-64 overflow-auto rounded-lg bg-bg-sunken p-3 font-mono text-xs",
|
|
239
|
-
children: JSON.stringify(
|
|
245
|
+
children: JSON.stringify(P.errorDetails, null, 2)
|
|
240
246
|
})]
|
|
241
247
|
})] }),
|
|
242
|
-
/* @__PURE__ */
|
|
248
|
+
/* @__PURE__ */ E(l, { children: [/* @__PURE__ */ T(f, { children: /* @__PURE__ */ T(p, { children: "Run Details" }) }), /* @__PURE__ */ T(u, { children: /* @__PURE__ */ E("div", {
|
|
243
249
|
className: "grid grid-cols-1 gap-6 md:grid-cols-3",
|
|
244
250
|
children: [
|
|
245
|
-
/* @__PURE__ */
|
|
251
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
|
|
246
252
|
className: "text-sm text-text-secondary",
|
|
247
253
|
children: "Execution ID"
|
|
248
|
-
}), /* @__PURE__ */
|
|
254
|
+
}), /* @__PURE__ */ T("p", {
|
|
249
255
|
className: "font-mono text-sm break-all",
|
|
250
|
-
children:
|
|
256
|
+
children: P.id
|
|
251
257
|
})] }),
|
|
252
|
-
/* @__PURE__ */
|
|
258
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
|
|
253
259
|
className: "text-sm text-text-secondary",
|
|
254
260
|
children: "Bot"
|
|
255
|
-
}), /* @__PURE__ */
|
|
261
|
+
}), /* @__PURE__ */ T("p", {
|
|
256
262
|
className: "font-mono text-sm break-all",
|
|
257
|
-
children:
|
|
263
|
+
children: P.appId ?? "—"
|
|
258
264
|
})] }),
|
|
259
|
-
/* @__PURE__ */
|
|
265
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
|
|
260
266
|
className: "text-sm text-text-secondary",
|
|
261
267
|
children: "Agent"
|
|
262
|
-
}), /* @__PURE__ */
|
|
268
|
+
}), /* @__PURE__ */ T("p", {
|
|
263
269
|
className: "font-mono text-sm break-all",
|
|
264
|
-
children:
|
|
270
|
+
children: P.agentId ?? "—"
|
|
265
271
|
})] }),
|
|
266
|
-
/* @__PURE__ */
|
|
272
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
|
|
267
273
|
className: "text-sm text-text-secondary",
|
|
268
274
|
children: "Conversation"
|
|
269
|
-
}), /* @__PURE__ */
|
|
275
|
+
}), /* @__PURE__ */ T("p", {
|
|
270
276
|
className: "font-mono text-sm break-all",
|
|
271
|
-
children:
|
|
277
|
+
children: P.conversationId ?? "—"
|
|
272
278
|
})] }),
|
|
273
|
-
/* @__PURE__ */
|
|
279
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
|
|
274
280
|
className: "text-sm text-text-secondary",
|
|
275
281
|
children: "Started"
|
|
276
|
-
}), /* @__PURE__ */
|
|
282
|
+
}), /* @__PURE__ */ T("p", {
|
|
277
283
|
className: "font-medium",
|
|
278
|
-
children: i(
|
|
284
|
+
children: i(P.createdAt)
|
|
279
285
|
})] }),
|
|
280
|
-
/* @__PURE__ */
|
|
286
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
|
|
281
287
|
className: "text-sm text-text-secondary",
|
|
282
288
|
children: "Completed"
|
|
283
|
-
}), /* @__PURE__ */
|
|
289
|
+
}), /* @__PURE__ */ T("p", {
|
|
284
290
|
className: "font-medium",
|
|
285
|
-
children: i(
|
|
291
|
+
children: i(P.completedAt)
|
|
286
292
|
})] })
|
|
287
293
|
]
|
|
288
294
|
}) })] }),
|
|
289
|
-
/* @__PURE__ */
|
|
295
|
+
/* @__PURE__ */ E("div", {
|
|
290
296
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
291
|
-
children: [/* @__PURE__ */
|
|
297
|
+
children: [/* @__PURE__ */ E(l, { children: [/* @__PURE__ */ T(f, { children: /* @__PURE__ */ T(p, { children: "Input" }) }), /* @__PURE__ */ T(u, { children: /* @__PURE__ */ T("pre", {
|
|
292
298
|
className: "max-h-96 overflow-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-sm",
|
|
293
|
-
children:
|
|
294
|
-
}) })] }), /* @__PURE__ */
|
|
299
|
+
children: P.input
|
|
300
|
+
}) })] }), /* @__PURE__ */ E(l, { children: [/* @__PURE__ */ T(f, { children: /* @__PURE__ */ T(p, { children: "Output" }) }), /* @__PURE__ */ T(u, { children: P.output ? /* @__PURE__ */ T("pre", {
|
|
295
301
|
className: "max-h-96 overflow-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-sm",
|
|
296
|
-
children:
|
|
297
|
-
}) : /* @__PURE__ */
|
|
302
|
+
children: P.output
|
|
303
|
+
}) : /* @__PURE__ */ T("p", {
|
|
298
304
|
className: "text-sm text-text-secondary",
|
|
299
305
|
children: "This run has not produced an output yet."
|
|
300
306
|
}) })] })]
|
|
301
307
|
}),
|
|
302
|
-
|
|
308
|
+
P.metadata && Object.keys(P.metadata).length > 0 && /* @__PURE__ */ E(l, { children: [/* @__PURE__ */ T(f, { children: /* @__PURE__ */ T(p, { children: "Metadata" }) }), /* @__PURE__ */ T(u, { children: /* @__PURE__ */ T("pre", {
|
|
303
309
|
className: "max-h-64 overflow-auto rounded-lg bg-bg-sunken p-3 font-mono text-xs",
|
|
304
|
-
children: JSON.stringify(
|
|
310
|
+
children: JSON.stringify(P.metadata, null, 2)
|
|
305
311
|
}) })] })
|
|
306
312
|
]
|
|
307
313
|
})
|
|
308
314
|
});
|
|
309
315
|
};
|
|
310
316
|
//#endregion
|
|
311
|
-
export {
|
|
317
|
+
export { U as ExecutionDetailPage };
|
|
312
318
|
|
|
313
319
|
//# sourceMappingURL=ExecutionDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionDetailPage.js","names":[],"sources":["../../../src/botlit/pages/ExecutionDetailPage.tsx"],"sourcesContent":["/**\n * Execution Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeCopyText, nativeToast } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Play,\n Clock,\n DollarSign,\n Zap,\n AlertTriangle,\n CheckCircle,\n XCircle,\n RefreshCw,\n Hourglass,\n Copy,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge } from '../components/Badge';\nimport { ErrorState } from '../components/ErrorState';\nimport { useExecution, useCreateExecution } from '../hooks/useExecutions';\nimport {\n formatNumber,\n formatCurrency,\n formatDuration,\n formatRelativeTime,\n MISSING_VALUE,\n} from '../utils/formatters';\nimport { toUnion } from '../utils/unions';\n\n/** Execution kinds `CreateExecutionInput.type` accepts. */\nconst EXECUTION_TYPES = ['AGENT', 'APP', 'WORKFLOW'] as const;\nimport { ExecutionStatus as GqlExecutionStatus } from '../../generated/wspace-types';\n\nconst getStatusIcon = (status: string) => {\n switch (status) {\n case GqlExecutionStatus.Completed:\n return <CheckCircle className=\"text-status-success-text\" size={20} />;\n case GqlExecutionStatus.Failed:\n case GqlExecutionStatus.Timeout:\n return <XCircle className=\"text-status-error-text\" size={20} />;\n case GqlExecutionStatus.Cancelled:\n return <XCircle className=\"text-text-secondary\" size={20} />;\n case GqlExecutionStatus.Running:\n return <RefreshCw className=\"text-status-info-text motion-safe:animate-spin\" size={20} />;\n case GqlExecutionStatus.Pending:\n return <Hourglass className=\"text-status-warning-text\" size={20} />;\n default:\n return <AlertTriangle className=\"text-text-secondary\" size={20} />;\n }\n};\n\nconst getStatusBadgeVariant = (\n status: string\n): 'success' | 'destructive' | 'warning' | 'secondary' | 'default' => {\n switch (status) {\n case GqlExecutionStatus.Completed:\n return 'success';\n case GqlExecutionStatus.Failed:\n case GqlExecutionStatus.Timeout:\n return 'destructive';\n case GqlExecutionStatus.Pending:\n return 'warning';\n case GqlExecutionStatus.Running:\n return 'default';\n default:\n return 'secondary';\n }\n};\n\nexport const ExecutionDetailPage: FC = () => {\n const { executionId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: execution, loading, error, refetch } = useExecution(executionId);\n const [createExecution, createExecutionState] = useCreateExecution();\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout title=\"Execution\">\n <ErrorState resource=\"this execution\" error={error} onRetry={() => void refetch()} />\n </PageLayout>\n );\n }\n\n if (!execution) {\n return (\n <PageLayout title=\"Execution Not Found\">\n <EmptyState\n illustration=\"empty-search\"\n title=\"Execution Not Found\"\n description=\"The execution doesn't exist.\"\n action={<Button onClick={() => navigateTo('executions')}>Back to Executions</Button>}\n />\n </PageLayout>\n );\n }\n\n /**\n * Re-runs this execution's input. The service has no dedicated replay\n * operation, so this creates a fresh execution with the same input and a\n * pointer back to the run it came from.\n */\n const handleReplay = async () => {\n try {\n const created = await createExecution({\n input: {\n workspaceId: execution.workspaceId,\n type: toUnion(execution.type, EXECUTION_TYPES, 'AGENT'),\n input: execution.input,\n appId: execution.appId,\n agentId: execution.agentId,\n metadata: { sourceExecutionId: execution.id },\n },\n });\n toast.success('Re-run started');\n navigateTo(`executions/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to re-run execution');\n }\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('executions')}>\n <ArrowLeft size={20} />\n </Button>\n {getStatusIcon(execution.status)}\n <div>\n <div className=\"flex items-center gap-2\">\n <span>Execution {execution.id.slice(0, 8)}…</span>\n <Badge variant={getStatusBadgeVariant(execution.status)}>{execution.status}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">\n {execution.appId ?? MISSING_VALUE} / {execution.agentId ?? MISSING_VALUE}\n </p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<Copy size={16} />}\n onClick={() => {\n void nativeCopyText(execution.id);\n if (isNative()) void nativeToast('Copied');\n }}\n >\n Copy ID\n </Button>\n <Button\n leftIcon={<Play size={16} />}\n onClick={() => void handleReplay()}\n isLoading={createExecutionState.loading}\n >\n Run again\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Clock size={18} />}>\n This is the record of one agent run — its status, how long it took, the tokens and cost it\n consumed, and the input and output that produced the result. Use it to debug a failure,\n understand an unexpected answer, or audit exactly what the agent did on a given request.\n </PagePurpose>\n\n {/* Metrics Summary */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6 text-center\">\n <Clock className=\"h-6 w-6 mx-auto mb-2 text-text-secondary\" />\n <p className=\"text-2xl font-bold tabular-nums\">\n {execution.duration === null || execution.duration === undefined\n ? MISSING_VALUE\n : formatDuration(execution.duration)}\n </p>\n <p className=\"text-sm text-text-secondary\">Duration</p>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6 text-center\">\n <Zap className=\"h-6 w-6 mx-auto mb-2 text-text-secondary\" />\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatNumber(execution.tokensUsed)}\n </p>\n <p className=\"text-sm text-text-secondary\">Tokens</p>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6 text-center\">\n <DollarSign className=\"h-6 w-6 mx-auto mb-2 text-text-secondary\" />\n <p className=\"text-2xl font-bold tabular-nums\">{formatCurrency(execution.cost)}</p>\n <p className=\"text-sm text-text-secondary\">Cost</p>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6 text-center\">\n <RefreshCw className=\"h-6 w-6 mx-auto mb-2 text-text-secondary\" />\n <p className=\"text-2xl font-bold capitalize\">{execution.type.toLowerCase()}</p>\n <p className=\"text-sm text-text-secondary\">Type</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Failure details */}\n {(execution.errorMessage || execution.errorCode) && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-status-error-text\">\n <AlertTriangle size={18} />\n Failure\n </CardTitle>\n {execution.errorCode && <CardDescription>{execution.errorCode}</CardDescription>}\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {execution.errorMessage && (\n <p className=\"text-sm text-text-primary\">{execution.errorMessage}</p>\n )}\n {execution.errorDetails && (\n <pre className=\"max-h-64 overflow-auto rounded-lg bg-bg-sunken p-3 font-mono text-xs\">\n {JSON.stringify(execution.errorDetails, null, 2)}\n </pre>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Identity & timings */}\n <Card>\n <CardHeader>\n <CardTitle>Run Details</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-3\">\n <div>\n <p className=\"text-sm text-text-secondary\">Execution ID</p>\n <p className=\"font-mono text-sm break-all\">{execution.id}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Bot</p>\n <p className=\"font-mono text-sm break-all\">{execution.appId ?? MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Agent</p>\n <p className=\"font-mono text-sm break-all\">{execution.agentId ?? MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Conversation</p>\n <p className=\"font-mono text-sm break-all\">\n {execution.conversationId ?? MISSING_VALUE}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Started</p>\n <p className=\"font-medium\">{formatRelativeTime(execution.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Completed</p>\n <p className=\"font-medium\">{formatRelativeTime(execution.completedAt)}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Input / Output */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Input</CardTitle>\n </CardHeader>\n <CardContent>\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-sm\">\n {execution.input}\n </pre>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Output</CardTitle>\n </CardHeader>\n <CardContent>\n {execution.output ? (\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-sm\">\n {execution.output}\n </pre>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n This run has not produced an output yet.\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n\n {/* Metadata */}\n {execution.metadata && Object.keys(execution.metadata).length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Metadata</CardTitle>\n </CardHeader>\n <CardContent>\n <pre className=\"max-h-64 overflow-auto rounded-lg bg-bg-sunken p-3 font-mono text-xs\">\n {JSON.stringify(execution.metadata, null, 2)}\n </pre>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExecutionDetailPage.js","names":[],"sources":["../../../src/botlit/pages/ExecutionDetailPage.tsx"],"sourcesContent":["/**\n * Execution Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeCopyText, nativeToast } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Play,\n Clock,\n DollarSign,\n Zap,\n AlertTriangle,\n CheckCircle,\n XCircle,\n RefreshCw,\n Hourglass,\n Copy,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge } from '../components/Badge';\nimport { ErrorState } from '../components/ErrorState';\nimport { useExecution, useCreateExecution } from '../hooks/useExecutions';\nimport {\n formatNumber,\n formatCurrency,\n formatDuration,\n formatRelativeTime,\n MISSING_VALUE,\n} from '../utils/formatters';\nimport { toUnion } from '../utils/unions';\n\n/** Execution kinds `CreateExecutionInput.type` accepts. */\nconst EXECUTION_TYPES = ['AGENT', 'APP', 'WORKFLOW'] as const;\nimport { ExecutionStatus as GqlExecutionStatus } from '../../generated/wspace-types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst getStatusIcon = (status: string) => {\n switch (status) {\n case GqlExecutionStatus.Completed:\n return <CheckCircle className=\"text-status-success-text\" size={20} />;\n case GqlExecutionStatus.Failed:\n case GqlExecutionStatus.Timeout:\n return <XCircle className=\"text-status-error-text\" size={20} />;\n case GqlExecutionStatus.Cancelled:\n return <XCircle className=\"text-text-secondary\" size={20} />;\n case GqlExecutionStatus.Running:\n return <RefreshCw className=\"text-status-info-text motion-safe:animate-spin\" size={20} />;\n case GqlExecutionStatus.Pending:\n return <Hourglass className=\"text-status-warning-text\" size={20} />;\n default:\n return <AlertTriangle className=\"text-text-secondary\" size={20} />;\n }\n};\n\nconst getStatusBadgeVariant = (\n status: string\n): 'success' | 'destructive' | 'warning' | 'secondary' | 'default' => {\n switch (status) {\n case GqlExecutionStatus.Completed:\n return 'success';\n case GqlExecutionStatus.Failed:\n case GqlExecutionStatus.Timeout:\n return 'destructive';\n case GqlExecutionStatus.Pending:\n return 'warning';\n case GqlExecutionStatus.Running:\n return 'default';\n default:\n return 'secondary';\n }\n};\n\nexport const ExecutionDetailPage: FC = () => {\n const { executionId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: execution, loading, error, refetch } = useExecution(executionId);\n const [createExecution, createExecutionState] = useCreateExecution();\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout title=\"Execution\">\n <ErrorState resource=\"this execution\" error={error} onRetry={() => void refetch()} />\n </PageLayout>\n );\n }\n\n if (!execution) {\n return (\n <PageLayout title=\"Execution Not Found\">\n <EmptyState\n illustration=\"empty-search\"\n title=\"Execution Not Found\"\n description=\"The execution doesn't exist.\"\n action={<Button onClick={() => navigateTo('executions')}>Back to Executions</Button>}\n />\n </PageLayout>\n );\n }\n\n /**\n * Re-runs this execution's input. The service has no dedicated replay\n * operation, so this creates a fresh execution with the same input and a\n * pointer back to the run it came from.\n */\n const handleReplay = async () => {\n try {\n const created = await createExecution({\n input: {\n workspaceId: execution.workspaceId,\n type: toUnion(execution.type, EXECUTION_TYPES, 'AGENT'),\n input: execution.input,\n appId: execution.appId,\n agentId: execution.agentId,\n metadata: { sourceExecutionId: execution.id },\n },\n });\n toast.success('Re-run started');\n navigateTo(`executions/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to re-run execution');\n }\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('executions')}>\n <ArrowLeft size={20} />\n </Button>\n {getStatusIcon(execution.status)}\n <div>\n <div className=\"flex items-center gap-2\">\n <span>Execution {execution.id.slice(0, 8)}…</span>\n <Badge variant={getStatusBadgeVariant(execution.status)}>{execution.status}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">\n {execution.appId ?? MISSING_VALUE} / {execution.agentId ?? MISSING_VALUE}\n </p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<Copy size={16} />}\n onClick={() => {\n void nativeCopyText(execution.id);\n if (isNative()) void nativeToast('Copied');\n }}\n >\n Copy ID\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.EXECUTION_CREATE}>\n <Button\n leftIcon={<Play size={16} />}\n onClick={() => void handleReplay()}\n isLoading={createExecutionState.loading}\n >\n Run again\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Clock size={18} />}>\n This is the record of one agent run — its status, how long it took, the tokens and cost it\n consumed, and the input and output that produced the result. Use it to debug a failure,\n understand an unexpected answer, or audit exactly what the agent did on a given request.\n </PagePurpose>\n\n {/* Metrics Summary */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6 text-center\">\n <Clock className=\"h-6 w-6 mx-auto mb-2 text-text-secondary\" />\n <p className=\"text-2xl font-bold tabular-nums\">\n {execution.duration === null || execution.duration === undefined\n ? MISSING_VALUE\n : formatDuration(execution.duration)}\n </p>\n <p className=\"text-sm text-text-secondary\">Duration</p>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6 text-center\">\n <Zap className=\"h-6 w-6 mx-auto mb-2 text-text-secondary\" />\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatNumber(execution.tokensUsed)}\n </p>\n <p className=\"text-sm text-text-secondary\">Tokens</p>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6 text-center\">\n <DollarSign className=\"h-6 w-6 mx-auto mb-2 text-text-secondary\" />\n <p className=\"text-2xl font-bold tabular-nums\">{formatCurrency(execution.cost)}</p>\n <p className=\"text-sm text-text-secondary\">Cost</p>\n </CardContent>\n </Card>\n <Card treatment=\"metric\">\n <CardContent className=\"pt-6 text-center\">\n <RefreshCw className=\"h-6 w-6 mx-auto mb-2 text-text-secondary\" />\n <p className=\"text-2xl font-bold capitalize\">{execution.type.toLowerCase()}</p>\n <p className=\"text-sm text-text-secondary\">Type</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Failure details */}\n {(execution.errorMessage || execution.errorCode) && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-status-error-text\">\n <AlertTriangle size={18} />\n Failure\n </CardTitle>\n {execution.errorCode && <CardDescription>{execution.errorCode}</CardDescription>}\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {execution.errorMessage && (\n <p className=\"text-sm text-text-primary\">{execution.errorMessage}</p>\n )}\n {execution.errorDetails && (\n <pre className=\"max-h-64 overflow-auto rounded-lg bg-bg-sunken p-3 font-mono text-xs\">\n {JSON.stringify(execution.errorDetails, null, 2)}\n </pre>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Identity & timings */}\n <Card>\n <CardHeader>\n <CardTitle>Run Details</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-3\">\n <div>\n <p className=\"text-sm text-text-secondary\">Execution ID</p>\n <p className=\"font-mono text-sm break-all\">{execution.id}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Bot</p>\n <p className=\"font-mono text-sm break-all\">{execution.appId ?? MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Agent</p>\n <p className=\"font-mono text-sm break-all\">{execution.agentId ?? MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Conversation</p>\n <p className=\"font-mono text-sm break-all\">\n {execution.conversationId ?? MISSING_VALUE}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Started</p>\n <p className=\"font-medium\">{formatRelativeTime(execution.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Completed</p>\n <p className=\"font-medium\">{formatRelativeTime(execution.completedAt)}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Input / Output */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Input</CardTitle>\n </CardHeader>\n <CardContent>\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-sm\">\n {execution.input}\n </pre>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Output</CardTitle>\n </CardHeader>\n <CardContent>\n {execution.output ? (\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-sm\">\n {execution.output}\n </pre>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n This run has not produced an output yet.\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n\n {/* Metadata */}\n {execution.metadata && Object.keys(execution.metadata).length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Metadata</CardTitle>\n </CardHeader>\n <CardContent>\n <pre className=\"max-h-64 overflow-auto rounded-lg bg-bg-sunken p-3 font-mono text-xs\">\n {JSON.stringify(execution.metadata, null, 2)}\n </pre>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|