@burdenoff/fluidgrids-fe-sdk 2026.922.8 → 2026.922.10
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-OSDL7NDT.js +11 -0
- package/dist/{ExecutionDetailPage-WLC63RRK.js.map → ExecutionDetailPage-OSDL7NDT.js.map} +1 -1
- package/dist/ExecutionsListPage-AATDFFIH.js +10 -0
- package/dist/{ExecutionsListPage-P5DRISMN.js.map → ExecutionsListPage-AATDFFIH.js.map} +1 -1
- package/dist/{WorkflowBuilder-LZ7X2M5Y.js → WorkflowBuilder-YV3J2D44.js} +8 -8
- package/dist/{WorkflowBuilder-LZ7X2M5Y.js.map → WorkflowBuilder-YV3J2D44.js.map} +1 -1
- package/dist/WorkflowsList-JHM7Q5HE.js +13 -0
- package/dist/{WorkflowsList-QDPC2HVV.js.map → WorkflowsList-JHM7Q5HE.js.map} +1 -1
- package/dist/{chunk-4KX6I7PA.js → chunk-3SZ2KA6G.js} +5 -5
- package/dist/{chunk-4KX6I7PA.js.map → chunk-3SZ2KA6G.js.map} +1 -1
- package/dist/{chunk-Z4XRVZZ2.js → chunk-5IAMVAGX.js} +5 -5
- package/dist/{chunk-Z4XRVZZ2.js.map → chunk-5IAMVAGX.js.map} +1 -1
- package/dist/{chunk-WO3AHQVD.js → chunk-BHITFSOK.js} +73 -3
- package/dist/chunk-BHITFSOK.js.map +1 -0
- package/dist/{chunk-VTKT6XDA.js → chunk-C7DLBPWJ.js} +353 -19
- package/dist/chunk-C7DLBPWJ.js.map +1 -0
- package/dist/{chunk-OZBZS6DM.js → chunk-CVVNQCFM.js} +3 -3
- package/dist/{chunk-OZBZS6DM.js.map → chunk-CVVNQCFM.js.map} +1 -1
- package/dist/{chunk-CVNW2EUB.js → chunk-EUZZLC3N.js} +3 -3
- package/dist/{chunk-CVNW2EUB.js.map → chunk-EUZZLC3N.js.map} +1 -1
- package/dist/{chunk-WJQSPVU5.js → chunk-FKX2IOUQ.js} +4 -4
- package/dist/{chunk-WJQSPVU5.js.map → chunk-FKX2IOUQ.js.map} +1 -1
- package/dist/{chunk-REM2BQK5.js → chunk-IPVHC2DM.js} +5 -5
- package/dist/{chunk-REM2BQK5.js.map → chunk-IPVHC2DM.js.map} +1 -1
- package/dist/{chunk-CQOQ6A73.js → chunk-ISS73LG3.js} +3 -3
- package/dist/{chunk-CQOQ6A73.js.map → chunk-ISS73LG3.js.map} +1 -1
- package/dist/{chunk-4LJOUX2R.js → chunk-NOSLJG7N.js} +5 -5
- package/dist/{chunk-4LJOUX2R.js.map → chunk-NOSLJG7N.js.map} +1 -1
- package/dist/{chunk-QWUPHC3K.js → chunk-PTGKDQ5K.js} +4 -4
- package/dist/{chunk-QWUPHC3K.js.map → chunk-PTGKDQ5K.js.map} +1 -1
- package/dist/{chunk-62OZJC2B.js → chunk-R6JFXZXN.js} +4 -4
- package/dist/{chunk-62OZJC2B.js.map → chunk-R6JFXZXN.js.map} +1 -1
- package/dist/{chunk-KAMWWBX5.js → chunk-UNW4I442.js} +3 -3
- package/dist/{chunk-KAMWWBX5.js.map → chunk-UNW4I442.js.map} +1 -1
- package/dist/{chunk-UIY2HBWA.js → chunk-W23ZXNKU.js} +12 -2
- package/dist/chunk-W23ZXNKU.js.map +1 -0
- package/dist/{chunk-275FCUOI.js → chunk-YMD3T6J2.js} +17 -2
- package/dist/chunk-YMD3T6J2.js.map +1 -0
- package/dist/executions.js +6 -6
- package/dist/history.js +3 -3
- package/dist/index.d.ts +351 -8
- package/dist/index.js +906 -39
- package/dist/index.js.map +1 -1
- package/dist/nodes.js +2 -2
- package/dist/settings.js +3 -3
- package/dist/templates.js +6 -6
- package/dist/{workflow-builder-D9z-_vNX.d.ts → workflow-builder-Y7PcoT2O.d.ts} +29 -0
- package/dist/workflow-builder.d.ts +1 -1
- package/dist/workflow-builder.js +7 -7
- package/dist/workflows-list.js +5 -5
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-WLC63RRK.js +0 -11
- package/dist/ExecutionsListPage-P5DRISMN.js +0 -10
- package/dist/WorkflowsList-QDPC2HVV.js +0 -13
- package/dist/chunk-275FCUOI.js.map +0 -1
- package/dist/chunk-UIY2HBWA.js.map +0 -1
- package/dist/chunk-VTKT6XDA.js.map +0 -1
- package/dist/chunk-WO3AHQVD.js.map +0 -1
|
@@ -1 +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-Z4XRVZZ2.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 { 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 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 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 <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"]}
|
|
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-5IAMVAGX.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 { 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 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 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 <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"]}
|
|
@@ -99,6 +99,21 @@ function useRetryNodeMutation(baseOptions) {
|
|
|
99
99
|
const options = { ...defaultOptions, ...baseOptions };
|
|
100
100
|
return ApolloReactHooks.useMutation(RetryNodeDocument, options);
|
|
101
101
|
}
|
|
102
|
+
var RunFromNodeDocument = gql`
|
|
103
|
+
mutation RunFromNode($input: RunFromNodeInput!) {
|
|
104
|
+
runFromNode(input: $input) {
|
|
105
|
+
runId
|
|
106
|
+
workflowKey
|
|
107
|
+
version
|
|
108
|
+
triggerNodeId
|
|
109
|
+
status
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
`;
|
|
113
|
+
function useRunFromNodeMutation(baseOptions) {
|
|
114
|
+
const options = { ...defaultOptions, ...baseOptions };
|
|
115
|
+
return ApolloReactHooks.useMutation(RunFromNodeDocument, options);
|
|
116
|
+
}
|
|
102
117
|
var TerminateExecutionDocument = gql`
|
|
103
118
|
mutation TerminateExecution($runId: ID!, $reason: String) {
|
|
104
119
|
terminateWorkflow(runId: $runId, reason: $reason) {
|
|
@@ -155,6 +170,8 @@ var ExecutionDetailDocument = gql`
|
|
|
155
170
|
triggerNodeId
|
|
156
171
|
triggerData
|
|
157
172
|
status
|
|
173
|
+
mode
|
|
174
|
+
sourceRunId
|
|
158
175
|
context
|
|
159
176
|
triggeredById
|
|
160
177
|
parentRunId
|
|
@@ -196,6 +213,8 @@ var ExecutionDetailDocument = gql`
|
|
|
196
213
|
instanceKey
|
|
197
214
|
context
|
|
198
215
|
metadata
|
|
216
|
+
usedPinnedData
|
|
217
|
+
reusedFromRunId
|
|
199
218
|
}
|
|
200
219
|
}
|
|
201
220
|
}
|
|
@@ -357,6 +376,8 @@ var NodeStatesDocument = gql`
|
|
|
357
376
|
instanceKey
|
|
358
377
|
context
|
|
359
378
|
metadata
|
|
379
|
+
usedPinnedData
|
|
380
|
+
reusedFromRunId
|
|
360
381
|
}
|
|
361
382
|
}
|
|
362
383
|
`;
|
|
@@ -566,6 +587,18 @@ function useImportWorkflowTemplateMutation(baseOptions) {
|
|
|
566
587
|
const options = { ...defaultOptions, ...baseOptions };
|
|
567
588
|
return ApolloReactHooks.useMutation(ImportWorkflowTemplateDocument, options);
|
|
568
589
|
}
|
|
590
|
+
var PinNodeDataDocument = gql`
|
|
591
|
+
mutation PinNodeData($id: ID!, $nodeId: String!, $data: JSON!) {
|
|
592
|
+
pinNodeData(id: $id, nodeId: $nodeId, data: $data) {
|
|
593
|
+
id
|
|
594
|
+
pinnedNodeData
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
`;
|
|
598
|
+
function usePinNodeDataMutation(baseOptions) {
|
|
599
|
+
const options = { ...defaultOptions, ...baseOptions };
|
|
600
|
+
return ApolloReactHooks.useMutation(PinNodeDataDocument, options);
|
|
601
|
+
}
|
|
569
602
|
var RegisterNodeDocument = gql`
|
|
570
603
|
mutation RegisterNode($input: RegisterNodeInput!) {
|
|
571
604
|
registerNode(input: $input) {
|
|
@@ -635,6 +668,18 @@ function useTriggerWorkflowMutation(baseOptions) {
|
|
|
635
668
|
const options = { ...defaultOptions, ...baseOptions };
|
|
636
669
|
return ApolloReactHooks.useMutation(TriggerWorkflowDocument, options);
|
|
637
670
|
}
|
|
671
|
+
var UnpinNodeDataDocument = gql`
|
|
672
|
+
mutation UnpinNodeData($id: ID!, $nodeId: String!) {
|
|
673
|
+
unpinNodeData(id: $id, nodeId: $nodeId) {
|
|
674
|
+
id
|
|
675
|
+
pinnedNodeData
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
`;
|
|
679
|
+
function useUnpinNodeDataMutation(baseOptions) {
|
|
680
|
+
const options = { ...defaultOptions, ...baseOptions };
|
|
681
|
+
return ApolloReactHooks.useMutation(UnpinNodeDataDocument, options);
|
|
682
|
+
}
|
|
638
683
|
var UpdateWorkflowDefinitionDocument = gql`
|
|
639
684
|
mutation UpdateWorkflowDefinition($id: ID!, $input: UpdateWorkflowDefinitionInput!) {
|
|
640
685
|
updateWorkflowDefinition(id: $id, input: $input) {
|
|
@@ -901,6 +946,7 @@ var WorkflowDefinitionDocument = gql`
|
|
|
901
946
|
description
|
|
902
947
|
status
|
|
903
948
|
definitionJson
|
|
949
|
+
pinnedNodeData
|
|
904
950
|
alias
|
|
905
951
|
icon
|
|
906
952
|
category
|
|
@@ -976,6 +1022,26 @@ function useWorkflowDefinitionsSuspenseQuery(baseOptions) {
|
|
|
976
1022
|
const options = baseOptions === ApolloReactHooks.skipToken ? baseOptions : { ...defaultOptions, ...baseOptions };
|
|
977
1023
|
return ApolloReactHooks.useSuspenseQuery(WorkflowDefinitionsDocument, options);
|
|
978
1024
|
}
|
|
1025
|
+
var WorkflowPinnedDataDocument = gql`
|
|
1026
|
+
query WorkflowPinnedData($id: ID) {
|
|
1027
|
+
workflowDefinition(id: $id) {
|
|
1028
|
+
id
|
|
1029
|
+
pinnedNodeData
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
`;
|
|
1033
|
+
function useWorkflowPinnedDataQuery(baseOptions) {
|
|
1034
|
+
const options = { ...defaultOptions, ...baseOptions };
|
|
1035
|
+
return ApolloReactHooks.useQuery(WorkflowPinnedDataDocument, options);
|
|
1036
|
+
}
|
|
1037
|
+
function useWorkflowPinnedDataLazyQuery(baseOptions) {
|
|
1038
|
+
const options = { ...defaultOptions, ...baseOptions };
|
|
1039
|
+
return ApolloReactHooks.useLazyQuery(WorkflowPinnedDataDocument, options);
|
|
1040
|
+
}
|
|
1041
|
+
function useWorkflowPinnedDataSuspenseQuery(baseOptions) {
|
|
1042
|
+
const options = baseOptions === ApolloReactHooks.skipToken ? baseOptions : { ...defaultOptions, ...baseOptions };
|
|
1043
|
+
return ApolloReactHooks.useSuspenseQuery(WorkflowPinnedDataDocument, options);
|
|
1044
|
+
}
|
|
979
1045
|
var WorkflowRunDocument = gql`
|
|
980
1046
|
query WorkflowRun($id: ID!) {
|
|
981
1047
|
workflowRun(id: $id) {
|
|
@@ -983,6 +1049,8 @@ var WorkflowRunDocument = gql`
|
|
|
983
1049
|
workflowKey
|
|
984
1050
|
version
|
|
985
1051
|
status
|
|
1052
|
+
mode
|
|
1053
|
+
sourceRunId
|
|
986
1054
|
triggerNodeId
|
|
987
1055
|
triggerData
|
|
988
1056
|
context
|
|
@@ -1012,6 +1080,8 @@ var WorkflowRunDocument = gql`
|
|
|
1012
1080
|
attemptCount
|
|
1013
1081
|
context
|
|
1014
1082
|
metadata
|
|
1083
|
+
usedPinnedData
|
|
1084
|
+
reusedFromRunId
|
|
1015
1085
|
}
|
|
1016
1086
|
}
|
|
1017
1087
|
}
|
|
@@ -1223,6 +1293,6 @@ function useWorkflowDefinitionsTagsSuspenseQuery(baseOptions) {
|
|
|
1223
1293
|
return ApolloReactHooks.useSuspenseQuery(WorkflowDefinitionsTagsDocument, options);
|
|
1224
1294
|
}
|
|
1225
1295
|
|
|
1226
|
-
export { ActivateWorkflowDefinitionDocument, ActiveExecutionsDocument, AvailableFluidgridsTagsDocument, CancelExecutionDocument, CreateFluidgridsTagDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DashboardSummaryDocument, DeactivateWorkflowDefinitionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, EventRegistrationsDocument, ExecutionDetailDocument, ExecutionLogsDocument, ExecutionStatsDocument, ExecutionsListDocument, FluidgridsAvailableTagFieldsFragmentDoc, FluidgridsEntityTagsDocument, FluidgridsTagAssignmentFieldsFragmentDoc, ImportWorkflowTemplateDocument, NodeEndpointConfigDocument, NodeEndpointConfigsDocument, NodeManifestDocument, NodeSchemaIntrospectionDocument, NodeStatesDocument, NodeUsageStatusDocument, PauseExecutionDocument, RegisterNodeDocument, RemoveNodeFromWorkflowsDocument, ReplaceFluidgridsEntityTagsDocument, RestoreWorkflowVersionDocument, ResumeExecutionDocument, RetryNodeDocument, RunLogAppendedDocument, RunLogLineFieldsFragmentDoc, RunLogsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, TerminateExecutionDocument, TriggerWorkflowDocument, UntagFluidgridsEntityDocument, UpdateWorkflowDefinitionDocument, UsageTimeSeriesDocument, WorkflowDefinitionDocument, WorkflowDefinitionsDocument, WorkflowDefinitionsTagsDocument, WorkflowRunDocument, WorkflowRunsDocument, WorkflowVersionsDocument, useActivateWorkflowDefinitionMutation, useActiveExecutionsLazyQuery, useActiveExecutionsQuery, useActiveExecutionsSuspenseQuery, useAvailableFluidgridsTagsLazyQuery, useAvailableFluidgridsTagsQuery, useAvailableFluidgridsTagsSuspenseQuery, useCancelExecutionMutation, useCreateFluidgridsTagMutation, useCreateWorkflowDefinitionMutation, useCreateWorkflowVersionMutation, useDashboardSummaryLazyQuery, useDashboardSummaryQuery, useDashboardSummarySuspenseQuery, useDeactivateWorkflowDefinitionMutation, useDeleteWorkflowDefinitionMutation, useDuplicateWorkflowMutation, useEventRegistrationsLazyQuery, useEventRegistrationsQuery, useEventRegistrationsSuspenseQuery, useExecutionDetailLazyQuery, useExecutionDetailQuery, useExecutionDetailSuspenseQuery, useExecutionLogsLazyQuery, useExecutionLogsQuery, useExecutionLogsSuspenseQuery, useExecutionStatsLazyQuery, useExecutionStatsQuery, useExecutionStatsSuspenseQuery, useExecutionsListLazyQuery, useExecutionsListQuery, useExecutionsListSuspenseQuery, useFluidgridsEntityTagsLazyQuery, useFluidgridsEntityTagsQuery, useFluidgridsEntityTagsSuspenseQuery, useImportWorkflowTemplateMutation, useNodeEndpointConfigLazyQuery, useNodeEndpointConfigQuery, useNodeEndpointConfigSuspenseQuery, useNodeEndpointConfigsLazyQuery, useNodeEndpointConfigsQuery, useNodeEndpointConfigsSuspenseQuery, useNodeManifestLazyQuery, useNodeManifestQuery, useNodeManifestSuspenseQuery, useNodeSchemaIntrospectionLazyQuery, useNodeSchemaIntrospectionQuery, useNodeSchemaIntrospectionSuspenseQuery, useNodeStatesLazyQuery, useNodeStatesQuery, useNodeStatesSuspenseQuery, useNodeUsageStatusLazyQuery, useNodeUsageStatusQuery, useNodeUsageStatusSuspenseQuery, usePauseExecutionMutation, useRegisterNodeMutation, useRemoveNodeFromWorkflowsMutation, useReplaceFluidgridsEntityTagsMutation, useRestoreWorkflowVersionMutation, useResumeExecutionMutation, useRetryNodeMutation, useRunLogAppendedSubscription, useRunLogsLazyQuery, useRunLogsQuery, useRunLogsSuspenseQuery, useSearchFluidgridsTagsLazyQuery, useSearchFluidgridsTagsQuery, useSearchFluidgridsTagsSuspenseQuery, useTagFluidgridsEntityMutation, useTerminateExecutionMutation, useTriggerWorkflowMutation, useUntagFluidgridsEntityMutation, useUpdateWorkflowDefinitionMutation, useUsageTimeSeriesLazyQuery, useUsageTimeSeriesQuery, useUsageTimeSeriesSuspenseQuery, useWorkflowDefinitionLazyQuery, useWorkflowDefinitionQuery, useWorkflowDefinitionSuspenseQuery, useWorkflowDefinitionsLazyQuery, useWorkflowDefinitionsQuery, useWorkflowDefinitionsSuspenseQuery, useWorkflowDefinitionsTagsLazyQuery, useWorkflowDefinitionsTagsQuery, useWorkflowDefinitionsTagsSuspenseQuery, useWorkflowRunLazyQuery, useWorkflowRunQuery, useWorkflowRunSuspenseQuery, useWorkflowRunsLazyQuery, useWorkflowRunsQuery, useWorkflowRunsSuspenseQuery, useWorkflowVersionsLazyQuery, useWorkflowVersionsQuery, useWorkflowVersionsSuspenseQuery };
|
|
1227
|
-
//# sourceMappingURL=chunk-
|
|
1228
|
-
//# sourceMappingURL=chunk-
|
|
1296
|
+
export { ActivateWorkflowDefinitionDocument, ActiveExecutionsDocument, AvailableFluidgridsTagsDocument, CancelExecutionDocument, CreateFluidgridsTagDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DashboardSummaryDocument, DeactivateWorkflowDefinitionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, EventRegistrationsDocument, ExecutionDetailDocument, ExecutionLogsDocument, ExecutionStatsDocument, ExecutionsListDocument, FluidgridsAvailableTagFieldsFragmentDoc, FluidgridsEntityTagsDocument, FluidgridsTagAssignmentFieldsFragmentDoc, ImportWorkflowTemplateDocument, NodeEndpointConfigDocument, NodeEndpointConfigsDocument, NodeManifestDocument, NodeSchemaIntrospectionDocument, NodeStatesDocument, NodeUsageStatusDocument, PauseExecutionDocument, PinNodeDataDocument, RegisterNodeDocument, RemoveNodeFromWorkflowsDocument, ReplaceFluidgridsEntityTagsDocument, RestoreWorkflowVersionDocument, ResumeExecutionDocument, RetryNodeDocument, RunFromNodeDocument, RunLogAppendedDocument, RunLogLineFieldsFragmentDoc, RunLogsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, TerminateExecutionDocument, TriggerWorkflowDocument, UnpinNodeDataDocument, UntagFluidgridsEntityDocument, UpdateWorkflowDefinitionDocument, UsageTimeSeriesDocument, WorkflowDefinitionDocument, WorkflowDefinitionsDocument, WorkflowDefinitionsTagsDocument, WorkflowPinnedDataDocument, WorkflowRunDocument, WorkflowRunsDocument, WorkflowVersionsDocument, useActivateWorkflowDefinitionMutation, useActiveExecutionsLazyQuery, useActiveExecutionsQuery, useActiveExecutionsSuspenseQuery, useAvailableFluidgridsTagsLazyQuery, useAvailableFluidgridsTagsQuery, useAvailableFluidgridsTagsSuspenseQuery, useCancelExecutionMutation, useCreateFluidgridsTagMutation, useCreateWorkflowDefinitionMutation, useCreateWorkflowVersionMutation, useDashboardSummaryLazyQuery, useDashboardSummaryQuery, useDashboardSummarySuspenseQuery, useDeactivateWorkflowDefinitionMutation, useDeleteWorkflowDefinitionMutation, useDuplicateWorkflowMutation, useEventRegistrationsLazyQuery, useEventRegistrationsQuery, useEventRegistrationsSuspenseQuery, useExecutionDetailLazyQuery, useExecutionDetailQuery, useExecutionDetailSuspenseQuery, useExecutionLogsLazyQuery, useExecutionLogsQuery, useExecutionLogsSuspenseQuery, useExecutionStatsLazyQuery, useExecutionStatsQuery, useExecutionStatsSuspenseQuery, useExecutionsListLazyQuery, useExecutionsListQuery, useExecutionsListSuspenseQuery, useFluidgridsEntityTagsLazyQuery, useFluidgridsEntityTagsQuery, useFluidgridsEntityTagsSuspenseQuery, useImportWorkflowTemplateMutation, useNodeEndpointConfigLazyQuery, useNodeEndpointConfigQuery, useNodeEndpointConfigSuspenseQuery, useNodeEndpointConfigsLazyQuery, useNodeEndpointConfigsQuery, useNodeEndpointConfigsSuspenseQuery, useNodeManifestLazyQuery, useNodeManifestQuery, useNodeManifestSuspenseQuery, useNodeSchemaIntrospectionLazyQuery, useNodeSchemaIntrospectionQuery, useNodeSchemaIntrospectionSuspenseQuery, useNodeStatesLazyQuery, useNodeStatesQuery, useNodeStatesSuspenseQuery, useNodeUsageStatusLazyQuery, useNodeUsageStatusQuery, useNodeUsageStatusSuspenseQuery, usePauseExecutionMutation, usePinNodeDataMutation, useRegisterNodeMutation, useRemoveNodeFromWorkflowsMutation, useReplaceFluidgridsEntityTagsMutation, useRestoreWorkflowVersionMutation, useResumeExecutionMutation, useRetryNodeMutation, useRunFromNodeMutation, useRunLogAppendedSubscription, useRunLogsLazyQuery, useRunLogsQuery, useRunLogsSuspenseQuery, useSearchFluidgridsTagsLazyQuery, useSearchFluidgridsTagsQuery, useSearchFluidgridsTagsSuspenseQuery, useTagFluidgridsEntityMutation, useTerminateExecutionMutation, useTriggerWorkflowMutation, useUnpinNodeDataMutation, useUntagFluidgridsEntityMutation, useUpdateWorkflowDefinitionMutation, useUsageTimeSeriesLazyQuery, useUsageTimeSeriesQuery, useUsageTimeSeriesSuspenseQuery, useWorkflowDefinitionLazyQuery, useWorkflowDefinitionQuery, useWorkflowDefinitionSuspenseQuery, useWorkflowDefinitionsLazyQuery, useWorkflowDefinitionsQuery, useWorkflowDefinitionsSuspenseQuery, useWorkflowDefinitionsTagsLazyQuery, useWorkflowDefinitionsTagsQuery, useWorkflowDefinitionsTagsSuspenseQuery, useWorkflowPinnedDataLazyQuery, useWorkflowPinnedDataQuery, useWorkflowPinnedDataSuspenseQuery, useWorkflowRunLazyQuery, useWorkflowRunQuery, useWorkflowRunSuspenseQuery, useWorkflowRunsLazyQuery, useWorkflowRunsQuery, useWorkflowRunsSuspenseQuery, useWorkflowVersionsLazyQuery, useWorkflowVersionsQuery, useWorkflowVersionsSuspenseQuery };
|
|
1297
|
+
//# sourceMappingURL=chunk-BHITFSOK.js.map
|
|
1298
|
+
//# sourceMappingURL=chunk-BHITFSOK.js.map
|