@burdenoff/fluidgrids-fe-sdk 2026.922.13 → 2026.923.2
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/ExecutionDetailPage-BD7CS4KL.js +12 -0
- package/dist/{ExecutionDetailPage-OSDL7NDT.js.map → ExecutionDetailPage-BD7CS4KL.js.map} +1 -1
- package/dist/ExecutionsListPage-VOGSLA7T.js +11 -0
- package/dist/{ExecutionsListPage-AATDFFIH.js.map → ExecutionsListPage-VOGSLA7T.js.map} +1 -1
- package/dist/{WorkflowBuilder-D7RKU4UK.js → WorkflowBuilder-WLJBVVHS.js} +8 -8
- package/dist/{WorkflowBuilder-D7RKU4UK.js.map → WorkflowBuilder-WLJBVVHS.js.map} +1 -1
- package/dist/{WorkflowsList-JHM7Q5HE.js → WorkflowsList-QREUMT55.js} +6 -6
- package/dist/{WorkflowsList-JHM7Q5HE.js.map → WorkflowsList-QREUMT55.js.map} +1 -1
- package/dist/{chunk-5IAMVAGX.js → chunk-4C6UYNC5.js} +43 -5
- package/dist/chunk-4C6UYNC5.js.map +1 -0
- package/dist/chunk-5A7GP6O7.js +729 -0
- package/dist/chunk-5A7GP6O7.js.map +1 -0
- package/dist/{chunk-MTWEYC2W.js → chunk-5PZDLMC4.js} +4 -4
- package/dist/{chunk-MTWEYC2W.js.map → chunk-5PZDLMC4.js.map} +1 -1
- package/dist/chunk-FKOUPL6Z.js +753 -0
- package/dist/chunk-FKOUPL6Z.js.map +1 -0
- package/dist/{chunk-EUZZLC3N.js → chunk-HNVWIVJH.js} +202 -6
- package/dist/chunk-HNVWIVJH.js.map +1 -0
- package/dist/{chunk-PTGKDQ5K.js → chunk-LH2YML5F.js} +8 -2
- package/dist/chunk-LH2YML5F.js.map +1 -0
- package/dist/chunk-NK32XOQN.js +248 -0
- package/dist/chunk-NK32XOQN.js.map +1 -0
- package/dist/{chunk-CVVNQCFM.js → chunk-Q4RPP67K.js} +4 -4
- package/dist/{chunk-CVVNQCFM.js.map → chunk-Q4RPP67K.js.map} +1 -1
- package/dist/{chunk-UNW4I442.js → chunk-Q7RJYGQK.js} +3 -3
- package/dist/{chunk-UNW4I442.js.map → chunk-Q7RJYGQK.js.map} +1 -1
- package/dist/{chunk-RJQJAN6J.js → chunk-TEZV7I6A.js} +4 -4
- package/dist/{chunk-RJQJAN6J.js.map → chunk-TEZV7I6A.js.map} +1 -1
- package/dist/{chunk-XQYAM47Y.js → chunk-TOHTP3BT.js} +4 -4
- package/dist/{chunk-XQYAM47Y.js.map → chunk-TOHTP3BT.js.map} +1 -1
- package/dist/{chunk-IPVHC2DM.js → chunk-TVLE7GNH.js} +374 -7
- package/dist/chunk-TVLE7GNH.js.map +1 -0
- package/dist/{chunk-ISS73LG3.js → chunk-VPWQN7KV.js} +3 -3
- package/dist/{chunk-ISS73LG3.js.map → chunk-VPWQN7KV.js.map} +1 -1
- package/dist/{chunk-R6JFXZXN.js → chunk-VTPBYPDV.js} +47 -5
- package/dist/chunk-VTPBYPDV.js.map +1 -0
- package/dist/{chunk-GWRX2T3K.js → chunk-XF7QA3QT.js} +417 -155
- package/dist/chunk-XF7QA3QT.js.map +1 -0
- package/dist/executions.js +7 -6
- package/dist/history.js +4 -4
- package/dist/index.d.ts +71 -1
- package/dist/index.js +26 -23
- package/dist/index.js.map +1 -1
- package/dist/nodes.js +2 -2
- package/dist/observability-5ShR4Phm.d.ts +134 -0
- package/dist/observability.d.ts +2 -0
- package/dist/observability.js +8 -0
- package/dist/observability.js.map +1 -0
- package/dist/settings.js +5 -1
- package/dist/templates.js +6 -6
- package/dist/workflow-builder.js +7 -7
- package/dist/workflows-list.js +4 -4
- package/package.json +5 -1
- package/dist/ExecutionDetailPage-OSDL7NDT.js +0 -11
- package/dist/ExecutionsListPage-AATDFFIH.js +0 -10
- package/dist/chunk-5IAMVAGX.js.map +0 -1
- package/dist/chunk-EUZZLC3N.js.map +0 -1
- package/dist/chunk-GWRX2T3K.js.map +0 -1
- package/dist/chunk-IPVHC2DM.js.map +0 -1
- package/dist/chunk-PTGKDQ5K.js.map +0 -1
- package/dist/chunk-R6JFXZXN.js.map +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { ExecutionDetailPage } from './chunk-4C6UYNC5.js';
|
|
2
|
+
import './chunk-HNVWIVJH.js';
|
|
3
|
+
import './chunk-NK32XOQN.js';
|
|
4
|
+
import './chunk-W23ZXNKU.js';
|
|
5
|
+
import './chunk-3ZYUGTIT.js';
|
|
6
|
+
import './chunk-WWU2O2SR.js';
|
|
7
|
+
import './chunk-BHITFSOK.js';
|
|
8
|
+
import './chunk-LMO5ASOE.js';
|
|
9
|
+
import './chunk-7YWBH2A5.js';
|
|
10
|
+
import './chunk-5BDQNSP3.js';
|
|
11
|
+
//# sourceMappingURL=ExecutionDetailPage-BD7CS4KL.js.map
|
|
12
|
+
//# sourceMappingURL=ExecutionDetailPage-BD7CS4KL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionDetailPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionDetailPage-BD7CS4KL.js"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { ExecutionsListPage } from './chunk-VTPBYPDV.js';
|
|
2
|
+
import './chunk-HNVWIVJH.js';
|
|
3
|
+
import './chunk-NK32XOQN.js';
|
|
4
|
+
import './chunk-Q4RPP67K.js';
|
|
5
|
+
import './chunk-WWU2O2SR.js';
|
|
6
|
+
import './chunk-BHITFSOK.js';
|
|
7
|
+
import './chunk-LMO5ASOE.js';
|
|
8
|
+
import './chunk-7YWBH2A5.js';
|
|
9
|
+
import './chunk-5BDQNSP3.js';
|
|
10
|
+
//# sourceMappingURL=ExecutionsListPage-VOGSLA7T.js.map
|
|
11
|
+
//# sourceMappingURL=ExecutionsListPage-VOGSLA7T.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionsListPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionsListPage-VOGSLA7T.js"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
export { WorkflowBuilder } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { WorkflowBuilder } from './chunk-TOHTP3BT.js';
|
|
2
|
+
import './chunk-XF7QA3QT.js';
|
|
3
|
+
import './chunk-XQP33UJR.js';
|
|
3
4
|
import './chunk-P5PKRQAO.js';
|
|
4
5
|
import './chunk-NH5YCY37.js';
|
|
5
6
|
import './chunk-DBOMRIP5.js';
|
|
6
7
|
import './chunk-BQXHJIER.js';
|
|
7
8
|
import './chunk-6LXMUIR3.js';
|
|
8
|
-
import './chunk-XQP33UJR.js';
|
|
9
9
|
import './chunk-AANIWER2.js';
|
|
10
10
|
import './chunk-W23ZXNKU.js';
|
|
11
11
|
import './chunk-3ZYUGTIT.js';
|
|
12
|
-
import './chunk-
|
|
13
|
-
import './chunk-LMO5ASOE.js';
|
|
12
|
+
import './chunk-Q4RPP67K.js';
|
|
14
13
|
import './chunk-WWU2O2SR.js';
|
|
15
|
-
import './chunk-5BDQNSP3.js';
|
|
16
14
|
import './chunk-YMD3T6J2.js';
|
|
17
15
|
import './chunk-BHITFSOK.js';
|
|
16
|
+
import './chunk-LMO5ASOE.js';
|
|
18
17
|
import './chunk-7YWBH2A5.js';
|
|
19
|
-
|
|
20
|
-
//# sourceMappingURL=WorkflowBuilder-
|
|
18
|
+
import './chunk-5BDQNSP3.js';
|
|
19
|
+
//# sourceMappingURL=WorkflowBuilder-WLJBVVHS.js.map
|
|
20
|
+
//# sourceMappingURL=WorkflowBuilder-WLJBVVHS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-WLJBVVHS.js"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export { WorkflowsList } from './chunk-
|
|
1
|
+
export { WorkflowsList } from './chunk-TVLE7GNH.js';
|
|
2
2
|
import './chunk-AANIWER2.js';
|
|
3
3
|
import './chunk-W23ZXNKU.js';
|
|
4
4
|
import './chunk-3ZYUGTIT.js';
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-LMO5ASOE.js';
|
|
5
|
+
import './chunk-Q4RPP67K.js';
|
|
7
6
|
import './chunk-WWU2O2SR.js';
|
|
8
|
-
import './chunk-5BDQNSP3.js';
|
|
9
7
|
import './chunk-YMD3T6J2.js';
|
|
10
8
|
import './chunk-BHITFSOK.js';
|
|
9
|
+
import './chunk-LMO5ASOE.js';
|
|
11
10
|
import './chunk-7YWBH2A5.js';
|
|
12
|
-
|
|
13
|
-
//# sourceMappingURL=WorkflowsList-
|
|
11
|
+
import './chunk-5BDQNSP3.js';
|
|
12
|
+
//# sourceMappingURL=WorkflowsList-QREUMT55.js.map
|
|
13
|
+
//# sourceMappingURL=WorkflowsList-QREUMT55.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowsList-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowsList-QREUMT55.js"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { useExecution, buildNodeDisplayMap, useExecutionActions, useAutoRefresh, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-
|
|
1
|
+
import { useExecution, buildNodeDisplayMap, useExecutionActions, useAutoRefresh, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-HNVWIVJH.js';
|
|
2
2
|
import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-W23ZXNKU.js';
|
|
3
|
-
import { throwIfResultError } from './chunk-LMO5ASOE.js';
|
|
4
3
|
import { getFluidGridsConfig } from './chunk-WWU2O2SR.js';
|
|
5
|
-
import { getFluidGridsClientSafe } from './chunk-5BDQNSP3.js';
|
|
6
4
|
import { RunLogsDocument, RunLogAppendedDocument } from './chunk-BHITFSOK.js';
|
|
5
|
+
import { throwIfResultError } from './chunk-LMO5ASOE.js';
|
|
7
6
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
7
|
+
import { getFluidGridsClientSafe } from './chunk-5BDQNSP3.js';
|
|
8
8
|
import { useState, useMemo, useCallback, useRef, useEffect } from 'react';
|
|
9
9
|
import { useParams, useNavigate, Link } from 'react-router';
|
|
10
10
|
import { Icon } from '@iconify/react';
|
|
11
|
+
import { toast } from 'sonner';
|
|
11
12
|
import { Button } from '@burdenoff/fe-libs/button';
|
|
12
13
|
import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '@burdenoff/fe-libs/ui';
|
|
13
14
|
import { useActorProfiles, buildActorFallback } from '@burdenoff/fe-libs/shared';
|
|
@@ -198,6 +199,7 @@ function ExecutionDetailPage() {
|
|
|
198
199
|
resumeExecution,
|
|
199
200
|
cancelExecution,
|
|
200
201
|
retryNode,
|
|
202
|
+
replayExecution,
|
|
201
203
|
terminateExecution,
|
|
202
204
|
loading: actionLoading
|
|
203
205
|
} = useExecutionActions();
|
|
@@ -241,6 +243,26 @@ function ExecutionDetailPage() {
|
|
|
241
243
|
await retryNode(runId, nodeId);
|
|
242
244
|
refetch();
|
|
243
245
|
};
|
|
246
|
+
const handleReplay = async () => {
|
|
247
|
+
if (!runId) return;
|
|
248
|
+
const replayed = await replayExecution(runId);
|
|
249
|
+
if (!replayed) {
|
|
250
|
+
toast.error(
|
|
251
|
+
tr(
|
|
252
|
+
"fluidgrids.executions.executionDetail.replayFailed",
|
|
253
|
+
"Could not replay this run"
|
|
254
|
+
)
|
|
255
|
+
);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
toast.success(
|
|
259
|
+
tr(
|
|
260
|
+
"fluidgrids.executions.executionDetail.replayStarted",
|
|
261
|
+
"Replay started in test mode"
|
|
262
|
+
)
|
|
263
|
+
);
|
|
264
|
+
navigate(`../runs/${replayed.runId}`);
|
|
265
|
+
};
|
|
244
266
|
const handleViewChildRun = useCallback(
|
|
245
267
|
(childRunId) => {
|
|
246
268
|
navigate(`../runs/${childRunId}`);
|
|
@@ -569,6 +591,22 @@ function ExecutionDetailPage() {
|
|
|
569
591
|
]
|
|
570
592
|
}
|
|
571
593
|
),
|
|
594
|
+
canControlRuns && execution.status !== "RUNNING" && execution.status !== "PENDING" && execution.status !== "WAITING" && /* @__PURE__ */ jsxs(
|
|
595
|
+
Button,
|
|
596
|
+
{
|
|
597
|
+
variant: "outline",
|
|
598
|
+
size: "sm",
|
|
599
|
+
onClick: () => void handleReplay(),
|
|
600
|
+
disabled: actionLoading,
|
|
601
|
+
children: [
|
|
602
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:replay", className: "mr-1", width: 16 }),
|
|
603
|
+
tr(
|
|
604
|
+
"fluidgrids.executions.executionDetail.replayButton",
|
|
605
|
+
"Replay in test mode"
|
|
606
|
+
)
|
|
607
|
+
]
|
|
608
|
+
}
|
|
609
|
+
),
|
|
572
610
|
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: refetch, children: [
|
|
573
611
|
/* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-1", width: 16 }),
|
|
574
612
|
tr(
|
|
@@ -831,5 +869,5 @@ function ExecutionDetailPage() {
|
|
|
831
869
|
}
|
|
832
870
|
|
|
833
871
|
export { ExecutionDetailPage };
|
|
834
|
-
//# sourceMappingURL=chunk-
|
|
835
|
-
//# sourceMappingURL=chunk-
|
|
872
|
+
//# sourceMappingURL=chunk-4C6UYNC5.js.map
|
|
873
|
+
//# sourceMappingURL=chunk-4C6UYNC5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/executions/hooks/useRunLogs.ts","../src/modules/executions/pages/ExecutionDetailPage.tsx"],"names":["useState","useMemo","useCallback"],"mappings":"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","file":"chunk-4C6UYNC5.js","sourcesContent":["/**\n * useRunLogs — a GitHub-Actions-style live tail for a workflow run.\n *\n * Two sources feed one ordered list:\n *\n * backfill `workflowRunLogs`, keyset-paginated. The source of truth, and\n * the only thing that can show a run that finished before the page\n * was opened.\n * live `runLogAppended`, which carries ONLY lines appended after the\n * subscription opens — it is a pub/sub stream with no history.\n *\n * So the order matters: query first, then subscribe, then de-duplicate by line\n * `id`. Line ids are assigned by the executor precisely so the live copy and\n * the persisted copy of a line can be matched.\n *\n * If the subscription never connects (a proxy that blocks SSE, a gateway\n * hiccup) the hook falls back to polling the cursor while the run is active,\n * so a live tail degrades to a slower live tail rather than to nothing.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { getFluidGridsClientSafe } from \"../../../graphql/client\";\nimport { throwIfResultError } from \"../../../graphql/errors\";\nimport { RUN_LOGS, RUN_LOG_APPENDED } from \"../graphql/operations\";\nimport type { RunLogLevel, RunLogLine } from \"../types\";\n\n/** How often to re-query when the live subscription is unavailable. */\nconst POLL_INTERVAL_MS = 2000;\n\n/** Page size for backfill. Large enough that a typical run arrives in one round trip. */\nconst PAGE_SIZE = 500;\n\ninterface RunLogsData {\n workflowRunLogs: {\n lines: RunLogLine[];\n nextCursor: string | null;\n hasMore: boolean;\n limitReached: boolean;\n };\n}\n\ninterface RunLogAppendedData {\n runLogAppended: RunLogLine[];\n}\n\nexport interface UseRunLogsOptions {\n /** Keep tailing. Set false once the run reaches a terminal state. */\n live?: boolean;\n /** Server-side severity filter. Applied to backfill; live lines are filtered client-side. */\n minLevel?: RunLogLevel | null;\n /** Include lines from sub-workflow runs nested under this one. */\n includeChildRuns?: boolean;\n}\n\nexport interface UseRunLogsResult {\n lines: RunLogLine[];\n loading: boolean;\n error: Error | null;\n /** True when the run has more lines after the current page — drives \"Load more\". */\n hasMore: boolean;\n /** True when the run hit its log cap and lines were dropped server-side. */\n limitReached: boolean;\n /** True while a live subscription is delivering (as opposed to polling). */\n streaming: boolean;\n /** Fetch the next page, continuing forward from the newest line held. */\n loadMore: () => Promise<void>;\n /** Discard everything and re-read from the start. */\n refetch: () => Promise<void>;\n}\n\nexport function useRunLogs(\n runId: string | undefined,\n options: UseRunLogsOptions = {},\n): UseRunLogsResult {\n const { live = false, minLevel = null, includeChildRuns = false } = options;\n\n const [lines, setLines] = useState<RunLogLine[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [limitReached, setLimitReached] = useState(false);\n const [streaming, setStreaming] = useState(false);\n\n /**\n * Ids already rendered. A line can arrive twice — once live and once in a\n * later backfill page — and the two copies are byte-identical by design, so\n * the id is all that is needed to collapse them.\n */\n const seenIds = useRef<Set<string>>(new Set());\n /** Cursor of the newest line we hold; where the next forward read starts. */\n const cursor = useRef<string | null>(null);\n\n const append = useCallback((incoming: RunLogLine[]) => {\n if (incoming.length === 0) return;\n\n const fresh = incoming.filter((line) => !seenIds.current.has(line.id));\n if (fresh.length === 0) return;\n for (const line of fresh) seenIds.current.add(line.id);\n\n setLines((prev) =>\n // Sort on every append rather than trusting arrival order: live lines and\n // a backfill page can interleave, and a run's nodes are executed by\n // several worker replicas whose batches need not arrive in order.\n [...prev, ...fresh].sort((a, b) =>\n a.timestamp === b.timestamp\n ? a.id.localeCompare(b.id)\n : a.timestamp.localeCompare(b.timestamp),\n ),\n );\n }, []);\n\n /** Read one page forward from `cursor`. */\n const fetchPage = useCallback(\n async (after: string | null): Promise<void> => {\n const client = getFluidGridsClientSafe();\n if (!client || !runId) return;\n\n const result = await client.query<RunLogsData>({\n query: RUN_LOGS,\n variables: {\n runId,\n after,\n limit: PAGE_SIZE,\n minLevel,\n includeChildRuns,\n },\n fetchPolicy: \"network-only\",\n });\n throwIfResultError(result);\n\n const page = result.data?.workflowRunLogs;\n if (!page) return;\n\n append(page.lines);\n setHasMore(page.hasMore);\n setLimitReached(page.limitReached);\n if (page.nextCursor) cursor.current = page.nextCursor;\n },\n [runId, minLevel, includeChildRuns, append],\n );\n\n const refetch = useCallback(async () => {\n seenIds.current = new Set();\n cursor.current = null;\n setLines([]);\n setLoading(true);\n setError(null);\n try {\n await fetchPage(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [fetchPage]);\n\n const loadMore = useCallback(async () => {\n try {\n await fetchPage(cursor.current);\n } catch (err) {\n setError(err as Error);\n }\n }, [fetchPage]);\n\n // Initial load, and a full reset whenever the run or a server-side filter\n // changes — the cursor is only meaningful for one filter combination.\n useEffect(() => {\n if (!runId) {\n setLoading(false);\n return;\n }\n void refetch();\n }, [runId, refetch]);\n\n // Live tail. Falls back to polling when the subscription cannot deliver.\n useEffect(() => {\n const client = getFluidGridsClientSafe();\n if (!runId || !live || !client) {\n setStreaming(false);\n return;\n }\n\n let cancelled = false;\n let poll: ReturnType<typeof setInterval> | null = null;\n\n const startPolling = (): void => {\n if (poll || cancelled) return;\n setStreaming(false);\n poll = setInterval(() => {\n void fetchPage(cursor.current).catch(() => {\n // A transient read failure must not tear down the tail; the next\n // tick retries from the same cursor.\n });\n }, POLL_INTERVAL_MS);\n };\n\n const subscription = client\n .subscribe<RunLogAppendedData>({\n query: RUN_LOG_APPENDED,\n variables: { runId },\n })\n .subscribe({\n next: ({ data }) => {\n if (cancelled) return;\n setStreaming(true);\n append(data?.runLogAppended ?? []);\n },\n error: () => {\n // Subscriptions are an accelerator, never the only path to the data.\n startPolling();\n },\n complete: () => {\n if (!cancelled) startPolling();\n },\n });\n\n // Poll until the first live line proves the stream works. Without this a\n // subscription that connects but never errors (a proxy holding the\n // response open) would silently show nothing.\n const readinessProbe = setTimeout(startPolling, POLL_INTERVAL_MS * 2);\n\n return () => {\n cancelled = true;\n clearTimeout(readinessProbe);\n if (poll) clearInterval(poll);\n subscription.unsubscribe();\n setStreaming(false);\n };\n }, [runId, live, fetchPage, append]);\n\n // One catch-up read when the run stops being live.\n //\n // A run appends its last few lines — the final node completing, `run-complete`\n // — between the last poll and the moment the caller flips `live` to false.\n // Tearing the tail down without this leaves the log visibly short of the run\n // it describes, and only a manual reload would recover it.\n const wasLive = useRef(false);\n useEffect(() => {\n if (live) {\n wasLive.current = true;\n return;\n }\n if (!wasLive.current) return;\n wasLive.current = false;\n\n void fetchPage(cursor.current).catch(() => {\n // Nothing to recover to; the reader can still refetch by hand.\n });\n }, [live, fetchPage]);\n\n // Live lines bypass the server-side filter, so re-apply it here to keep the\n // rendered list consistent with what the query would have returned.\n const filtered = useMemo(() => {\n if (!minLevel) return lines;\n const order: RunLogLevel[] = [\"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"];\n const floor = order.indexOf(minLevel);\n return lines.filter((line) => order.indexOf(line.level) >= floor);\n }, [lines, minLevel]);\n\n return {\n lines: filtered,\n loading,\n error,\n hasMore,\n limitReached,\n streaming,\n loadMore,\n refetch,\n };\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { useParams, Link, useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n ExecutionStatusBadge,\n NodeTimeline,\n RunLogViewer,\n} from \"../components\";\nimport {\n useExecution,\n useExecutionActions,\n useAutoRefresh,\n} from \"../hooks/useExecutions\";\nimport { useRunLogs } from \"../hooks/useRunLogs\";\nimport type { RunLogLevel } from \"../types\";\nimport { buildNodeDisplayMap, formatRunVersion } from \"../utils/run-display\";\nimport {\n useActorProfiles,\n buildActorFallback,\n type ActorInput,\n} from \"@burdenoff/fe-libs/shared\";\nimport { getFluidGridsConfig } from \"../../../config\";\nimport { useFluidGridsPermission } from \"../../../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../../../permissions/constants\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ntype DetailTab = \"timeline\" | \"logs\" | \"input\" | \"context\";\n\nexport function ExecutionDetailPage() {\n const tr = useTr();\n const { runId } = useParams<{ runId: string }>();\n const navigate = useNavigate();\n\n const [activeTab, setActiveTab] = useState<DetailTab>(\"timeline\");\n const [autoRefreshEnabled, setAutoRefreshEnabled] = useState(true);\n const [showTerminateDialog, setShowTerminateDialog] = useState(false);\n const { allowed: canControlRuns } = useFluidGridsPermission(\n FLUIDGRIDS_PERMISSIONS.WORKFLOW_RUN_EXECUTE,\n );\n\n const [minLogLevel, setMinLogLevel] = useState<RunLogLevel | null>(null);\n\n // Data fetching\n const { execution, loading, error, refetch } = useExecution(runId);\n\n // nodeId → human label/operation from the run's workflow definition.\n const nodeDisplay = useMemo(\n () => buildNodeDisplayMap(execution?.workflow?.definitionJson),\n [execution?.workflow?.definitionJson],\n );\n\n // Resolve the triggering actor's display name (best-effort, cached).\n const fgConfig = getFluidGridsConfig();\n const actorInputs = useMemo<ActorInput[]>(\n () =>\n execution?.triggeredById\n ? [{ actorId: execution.triggeredById, actorType: \"user\" }]\n : [],\n [execution?.triggeredById],\n );\n const actorProfiles = useActorProfiles(actorInputs, {\n workspaceId: fgConfig.workspaceId || undefined,\n orgId: fgConfig.organizationId,\n authToken: fgConfig.authToken,\n });\n const triggeredByLabel = execution?.triggeredById\n ? (actorProfiles[execution.triggeredById]?.displayName ??\n buildActorFallback({\n actorId: execution.triggeredById,\n actorType: \"user\",\n }).displayName)\n : null;\n const {\n pauseExecution,\n resumeExecution,\n cancelExecution,\n retryNode,\n replayExecution,\n terminateExecution,\n loading: actionLoading,\n } = useExecutionActions();\n\n // Auto-refresh for running executions\n const isActive =\n execution?.status === \"RUNNING\" ||\n execution?.status === \"PENDING\" ||\n execution?.status === \"WAITING\";\n\n // The log viewer maintains its own live tail (subscription, with a polling\n // fallback), so this only refreshes the run header and node states.\n useAutoRefresh(\n useCallback(() => {\n refetch();\n }, [refetch]),\n autoRefreshEnabled && isActive,\n 2000,\n );\n\n const runLogs = useRunLogs(runId, {\n // Only tail while the run can still produce lines; a finished run's log is\n // complete after the first read.\n live: isActive,\n minLevel: minLogLevel,\n });\n\n // Handlers\n const handlePause = async () => {\n if (!runId) return;\n await pauseExecution(runId);\n refetch();\n };\n\n const handleResume = async () => {\n if (!runId) return;\n await resumeExecution(runId);\n refetch();\n };\n\n const handleCancel = async () => {\n if (!runId) return;\n await cancelExecution(runId);\n refetch();\n };\n\n const handleTerminate = async () => {\n if (!runId) return;\n await terminateExecution(runId, \"User terminated\");\n setShowTerminateDialog(false);\n refetch();\n };\n\n const handleRetryNode = async (nodeId: string) => {\n if (!runId) return;\n await retryNode(runId, nodeId);\n refetch();\n };\n\n const handleReplay = async () => {\n if (!runId) return;\n const replayed = await replayExecution(runId);\n if (!replayed) {\n toast.error(\n tr(\n \"fluidgrids.executions.executionDetail.replayFailed\",\n \"Could not replay this run\",\n ),\n );\n return;\n }\n toast.success(\n tr(\n \"fluidgrids.executions.executionDetail.replayStarted\",\n \"Replay started in test mode\",\n ),\n );\n navigate(`../runs/${replayed.runId}`);\n };\n\n const handleViewChildRun = useCallback(\n (childRunId: string) => {\n navigate(`../runs/${childRunId}`);\n },\n [navigate],\n );\n\n // Formatting helpers\n const formatDuration = (ms?: number): string => {\n if (!ms) return \"-\";\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000)\n return `${Math.round(ms / 60000)}m ${Math.round((ms % 60000) / 1000)}s`;\n return `${Math.round(ms / 3600000)}h ${Math.round((ms % 3600000) / 60000)}m`;\n };\n\n const formatDateTime = (dateStr?: string): string => {\n if (!dateStr) return \"-\";\n const date = new Date(dateStr);\n return date.toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n };\n\n // Loading state\n if (loading && !execution) {\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n <div className=\"animate-pulse\">\n <div className=\"h-8 w-48 bg-background-tertiary rounded mb-4\" />\n <div className=\"h-4 w-32 bg-background-tertiary rounded mb-8\" />\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-4 mb-6\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"h-24 bg-background-tertiary rounded-lg\" />\n ))}\n </div>\n <div className=\"h-96 bg-background-tertiary rounded-lg\" />\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n <Link\n to=\"../runs\"\n className=\"text-action-primary-text hover:underline text-sm mb-4 inline-block\"\n >\n ←{\" \"}\n {tr(\n \"fluidgrids.executions.executionDetail.backToExecutions\",\n \"Back to Executions\",\n )}\n </Link>\n <div className=\"bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg p-6 text-center\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"mx-auto text-[var(--color-status-error-text)] mb-4\"\n width={48}\n />\n <h2 className=\"text-lg font-medium text-[var(--color-status-error-text)] mb-2\">\n {tr(\n \"fluidgrids.executions.executionDetail.loadErrorTitle\",\n \"Failed to load execution\",\n )}\n </h2>\n <p className=\"text-[var(--color-status-error-text)] mb-4\">\n {error.message}\n </p>\n <Button variant=\"outline\" onClick={refetch}>\n {tr(\"fluidgrids.executions.executionDetail.tryAgain\", \"Try Again\")}\n </Button>\n </div>\n </div>\n );\n }\n\n // Not found state\n if (!execution) {\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n <Link\n to=\"../runs\"\n className=\"text-action-primary-text hover:underline text-sm mb-4 inline-block\"\n >\n ←{\" \"}\n {tr(\n \"fluidgrids.executions.executionDetail.backToExecutions\",\n \"Back to Executions\",\n )}\n </Link>\n <div className=\"bg-background-secondary border border-border-secondary rounded-lg p-6 text-center\">\n <Icon\n icon=\"mdi:file-find-outline\"\n className=\"mx-auto text-text-secondary mb-4\"\n width={48}\n />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">\n {tr(\n \"fluidgrids.executions.executionDetail.notFoundTitle\",\n \"Execution not found\",\n )}\n </h2>\n <p className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.notFoundDescriptionPrefix\",\n \"The execution with ID\",\n )}{\" \"}\n "{runId}"{\" \"}\n {tr(\n \"fluidgrids.executions.executionDetail.notFoundDescriptionSuffix\",\n \"could not be found.\",\n )}\n </p>\n </div>\n </div>\n );\n }\n\n const tabs: Array<{ id: DetailTab; label: string; icon: string }> = [\n {\n id: \"timeline\",\n label: tr(\n \"fluidgrids.executions.executionDetail.timelineTab\",\n \"Timeline\",\n ),\n icon: \"mdi:timeline\",\n },\n {\n id: \"logs\",\n label: tr(\"fluidgrids.executions.executionDetail.logsTab\", \"Logs\"),\n icon: \"mdi:text-box-outline\",\n },\n {\n id: \"input\",\n label: tr(\"fluidgrids.executions.executionDetail.inputTab\", \"Input Data\"),\n icon: \"mdi:code-json\",\n },\n {\n id: \"context\",\n label: tr(\"fluidgrids.executions.executionDetail.contextTab\", \"Context\"),\n icon: \"mdi:information-outline\",\n },\n ];\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Back link */}\n <Link\n to=\"../runs\"\n className=\"text-action-primary-text hover:underline text-sm mb-4 inline-block\"\n >\n ←{\" \"}\n {tr(\n \"fluidgrids.executions.executionDetail.backToExecutions\",\n \"Back to Executions\",\n )}\n </Link>\n\n {/* Sub-workflow parent breadcrumb */}\n {execution.parentRunId && (\n <div className=\"flex items-center gap-2 mb-3 text-sm\">\n <Icon icon=\"mdi:sitemap\" className=\"text-indigo-500\" width={16} />\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.subWorkflowOf\",\n \"Sub-workflow of\",\n )}\n </span>\n <Link\n to={`../runs/${execution.parentRunId}`}\n className=\"text-indigo-600 hover:underline font-medium\"\n >\n {tr(\n \"fluidgrids.executions.executionDetail.parentRunLinkPrefix\",\n \"Parent Run\",\n )}{\" \"}\n {execution.parentRunId.slice(0, 12)}...\n </Link>\n </div>\n )}\n\n {/* Header */}\n <div className=\"flex flex-col lg:flex-row lg:items-start lg:justify-between gap-4 mb-6\">\n <div>\n <div className=\"flex items-center gap-3 mb-2\">\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {execution.workflow?.name || execution.workflowKey}\n </h1>\n <ExecutionStatusBadge status={execution.status} size=\"lg\" />\n {execution.parentRunId && (\n <span className=\"px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded\">\n {tr(\n \"fluidgrids.executions.executionDetail.subWorkflowBadge\",\n \"Sub-Workflow\",\n )}\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-4 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Icon icon=\"mdi:identifier\" width={16} />\n <code className=\"font-mono\">{execution.id.slice(0, 12)}...</code>\n </span>\n <span className=\"flex items-center gap-1\">\n <Icon icon=\"mdi:tag-outline\" width={16} />\n {formatRunVersion(execution.version)}\n </span>\n <span className=\"flex items-center gap-1\">\n <Icon icon=\"mdi:clock-outline\" width={16} />\n {formatDateTime(execution.startedAt || execution.createdAt)}\n </span>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-wrap items-center gap-2\">\n {/* Auto-refresh toggle */}\n {isActive && (\n <label className=\"flex items-center gap-2 text-sm text-text-secondary mr-4\">\n <input\n type=\"checkbox\"\n checked={autoRefreshEnabled}\n onChange={(e) => setAutoRefreshEnabled(e.target.checked)}\n className=\"w-4 h-4 rounded\"\n />\n {tr(\n \"fluidgrids.executions.executionDetail.autoRefreshToggle\",\n \"Auto-refresh\",\n )}\n </label>\n )}\n\n {/* Control buttons based on status */}\n {canControlRuns && execution.status === \"RUNNING\" && (\n <>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handlePause}\n disabled={actionLoading}\n >\n <Icon icon=\"mdi:pause\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.executionDetail.pauseButton\",\n \"Pause\",\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCancel}\n disabled={actionLoading}\n className=\"border-[var(--color-status-warning-border)] text-[var(--color-status-warning-text)] hover:bg-[var(--color-status-warning-bg-subtle)]\"\n >\n <Icon icon=\"mdi:stop\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.executionDetail.cancelButton\",\n \"Cancel\",\n )}\n </Button>\n </>\n )}\n\n {canControlRuns && execution.status === \"WAITING\" && (\n <>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleResume}\n disabled={actionLoading}\n >\n <Icon icon=\"mdi:play\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.executionDetail.resumeButton\",\n \"Resume\",\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCancel}\n disabled={actionLoading}\n className=\"border-[var(--color-status-warning-border)] text-[var(--color-status-warning-text)] hover:bg-[var(--color-status-warning-bg-subtle)]\"\n >\n <Icon icon=\"mdi:stop\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.executionDetail.cancelButton\",\n \"Cancel\",\n )}\n </Button>\n </>\n )}\n\n {canControlRuns && execution.status === \"PENDING\" && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCancel}\n disabled={actionLoading}\n >\n <Icon icon=\"mdi:stop\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.executionDetail.cancelButton\",\n \"Cancel\",\n )}\n </Button>\n )}\n\n {canControlRuns &&\n (execution.status === \"RUNNING\" ||\n execution.status === \"WAITING\") && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowTerminateDialog(true)}\n disabled={actionLoading}\n className=\"border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]\"\n >\n <Icon icon=\"mdi:close-octagon\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.executionDetail.terminateButton\",\n \"Terminate\",\n )}\n </Button>\n )}\n\n {canControlRuns &&\n execution.status !== \"RUNNING\" &&\n execution.status !== \"PENDING\" &&\n execution.status !== \"WAITING\" && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleReplay()}\n disabled={actionLoading}\n >\n <Icon icon=\"mdi:replay\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.executionDetail.replayButton\",\n \"Replay in test mode\",\n )}\n </Button>\n )}\n\n <Button variant=\"outline\" size=\"sm\" onClick={refetch}>\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.executionDetail.refreshButton\",\n \"Refresh\",\n )}\n </Button>\n </div>\n </div>\n\n {/* Stats Grid */}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-4 mb-6\">\n <div className=\"bg-background-secondary rounded-lg border border-border-secondary p-4\">\n <div className=\"text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.durationStat\",\n \"Duration\",\n )}\n </div>\n <div className=\"text-xl font-bold text-text-primary mt-1\">\n {formatDuration(execution.duration)}\n </div>\n </div>\n <div className=\"bg-background-secondary rounded-lg border border-border-secondary p-4\">\n <div className=\"text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.progressStat\",\n \"Progress\",\n )}\n </div>\n <div className=\"flex items-center gap-2 mt-1\">\n <div className=\"flex-1 h-2 bg-background-tertiary rounded-full overflow-hidden\">\n <div\n className={`h-full ${\n execution.status === \"FAILED\"\n ? \"bg-[var(--color-status-error-bg)]\"\n : execution.status === \"COMPLETED\"\n ? \"bg-[var(--color-status-success-bg)]\"\n : \"bg-[var(--color-status-info-bg)]\"\n }`}\n style={{ width: `${execution.progress}%` }}\n />\n </div>\n <span className=\"text-xl font-bold text-text-primary\">\n {Math.round(execution.progress)}%\n </span>\n </div>\n </div>\n <div className=\"bg-background-secondary rounded-lg border border-border-secondary p-4\">\n <div className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.executions.executionDetail.nodesStat\", \"Nodes\")}\n </div>\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"text-xl font-bold text-[var(--color-status-success-text)]\">\n {execution.completedNodes ?? 0}\n </span>\n <span className=\"text-text-secondary\">/</span>\n <span className=\"text-xl font-bold text-text-primary\">\n {execution.totalNodes ?? 0}\n </span>\n {(execution.failedNodes ?? 0) > 0 && (\n <span className=\"text-sm text-[var(--color-status-error-text)] ml-2\">\n ({execution.failedNodes}{\" \"}\n {tr(\n \"fluidgrids.executions.executionDetail.failedNodesSuffix\",\n \"failed\",\n )}\n )\n </span>\n )}\n </div>\n </div>\n <div className=\"bg-background-secondary rounded-lg border border-border-secondary p-4\">\n <div className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.executions.executionDetail.triggerStat\", \"Trigger\")}\n </div>\n <div className=\"text-lg font-medium text-text-primary mt-1 truncate\">\n {execution.triggerNodeId\n ? (nodeDisplay[execution.triggerNodeId]?.label ??\n execution.triggerNodeId)\n : \"—\"}\n </div>\n </div>\n </div>\n\n {/* Error Banner */}\n {execution.errorMessage && (\n <div className=\"mb-6 p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg\">\n <div className=\"flex items-center gap-2 text-[var(--color-status-error-text)] mb-2\">\n <Icon icon=\"mdi:alert-circle\" width={20} />\n <span className=\"font-medium\">\n {tr(\"fluidgrids.executions.executionDetail.errorLabel\", \"Error\")}\n {execution.errorType ? ` (${execution.errorType})` : \"\"}\n </span>\n </div>\n <p className=\"text-[var(--color-status-error-text)]\">\n {execution.errorMessage}\n </p>\n </div>\n )}\n\n {/* Tabs */}\n <div className=\"border-b border-border-secondary mb-6\">\n <nav className=\"flex gap-4 -mb-px\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={`\n flex items-center gap-2 px-4 py-3 border-b-2 text-sm font-medium transition-colors\n ${\n activeTab === tab.id\n ? \"border-action-primary-bg text-action-primary-text\"\n : \"border-transparent text-text-secondary hover:text-text-primary hover:border-border-primary\"\n }\n `}\n >\n <Icon icon={tab.icon} width={18} />\n {tab.label}\n </button>\n ))}\n </nav>\n </div>\n\n {/* Tab Content */}\n <div className=\"bg-background-secondary rounded-lg border border-border-secondary\">\n {activeTab === \"timeline\" && (\n <div className=\"p-4 sm:p-6\">\n <NodeTimeline\n nodeStates={execution.nodeStates ?? []}\n nodeDisplay={nodeDisplay}\n triggerNodeId={execution.triggerNodeId ?? undefined}\n onRetryNode={canControlRuns ? handleRetryNode : undefined}\n onViewChildRun={handleViewChildRun}\n />\n </div>\n )}\n\n {activeTab === \"logs\" && (\n <div className=\"p-4 sm:p-6\">\n <RunLogViewer\n runId={runId!}\n lines={runLogs.lines}\n nodeStates={execution.nodeStates ?? []}\n nodeDisplay={nodeDisplay}\n loading={runLogs.loading}\n error={runLogs.error}\n hasMore={runLogs.hasMore}\n limitReached={runLogs.limitReached}\n streaming={runLogs.streaming}\n active={isActive}\n minLevel={minLogLevel}\n onMinLevelChange={setMinLogLevel}\n onLoadMore={() => void runLogs.loadMore()}\n />\n </div>\n )}\n\n {activeTab === \"input\" && (\n <div className=\"p-4 sm:p-6\">\n <h3 className=\"text-lg font-medium text-text-primary mb-4\">\n {tr(\n \"fluidgrids.executions.executionDetail.triggerDataHeading\",\n \"Trigger Data\",\n )}\n </h3>\n <div className=\"bg-background-primary rounded p-4 max-h-[400px] overflow-auto\">\n <pre className=\"text-sm text-text-primary font-mono whitespace-pre-wrap break-words\">\n {JSON.stringify(execution.triggerData ?? null, null, 2)}\n </pre>\n </div>\n </div>\n )}\n\n {activeTab === \"context\" && (\n <div className=\"p-4 sm:p-6\">\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <div>\n <h3 className=\"text-lg font-medium text-text-primary mb-4\">\n {tr(\n \"fluidgrids.executions.executionDetail.executionContextHeading\",\n \"Execution Context\",\n )}\n </h3>\n <div className=\"bg-background-primary rounded p-4 max-h-[300px] overflow-auto\">\n <pre className=\"text-sm text-text-primary font-mono whitespace-pre-wrap break-words\">\n {JSON.stringify(execution.context ?? null, null, 2)}\n </pre>\n </div>\n </div>\n <div>\n <h3 className=\"text-lg font-medium text-text-primary mb-4\">\n {tr(\n \"fluidgrids.executions.executionDetail.executionDetailsHeading\",\n \"Execution Details\",\n )}\n </h3>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.runIdRow\",\n \"Run ID\",\n )}\n </span>\n <code className=\"font-mono text-text-primary\">\n {execution.id}\n </code>\n </div>\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.workflowRow\",\n \"Workflow\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {execution.workflow?.name || execution.workflowKey}\n </span>\n </div>\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.workflowKeyRow\",\n \"Workflow Key\",\n )}\n </span>\n <code className=\"font-mono text-text-primary\">\n {execution.workflowKey}\n </code>\n </div>\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.versionRow\",\n \"Version\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {formatRunVersion(execution.version)}\n </span>\n </div>\n {execution.triggeredById && (\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.triggeredByRow\",\n \"Triggered By\",\n )}\n </span>\n <span\n className=\"text-text-primary\"\n title={execution.triggeredById}\n >\n {triggeredByLabel}\n </span>\n </div>\n )}\n {execution.parentRunId && (\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.parentRunRow\",\n \"Parent Run\",\n )}\n </span>\n <Link\n to={`/runs/${execution.parentRunId}`}\n className=\"text-action-primary-text hover:underline font-mono\"\n >\n {execution.parentRunId.slice(0, 12)}...\n </Link>\n </div>\n )}\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.createdRow\",\n \"Created\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {formatDateTime(execution.createdAt)}\n </span>\n </div>\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.startedRow\",\n \"Started\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {formatDateTime(execution.startedAt)}\n </span>\n </div>\n {execution.completedAt && (\n <div className=\"flex justify-between py-2 border-b border-border-secondary\">\n <span className=\"text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionDetail.completedRow\",\n \"Completed\",\n )}\n </span>\n <span className=\"text-text-primary\">\n {formatDateTime(execution.completedAt)}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <AlertDialog\n open={showTerminateDialog}\n onOpenChange={setShowTerminateDialog}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {tr(\n \"fluidgrids.executions.executionDetail.terminateDialogTitle\",\n \"Terminate Execution\",\n )}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {tr(\n \"fluidgrids.executions.executionDetail.terminateDialogDescription\",\n \"Are you sure you want to force terminate this execution? This will immediately stop the running workflow and cannot be resumed.\",\n )}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={actionLoading}>\n {tr(\n \"fluidgrids.executions.executionDetail.cancelButton\",\n \"Cancel\",\n )}\n </AlertDialogCancel>\n <AlertDialogAction\n onClick={handleTerminate}\n disabled={actionLoading}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {actionLoading\n ? tr(\n \"fluidgrids.executions.executionDetail.terminatingButton\",\n \"Terminating...\",\n )\n : tr(\n \"fluidgrids.executions.executionDetail.terminateButton\",\n \"Terminate\",\n )}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n"]}
|