@burdenoff/microfe-botmanor 2026.813.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +12 -0
  2. package/dist/botlit/BotlitRoutes.js +357 -0
  3. package/dist/botlit/BotlitRoutes.js.map +1 -0
  4. package/dist/botlit/BotmanorRoot.js +12 -0
  5. package/dist/botlit/BotmanorRoot.js.map +1 -0
  6. package/dist/botlit/BotmanorRootInner.js +101 -0
  7. package/dist/botlit/BotmanorRootInner.js.map +1 -0
  8. package/dist/botlit/components/Badge.js +39 -0
  9. package/dist/botlit/components/Badge.js.map +1 -0
  10. package/dist/botlit/components/Button.js +46 -0
  11. package/dist/botlit/components/Button.js.map +1 -0
  12. package/dist/botlit/components/Card.js +31 -0
  13. package/dist/botlit/components/Card.js.map +1 -0
  14. package/dist/botlit/components/ChannelSelectorSheet.js +130 -0
  15. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -0
  16. package/dist/botlit/components/EmptyState.js +35 -0
  17. package/dist/botlit/components/EmptyState.js.map +1 -0
  18. package/dist/botlit/components/ErrorState.js +33 -0
  19. package/dist/botlit/components/ErrorState.js.map +1 -0
  20. package/dist/botlit/components/Input.js +59 -0
  21. package/dist/botlit/components/Input.js.map +1 -0
  22. package/dist/botlit/components/PageLayout.js +34 -0
  23. package/dist/botlit/components/PageLayout.js.map +1 -0
  24. package/dist/botlit/components/QuotaExhaustedDialog.js +20 -0
  25. package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -0
  26. package/dist/botlit/components/RouteLoader.js +52 -0
  27. package/dist/botlit/components/RouteLoader.js.map +1 -0
  28. package/dist/botlit/components/VersionHistoryPanel.js +144 -0
  29. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -0
  30. package/dist/botlit/components/WorkspaceRequired.js +70 -0
  31. package/dist/botlit/components/WorkspaceRequired.js.map +1 -0
  32. package/dist/botlit/hooks/index.js +16 -0
  33. package/dist/botlit/hooks/internal/mutationInput.js +16 -0
  34. package/dist/botlit/hooks/internal/mutationInput.js.map +1 -0
  35. package/dist/botlit/hooks/internal/workspaceGateway.js +99 -0
  36. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -0
  37. package/dist/botlit/hooks/useA2A.js +184 -0
  38. package/dist/botlit/hooks/useA2A.js.map +1 -0
  39. package/dist/botlit/hooks/useAgents.js +469 -0
  40. package/dist/botlit/hooks/useAgents.js.map +1 -0
  41. package/dist/botlit/hooks/useBots.js +306 -0
  42. package/dist/botlit/hooks/useBots.js.map +1 -0
  43. package/dist/botlit/hooks/useBuckets.js +119 -0
  44. package/dist/botlit/hooks/useBuckets.js.map +1 -0
  45. package/dist/botlit/hooks/useChannels.js +213 -0
  46. package/dist/botlit/hooks/useChannels.js.map +1 -0
  47. package/dist/botlit/hooks/useConversations.js +64 -0
  48. package/dist/botlit/hooks/useConversations.js.map +1 -0
  49. package/dist/botlit/hooks/useExecutions.js +86 -0
  50. package/dist/botlit/hooks/useExecutions.js.map +1 -0
  51. package/dist/botlit/hooks/useKnowledgeBases.js +113 -0
  52. package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -0
  53. package/dist/botlit/hooks/useLLMProviders.js +83 -0
  54. package/dist/botlit/hooks/useLLMProviders.js.map +1 -0
  55. package/dist/botlit/hooks/useMCPServers.js +134 -0
  56. package/dist/botlit/hooks/useMCPServers.js.map +1 -0
  57. package/dist/botlit/hooks/usePolicies.js +120 -0
  58. package/dist/botlit/hooks/usePolicies.js.map +1 -0
  59. package/dist/botlit/hooks/usePromptTemplates.js +161 -0
  60. package/dist/botlit/hooks/usePromptTemplates.js.map +1 -0
  61. package/dist/botlit/hooks/useRetrievalProfiles.js +146 -0
  62. package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -0
  63. package/dist/botlit/hooks/useSkills.js +132 -0
  64. package/dist/botlit/hooks/useSkills.js.map +1 -0
  65. package/dist/botlit/hooks/useStore.js +167 -0
  66. package/dist/botlit/hooks/useStore.js.map +1 -0
  67. package/dist/botlit/hooks/useUserPlatformConnection.js +172 -0
  68. package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -0
  69. package/dist/botlit/index.js +11 -0
  70. package/dist/botlit/pages/A2AAgentDetailPage.js +589 -0
  71. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -0
  72. package/dist/botlit/pages/A2ARegistryPage.js +240 -0
  73. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -0
  74. package/dist/botlit/pages/AgentBuilderPage.js +486 -0
  75. package/dist/botlit/pages/AgentBuilderPage.js.map +1 -0
  76. package/dist/botlit/pages/AgentDetailPage.js +517 -0
  77. package/dist/botlit/pages/AgentDetailPage.js.map +1 -0
  78. package/dist/botlit/pages/AgentsListPage.js +294 -0
  79. package/dist/botlit/pages/AgentsListPage.js.map +1 -0
  80. package/dist/botlit/pages/BotChannelsTab.js +530 -0
  81. package/dist/botlit/pages/BotChannelsTab.js.map +1 -0
  82. package/dist/botlit/pages/BotDetailPage.js +872 -0
  83. package/dist/botlit/pages/BotDetailPage.js.map +1 -0
  84. package/dist/botlit/pages/BotWorkflowTab.js +229 -0
  85. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -0
  86. package/dist/botlit/pages/BotsListPage.js +313 -0
  87. package/dist/botlit/pages/BotsListPage.js.map +1 -0
  88. package/dist/botlit/pages/BucketsPage.js +604 -0
  89. package/dist/botlit/pages/BucketsPage.js.map +1 -0
  90. package/dist/botlit/pages/ChannelDetailPage.js +955 -0
  91. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -0
  92. package/dist/botlit/pages/ChannelRoutesPage.js +218 -0
  93. package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -0
  94. package/dist/botlit/pages/ChannelsPage.js +304 -0
  95. package/dist/botlit/pages/ChannelsPage.js.map +1 -0
  96. package/dist/botlit/pages/ChatPage.js +247 -0
  97. package/dist/botlit/pages/ChatPage.js.map +1 -0
  98. package/dist/botlit/pages/DashboardPage.js +318 -0
  99. package/dist/botlit/pages/DashboardPage.js.map +1 -0
  100. package/dist/botlit/pages/ExecutionDetailPage.js +313 -0
  101. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -0
  102. package/dist/botlit/pages/ExecutionsPage.js +294 -0
  103. package/dist/botlit/pages/ExecutionsPage.js.map +1 -0
  104. package/dist/botlit/pages/InstalledPackagesPage.js +619 -0
  105. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -0
  106. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +473 -0
  107. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -0
  108. package/dist/botlit/pages/KnowledgeBasesPage.js +150 -0
  109. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -0
  110. package/dist/botlit/pages/MCPServerDetailPage.js +550 -0
  111. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -0
  112. package/dist/botlit/pages/MCPServersPage.js +321 -0
  113. package/dist/botlit/pages/MCPServersPage.js.map +1 -0
  114. package/dist/botlit/pages/PoliciesPage.js +224 -0
  115. package/dist/botlit/pages/PoliciesPage.js.map +1 -0
  116. package/dist/botlit/pages/PolicyDetailPage.js +861 -0
  117. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -0
  118. package/dist/botlit/pages/PromptStudioPage.js +236 -0
  119. package/dist/botlit/pages/PromptStudioPage.js.map +1 -0
  120. package/dist/botlit/pages/PromptTemplateDetailPage.js +812 -0
  121. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -0
  122. package/dist/botlit/pages/PromptTemplatesPage.js +269 -0
  123. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -0
  124. package/dist/botlit/pages/RetrievalProfileDetailPage.js +559 -0
  125. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -0
  126. package/dist/botlit/pages/RetrievalProfilesPage.js +219 -0
  127. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -0
  128. package/dist/botlit/pages/SettingsPage.js +655 -0
  129. package/dist/botlit/pages/SettingsPage.js.map +1 -0
  130. package/dist/botlit/pages/SkillDetailPage.js +778 -0
  131. package/dist/botlit/pages/SkillDetailPage.js.map +1 -0
  132. package/dist/botlit/pages/SkillsPage.js +206 -0
  133. package/dist/botlit/pages/SkillsPage.js.map +1 -0
  134. package/dist/botlit/pages/StorePackageDetailPage.js +462 -0
  135. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -0
  136. package/dist/botlit/pages/StorePage.js +315 -0
  137. package/dist/botlit/pages/StorePage.js.map +1 -0
  138. package/dist/botlit/providers/BotlitProvider.js +93 -0
  139. package/dist/botlit/providers/BotlitProvider.js.map +1 -0
  140. package/dist/botlit/store/botlitStore.js +101 -0
  141. package/dist/botlit/store/botlitStore.js.map +1 -0
  142. package/dist/botlit/utils/cn.js +10 -0
  143. package/dist/botlit/utils/cn.js.map +1 -0
  144. package/dist/botlit/utils/formatters.js +37 -0
  145. package/dist/botlit/utils/formatters.js.map +1 -0
  146. package/dist/botlit/utils/navigation.js +9 -0
  147. package/dist/botlit/utils/navigation.js.map +1 -0
  148. package/dist/botlit/utils/unions.js +14 -0
  149. package/dist/botlit/utils/unions.js.map +1 -0
  150. package/dist/generated/global-operations.js +66 -0
  151. package/dist/generated/global-operations.js.map +1 -0
  152. package/dist/generated/global-types.js +8 -0
  153. package/dist/generated/global-types.js.map +1 -0
  154. package/dist/generated/wspace-operations.js +1591 -0
  155. package/dist/generated/wspace-operations.js.map +1 -0
  156. package/dist/generated/wspace-types.js +12 -0
  157. package/dist/generated/wspace-types.js.map +1 -0
  158. package/dist/index.js +13 -0
  159. package/dist/utils/nativeBridge.js +2 -0
  160. package/package.json +133 -0
@@ -0,0 +1,313 @@
1
+ import { useBotlit as e } from "../providers/BotlitProvider.js";
2
+ import { formatCurrency as t, formatDuration as n, formatNumber as r, formatRelativeTime as i } from "../utils/formatters.js";
3
+ import { PageLayout as a } from "../components/PageLayout.js";
4
+ import { Card as o, CardContent as s, CardDescription as c, CardHeader as l, CardTitle as u } from "../components/Card.js";
5
+ import { Button as d } from "../components/Button.js";
6
+ import { Badge as f } from "../components/Badge.js";
7
+ import { isNative as p, nativeCopyText as m, nativeToast as h } from "../../utils/nativeBridge.js";
8
+ import { EmptyState as g } from "../components/EmptyState.js";
9
+ import { ErrorState as _ } from "../components/ErrorState.js";
10
+ import { toUnion as v } from "../utils/unions.js";
11
+ import { useCreateExecution as y, useExecution as b } from "../hooks/useExecutions.js";
12
+ import { ExecutionStatus as x } from "../../generated/wspace-types.js";
13
+ import { PagePurpose as S } from "@burdenoff/fe-libs/ui";
14
+ import { jsx as C, jsxs as w } from "react/jsx-runtime";
15
+ import { useParams as T } from "react-router";
16
+ import { AlertTriangle as E, ArrowLeft as D, CheckCircle as O, Clock as k, Copy as A, DollarSign as j, Hourglass as M, Play as N, RefreshCw as P, XCircle as F, Zap as I } from "lucide-react";
17
+ import { toast as L } from "sonner";
18
+ //#region src/botlit/pages/ExecutionDetailPage.tsx
19
+ var R = [
20
+ "AGENT",
21
+ "APP",
22
+ "WORKFLOW"
23
+ ], z = (e) => {
24
+ switch (e) {
25
+ case x.Completed: return /* @__PURE__ */ C(O, {
26
+ className: "text-status-success-text",
27
+ size: 20
28
+ });
29
+ case x.Failed:
30
+ case x.Timeout: return /* @__PURE__ */ C(F, {
31
+ className: "text-status-error-text",
32
+ size: 20
33
+ });
34
+ case x.Cancelled: return /* @__PURE__ */ C(F, {
35
+ className: "text-text-secondary",
36
+ size: 20
37
+ });
38
+ case x.Running: return /* @__PURE__ */ C(P, {
39
+ className: "text-status-info-text motion-safe:animate-spin",
40
+ size: 20
41
+ });
42
+ case x.Pending: return /* @__PURE__ */ C(M, {
43
+ className: "text-status-warning-text",
44
+ size: 20
45
+ });
46
+ default: return /* @__PURE__ */ C(E, {
47
+ className: "text-text-secondary",
48
+ size: 20
49
+ });
50
+ }
51
+ }, B = (e) => {
52
+ switch (e) {
53
+ case x.Completed: return "success";
54
+ case x.Failed:
55
+ case x.Timeout: return "destructive";
56
+ case x.Pending: return "warning";
57
+ case x.Running: return "default";
58
+ default: return "secondary";
59
+ }
60
+ }, V = () => {
61
+ let { executionId: x } = T(), { navigateTo: O } = e(), { data: M, loading: F, error: V, refetch: H } = b(x), [U, W] = y();
62
+ if (F) return /* @__PURE__ */ C(a, {
63
+ title: "Loading...",
64
+ children: /* @__PURE__ */ C("div", { className: "h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" })
65
+ });
66
+ if (V) return /* @__PURE__ */ C(a, {
67
+ title: "Execution",
68
+ children: /* @__PURE__ */ C(_, {
69
+ resource: "this execution",
70
+ error: V,
71
+ onRetry: () => void H()
72
+ })
73
+ });
74
+ if (!M) return /* @__PURE__ */ C(a, {
75
+ title: "Execution Not Found",
76
+ children: /* @__PURE__ */ C(g, {
77
+ illustration: "empty-search",
78
+ title: "Execution Not Found",
79
+ description: "The execution doesn't exist.",
80
+ action: /* @__PURE__ */ C(d, {
81
+ onClick: () => O("executions"),
82
+ children: "Back to Executions"
83
+ })
84
+ })
85
+ });
86
+ let G = async () => {
87
+ try {
88
+ let e = await U({ input: {
89
+ workspaceId: M.workspaceId,
90
+ type: v(M.type, R, "AGENT"),
91
+ input: M.input,
92
+ appId: M.appId,
93
+ agentId: M.agentId,
94
+ metadata: { sourceExecutionId: M.id }
95
+ } });
96
+ L.success("Re-run started"), O(`executions/${e.id}`);
97
+ } catch (e) {
98
+ L.error(e instanceof Error ? e.message : "Failed to re-run execution");
99
+ }
100
+ };
101
+ return /* @__PURE__ */ C(a, {
102
+ title: /* @__PURE__ */ w("div", {
103
+ className: "flex items-center gap-3",
104
+ children: [
105
+ /* @__PURE__ */ C(d, {
106
+ variant: "ghost",
107
+ size: "icon",
108
+ onClick: () => O("executions"),
109
+ children: /* @__PURE__ */ C(D, { size: 20 })
110
+ }),
111
+ z(M.status),
112
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("div", {
113
+ className: "flex items-center gap-2",
114
+ children: [/* @__PURE__ */ w("span", { children: [
115
+ "Execution ",
116
+ M.id.slice(0, 8),
117
+ "…"
118
+ ] }), /* @__PURE__ */ C(f, {
119
+ variant: B(M.status),
120
+ children: M.status
121
+ })]
122
+ }), /* @__PURE__ */ w("p", {
123
+ className: "text-sm font-normal text-text-secondary",
124
+ children: [
125
+ M.appId ?? "—",
126
+ " / ",
127
+ M.agentId ?? "—"
128
+ ]
129
+ })] })
130
+ ]
131
+ }),
132
+ actions: /* @__PURE__ */ w("div", {
133
+ className: "flex gap-2",
134
+ children: [/* @__PURE__ */ C(d, {
135
+ variant: "outline",
136
+ leftIcon: /* @__PURE__ */ C(A, { size: 16 }),
137
+ onClick: () => {
138
+ m(M.id), p() && h("Copied");
139
+ },
140
+ children: "Copy ID"
141
+ }), /* @__PURE__ */ C(d, {
142
+ leftIcon: /* @__PURE__ */ C(N, { size: 16 }),
143
+ onClick: () => void G(),
144
+ isLoading: W.loading,
145
+ children: "Run again"
146
+ })]
147
+ }),
148
+ children: /* @__PURE__ */ w("div", {
149
+ className: "space-y-6",
150
+ children: [
151
+ /* @__PURE__ */ C(S, {
152
+ icon: /* @__PURE__ */ C(k, { size: 18 }),
153
+ 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
+ }),
155
+ /* @__PURE__ */ w("div", {
156
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
157
+ children: [
158
+ /* @__PURE__ */ C(o, {
159
+ treatment: "glass",
160
+ glow: !0,
161
+ children: /* @__PURE__ */ w(s, {
162
+ className: "pt-6 text-center",
163
+ children: [
164
+ /* @__PURE__ */ C(k, { className: "h-6 w-6 mx-auto mb-2 text-text-secondary" }),
165
+ /* @__PURE__ */ C("p", {
166
+ className: "text-2xl font-bold tabular-nums",
167
+ children: M.duration === null || M.duration === void 0 ? "—" : n(M.duration)
168
+ }),
169
+ /* @__PURE__ */ C("p", {
170
+ className: "text-sm text-text-secondary",
171
+ children: "Duration"
172
+ })
173
+ ]
174
+ })
175
+ }),
176
+ /* @__PURE__ */ C(o, {
177
+ treatment: "metric",
178
+ children: /* @__PURE__ */ w(s, {
179
+ className: "pt-6 text-center",
180
+ children: [
181
+ /* @__PURE__ */ C(I, { className: "h-6 w-6 mx-auto mb-2 text-text-secondary" }),
182
+ /* @__PURE__ */ C("p", {
183
+ className: "text-2xl font-bold tabular-nums",
184
+ children: r(M.tokensUsed)
185
+ }),
186
+ /* @__PURE__ */ C("p", {
187
+ className: "text-sm text-text-secondary",
188
+ children: "Tokens"
189
+ })
190
+ ]
191
+ })
192
+ }),
193
+ /* @__PURE__ */ C(o, {
194
+ treatment: "metric",
195
+ children: /* @__PURE__ */ w(s, {
196
+ className: "pt-6 text-center",
197
+ children: [
198
+ /* @__PURE__ */ C(j, { className: "h-6 w-6 mx-auto mb-2 text-text-secondary" }),
199
+ /* @__PURE__ */ C("p", {
200
+ className: "text-2xl font-bold tabular-nums",
201
+ children: t(M.cost)
202
+ }),
203
+ /* @__PURE__ */ C("p", {
204
+ className: "text-sm text-text-secondary",
205
+ children: "Cost"
206
+ })
207
+ ]
208
+ })
209
+ }),
210
+ /* @__PURE__ */ C(o, {
211
+ treatment: "metric",
212
+ children: /* @__PURE__ */ w(s, {
213
+ className: "pt-6 text-center",
214
+ children: [
215
+ /* @__PURE__ */ C(P, { className: "h-6 w-6 mx-auto mb-2 text-text-secondary" }),
216
+ /* @__PURE__ */ C("p", {
217
+ className: "text-2xl font-bold capitalize",
218
+ children: M.type.toLowerCase()
219
+ }),
220
+ /* @__PURE__ */ C("p", {
221
+ className: "text-sm text-text-secondary",
222
+ children: "Type"
223
+ })
224
+ ]
225
+ })
226
+ })
227
+ ]
228
+ }),
229
+ (M.errorMessage || M.errorCode) && /* @__PURE__ */ w(o, { children: [/* @__PURE__ */ w(l, { children: [/* @__PURE__ */ w(u, {
230
+ className: "flex items-center gap-2 text-status-error-text",
231
+ children: [/* @__PURE__ */ C(E, { size: 18 }), "Failure"]
232
+ }), M.errorCode && /* @__PURE__ */ C(c, { children: M.errorCode })] }), /* @__PURE__ */ w(s, {
233
+ className: "space-y-3",
234
+ children: [M.errorMessage && /* @__PURE__ */ C("p", {
235
+ className: "text-sm text-text-primary",
236
+ children: M.errorMessage
237
+ }), M.errorDetails && /* @__PURE__ */ C("pre", {
238
+ className: "max-h-64 overflow-auto rounded-lg bg-bg-sunken p-3 font-mono text-xs",
239
+ children: JSON.stringify(M.errorDetails, null, 2)
240
+ })]
241
+ })] }),
242
+ /* @__PURE__ */ w(o, { children: [/* @__PURE__ */ C(l, { children: /* @__PURE__ */ C(u, { children: "Run Details" }) }), /* @__PURE__ */ C(s, { children: /* @__PURE__ */ w("div", {
243
+ className: "grid grid-cols-1 gap-6 md:grid-cols-3",
244
+ children: [
245
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
246
+ className: "text-sm text-text-secondary",
247
+ children: "Execution ID"
248
+ }), /* @__PURE__ */ C("p", {
249
+ className: "font-mono text-sm break-all",
250
+ children: M.id
251
+ })] }),
252
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
253
+ className: "text-sm text-text-secondary",
254
+ children: "Bot"
255
+ }), /* @__PURE__ */ C("p", {
256
+ className: "font-mono text-sm break-all",
257
+ children: M.appId ?? "—"
258
+ })] }),
259
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
260
+ className: "text-sm text-text-secondary",
261
+ children: "Agent"
262
+ }), /* @__PURE__ */ C("p", {
263
+ className: "font-mono text-sm break-all",
264
+ children: M.agentId ?? "—"
265
+ })] }),
266
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
267
+ className: "text-sm text-text-secondary",
268
+ children: "Conversation"
269
+ }), /* @__PURE__ */ C("p", {
270
+ className: "font-mono text-sm break-all",
271
+ children: M.conversationId ?? "—"
272
+ })] }),
273
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
274
+ className: "text-sm text-text-secondary",
275
+ children: "Started"
276
+ }), /* @__PURE__ */ C("p", {
277
+ className: "font-medium",
278
+ children: i(M.createdAt)
279
+ })] }),
280
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
281
+ className: "text-sm text-text-secondary",
282
+ children: "Completed"
283
+ }), /* @__PURE__ */ C("p", {
284
+ className: "font-medium",
285
+ children: i(M.completedAt)
286
+ })] })
287
+ ]
288
+ }) })] }),
289
+ /* @__PURE__ */ w("div", {
290
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
291
+ children: [/* @__PURE__ */ w(o, { children: [/* @__PURE__ */ C(l, { children: /* @__PURE__ */ C(u, { children: "Input" }) }), /* @__PURE__ */ C(s, { children: /* @__PURE__ */ C("pre", {
292
+ className: "max-h-96 overflow-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-sm",
293
+ children: M.input
294
+ }) })] }), /* @__PURE__ */ w(o, { children: [/* @__PURE__ */ C(l, { children: /* @__PURE__ */ C(u, { children: "Output" }) }), /* @__PURE__ */ C(s, { children: M.output ? /* @__PURE__ */ C("pre", {
295
+ className: "max-h-96 overflow-auto whitespace-pre-wrap rounded-lg bg-bg-sunken p-3 text-sm",
296
+ children: M.output
297
+ }) : /* @__PURE__ */ C("p", {
298
+ className: "text-sm text-text-secondary",
299
+ children: "This run has not produced an output yet."
300
+ }) })] })]
301
+ }),
302
+ M.metadata && Object.keys(M.metadata).length > 0 && /* @__PURE__ */ w(o, { children: [/* @__PURE__ */ C(l, { children: /* @__PURE__ */ C(u, { children: "Metadata" }) }), /* @__PURE__ */ C(s, { children: /* @__PURE__ */ C("pre", {
303
+ className: "max-h-64 overflow-auto rounded-lg bg-bg-sunken p-3 font-mono text-xs",
304
+ children: JSON.stringify(M.metadata, null, 2)
305
+ }) })] })
306
+ ]
307
+ })
308
+ });
309
+ };
310
+ //#endregion
311
+ export { V as ExecutionDetailPage };
312
+
313
+ //# sourceMappingURL=ExecutionDetailPage.js.map
@@ -0,0 +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":";;;;;;;;;;;;;;;;;;AAyCA,IAAM,IAAkB;CAAC;CAAS;CAAO;CAAW,EAG9C,KAAiB,MAAmB;AACxC,SAAQ,GAAR;EACE,KAAK,EAAmB,UACtB,QAAO,kBAAC,GAAD;GAAa,WAAU;GAA2B,MAAM;GAAM,CAAA;EACvE,KAAK,EAAmB;EACxB,KAAK,EAAmB,QACtB,QAAO,kBAAC,GAAD;GAAS,WAAU;GAAyB,MAAM;GAAM,CAAA;EACjE,KAAK,EAAmB,UACtB,QAAO,kBAAC,GAAD;GAAS,WAAU;GAAsB,MAAM;GAAM,CAAA;EAC9D,KAAK,EAAmB,QACtB,QAAO,kBAAC,GAAD;GAAW,WAAU;GAAiD,MAAM;GAAM,CAAA;EAC3F,KAAK,EAAmB,QACtB,QAAO,kBAAC,GAAD;GAAW,WAAU;GAA2B,MAAM;GAAM,CAAA;EACrE,QACE,QAAO,kBAAC,GAAD;GAAe,WAAU;GAAsB,MAAM;GAAM,CAAA;;GAIlE,KACJ,MACoE;AACpE,SAAQ,GAAR;EACE,KAAK,EAAmB,UACtB,QAAO;EACT,KAAK,EAAmB;EACxB,KAAK,EAAmB,QACtB,QAAO;EACT,KAAK,EAAmB,QACtB,QAAO;EACT,KAAK,EAAmB,QACtB,QAAO;EACT,QACE,QAAO;;GAIA,UAAgC;CAC3C,IAAM,EAAE,mBAAgB,GAAW,EAC7B,EAAE,kBAAe,GAAW,EAC5B,EAAE,MAAM,GAAW,YAAS,UAAO,eAAY,EAAa,EAAY,EACxE,CAAC,GAAiB,KAAwB,GAAoB;AAEpE,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,OAAD,EAAK,WAAU,+DAAgE,CAAA;EACpE,CAAA;AAIjB,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,GAAD;GAAY,UAAS;GAAwB;GAAO,eAAe,KAAK,GAAS;GAAI,CAAA;EAC1E,CAAA;AAIjB,KAAI,CAAC,EACH,QACE,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,QAAQ,kBAAC,GAAD;IAAQ,eAAe,EAAW,aAAa;cAAE;IAA2B,CAAA;GACpF,CAAA;EACS,CAAA;CASjB,IAAM,IAAe,YAAY;AAC/B,MAAI;GACF,IAAM,IAAU,MAAM,EAAgB,EACpC,OAAO;IACL,aAAa,EAAU;IACvB,MAAM,EAAQ,EAAU,MAAM,GAAiB,QAAQ;IACvD,OAAO,EAAU;IACjB,OAAO,EAAU;IACjB,SAAS,EAAU;IACnB,UAAU,EAAE,mBAAmB,EAAU,IAAI;IAC9C,EACF,CAAC;AAEF,GADA,EAAM,QAAQ,iBAAiB,EAC/B,EAAW,cAAc,EAAQ,KAAK;WAC/B,GAAK;AACZ,KAAM,MAAM,aAAe,QAAQ,EAAI,UAAU,6BAA6B;;;AAIlF,QACE,kBAAC,GAAD;EACE,OACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KAAQ,SAAQ;KAAQ,MAAK;KAAO,eAAe,EAAW,aAAa;eACzE,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;KAChB,CAAA;IACR,EAAc,EAAU,OAAO;IAChC,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD,EAAA,UAAA;MAAM;MAAW,EAAU,GAAG,MAAM,GAAG,EAAE;MAAC;MAAQ,EAAA,CAAA,EAClD,kBAAC,GAAD;MAAO,SAAS,EAAsB,EAAU,OAAO;gBAAG,EAAU;MAAe,CAAA,CAC/E;QACN,kBAAC,KAAD;KAAG,WAAU;eAAb;MACG,EAAU,SAAA;MAAuB;MAAI,EAAU,WAAA;MAC9C;OACA,EAAA,CAAA;IACF;;EAER,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IACE,SAAQ;IACR,UAAU,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IAC5B,eAAe;AAEb,KADK,EAAe,EAAU,GAAG,EAC7B,GAAU,IAAO,EAAY,SAAS;;cAE7C;IAEQ,CAAA,EACT,kBAAC,GAAD;IACE,UAAU,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IAC5B,eAAe,KAAK,GAAc;IAClC,WAAW,EAAqB;cACjC;IAEQ,CAAA,CACL;;YAGR,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KAAa,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;eAAE;KAI1B,CAAA;IAGd,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OAAM,WAAU;OAAQ,MAAA;iBACtB,kBAAC,GAAD;QAAa,WAAU;kBAAvB;SACE,kBAAC,GAAD,EAAO,WAAU,4CAA6C,CAAA;SAC9D,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAU,aAAa,QAAQ,EAAU,aAAa,KAAA,IAAA,MAEnD,EAAe,EAAU,SAAS;UACpC,CAAA;SACJ,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAY,CAAA;SAC3C;;OACT,CAAA;MACP,kBAAC,GAAD;OAAM,WAAU;iBACd,kBAAC,GAAD;QAAa,WAAU;kBAAvB;SACE,kBAAC,GAAD,EAAK,WAAU,4CAA6C,CAAA;SAC5D,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAa,EAAU,WAAW;UACjC,CAAA;SACJ,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAU,CAAA;SACzC;;OACT,CAAA;MACP,kBAAC,GAAD;OAAM,WAAU;iBACd,kBAAC,GAAD;QAAa,WAAU;kBAAvB;SACE,kBAAC,GAAD,EAAY,WAAU,4CAA6C,CAAA;SACnE,kBAAC,KAAD;UAAG,WAAU;oBAAmC,EAAe,EAAU,KAAK;UAAK,CAAA;SACnF,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAQ,CAAA;SACvC;;OACT,CAAA;MACP,kBAAC,GAAD;OAAM,WAAU;iBACd,kBAAC,GAAD;QAAa,WAAU;kBAAvB;SACE,kBAAC,GAAD,EAAW,WAAU,4CAA6C,CAAA;SAClE,kBAAC,KAAD;UAAG,WAAU;oBAAiC,EAAU,KAAK,aAAa;UAAK,CAAA;SAC/E,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAQ,CAAA;SACvC;;OACT,CAAA;MACH;;KAGJ,EAAU,gBAAgB,EAAU,cACpC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KAAW,WAAU;eAArB,CACE,kBAAC,GAAD,EAAe,MAAM,IAAM,CAAA,EAAA,UAEjB;QACX,EAAU,aAAa,kBAAC,GAAD,EAAA,UAAkB,EAAU,WAA4B,CAAA,CACrE,EAAA,CAAA,EACb,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACG,EAAU,gBACT,kBAAC,KAAD;MAAG,WAAU;gBAA6B,EAAU;MAAiB,CAAA,EAEtE,EAAU,gBACT,kBAAC,OAAD;MAAK,WAAU;gBACZ,KAAK,UAAU,EAAU,cAAc,MAAM,EAAE;MAC5C,CAAA,CAEI;OACT,EAAA,CAAA;IAIT,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,eAAuB,CAAA,EACvB,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAgB,CAAA,EAC3D,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAU;OAAO,CAAA,CACzD,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAO,CAAA,EAClD,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAU,SAAA;OAA2B,CAAA,CAC7E,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAS,CAAA,EACpD,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAU,WAAA;OAA6B,CAAA,CAC/E,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAgB,CAAA,EAC3D,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAU,kBAAA;OACT,CAAA,CACA,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAW,CAAA,EACtD,kBAAC,KAAD;OAAG,WAAU;iBAAe,EAAmB,EAAU,UAAU;OAAK,CAAA,CACpE,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAa,CAAA,EACxD,kBAAC,KAAD;OAAG,WAAU;iBAAe,EAAmB,EAAU,YAAY;OAAK,CAAA,CACtE,EAAA,CAAA;MACF;QACM,CAAA,CACT,EAAA,CAAA;IAGP,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,SAAiB,CAAA,EACjB,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAU;MACP,CAAA,EACM,CAAA,CACT,EAAA,CAAA,EACP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,UAAkB,CAAA,EAClB,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,EAAU,SACT,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAU;MACP,CAAA,GAEN,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA,EAEM,CAAA,CACT,EAAA,CAAA,CACH;;IAGL,EAAU,YAAY,OAAO,KAAK,EAAU,SAAS,CAAC,SAAS,KAC9D,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,YAAoB,CAAA,EACpB,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;eACZ,KAAK,UAAU,EAAU,UAAU,MAAM,EAAE;KACxC,CAAA,EACM,CAAA,CACT,EAAA,CAAA;IAEL;;EACK,CAAA"}
@@ -0,0 +1,294 @@
1
+ import { useBotlit as e } from "../providers/BotlitProvider.js";
2
+ import { formatCurrency as t, formatDuration as n, formatNumber as r, formatRelativeTime as i } from "../utils/formatters.js";
3
+ import { PageLayout as a } from "../components/PageLayout.js";
4
+ import { Card as o, CardContent as s } from "../components/Card.js";
5
+ import { Button as c } from "../components/Button.js";
6
+ import { Badge as l } from "../components/Badge.js";
7
+ import { EmptyState as u } from "../components/EmptyState.js";
8
+ import { Input as d } from "../components/Input.js";
9
+ import { ErrorState as f } from "../components/ErrorState.js";
10
+ import { summariseExecutions as p, useExecutions as m } from "../hooks/useExecutions.js";
11
+ import "../hooks/index.js";
12
+ import { ExecutionStatus as h } from "../../generated/wspace-types.js";
13
+ import { useMemo as g, useState as _ } from "react";
14
+ import { PagePurpose as v } from "@burdenoff/fe-libs/ui";
15
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
16
+ import { Link as x } from "react-router";
17
+ import { Activity as S, CheckCircle as C, Clock as w, DollarSign as T, Hourglass as E, RefreshCw as D, Search as O, TrendingUp as k, XCircle as A, Zap as j } from "lucide-react";
18
+ //#region src/botlit/pages/ExecutionsPage.tsx
19
+ var M = [
20
+ h.Completed,
21
+ h.Running,
22
+ h.Pending,
23
+ h.Failed,
24
+ h.Timeout,
25
+ h.Cancelled
26
+ ], N = {
27
+ [h.Completed]: "Completed",
28
+ [h.Running]: "Running",
29
+ [h.Pending]: "Pending",
30
+ [h.Failed]: "Failed",
31
+ [h.Timeout]: "Timed out",
32
+ [h.Cancelled]: "Cancelled"
33
+ }, P = ({ status: e, className: t }) => {
34
+ switch (e) {
35
+ case h.Completed: return /* @__PURE__ */ y(C, { className: t ?? "h-4 w-4 text-status-success-text" });
36
+ case h.Failed:
37
+ case h.Timeout: return /* @__PURE__ */ y(A, { className: t ?? "h-4 w-4 text-status-error-text" });
38
+ case h.Running: return /* @__PURE__ */ y(D, { className: t ?? "h-4 w-4 text-status-info-text motion-safe:animate-spin" });
39
+ case h.Pending: return /* @__PURE__ */ y(E, { className: t ?? "h-4 w-4 text-status-warning-text" });
40
+ default: return /* @__PURE__ */ y(S, { className: t ?? "h-4 w-4 text-text-secondary" });
41
+ }
42
+ }, F = ({ status: e }) => /* @__PURE__ */ b(l, {
43
+ variant: {
44
+ [h.Completed]: "success",
45
+ [h.Failed]: "destructive",
46
+ [h.Timeout]: "destructive",
47
+ [h.Running]: "default",
48
+ [h.Pending]: "warning",
49
+ [h.Cancelled]: "secondary"
50
+ }[e] ?? "secondary",
51
+ className: "flex items-center gap-1",
52
+ children: [/* @__PURE__ */ y(P, { status: e }), N[e] ?? e]
53
+ }), I = () => {
54
+ let { getPath: l } = e(), [h, C] = _(""), [E, A] = _([]), { data: I, loading: L, error: R, refetch: z } = m(g(() => ({
55
+ search: h,
56
+ status: E
57
+ }), [h, E])), B = g(() => p(I), [I]);
58
+ return /* @__PURE__ */ y(a, {
59
+ title: "Executions",
60
+ description: "Monitor agent execution history, performance, and costs",
61
+ actions: /* @__PURE__ */ y(c, {
62
+ variant: "outline",
63
+ leftIcon: /* @__PURE__ */ y(D, { size: 16 }),
64
+ onClick: () => void z(),
65
+ children: "Refresh"
66
+ }),
67
+ children: /* @__PURE__ */ b("div", {
68
+ className: "space-y-6",
69
+ children: [
70
+ /* @__PURE__ */ y(v, {
71
+ icon: /* @__PURE__ */ y(S, { size: 18 }),
72
+ children: "An execution is a single run of an agent — one request in, one response out. This page is your observability and cost dashboard: see which runs succeeded or failed, how long they took, how many tokens they burned and what they cost. Use it to spot failing agents, runaway spend and latency regressions, then open any run to inspect its full trace."
73
+ }),
74
+ B.total > 0 && /* @__PURE__ */ b("div", {
75
+ className: "space-y-2",
76
+ children: [/* @__PURE__ */ b("div", {
77
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
78
+ children: [
79
+ /* @__PURE__ */ y(o, {
80
+ treatment: "glass",
81
+ glow: !0,
82
+ children: /* @__PURE__ */ y(s, {
83
+ className: "pt-6",
84
+ children: /* @__PURE__ */ b("div", {
85
+ className: "flex items-center justify-between",
86
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
87
+ className: "text-sm text-text-secondary",
88
+ children: "Executions"
89
+ }), /* @__PURE__ */ y("p", {
90
+ className: "text-2xl font-bold tabular-nums",
91
+ children: r(B.total)
92
+ })] }), /* @__PURE__ */ y(S, { className: "h-8 w-8 text-text-secondary" })]
93
+ })
94
+ })
95
+ }),
96
+ /* @__PURE__ */ y(o, {
97
+ treatment: "metric",
98
+ children: /* @__PURE__ */ y(s, {
99
+ className: "pt-6",
100
+ children: /* @__PURE__ */ b("div", {
101
+ className: "flex items-center justify-between",
102
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
103
+ className: "text-sm text-text-secondary",
104
+ children: "Success Rate"
105
+ }), /* @__PURE__ */ b("p", {
106
+ className: "text-2xl font-bold tabular-nums text-status-success-text",
107
+ children: [(B.successRate * 100).toFixed(1), "%"]
108
+ })] }), /* @__PURE__ */ y(k, { className: "h-8 w-8 text-status-success-text" })]
109
+ })
110
+ })
111
+ }),
112
+ /* @__PURE__ */ y(o, {
113
+ treatment: "metric",
114
+ children: /* @__PURE__ */ y(s, {
115
+ className: "pt-6",
116
+ children: /* @__PURE__ */ b("div", {
117
+ className: "flex items-center justify-between",
118
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
119
+ className: "text-sm text-text-secondary",
120
+ children: "Avg Duration"
121
+ }), /* @__PURE__ */ y("p", {
122
+ className: "text-2xl font-bold tabular-nums",
123
+ children: n(B.avgDurationMs)
124
+ })] }), /* @__PURE__ */ y(w, { className: "h-8 w-8 text-text-secondary" })]
125
+ })
126
+ })
127
+ }),
128
+ /* @__PURE__ */ y(o, {
129
+ treatment: "metric",
130
+ children: /* @__PURE__ */ y(s, {
131
+ className: "pt-6",
132
+ children: /* @__PURE__ */ b("div", {
133
+ className: "flex items-center justify-between",
134
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
135
+ className: "text-sm text-text-secondary",
136
+ children: "Total Cost"
137
+ }), /* @__PURE__ */ y("p", {
138
+ className: "text-2xl font-bold tabular-nums",
139
+ children: t(B.totalCost)
140
+ })] }), /* @__PURE__ */ y(T, { className: "h-8 w-8 text-text-secondary" })]
141
+ })
142
+ })
143
+ })
144
+ ]
145
+ }), /* @__PURE__ */ b("p", {
146
+ className: "text-xs text-text-secondary",
147
+ children: [
148
+ "Calculated across the ",
149
+ r(B.total),
150
+ " runs shown below."
151
+ ]
152
+ })]
153
+ }),
154
+ /* @__PURE__ */ b("div", {
155
+ className: "flex flex-wrap items-center gap-4",
156
+ children: [/* @__PURE__ */ b("div", {
157
+ className: "relative flex-1 max-w-md",
158
+ children: [/* @__PURE__ */ y(O, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ y(d, {
159
+ placeholder: "Search by run, agent, bot or input…",
160
+ value: h,
161
+ onChange: (e) => C(e.target.value),
162
+ className: "pl-9"
163
+ })]
164
+ }), /* @__PURE__ */ y("div", {
165
+ className: "flex flex-wrap gap-2",
166
+ children: M.map((e) => /* @__PURE__ */ b(c, {
167
+ variant: E.includes(e) ? "default" : "outline",
168
+ size: "sm",
169
+ onClick: () => A((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]),
170
+ children: [/* @__PURE__ */ y(P, { status: e }), /* @__PURE__ */ y("span", {
171
+ className: "ml-1",
172
+ children: N[e]
173
+ })]
174
+ }, e))
175
+ })]
176
+ }),
177
+ L ? /* @__PURE__ */ y("div", {
178
+ className: "space-y-4",
179
+ children: [
180
+ 1,
181
+ 2,
182
+ 3,
183
+ 4,
184
+ 5
185
+ ].map((e) => /* @__PURE__ */ y("div", { className: "h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
186
+ }) : R ? /* @__PURE__ */ y(f, {
187
+ resource: "executions",
188
+ error: R,
189
+ onRetry: () => void z()
190
+ }) : I.length > 0 ? /* @__PURE__ */ b("div", {
191
+ className: "space-y-2",
192
+ children: [/* @__PURE__ */ b("div", {
193
+ className: "grid grid-cols-12 gap-4 px-4 py-2 text-sm font-medium text-text-secondary border-b border-border-subtle",
194
+ children: [
195
+ /* @__PURE__ */ y("div", {
196
+ className: "col-span-2",
197
+ children: "Status"
198
+ }),
199
+ /* @__PURE__ */ y("div", {
200
+ className: "col-span-3",
201
+ children: "Bot / Agent"
202
+ }),
203
+ /* @__PURE__ */ y("div", {
204
+ className: "col-span-2",
205
+ children: "Duration"
206
+ }),
207
+ /* @__PURE__ */ y("div", {
208
+ className: "col-span-2",
209
+ children: "Tokens"
210
+ }),
211
+ /* @__PURE__ */ y("div", {
212
+ className: "col-span-1",
213
+ children: "Cost"
214
+ }),
215
+ /* @__PURE__ */ y("div", {
216
+ className: "col-span-2",
217
+ children: "Started"
218
+ })
219
+ ]
220
+ }), I.map((e) => /* @__PURE__ */ y(x, {
221
+ to: l(`executions/${e.id}`),
222
+ children: /* @__PURE__ */ y(o, {
223
+ className: "hover:border-primary/50 transition-colors cursor-pointer",
224
+ children: /* @__PURE__ */ y(s, {
225
+ className: "py-3",
226
+ children: /* @__PURE__ */ b("div", {
227
+ className: "grid grid-cols-12 gap-4 items-center",
228
+ children: [
229
+ /* @__PURE__ */ y("div", {
230
+ className: "col-span-2",
231
+ children: /* @__PURE__ */ y(F, { status: e.status })
232
+ }),
233
+ /* @__PURE__ */ b("div", {
234
+ className: "col-span-3",
235
+ children: [/* @__PURE__ */ y("p", {
236
+ className: "font-medium truncate",
237
+ children: e.appId ?? "—"
238
+ }), /* @__PURE__ */ y("p", {
239
+ className: "text-sm text-text-secondary truncate",
240
+ children: e.agentId ?? "—"
241
+ })]
242
+ }),
243
+ /* @__PURE__ */ y("div", {
244
+ className: "col-span-2",
245
+ children: /* @__PURE__ */ b("div", {
246
+ className: "flex items-center gap-1",
247
+ children: [/* @__PURE__ */ y(w, {
248
+ size: 14,
249
+ className: "text-text-secondary"
250
+ }), /* @__PURE__ */ y("span", { children: n(e.duration) })]
251
+ })
252
+ }),
253
+ /* @__PURE__ */ y("div", {
254
+ className: "col-span-2",
255
+ children: /* @__PURE__ */ b("div", {
256
+ className: "flex items-center gap-1",
257
+ children: [/* @__PURE__ */ y(j, {
258
+ size: 14,
259
+ className: "text-text-secondary"
260
+ }), /* @__PURE__ */ y("span", { children: r(e.tokensUsed) })]
261
+ })
262
+ }),
263
+ /* @__PURE__ */ y("div", {
264
+ className: "col-span-1",
265
+ children: /* @__PURE__ */ b("div", {
266
+ className: "flex items-center gap-1",
267
+ children: [/* @__PURE__ */ y(T, {
268
+ size: 14,
269
+ className: "text-text-secondary"
270
+ }), /* @__PURE__ */ y("span", { children: t(e.cost) })]
271
+ })
272
+ }),
273
+ /* @__PURE__ */ y("div", {
274
+ className: "col-span-2 text-sm text-text-secondary",
275
+ children: i(e.createdAt)
276
+ })
277
+ ]
278
+ })
279
+ })
280
+ })
281
+ }, e.id))]
282
+ }) : /* @__PURE__ */ y(u, {
283
+ illustration: "empty-search",
284
+ title: "No executions found",
285
+ description: E.length > 0 || h ? "No executions match your filters. Try adjusting your search." : "Executions will appear here when agents process requests."
286
+ })
287
+ ]
288
+ })
289
+ });
290
+ };
291
+ //#endregion
292
+ export { I as ExecutionsPage };
293
+
294
+ //# sourceMappingURL=ExecutionsPage.js.map