@burdenoff/fluidgrids-fe-sdk 2026.1008.1 → 2026.1008.3
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-JB5UYJMF.js +12 -0
- package/dist/{ExecutionDetailPage-3QKAXLHE.js.map → ExecutionDetailPage-JB5UYJMF.js.map} +1 -1
- package/dist/ExecutionsListPage-RDGTW6UF.js +11 -0
- package/dist/{ExecutionsListPage-KZLKLSSC.js.map → ExecutionsListPage-RDGTW6UF.js.map} +1 -1
- package/dist/{WorkflowBuilder-VW2MQ3TP.js → WorkflowBuilder-YVIRBXAH.js} +7 -7
- package/dist/{WorkflowBuilder-VW2MQ3TP.js.map → WorkflowBuilder-YVIRBXAH.js.map} +1 -1
- package/dist/WorkflowsList-CQRXZV6I.js +14 -0
- package/dist/{WorkflowsList-3Q7SSUYR.js.map → WorkflowsList-CQRXZV6I.js.map} +1 -1
- package/dist/{chunk-ZLYJKIKG.js → chunk-2ORIFA6I.js} +3 -3
- package/dist/{chunk-ZLYJKIKG.js.map → chunk-2ORIFA6I.js.map} +1 -1
- package/dist/{chunk-U2ORKW7G.js → chunk-5DQU54IB.js} +65 -10
- package/dist/chunk-5DQU54IB.js.map +1 -0
- package/dist/{chunk-DP277LT4.js → chunk-5UB3HSNE.js} +5 -5
- package/dist/{chunk-DP277LT4.js.map → chunk-5UB3HSNE.js.map} +1 -1
- package/dist/{chunk-LW722GAN.js → chunk-CZ7APZ5B.js} +5 -4
- package/dist/chunk-CZ7APZ5B.js.map +1 -0
- package/dist/chunk-DFGJKGWH.js +206 -0
- package/dist/chunk-DFGJKGWH.js.map +1 -0
- package/dist/{chunk-XJIQEIOD.js → chunk-EL672H2D.js} +4 -4
- package/dist/{chunk-XJIQEIOD.js.map → chunk-EL672H2D.js.map} +1 -1
- package/dist/{chunk-ZZRRG37Q.js → chunk-F5UXTEW5.js} +3 -3
- package/dist/{chunk-ZZRRG37Q.js.map → chunk-F5UXTEW5.js.map} +1 -1
- package/dist/{chunk-SJORR3EX.js → chunk-FA7S7YMY.js} +5 -153
- package/dist/chunk-FA7S7YMY.js.map +1 -0
- package/dist/{chunk-FKOUPL6Z.js → chunk-FAPYERDO.js} +3 -3
- package/dist/{chunk-FKOUPL6Z.js.map → chunk-FAPYERDO.js.map} +1 -1
- package/dist/{chunk-G3RPRMP5.js → chunk-M2YFTRLL.js} +4 -4
- package/dist/{chunk-G3RPRMP5.js.map → chunk-M2YFTRLL.js.map} +1 -1
- package/dist/{chunk-674J7L3F.js → chunk-VGJKZYW2.js} +10 -4
- package/dist/chunk-VGJKZYW2.js.map +1 -0
- package/dist/{chunk-5A7GP6O7.js → chunk-WNFZXH3Z.js} +3 -3
- package/dist/{chunk-5A7GP6O7.js.map → chunk-WNFZXH3Z.js.map} +1 -1
- package/dist/{chunk-BNSM27CU.js → chunk-WXNDAONY.js} +3 -3
- package/dist/{chunk-BNSM27CU.js.map → chunk-WXNDAONY.js.map} +1 -1
- package/dist/{chunk-GKSXZFDY.js → chunk-XBIHI224.js} +4 -4
- package/dist/{chunk-GKSXZFDY.js.map → chunk-XBIHI224.js.map} +1 -1
- package/dist/{chunk-RJPBWDZM.js → chunk-Z5HU6MUG.js} +5 -5
- package/dist/{chunk-RJPBWDZM.js.map → chunk-Z5HU6MUG.js.map} +1 -1
- package/dist/{chunk-5BDQNSP3.js → chunk-ZBMMEE5U.js} +6 -4
- package/dist/chunk-ZBMMEE5U.js.map +1 -0
- package/dist/client-YFAZ23OL.js +3 -0
- package/dist/{client-AMUUS7VE.js.map → client-YFAZ23OL.js.map} +1 -1
- package/dist/config-SCVEDF5V.js +3 -0
- package/dist/{config-5UMLMALY.js.map → config-SCVEDF5V.js.map} +1 -1
- package/dist/executions.js +6 -6
- package/dist/history.js +4 -4
- package/dist/index.d.ts +17 -5
- package/dist/index.js +29 -24
- package/dist/index.js.map +1 -1
- package/dist/nodes.js +2 -2
- package/dist/observability.js +3 -3
- package/dist/settings.js +3 -3
- package/dist/templates.js +5 -5
- package/dist/{workflow-builder-CpdCzzst.d.ts → workflow-builder-DvbjeuIN.d.ts} +5 -1
- package/dist/workflow-builder.d.ts +1 -1
- package/dist/workflow-builder.js +6 -6
- package/dist/workflows-list.js +4 -4
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-3QKAXLHE.js +0 -12
- package/dist/ExecutionsListPage-KZLKLSSC.js +0 -11
- package/dist/WorkflowsList-3Q7SSUYR.js +0 -14
- package/dist/chunk-5BDQNSP3.js.map +0 -1
- package/dist/chunk-674J7L3F.js.map +0 -1
- package/dist/chunk-LW722GAN.js.map +0 -1
- package/dist/chunk-SJORR3EX.js.map +0 -1
- package/dist/chunk-U2ORKW7G.js.map +0 -1
- package/dist/chunk-U4AJLVHA.js +0 -52
- package/dist/chunk-U4AJLVHA.js.map +0 -1
- package/dist/client-AMUUS7VE.js +0 -3
- package/dist/config-5UMLMALY.js +0 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useDataSinks, useDataSinkData, useInsightsData, useRunReplayActions } from './chunk-
|
|
1
|
+
import { useDataSinks, useDataSinkData, useInsightsData, useRunReplayActions } from './chunk-WNFZXH3Z.js';
|
|
2
2
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
3
3
|
import { useState, useMemo, useEffect } from 'react';
|
|
4
4
|
import { Icon } from '@iconify/react';
|
|
@@ -749,5 +749,5 @@ function ErrorAnalyticsPage() {
|
|
|
749
749
|
}
|
|
750
750
|
|
|
751
751
|
export { DataSinkDashboardPage, ErrorAnalyticsPage, InsightsPage };
|
|
752
|
-
//# sourceMappingURL=chunk-
|
|
753
|
-
//# sourceMappingURL=chunk-
|
|
752
|
+
//# sourceMappingURL=chunk-FAPYERDO.js.map
|
|
753
|
+
//# sourceMappingURL=chunk-FAPYERDO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/observability/utils.ts","../src/modules/observability/pages/DataSinkDashboardPage.tsx","../src/modules/observability/pages/InsightsPage.tsx"],"names":["jsxs","jsx","Icon","useState","useMemo","Button"],"mappings":"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","file":"chunk-FKOUPL6Z.js","sourcesContent":["import type { FailedRun, NodeUsageStat } from \"./types\";\n\nexport interface ErrorBreakdownEntry {\n key: string;\n count: number;\n}\n\nexport interface WorkflowFailureEntry {\n workflowKey: string;\n label: string;\n count: number;\n}\n\nexport function percentage(value: number, total: number): number {\n if (total <= 0) return 0;\n return Math.round((value / total) * 1000) / 10;\n}\n\nexport function getFailureBreakdown(\n runs: readonly FailedRun[],\n): ErrorBreakdownEntry[] {\n const counts = new Map<string, number>();\n for (const run of runs) {\n const key = run.errorType || \"UNKNOWN\";\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([key, count]) => ({ key, count }))\n .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key));\n}\n\nexport function getTopFailingWorkflows(\n runs: readonly FailedRun[],\n): WorkflowFailureEntry[] {\n const counts = new Map<string, WorkflowFailureEntry>();\n for (const run of runs) {\n const current = counts.get(run.workflowKey);\n if (current) {\n current.count += 1;\n } else {\n counts.set(run.workflowKey, {\n workflowKey: run.workflowKey,\n label: run.workflow?.name || run.workflowKey,\n count: 1,\n });\n }\n }\n return [...counts.values()].sort(\n (a, b) => b.count - a.count || a.label.localeCompare(b.label),\n );\n}\n\nexport function getTopFailingNodes(\n nodeUsageStats: readonly NodeUsageStat[],\n): NodeUsageStat[] {\n return [...nodeUsageStats]\n .filter((stat) => stat.failureCount > 0)\n .sort(\n (a, b) =>\n b.failureCount - a.failureCount || a.nodeType.localeCompare(b.nodeType),\n );\n}\n\nexport function formatDuration(seconds: number | null | undefined): string {\n if (seconds === null || seconds === undefined || !Number.isFinite(seconds)) {\n return \"—\";\n }\n if (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return `${minutes}m ${remainingSeconds}s`;\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"—\";\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes / 1024;\n let unit = units[0];\n for (let i = 1; i < units.length && value >= 1024; i += 1) {\n value /= 1024;\n unit = units[i];\n }\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${unit}`;\n}\n\nexport function prettyJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2) ?? \"null\";\n } catch {\n return String(value);\n }\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { Input } from \"@burdenoff/fe-libs/ui\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { useDataSinkData, useDataSinks } from \"../hooks/useObservability\";\nimport { formatBytes, prettyJson } from \"../utils\";\nimport type { DataSinkSummary } from \"../types\";\n\nfunction valueLabel(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\nfunction DataPreview({ value }: { value: unknown }) {\n const tr = useTr();\n if (Array.isArray(value)) {\n const rows = value.filter(\n (item): item is Record<string, unknown> =>\n Boolean(item) && typeof item === \"object\" && !Array.isArray(item),\n );\n if (rows.length > 0) {\n const keys = [...new Set(rows.flatMap((row) => Object.keys(row)))].slice(\n 0,\n 12,\n );\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border-secondary\">\n <table className=\"min-w-full text-left text-sm\">\n <thead className=\"bg-background-tertiary text-xs uppercase text-text-secondary\">\n <tr>\n {keys.map((key) => (\n <th\n key={key}\n className=\"whitespace-nowrap px-3 py-2 font-medium\"\n >\n {key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-secondary\">\n {rows.slice(0, 50).map((row, index) => (\n <tr key={index} className=\"text-text-primary\">\n {keys.map((key) => (\n <td key={key} className=\"max-w-xs truncate px-3 py-2\">\n {valueLabel(row[key])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {rows.length > 50 && (\n <p className=\"border-t border-border-secondary px-3 py-2 text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.previewLimit\",\n \"Showing the first 50 rows\",\n )}\n </p>\n )}\n </div>\n );\n }\n }\n return (\n <pre className=\"max-h-[28rem] overflow-auto rounded-lg border border-border-secondary bg-background-primary p-4 text-xs text-text-primary\">\n {prettyJson(value)}\n </pre>\n );\n}\n\nfunction SinkCard({\n sink,\n selected,\n onSelect,\n}: {\n sink: DataSinkSummary;\n selected: boolean;\n onSelect: () => void;\n}) {\n const tr = useTr();\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={`w-full rounded-lg border p-4 text-left transition-colors ${selected ? \"border-action-primary-bg bg-action-primary-bg/10\" : \"border-border-secondary bg-background-secondary hover:border-action-primary-bg/60\"}`}\n aria-pressed={selected}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">\n {sink.name || sink.key}\n </p>\n <p className=\"mt-1 truncate font-mono text-xs text-text-secondary\">\n {sink.key}\n </p>\n </div>\n <span className=\"shrink-0 rounded-full bg-background-tertiary px-2 py-0.5 text-xs text-text-secondary\">\n {sink.status}\n </span>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-text-secondary\">\n <span>{formatBytes(sink.sizeBytes)}</span>\n <span>\n {sink.linkedWorkflowCount}{\" \"}\n {tr(\"fluidgrids.dataSinks.workflows\", \"workflows\")}\n </span>\n </div>\n </button>\n );\n}\n\nexport function DataSinkDashboardPage() {\n const tr = useTr();\n const [search, setSearch] = useState(\"\");\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const { sinks, totalCount, loading, error, refetch } = useDataSinks(search);\n const selectedSink = useMemo(\n () => sinks.find((sink) => sink.id === selectedId) ?? sinks[0] ?? null,\n [selectedId, sinks],\n );\n const {\n sinkData,\n loading: dataLoading,\n error: dataError,\n refetch: refetchData,\n } = useDataSinkData(selectedSink);\n\n useEffect(() => {\n if (selectedSink && selectedSink.id !== selectedId)\n setSelectedId(selectedSink.id);\n }, [selectedId, selectedSink]);\n\n const payload = sinkData?.extracted ?? sinkData?.raw;\n const totalBytes = sinks.reduce((total, sink) => total + sink.sizeBytes, 0);\n\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <header className=\"mb-6 flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.kicker\", \"BigConsole data\")}\n </p>\n <h1 className=\"mt-1 text-2xl font-semibold text-text-primary sm:text-3xl\">\n {tr(\"fluidgrids.dataSinks.title\", \"DataSink dashboard\")}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.subtitle\",\n \"Inspect workflow-produced data and its freshness without leaving FluidGrids.\",\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n onClick={() => void refetch()}\n disabled={loading}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.dataSinks.refresh\", \"Refresh\")}\n </Button>\n </header>\n\n <section className=\"mb-6 grid gap-4 sm:grid-cols-3\">\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.totalSinks\", \"DataSinks\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-text-primary\">\n {totalCount}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.activeSinks\", \"Active sinks\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-status-success-text\">\n {sinks.filter((sink) => sink.isActive).length}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.totalStorage\", \"Visible storage\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-text-primary\">\n {formatBytes(totalBytes)}\n </p>\n </div>\n </section>\n\n {error && (\n <div\n role=\"alert\"\n className=\"mb-6 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-4 text-sm text-status-error-text\"\n >\n {error.message}\n </div>\n )}\n <div className=\"grid gap-6 xl:grid-cols-[22rem_minmax(0,1fr)]\">\n <aside className=\"space-y-3\">\n <Input\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={tr(\n \"fluidgrids.dataSinks.search\",\n \"Search by name or key\",\n )}\n aria-label={tr(\n \"fluidgrids.dataSinks.search\",\n \"Search by name or key\",\n )}\n />\n {loading && sinks.length === 0 && (\n <p className=\"p-4 text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.loading\", \"Loading DataSinks…\")}\n </p>\n )}\n {!loading && sinks.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-border-secondary p-6 text-center text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.empty\", \"No active DataSinks found.\")}\n </div>\n )}\n {sinks.map((sink) => (\n <SinkCard\n key={sink.id}\n sink={sink}\n selected={sink.id === selectedSink?.id}\n onSelect={() => setSelectedId(sink.id)}\n />\n ))}\n </aside>\n\n <main className=\"min-w-0 rounded-xl border border-border-secondary bg-background-secondary p-5\">\n {!selectedSink && (\n <div className=\"flex min-h-64 flex-col items-center justify-center text-center\">\n <Icon\n icon=\"mdi:database-outline\"\n className=\"mb-3 text-text-secondary\"\n width={40}\n />\n <p className=\"font-medium text-text-primary\">\n {tr(\"fluidgrids.dataSinks.selectTitle\", \"Select a DataSink\")}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.selectDescription\",\n \"Choose a sink to inspect its latest payload.\",\n )}\n </p>\n </div>\n )}\n {selectedSink && (\n <>\n <div className=\"mb-5 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-lg font-semibold text-text-primary\">\n {selectedSink.name || selectedSink.key}\n </h2>\n <p className=\"mt-1 font-mono text-xs text-text-secondary\">\n {selectedSink.key} ·{\" \"}\n {tr(\"fluidgrids.dataSinks.updated\", \"Updated\")}{\" \"}\n {new Date(selectedSink.lastRefreshedAt).toLocaleString()}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void refetchData()}\n disabled={dataLoading}\n >\n <Icon\n icon=\"mdi:database-refresh-outline\"\n className=\"mr-1\"\n width={16}\n />\n {tr(\"fluidgrids.dataSinks.refreshPayload\", \"Refresh payload\")}\n </Button>\n </div>\n {dataError && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\"\n >\n {dataError.message}\n </div>\n )}\n {dataLoading && !sinkData && (\n <div className=\"h-64 animate-pulse rounded-lg bg-background-primary\" />\n )}\n {!dataLoading && sinkData && (\n <>\n <div className=\"mb-4 flex flex-wrap gap-3 text-xs text-text-secondary\">\n <span>\n {sinkData.cached\n ? tr(\"fluidgrids.dataSinks.cached\", \"Cached\")\n : tr(\"fluidgrids.dataSinks.fresh\", \"Fresh\")}\n </span>\n <span>v{sinkData.version}</span>\n {sinkData.totalCount !== null &&\n sinkData.totalCount !== undefined && (\n <span>{sinkData.totalCount} rows</span>\n )}\n </div>\n <DataPreview value={payload} />\n </>\n )}\n </>\n )}\n </main>\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport {\n useInsightsData,\n useRunReplayActions,\n} from \"../hooks/useObservability\";\nimport {\n formatDuration,\n getFailureBreakdown,\n getTopFailingNodes,\n getTopFailingWorkflows,\n percentage,\n} from \"../utils\";\nimport type { DashboardSummary, FailedRun } from \"../types\";\n\nfunction normalizedRate(summary: DashboardSummary): number {\n const supplied = summary.workflowSuccessRate;\n if (supplied !== null && supplied !== undefined) {\n return supplied <= 1 ? supplied * 100 : supplied;\n }\n const finished = summary.runsCompletedCount + summary.runsFailedCount;\n return percentage(summary.runsCompletedCount, finished);\n}\n\nfunction MetricCard({\n icon,\n label,\n value,\n detail,\n tone = \"text-text-primary\",\n}: {\n icon: string;\n label: string;\n value: string;\n detail?: string;\n tone?: string;\n}) {\n return (\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Icon icon={icon} width={18} />\n <span>{label}</span>\n </div>\n <p className={`mt-3 text-2xl font-semibold ${tone}`}>{value}</p>\n {detail && <p className=\"mt-1 text-xs text-text-secondary\">{detail}</p>}\n </div>\n );\n}\n\nfunction LoadingState() {\n return (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\" aria-busy=\"true\">\n {[1, 2, 3, 4].map((item) => (\n <div\n key={item}\n className=\"h-28 animate-pulse rounded-xl border border-border-secondary bg-background-secondary\"\n />\n ))}\n </div>\n );\n}\n\nexport interface InsightsPageProps {\n showErrors?: boolean;\n}\n\nexport function InsightsPage({ showErrors = false }: InsightsPageProps) {\n const tr = useTr();\n const navigate = useNavigate();\n const { summary, failedRuns, loading, error, refetch } = useInsightsData();\n const { retryMany, loading: retryLoading } = useRunReplayActions();\n const [activeTab, setActiveTab] = useState<\"overview\" | \"errors\">(\n showErrors ? \"errors\" : \"overview\",\n );\n\n const failureBreakdown = useMemo(\n () => getFailureBreakdown(failedRuns),\n [failedRuns],\n );\n const topWorkflows = useMemo(\n () => getTopFailingWorkflows(failedRuns).slice(0, 8),\n [failedRuns],\n );\n const topNodes = useMemo(\n () => getTopFailingNodes(summary?.nodeUsageStats ?? []).slice(0, 8),\n [summary?.nodeUsageStats],\n );\n\n const retry = async (run: FailedRun) => {\n const retried = await retryMany([run.id]);\n if (retried.length === 0) {\n toast.error(\n tr(\"fluidgrids.insights.retryFailed\", \"Could not retry the failed run\"),\n );\n return;\n }\n toast.success(\n tr(\"fluidgrids.insights.retryStarted\", \"A new run was started\"),\n );\n navigate(`../runs/${retried[0].runId}`);\n };\n\n if (error) {\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <div\n className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-5 text-status-error-text\"\n role=\"alert\"\n >\n <p className=\"font-medium\">\n {tr(\"fluidgrids.insights.loadError\", \"Could not load insights\")}\n </p>\n <p className=\"mt-1 text-sm\">{error.message}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => void refetch()}\n >\n {tr(\"fluidgrids.insights.retryLoad\", \"Try again\")}\n </Button>\n </div>\n </div>\n );\n }\n\n const successRate = summary ? normalizedRate(summary) : 0;\n const failureRate = summary\n ? percentage(summary.runsFailedCount, summary.runsCountTotal)\n : 0;\n const commonError = failureBreakdown[0];\n\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <header className=\"mb-6 flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {tr(\"fluidgrids.insights.period\", \"Last 30 days\")}\n </p>\n <h1 className=\"mt-1 text-2xl font-semibold text-text-primary sm:text-3xl\">\n {tr(\"fluidgrids.insights.title\", \"Workflow insights\")}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.subtitle\",\n \"Understand workflow health, failures, and the nodes that need attention.\",\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n onClick={() => void refetch()}\n disabled={loading}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.insights.refresh\", \"Refresh\")}\n </Button>\n </header>\n\n <div\n className=\"mb-6 flex gap-1 border-b border-border-secondary\"\n role=\"tablist\"\n >\n <button\n role=\"tab\"\n aria-selected={activeTab === \"overview\"}\n onClick={() => {\n setActiveTab(\"overview\");\n if (showErrors) navigate(\"../insights\");\n }}\n className={`border-b-2 px-3 py-2 text-sm ${activeTab === \"overview\" ? \"border-action-primary-bg text-text-primary\" : \"border-transparent text-text-secondary\"}`}\n >\n {tr(\"fluidgrids.insights.overviewTab\", \"Overview\")}\n </button>\n <button\n role=\"tab\"\n aria-selected={activeTab === \"errors\"}\n onClick={() => {\n setActiveTab(\"errors\");\n if (!showErrors) navigate(\"../insights/errors\");\n }}\n className={`border-b-2 px-3 py-2 text-sm ${activeTab === \"errors\" ? \"border-action-primary-bg text-text-primary\" : \"border-transparent text-text-secondary\"}`}\n >\n {tr(\"fluidgrids.insights.errorsTab\", \"Error analytics\")}\n </button>\n </div>\n\n {loading && !summary ? (\n <LoadingState />\n ) : activeTab === \"overview\" && summary ? (\n <OverviewContent\n summary={summary}\n successRate={successRate}\n failureRate={failureRate}\n topWorkflows={topWorkflows}\n topNodes={topNodes}\n tr={tr}\n />\n ) : (\n <ErrorContent\n summary={summary}\n failedRuns={failedRuns}\n failureBreakdown={failureBreakdown}\n commonError={commonError}\n retry={retry}\n retryLoading={retryLoading}\n tr={tr}\n />\n )}\n </div>\n );\n}\n\nfunction OverviewContent({\n summary,\n successRate,\n failureRate,\n topWorkflows,\n topNodes,\n tr,\n}: {\n summary: DashboardSummary;\n successRate: number;\n failureRate: number;\n topWorkflows: ReturnType<typeof getTopFailingWorkflows>;\n topNodes: ReturnType<typeof getTopFailingNodes>;\n tr: ReturnType<typeof useTr>;\n}) {\n const totalDuration =\n summary.runsCompletedCount * (summary.avgWorkflowExecutionTimeSeconds ?? 0);\n return (\n <div className=\"space-y-6\">\n <section\n className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\"\n aria-label={tr(\"fluidgrids.insights.healthLabel\", \"Workflow health\")}\n >\n <MetricCard\n icon=\"mdi:chart-line\"\n label={tr(\"fluidgrids.insights.successRate\", \"Success rate\")}\n value={`${successRate.toFixed(1)}%`}\n detail={`${summary.runsCompletedCount.toLocaleString()} completed runs`}\n tone=\"text-status-success-text\"\n />\n <MetricCard\n icon=\"mdi:clock-outline\"\n label={tr(\"fluidgrids.insights.avgDuration\", \"Average duration\")}\n value={formatDuration(summary.avgWorkflowExecutionTimeSeconds)}\n detail={`${summary.runsCountTotal.toLocaleString()} total runs`}\n />\n <MetricCard\n icon=\"mdi:alert-circle-outline\"\n label={tr(\"fluidgrids.insights.failedRuns\", \"Failed runs\")}\n value={summary.runsFailedCount.toLocaleString()}\n detail={`${failureRate.toFixed(1)}% of all runs`}\n tone=\"text-status-error-text\"\n />\n <MetricCard\n icon=\"mdi:timer-play-outline\"\n label={tr(\n \"fluidgrids.insights.timeProcessed\",\n \"Execution time processed\",\n )}\n value={formatDuration(totalDuration)}\n detail={tr(\n \"fluidgrids.insights.timeProcessedDetail\",\n \"Based on completed runs; time-saved baselines are not configured.\",\n )}\n />\n </section>\n\n <section className=\"grid gap-6 lg:grid-cols-2\">\n <InsightList\n title={tr(\n \"fluidgrids.insights.topFailingWorkflows\",\n \"Top failing workflows\",\n )}\n empty={tr(\n \"fluidgrids.insights.noFailedWorkflows\",\n \"No failed workflows in this period.\",\n )}\n >\n {topWorkflows.map((workflow) => (\n <div key={workflow.workflowKey} className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">\n {workflow.label}\n </span>\n <div className=\"h-2 w-28 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-error-bg\"\n style={{\n width: `${Math.max(8, percentage(workflow.count, topWorkflows[0]?.count ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-secondary\">\n {workflow.count}\n </span>\n </div>\n ))}\n </InsightList>\n <InsightList\n title={tr(\"fluidgrids.insights.topFailingNodes\", \"Top failing nodes\")}\n empty={tr(\n \"fluidgrids.insights.noFailedNodes\",\n \"No node failures in this period.\",\n )}\n >\n {topNodes.map((node) => (\n <div key={node.nodeType} className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">\n {node.nodeType}\n </span>\n <div className=\"h-2 w-28 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-warning-bg\"\n style={{\n width: `${Math.max(8, percentage(node.failureCount, topNodes[0]?.failureCount ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-secondary\">\n {node.failureCount}\n </span>\n </div>\n ))}\n </InsightList>\n </section>\n </div>\n );\n}\n\nfunction InsightList({\n title,\n empty,\n children,\n}: {\n title: string;\n empty: string;\n children: React.ReactNode;\n}) {\n const hasChildren = Array.isArray(children)\n ? children.length > 0\n : Boolean(children);\n return (\n <section className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">\n {title}\n </h2>\n {hasChildren ? (\n <div className=\"space-y-3\">{children}</div>\n ) : (\n <p className=\"text-sm text-text-secondary\">{empty}</p>\n )}\n </section>\n );\n}\n\nfunction ErrorContent({\n summary,\n failedRuns,\n failureBreakdown,\n commonError,\n retry,\n retryLoading,\n tr,\n}: {\n summary: DashboardSummary | null;\n failedRuns: FailedRun[];\n failureBreakdown: ReturnType<typeof getFailureBreakdown>;\n commonError?: { key: string; count: number };\n retry: (run: FailedRun) => Promise<void>;\n retryLoading: boolean;\n tr: ReturnType<typeof useTr>;\n}) {\n return (\n <div className=\"space-y-6\">\n <section className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricCard\n icon=\"mdi:alert-outline\"\n label={tr(\"fluidgrids.insights.failureRate\", \"Failure rate\")}\n value={`${summary ? percentage(summary.runsFailedCount, summary.runsCountTotal).toFixed(1) : \"0.0\"}%`}\n tone=\"text-status-error-text\"\n />\n <MetricCard\n icon=\"mdi:counter\"\n label={tr(\"fluidgrids.insights.failureCount\", \"Failures captured\")}\n value={failedRuns.length.toLocaleString()}\n detail={\n summary\n ? `${summary.runsFailedCount.toLocaleString()} total recorded`\n : undefined\n }\n />\n <MetricCard\n icon=\"mdi:alert-decagram-outline\"\n label={tr(\"fluidgrids.insights.commonError\", \"Most common error\")}\n value={commonError?.key ?? \"—\"}\n detail={commonError ? `${commonError.count} occurrences` : undefined}\n />\n <MetricCard\n icon=\"mdi:repeat\"\n label={tr(\n \"fluidgrids.insights.recoveredByRetry\",\n \"Recovered by retry\",\n )}\n value=\"—\"\n detail={tr(\n \"fluidgrids.insights.retryBaselineMissing\",\n \"Retry recovery baseline is not exposed by the service yet.\",\n )}\n tone=\"text-text-secondary\"\n />\n </section>\n <section className=\"grid gap-6 lg:grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]\">\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">\n {tr(\"fluidgrids.insights.errorsByType\", \"Errors by type\")}\n </h2>\n <div className=\"space-y-3\">\n {failureBreakdown.length === 0 && (\n <p className=\"text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.noErrors\",\n \"No errors in this period.\",\n )}\n </p>\n )}\n {failureBreakdown.map((entry) => (\n <div key={entry.key} className=\"flex items-center gap-3\">\n <span className=\"w-28 truncate text-sm text-text-secondary\">\n {entry.key}\n </span>\n <div className=\"h-2 flex-1 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-error-bg\"\n style={{\n width: `${Math.max(8, percentage(entry.count, failureBreakdown[0]?.count ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-primary\">\n {entry.count}\n </span>\n </div>\n ))}\n </div>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr(\"fluidgrids.insights.recentFailures\", \"Recent failures\")}\n </h2>\n <span className=\"text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.insights.sampleNote\",\n \"Showing the latest 100 failures\",\n )}\n </span>\n </div>\n <div className=\"divide-y divide-border-secondary\">\n {failedRuns.length === 0 && (\n <p className=\"py-3 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.noRecentFailures\",\n \"No recent failures.\",\n )}\n </p>\n )}\n {failedRuns.slice(0, 12).map((run) => (\n <div\n key={run.id}\n className=\"flex flex-col gap-2 py-3 sm:flex-row sm:items-center sm:gap-4\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {run.errorMessage || run.errorType || \"Workflow failed\"}\n </p>\n <p className=\"mt-0.5 truncate text-xs text-text-secondary\">\n {run.workflow?.name || run.workflowKey} ·{\" \"}\n {run.id.slice(0, 10)} · {formatDuration(run.duration)}\n </p>\n </div>\n <span className=\"rounded-full bg-status-error-bg-subtle px-2 py-1 text-xs text-status-error-text\">\n {run.errorType || \"UNKNOWN\"}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void retry(run)}\n disabled={retryLoading}\n >\n {tr(\"fluidgrids.insights.retry\", \"Retry\")}\n </Button>\n </div>\n ))}\n </div>\n </div>\n </section>\n </div>\n );\n}\n\nexport function ErrorAnalyticsPage() {\n return <InsightsPage showErrors />;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/observability/utils.ts","../src/modules/observability/pages/DataSinkDashboardPage.tsx","../src/modules/observability/pages/InsightsPage.tsx"],"names":["jsxs","jsx","Icon","useState","useMemo","Button"],"mappings":";;;;;;;;;;;AAaO,SAAS,UAAA,CAAW,OAAe,KAAA,EAAuB;AAC/D,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,CAAA;AACvB,EAAA,OAAO,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,KAAA,GAAS,GAAI,CAAA,GAAI,EAAA;AAC9C;AAEO,SAAS,oBACd,IAAA,EACuB;AACvB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,GAAA,GAAM,IAAI,SAAA,IAAa,SAAA;AAC7B,IAAA,MAAA,CAAO,IAAI,GAAA,EAAA,CAAM,MAAA,CAAO,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,CAAA,CACxB,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,GAAA,EAAK,KAAA,EAAM,CAAE,CAAA,CACtC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AACnE;AAEO,SAAS,uBACd,IAAA,EACwB;AACxB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAkC;AACrD,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,WAAW,CAAA;AAC1C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAA,IAAS,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAA,CAAI,IAAI,WAAA,EAAa;AAAA,QAC1B,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,KAAA,EAAO,GAAA,CAAI,QAAA,EAAU,IAAA,IAAQ,GAAA,CAAI,WAAA;AAAA,QACjC,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,IAC1B,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK;AAAA,GAC9D;AACF;AAEO,SAAS,mBACd,cAAA,EACiB;AACjB,EAAA,OAAO,CAAC,GAAG,cAAc,CAAA,CACtB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,YAAA,GAAe,CAAC,CAAA,CACtC,IAAA;AAAA,IACC,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,CAAE,YAAA,GAAe,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,QAAQ;AAAA,GAC1E;AACJ;AAEO,SAAS,eAAe,OAAA,EAA4C;AACzE,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAA,KAAY,MAAA,IAAa,CAAC,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1E,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,GAAU,GAAG,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,OAAA,GAAU,GAAI,CAAC,CAAA,EAAA,CAAA;AACrD,EAAA,IAAI,UAAU,EAAA,EAAI,OAAO,GAAG,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAChD,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAA,CAAA;AACxC;AAEO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,GAAQ,GAAG,OAAO,QAAA;AACjD,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AACrC,EAAA,IAAI,QAAQ,KAAA,GAAQ,IAAA;AACpB,EAAA,IAAI,IAAA,GAAO,MAAM,CAAC,CAAA;AAClB,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,KAAA,CAAM,UAAU,KAAA,IAAS,IAAA,EAAM,KAAK,CAAA,EAAG;AACzD,IAAA,KAAA,IAAS,IAAA;AACT,IAAA,IAAA,GAAO,MAAM,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,CAAA,EAAG,MAAM,OAAA,CAAQ,KAAA,IAAS,KAAK,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACtD;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,IAAK,MAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;ACpFA,SAAS,WAAW,KAAA,EAAwB;AAC1C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,QAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC1D,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,WAAA,CAAY,EAAE,KAAA,EAAM,EAAuB;AAClD,EAAA,MAAM,KAAK,KAAA,EAAM;AACjB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AAAA,MACjB,CAAC,IAAA,KACC,OAAA,CAAQ,IAAI,CAAA,IAAK,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI;AAAA,KACpE;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,IAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ,OAAO,IAAA,CAAK,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAA;AAAA,QACjE,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,8BAAA,EACf,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAM,WAAU,8DAAA,EACf,QAAA,kBAAA,GAAA,CAAC,QACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACT,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,yCAAA;AAAA,cAET,QAAA,EAAA;AAAA,aAAA;AAAA,YAHI;AAAA,WAKR,GACH,CAAA,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,kCAAA,EACd,eAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAI,CAAC,GAAA,EAAK,KAAA,qBAC3B,GAAA,CAAC,QAAe,SAAA,EAAU,mBAAA,EACvB,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACT,GAAA,CAAC,IAAA,EAAA,EAAa,SAAA,EAAU,+BACrB,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,KADb,GAET,CACD,CAAA,EAAA,EALM,KAMT,CACD,CAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,QACC,KAAK,MAAA,GAAS,EAAA,oBACb,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,wEAAA,EACV,QAAA,EAAA,EAAA;AAAA,UACC,mCAAA;AAAA,UACA;AAAA,SACF,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,IAEJ;AAAA,EACF;AACA,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,2HAAA,EACZ,QAAA,EAAA,UAAA,CAAW,KAAK,CAAA,EACnB,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS;AAAA,EAChB,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,KAAK,KAAA,EAAM;AACjB,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,SAAA,EAAW,CAAA,yDAAA,EAA4D,QAAA,GAAW,kDAAA,GAAqD,mFAAmF,CAAA,CAAA;AAAA,MAC1N,cAAA,EAAc,QAAA;AAAA,MAEd,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,OAAE,SAAA,EAAU,wCAAA,EACV,QAAA,EAAA,IAAA,CAAK,IAAA,IAAQ,KAAK,GAAA,EACrB,CAAA;AAAA,4BACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EACV,eAAK,GAAA,EACR;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EACb,eAAK,MAAA,EACR;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA,EAAE,CAAA;AAAA,+BAClC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,mBAAA;AAAA,YAAqB,GAAA;AAAA,YAC1B,EAAA,CAAG,kCAAkC,WAAW;AAAA,WAAA,EACnD;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,qBAAA,GAAwB;AACtC,EAAA,MAAM,KAAK,KAAA,EAAM;AACjB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,EAAE,OAAO,UAAA,EAAY,OAAA,EAAS,OAAO,OAAA,EAAQ,GAAI,aAAa,MAAM,CAAA;AAC1E,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,UAAU,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AAAA,IAClE,CAAC,YAAY,KAAK;AAAA,GACpB;AACA,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,OAAA,EAAS,WAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX,GAAI,gBAAgB,YAAY,CAAA;AAEhC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAA,IAAgB,aAAa,EAAA,KAAO,UAAA;AACtC,MAAA,aAAA,CAAc,aAAa,EAAE,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,QAAA,EAAU,SAAA,IAAa,QAAA,EAAU,GAAA;AACjD,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,CAAC,OAAO,IAAA,KAAS,KAAA,GAAQ,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAE1E,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,wEAAA,EAChB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,iEAAA,EACV,QAAA,EAAA,EAAA,CAAG,6BAAA,EAA+B,iBAAiB,CAAA,EACtD,CAAA;AAAA,4BACC,IAAA,EAAA,EAAG,SAAA,EAAU,6DACX,QAAA,EAAA,EAAA,CAAG,4BAAA,EAA8B,oBAAoB,CAAA,EACxD,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAA,EACV,QAAA,EAAA,EAAA;AAAA,UACC,+BAAA;AAAA,UACA;AAAA,SACF,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,MAAM,KAAK,OAAA,EAAQ;AAAA,UAC5B,QAAA,EAAU,OAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAK,IAAA,EAAK,aAAA,EAAc,SAAA,EAAU,MAAA,EAAO,OAAO,EAAA,EAAI,CAAA;AAAA,YACpD,EAAA,CAAG,gCAAgC,SAAS;AAAA;AAAA;AAAA;AAC/C,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,gCAAA,EACjB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,6BAAA,EACV,QAAA,EAAA,EAAA,CAAG,iCAAA,EAAmC,WAAW,CAAA,EACpD,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAAA,EACV,QAAA,EAAA,UAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,6BAAA,EACV,QAAA,EAAA,EAAA,CAAG,kCAAA,EAAoC,cAAc,CAAA,EACxD,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACV,QAAA,EAAA,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,EACzC;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,6BAAA,EACV,QAAA,EAAA,EAAA,CAAG,mCAAA,EAAqC,iBAAiB,CAAA,EAC5D,CAAA;AAAA,4BACC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAAA,EACV,QAAA,EAAA,WAAA,CAAY,UAAU,CAAA,EACzB;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,KAAA,oBACC,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAU,gHAAA;AAAA,QAET,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,KACT;AAAA,oBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,WAAA,EACf,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAAU,SAAA,CAAU,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YACjD,WAAA,EAAa,EAAA;AAAA,cACX,6BAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,YAAA,EAAY,EAAA;AAAA,cACV,6BAAA;AAAA,cACA;AAAA;AACF;AAAA,SACF;AAAA,QACC,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA,oBAC3B,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAA,EACV,QAAA,EAAA,EAAA,CAAG,8BAAA,EAAgC,yBAAoB,CAAA,EAC1D,CAAA;AAAA,QAED,CAAC,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA,oBAC5B,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qGAAA,EACZ,QAAA,EAAA,EAAA,CAAG,4BAAA,EAA8B,4BAA4B,CAAA,EAChE,CAAA;AAAA,QAED,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA;AAAA,YACA,QAAA,EAAU,IAAA,CAAK,EAAA,KAAO,YAAA,EAAc,EAAA;AAAA,YACpC,QAAA,EAAU,MAAM,aAAA,CAAc,IAAA,CAAK,EAAE;AAAA,WAAA;AAAA,UAHhC,IAAA,CAAK;AAAA,SAKb;AAAA,OAAA,EACH,CAAA;AAAA,sBAEA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+EAAA,EACb,QAAA,EAAA;AAAA,QAAA,CAAC,YAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,sBAAA;AAAA,cACL,SAAA,EAAU,0BAAA;AAAA,cACV,KAAA,EAAO;AAAA;AAAA,WACT;AAAA,8BACC,GAAA,EAAA,EAAE,SAAA,EAAU,iCACV,QAAA,EAAA,EAAA,CAAG,kCAAA,EAAoC,mBAAmB,CAAA,EAC7D,CAAA;AAAA,0BACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAA,EACV,QAAA,EAAA,EAAA;AAAA,YACC,wCAAA;AAAA,YACA;AAAA,WACF,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QAED,gCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAG,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA,YAAA,CAAa,IAAA,IAAQ,aAAa,GAAA,EACrC,CAAA;AAAA,8BACA,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAAA,EACV,QAAA,EAAA;AAAA,gBAAA,YAAA,CAAa,GAAA;AAAA,gBAAI,OAAA;AAAA,gBAAG,GAAA;AAAA,gBACpB,EAAA,CAAG,gCAAgC,SAAS,CAAA;AAAA,gBAAG,GAAA;AAAA,gBAC/C,IAAI,IAAA,CAAK,YAAA,CAAa,eAAe,EAAE,cAAA;AAAe,eAAA,EACzD;AAAA,aAAA,EACF,CAAA;AAAA,4BACA,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,SAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,MAAM,KAAK,WAAA,EAAY;AAAA,gBAChC,QAAA,EAAU,WAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,8BAAA;AAAA,sBACL,SAAA,EAAU,MAAA;AAAA,sBACV,KAAA,EAAO;AAAA;AAAA,mBACT;AAAA,kBACC,EAAA,CAAG,uCAAuC,iBAAiB;AAAA;AAAA;AAAA;AAC9D,WAAA,EACF,CAAA;AAAA,UACC,SAAA,oBACC,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,SAAA,EAAU,gHAAA;AAAA,cAET,QAAA,EAAA,SAAA,CAAU;AAAA;AAAA,WACb;AAAA,UAED,eAAe,CAAC,QAAA,oBACf,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qDAAA,EAAsD,CAAA;AAAA,UAEtE,CAAC,WAAA,IAAe,QAAA,oBACf,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uDAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EACE,QAAA,EAAA,QAAA,CAAS,MAAA,GACN,EAAA,CAAG,6BAAA,EAA+B,QAAQ,CAAA,GAC1C,EAAA,CAAG,4BAAA,EAA8B,OAAO,CAAA,EAC9C,CAAA;AAAA,mCACC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,gBAAA,GAAA;AAAA,gBAAE,QAAA,CAAS;AAAA,eAAA,EAAQ,CAAA;AAAA,cACxB,SAAS,UAAA,KAAe,IAAA,IACvB,SAAS,UAAA,KAAe,MAAA,yBACrB,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,gBAAA,QAAA,CAAS,UAAA;AAAA,gBAAW;AAAA,eAAA,EAAK;AAAA,aAAA,EAEtC,CAAA;AAAA,4BACA,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,OAAA,EAAS;AAAA,WAAA,EAC/B;AAAA,SAAA,EAEJ;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACvSA,SAAS,eAAe,OAAA,EAAmC;AACzD,EAAA,MAAM,WAAW,OAAA,CAAQ,mBAAA;AACzB,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AAC/C,IAAA,OAAO,QAAA,IAAY,CAAA,GAAI,QAAA,GAAW,GAAA,GAAM,QAAA;AAAA,EAC1C;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,kBAAA,GAAqB,OAAA,CAAQ,eAAA;AACtD,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,kBAAA,EAAoB,QAAQ,CAAA;AACxD;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO;AACT,CAAA,EAMG;AACD,EAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAY,OAAO,EAAA,EAAI,CAAA;AAAA,sBAC7BD,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACf,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAW,CAAA,4BAAA,EAA+B,IAAI,IAAK,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC3D,0BAAUA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAoC,QAAA,EAAA,MAAA,EAAO;AAAA,GAAA,EACrE,CAAA;AAEJ;AAEA,SAAS,YAAA,GAAe;AACtB,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAA2C,aAAU,MAAA,EACjE,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,yBACjBA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAU;AAAA,KAAA;AAAA,IADL;AAAA,GAGR,CAAA,EACH,CAAA;AAEJ;AAMO,SAAS,YAAA,CAAa,EAAE,UAAA,GAAa,KAAA,EAAM,EAAsB;AACtE,EAAA,MAAM,KAAK,KAAA,EAAM;AACjB,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,SAAS,KAAA,EAAO,OAAA,KAAY,eAAA,EAAgB;AACzE,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,YAAA,KAAiB,mBAAA,EAAoB;AACjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIE,QAAAA;AAAA,IAChC,aAAa,QAAA,GAAW;AAAA,GAC1B;AAEA,EAAA,MAAM,gBAAA,GAAmBC,OAAAA;AAAA,IACvB,MAAM,oBAAoB,UAAU,CAAA;AAAA,IACpC,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,YAAA,GAAeA,OAAAA;AAAA,IACnB,MAAM,sBAAA,CAAuB,UAAU,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,IACnD,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,QAAA,GAAWA,OAAAA;AAAA,IACf,MAAM,mBAAmB,OAAA,EAAS,cAAA,IAAkB,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IAClE,CAAC,SAAS,cAAc;AAAA,GAC1B;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,KAAmB;AACtC,IAAA,MAAM,UAAU,MAAM,SAAA,CAAU,CAAC,GAAA,CAAI,EAAE,CAAC,CAAA;AACxC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,KAAA;AAAA,QACJ,EAAA,CAAG,mCAAmC,gCAAgC;AAAA,OACxE;AACA,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,OAAA;AAAA,MACJ,EAAA,CAAG,oCAAoC,uBAAuB;AAAA,KAChE;AACA,IAAA,QAAA,CAAS,CAAA,QAAA,EAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAD,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,mGAAA;AAAA,QACV,IAAA,EAAK,OAAA;AAAA,QAEL,QAAA,EAAA;AAAA,0BAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eACV,QAAA,EAAA,EAAA,CAAG,+BAAA,EAAiC,yBAAyB,CAAA,EAChE,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAgB,gBAAM,OAAA,EAAQ,CAAA;AAAA,0BAC3CA,GAAAA;AAAA,YAACI,MAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,MAAA;AAAA,cACV,OAAA,EAAS,MAAM,KAAK,OAAA,EAAQ;AAAA,cAE3B,QAAA,EAAA,EAAA,CAAG,iCAAiC,WAAW;AAAA;AAAA;AAClD;AAAA;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,GAAU,cAAA,CAAe,OAAO,CAAA,GAAI,CAAA;AACxD,EAAA,MAAM,cAAc,OAAA,GAChB,UAAA,CAAW,QAAQ,eAAA,EAAiB,OAAA,CAAQ,cAAc,CAAA,GAC1D,CAAA;AACJ,EAAA,MAAM,WAAA,GAAc,iBAAiB,CAAC,CAAA;AAEtC,EAAA,uBACEL,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wEAAA,EAChB,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mEACV,QAAA,EAAA,EAAA,CAAG,4BAAA,EAA8B,cAAc,CAAA,EAClD,CAAA;AAAA,wBACAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6DACX,QAAA,EAAA,EAAA,CAAG,2BAAA,EAA6B,mBAAmB,CAAA,EACtD,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAA,EACV,QAAA,EAAA,EAAA;AAAA,UACC,8BAAA;AAAA,UACA;AAAA,SACF,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACAD,IAAAA;AAAA,QAACK,MAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,MAAM,KAAK,OAAA,EAAQ;AAAA,UAC5B,QAAA,EAAU,OAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAJ,GAAAA,CAACC,MAAA,EAAK,IAAA,EAAK,eAAc,SAAA,EAAU,MAAA,EAAO,OAAO,EAAA,EAAI,CAAA;AAAA,YACpD,EAAA,CAAG,+BAA+B,SAAS;AAAA;AAAA;AAAA;AAC9C,KAAA,EACF,CAAA;AAAA,oBAEAF,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,kDAAA;AAAA,QACV,IAAA,EAAK,SAAA;AAAA,QAEL,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,KAAA;AAAA,cACL,iBAAe,SAAA,KAAc,UAAA;AAAA,cAC7B,SAAS,MAAM;AACb,gBAAA,YAAA,CAAa,UAAU,CAAA;AACvB,gBAAA,IAAI,UAAA,WAAqB,aAAa,CAAA;AAAA,cACxC,CAAA;AAAA,cACA,SAAA,EAAW,CAAA,6BAAA,EAAgC,SAAA,KAAc,UAAA,GAAa,+CAA+C,wCAAwC,CAAA,CAAA;AAAA,cAE5J,QAAA,EAAA,EAAA,CAAG,mCAAmC,UAAU;AAAA;AAAA,WACnD;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,KAAA;AAAA,cACL,iBAAe,SAAA,KAAc,QAAA;AAAA,cAC7B,SAAS,MAAM;AACb,gBAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,gBAAA,IAAI,CAAC,UAAA,EAAY,QAAA,CAAS,oBAAoB,CAAA;AAAA,cAChD,CAAA;AAAA,cACA,SAAA,EAAW,CAAA,6BAAA,EAAgC,SAAA,KAAc,QAAA,GAAW,+CAA+C,wCAAwC,CAAA,CAAA;AAAA,cAE1J,QAAA,EAAA,EAAA,CAAG,iCAAiC,iBAAiB;AAAA;AAAA;AACxD;AAAA;AAAA,KACF;AAAA,IAEC,OAAA,IAAW,CAAC,OAAA,mBACXA,GAAAA,CAAC,gBAAa,CAAA,GACZ,SAAA,KAAc,UAAA,IAAc,OAAA,mBAC9BA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA;AAAA,wBAGFA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,aAAA,GACJ,OAAA,CAAQ,kBAAA,IAAsB,OAAA,CAAQ,+BAAA,IAAmC,CAAA,CAAA;AAC3E,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0CAAA;AAAA,QACV,YAAA,EAAY,EAAA,CAAG,iCAAA,EAAmC,iBAAiB,CAAA;AAAA,QAEnE,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,gBAAA;AAAA,cACL,KAAA,EAAO,EAAA,CAAG,iCAAA,EAAmC,cAAc,CAAA;AAAA,cAC3D,KAAA,EAAO,CAAA,EAAG,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,cAChC,MAAA,EAAQ,CAAA,EAAG,OAAA,CAAQ,kBAAA,CAAmB,gBAAgB,CAAA,eAAA,CAAA;AAAA,cACtD,IAAA,EAAK;AAAA;AAAA,WACP;AAAA,0BACAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,mBAAA;AAAA,cACL,KAAA,EAAO,EAAA,CAAG,iCAAA,EAAmC,kBAAkB,CAAA;AAAA,cAC/D,KAAA,EAAO,cAAA,CAAe,OAAA,CAAQ,+BAA+B,CAAA;AAAA,cAC7D,MAAA,EAAQ,CAAA,EAAG,OAAA,CAAQ,cAAA,CAAe,gBAAgB,CAAA,WAAA;AAAA;AAAA,WACpD;AAAA,0BACAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,0BAAA;AAAA,cACL,KAAA,EAAO,EAAA,CAAG,gCAAA,EAAkC,aAAa,CAAA;AAAA,cACzD,KAAA,EAAO,OAAA,CAAQ,eAAA,CAAgB,cAAA,EAAe;AAAA,cAC9C,MAAA,EAAQ,CAAA,EAAG,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,aAAA,CAAA;AAAA,cACjC,IAAA,EAAK;AAAA;AAAA,WACP;AAAA,0BACAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,wBAAA;AAAA,cACL,KAAA,EAAO,EAAA;AAAA,gBACL,mCAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,KAAA,EAAO,eAAe,aAAa,CAAA;AAAA,cACnC,MAAA,EAAQ,EAAA;AAAA,gBACN,yCAAA;AAAA,gBACA;AAAA;AACF;AAAA;AACF;AAAA;AAAA,KACF;AAAA,oBAEAD,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,2BAAA,EACjB,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAA;AAAA,YACL,yCAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,KAAA,EAAO,EAAA;AAAA,YACL,uCAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEC,QAAA,EAAA,YAAA,CAAa,IAAI,CAAC,QAAA,qBACjBD,IAAAA,CAAC,KAAA,EAAA,EAA+B,WAAU,yBAAA,EACxC,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EACb,mBAAS,KAAA,EACZ,CAAA;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACb,QAAA,kBAAAA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,wCAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,UAAA,CAAW,QAAA,CAAS,KAAA,EAAO,YAAA,CAAa,CAAC,CAAA,EAAG,KAAA,IAAS,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA;AAChF;AAAA,aACF,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EACb,mBAAS,KAAA,EACZ;AAAA,WAAA,EAAA,EAdQ,QAAA,CAAS,WAenB,CACD;AAAA;AAAA,OACH;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAA,CAAG,qCAAA,EAAuC,mBAAmB,CAAA;AAAA,UACpE,KAAA,EAAO,EAAA;AAAA,YACL,mCAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEC,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,IAAA,qBACbD,IAAAA,CAAC,KAAA,EAAA,EAAwB,WAAU,yBAAA,EACjC,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EACb,eAAK,QAAA,EACR,CAAA;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACb,QAAA,kBAAAA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,0CAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,UAAA,CAAW,IAAA,CAAK,YAAA,EAAc,QAAA,CAAS,CAAC,CAAA,EAAG,YAAA,IAAgB,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA;AACtF;AAAA,aACF,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EACb,eAAK,YAAA,EACR;AAAA,WAAA,EAAA,EAdQ,IAAA,CAAK,QAef,CACD;AAAA;AAAA;AACH,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,QAAQ,IACtC,QAAA,CAAS,MAAA,GAAS,CAAA,GAClB,OAAA,CAAQ,QAAQ,CAAA;AACpB,EAAA,uBACED,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,uEAAA,EACjB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IACC,WAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAa,QAAA,EAAS,CAAA,mBAErCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAA+B,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAEtD,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,OAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,0CAAA,EACjB,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,mBAAA;AAAA,UACL,KAAA,EAAO,EAAA,CAAG,iCAAA,EAAmC,cAAc,CAAA;AAAA,UAC3D,KAAA,EAAO,CAAA,EAAG,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,eAAA,EAAiB,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAK,CAAA,CAAA,CAAA;AAAA,UAClG,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,aAAA;AAAA,UACL,KAAA,EAAO,EAAA,CAAG,kCAAA,EAAoC,mBAAmB,CAAA;AAAA,UACjE,KAAA,EAAO,UAAA,CAAW,MAAA,CAAO,cAAA,EAAe;AAAA,UACxC,QACE,OAAA,GACI,CAAA,EAAG,QAAQ,eAAA,CAAgB,cAAA,EAAgB,CAAA,eAAA,CAAA,GAC3C;AAAA;AAAA,OAER;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,4BAAA;AAAA,UACL,KAAA,EAAO,EAAA,CAAG,iCAAA,EAAmC,mBAAmB,CAAA;AAAA,UAChE,KAAA,EAAO,aAAa,GAAA,IAAO,QAAA;AAAA,UAC3B,MAAA,EAAQ,WAAA,GAAc,CAAA,EAAG,WAAA,CAAY,KAAK,CAAA,YAAA,CAAA,GAAiB;AAAA;AAAA,OAC7D;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,YAAA;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,YACL,sCAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,KAAA,EAAM,QAAA;AAAA,UACN,MAAA,EAAQ,EAAA;AAAA,YACN,0CAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,IAAA,EAAK;AAAA;AAAA;AACP,KAAA,EACF,CAAA;AAAA,oBACAD,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,yDAAA,EACjB,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDACX,QAAA,EAAA,EAAA,CAAG,kCAAA,EAAoC,gBAAgB,CAAA,EAC1D,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,UAAA,gBAAA,CAAiB,WAAW,CAAA,oBAC3BC,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,6BAAA,EACV,QAAA,EAAA,EAAA;AAAA,YACC,8BAAA;AAAA,YACA;AAAA,WACF,EACF,CAAA;AAAA,UAED,gBAAA,CAAiB,IAAI,CAAC,KAAA,qBACrBD,IAAAA,CAAC,KAAA,EAAA,EAAoB,WAAU,yBAAA,EAC7B,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EACb,gBAAM,GAAA,EACT,CAAA;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEACb,QAAA,kBAAAA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,wCAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,gBAAA,CAAiB,CAAC,CAAA,EAAG,KAAA,IAAS,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA;AACjF;AAAA,aACF,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EACb,gBAAM,KAAA,EACT;AAAA,WAAA,EAAA,EAdQ,KAAA,CAAM,GAehB,CACD;AAAA,SAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6CACX,QAAA,EAAA,EAAA,CAAG,oCAAA,EAAsC,iBAAiB,CAAA,EAC7D,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA,EAAA;AAAA,YACC,gCAAA;AAAA,YACA;AAAA,WACF,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,UAAA,CAAW,WAAW,CAAA,oBACrBC,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,kCAAA,EACV,QAAA,EAAA,EAAA;AAAA,YACC,sCAAA;AAAA,YACA;AAAA,WACF,EACF,CAAA;AAAA,UAED,UAAA,CAAW,MAAM,CAAA,EAAG,EAAE,EAAE,GAAA,CAAI,CAAC,wBAC5BD,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,+DAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,OAAE,SAAA,EAAU,gDAAA,EACV,cAAI,YAAA,IAAgB,GAAA,CAAI,aAAa,iBAAA,EACxC,CAAA;AAAA,kCACAD,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EACV,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAI,QAAA,EAAU,QAAQ,GAAA,CAAI,WAAA;AAAA,oBAAY,OAAA;AAAA,oBAAG,GAAA;AAAA,oBACzC,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,oBAAE,QAAA;AAAA,oBAAI,cAAA,CAAe,IAAI,QAAQ;AAAA,mBAAA,EACtD;AAAA,iBAAA,EACF,CAAA;AAAA,gCACAC,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iFAAA,EACb,QAAA,EAAA,GAAA,CAAI,aAAa,SAAA,EACpB,CAAA;AAAA,gCACAA,GAAAA;AAAA,kBAACI,MAAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,SAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,KAAK,KAAA,CAAM,GAAG,CAAA;AAAA,oBAC7B,QAAA,EAAU,YAAA;AAAA,oBAET,QAAA,EAAA,EAAA,CAAG,6BAA6B,OAAO;AAAA;AAAA;AAC1C;AAAA,aAAA;AAAA,YAtBK,GAAA,CAAI;AAAA,WAwBZ;AAAA,SAAA,EACH;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,kBAAA,GAAqB;AACnC,EAAA,uBAAOJ,GAAAA,CAAC,YAAA,EAAA,EAAa,UAAA,EAAU,IAAA,EAAC,CAAA;AAClC","file":"chunk-FAPYERDO.js","sourcesContent":["import type { FailedRun, NodeUsageStat } from \"./types\";\n\nexport interface ErrorBreakdownEntry {\n key: string;\n count: number;\n}\n\nexport interface WorkflowFailureEntry {\n workflowKey: string;\n label: string;\n count: number;\n}\n\nexport function percentage(value: number, total: number): number {\n if (total <= 0) return 0;\n return Math.round((value / total) * 1000) / 10;\n}\n\nexport function getFailureBreakdown(\n runs: readonly FailedRun[],\n): ErrorBreakdownEntry[] {\n const counts = new Map<string, number>();\n for (const run of runs) {\n const key = run.errorType || \"UNKNOWN\";\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([key, count]) => ({ key, count }))\n .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key));\n}\n\nexport function getTopFailingWorkflows(\n runs: readonly FailedRun[],\n): WorkflowFailureEntry[] {\n const counts = new Map<string, WorkflowFailureEntry>();\n for (const run of runs) {\n const current = counts.get(run.workflowKey);\n if (current) {\n current.count += 1;\n } else {\n counts.set(run.workflowKey, {\n workflowKey: run.workflowKey,\n label: run.workflow?.name || run.workflowKey,\n count: 1,\n });\n }\n }\n return [...counts.values()].sort(\n (a, b) => b.count - a.count || a.label.localeCompare(b.label),\n );\n}\n\nexport function getTopFailingNodes(\n nodeUsageStats: readonly NodeUsageStat[],\n): NodeUsageStat[] {\n return [...nodeUsageStats]\n .filter((stat) => stat.failureCount > 0)\n .sort(\n (a, b) =>\n b.failureCount - a.failureCount || a.nodeType.localeCompare(b.nodeType),\n );\n}\n\nexport function formatDuration(seconds: number | null | undefined): string {\n if (seconds === null || seconds === undefined || !Number.isFinite(seconds)) {\n return \"—\";\n }\n if (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return `${minutes}m ${remainingSeconds}s`;\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"—\";\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes / 1024;\n let unit = units[0];\n for (let i = 1; i < units.length && value >= 1024; i += 1) {\n value /= 1024;\n unit = units[i];\n }\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${unit}`;\n}\n\nexport function prettyJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2) ?? \"null\";\n } catch {\n return String(value);\n }\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { Input } from \"@burdenoff/fe-libs/ui\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { useDataSinkData, useDataSinks } from \"../hooks/useObservability\";\nimport { formatBytes, prettyJson } from \"../utils\";\nimport type { DataSinkSummary } from \"../types\";\n\nfunction valueLabel(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\nfunction DataPreview({ value }: { value: unknown }) {\n const tr = useTr();\n if (Array.isArray(value)) {\n const rows = value.filter(\n (item): item is Record<string, unknown> =>\n Boolean(item) && typeof item === \"object\" && !Array.isArray(item),\n );\n if (rows.length > 0) {\n const keys = [...new Set(rows.flatMap((row) => Object.keys(row)))].slice(\n 0,\n 12,\n );\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border-secondary\">\n <table className=\"min-w-full text-left text-sm\">\n <thead className=\"bg-background-tertiary text-xs uppercase text-text-secondary\">\n <tr>\n {keys.map((key) => (\n <th\n key={key}\n className=\"whitespace-nowrap px-3 py-2 font-medium\"\n >\n {key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-secondary\">\n {rows.slice(0, 50).map((row, index) => (\n <tr key={index} className=\"text-text-primary\">\n {keys.map((key) => (\n <td key={key} className=\"max-w-xs truncate px-3 py-2\">\n {valueLabel(row[key])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {rows.length > 50 && (\n <p className=\"border-t border-border-secondary px-3 py-2 text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.previewLimit\",\n \"Showing the first 50 rows\",\n )}\n </p>\n )}\n </div>\n );\n }\n }\n return (\n <pre className=\"max-h-[28rem] overflow-auto rounded-lg border border-border-secondary bg-background-primary p-4 text-xs text-text-primary\">\n {prettyJson(value)}\n </pre>\n );\n}\n\nfunction SinkCard({\n sink,\n selected,\n onSelect,\n}: {\n sink: DataSinkSummary;\n selected: boolean;\n onSelect: () => void;\n}) {\n const tr = useTr();\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={`w-full rounded-lg border p-4 text-left transition-colors ${selected ? \"border-action-primary-bg bg-action-primary-bg/10\" : \"border-border-secondary bg-background-secondary hover:border-action-primary-bg/60\"}`}\n aria-pressed={selected}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">\n {sink.name || sink.key}\n </p>\n <p className=\"mt-1 truncate font-mono text-xs text-text-secondary\">\n {sink.key}\n </p>\n </div>\n <span className=\"shrink-0 rounded-full bg-background-tertiary px-2 py-0.5 text-xs text-text-secondary\">\n {sink.status}\n </span>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-text-secondary\">\n <span>{formatBytes(sink.sizeBytes)}</span>\n <span>\n {sink.linkedWorkflowCount}{\" \"}\n {tr(\"fluidgrids.dataSinks.workflows\", \"workflows\")}\n </span>\n </div>\n </button>\n );\n}\n\nexport function DataSinkDashboardPage() {\n const tr = useTr();\n const [search, setSearch] = useState(\"\");\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const { sinks, totalCount, loading, error, refetch } = useDataSinks(search);\n const selectedSink = useMemo(\n () => sinks.find((sink) => sink.id === selectedId) ?? sinks[0] ?? null,\n [selectedId, sinks],\n );\n const {\n sinkData,\n loading: dataLoading,\n error: dataError,\n refetch: refetchData,\n } = useDataSinkData(selectedSink);\n\n useEffect(() => {\n if (selectedSink && selectedSink.id !== selectedId)\n setSelectedId(selectedSink.id);\n }, [selectedId, selectedSink]);\n\n const payload = sinkData?.extracted ?? sinkData?.raw;\n const totalBytes = sinks.reduce((total, sink) => total + sink.sizeBytes, 0);\n\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <header className=\"mb-6 flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.kicker\", \"BigConsole data\")}\n </p>\n <h1 className=\"mt-1 text-2xl font-semibold text-text-primary sm:text-3xl\">\n {tr(\"fluidgrids.dataSinks.title\", \"DataSink dashboard\")}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.subtitle\",\n \"Inspect workflow-produced data and its freshness without leaving FluidGrids.\",\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n onClick={() => void refetch()}\n disabled={loading}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.dataSinks.refresh\", \"Refresh\")}\n </Button>\n </header>\n\n <section className=\"mb-6 grid gap-4 sm:grid-cols-3\">\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.totalSinks\", \"DataSinks\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-text-primary\">\n {totalCount}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.activeSinks\", \"Active sinks\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-status-success-text\">\n {sinks.filter((sink) => sink.isActive).length}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.totalStorage\", \"Visible storage\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-text-primary\">\n {formatBytes(totalBytes)}\n </p>\n </div>\n </section>\n\n {error && (\n <div\n role=\"alert\"\n className=\"mb-6 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-4 text-sm text-status-error-text\"\n >\n {error.message}\n </div>\n )}\n <div className=\"grid gap-6 xl:grid-cols-[22rem_minmax(0,1fr)]\">\n <aside className=\"space-y-3\">\n <Input\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={tr(\n \"fluidgrids.dataSinks.search\",\n \"Search by name or key\",\n )}\n aria-label={tr(\n \"fluidgrids.dataSinks.search\",\n \"Search by name or key\",\n )}\n />\n {loading && sinks.length === 0 && (\n <p className=\"p-4 text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.loading\", \"Loading DataSinks…\")}\n </p>\n )}\n {!loading && sinks.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-border-secondary p-6 text-center text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.empty\", \"No active DataSinks found.\")}\n </div>\n )}\n {sinks.map((sink) => (\n <SinkCard\n key={sink.id}\n sink={sink}\n selected={sink.id === selectedSink?.id}\n onSelect={() => setSelectedId(sink.id)}\n />\n ))}\n </aside>\n\n <main className=\"min-w-0 rounded-xl border border-border-secondary bg-background-secondary p-5\">\n {!selectedSink && (\n <div className=\"flex min-h-64 flex-col items-center justify-center text-center\">\n <Icon\n icon=\"mdi:database-outline\"\n className=\"mb-3 text-text-secondary\"\n width={40}\n />\n <p className=\"font-medium text-text-primary\">\n {tr(\"fluidgrids.dataSinks.selectTitle\", \"Select a DataSink\")}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.selectDescription\",\n \"Choose a sink to inspect its latest payload.\",\n )}\n </p>\n </div>\n )}\n {selectedSink && (\n <>\n <div className=\"mb-5 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-lg font-semibold text-text-primary\">\n {selectedSink.name || selectedSink.key}\n </h2>\n <p className=\"mt-1 font-mono text-xs text-text-secondary\">\n {selectedSink.key} ·{\" \"}\n {tr(\"fluidgrids.dataSinks.updated\", \"Updated\")}{\" \"}\n {new Date(selectedSink.lastRefreshedAt).toLocaleString()}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void refetchData()}\n disabled={dataLoading}\n >\n <Icon\n icon=\"mdi:database-refresh-outline\"\n className=\"mr-1\"\n width={16}\n />\n {tr(\"fluidgrids.dataSinks.refreshPayload\", \"Refresh payload\")}\n </Button>\n </div>\n {dataError && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\"\n >\n {dataError.message}\n </div>\n )}\n {dataLoading && !sinkData && (\n <div className=\"h-64 animate-pulse rounded-lg bg-background-primary\" />\n )}\n {!dataLoading && sinkData && (\n <>\n <div className=\"mb-4 flex flex-wrap gap-3 text-xs text-text-secondary\">\n <span>\n {sinkData.cached\n ? tr(\"fluidgrids.dataSinks.cached\", \"Cached\")\n : tr(\"fluidgrids.dataSinks.fresh\", \"Fresh\")}\n </span>\n <span>v{sinkData.version}</span>\n {sinkData.totalCount !== null &&\n sinkData.totalCount !== undefined && (\n <span>{sinkData.totalCount} rows</span>\n )}\n </div>\n <DataPreview value={payload} />\n </>\n )}\n </>\n )}\n </main>\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport {\n useInsightsData,\n useRunReplayActions,\n} from \"../hooks/useObservability\";\nimport {\n formatDuration,\n getFailureBreakdown,\n getTopFailingNodes,\n getTopFailingWorkflows,\n percentage,\n} from \"../utils\";\nimport type { DashboardSummary, FailedRun } from \"../types\";\n\nfunction normalizedRate(summary: DashboardSummary): number {\n const supplied = summary.workflowSuccessRate;\n if (supplied !== null && supplied !== undefined) {\n return supplied <= 1 ? supplied * 100 : supplied;\n }\n const finished = summary.runsCompletedCount + summary.runsFailedCount;\n return percentage(summary.runsCompletedCount, finished);\n}\n\nfunction MetricCard({\n icon,\n label,\n value,\n detail,\n tone = \"text-text-primary\",\n}: {\n icon: string;\n label: string;\n value: string;\n detail?: string;\n tone?: string;\n}) {\n return (\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Icon icon={icon} width={18} />\n <span>{label}</span>\n </div>\n <p className={`mt-3 text-2xl font-semibold ${tone}`}>{value}</p>\n {detail && <p className=\"mt-1 text-xs text-text-secondary\">{detail}</p>}\n </div>\n );\n}\n\nfunction LoadingState() {\n return (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\" aria-busy=\"true\">\n {[1, 2, 3, 4].map((item) => (\n <div\n key={item}\n className=\"h-28 animate-pulse rounded-xl border border-border-secondary bg-background-secondary\"\n />\n ))}\n </div>\n );\n}\n\nexport interface InsightsPageProps {\n showErrors?: boolean;\n}\n\nexport function InsightsPage({ showErrors = false }: InsightsPageProps) {\n const tr = useTr();\n const navigate = useNavigate();\n const { summary, failedRuns, loading, error, refetch } = useInsightsData();\n const { retryMany, loading: retryLoading } = useRunReplayActions();\n const [activeTab, setActiveTab] = useState<\"overview\" | \"errors\">(\n showErrors ? \"errors\" : \"overview\",\n );\n\n const failureBreakdown = useMemo(\n () => getFailureBreakdown(failedRuns),\n [failedRuns],\n );\n const topWorkflows = useMemo(\n () => getTopFailingWorkflows(failedRuns).slice(0, 8),\n [failedRuns],\n );\n const topNodes = useMemo(\n () => getTopFailingNodes(summary?.nodeUsageStats ?? []).slice(0, 8),\n [summary?.nodeUsageStats],\n );\n\n const retry = async (run: FailedRun) => {\n const retried = await retryMany([run.id]);\n if (retried.length === 0) {\n toast.error(\n tr(\"fluidgrids.insights.retryFailed\", \"Could not retry the failed run\"),\n );\n return;\n }\n toast.success(\n tr(\"fluidgrids.insights.retryStarted\", \"A new run was started\"),\n );\n navigate(`../runs/${retried[0].runId}`);\n };\n\n if (error) {\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <div\n className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-5 text-status-error-text\"\n role=\"alert\"\n >\n <p className=\"font-medium\">\n {tr(\"fluidgrids.insights.loadError\", \"Could not load insights\")}\n </p>\n <p className=\"mt-1 text-sm\">{error.message}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => void refetch()}\n >\n {tr(\"fluidgrids.insights.retryLoad\", \"Try again\")}\n </Button>\n </div>\n </div>\n );\n }\n\n const successRate = summary ? normalizedRate(summary) : 0;\n const failureRate = summary\n ? percentage(summary.runsFailedCount, summary.runsCountTotal)\n : 0;\n const commonError = failureBreakdown[0];\n\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <header className=\"mb-6 flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {tr(\"fluidgrids.insights.period\", \"Last 30 days\")}\n </p>\n <h1 className=\"mt-1 text-2xl font-semibold text-text-primary sm:text-3xl\">\n {tr(\"fluidgrids.insights.title\", \"Workflow insights\")}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.subtitle\",\n \"Understand workflow health, failures, and the nodes that need attention.\",\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n onClick={() => void refetch()}\n disabled={loading}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.insights.refresh\", \"Refresh\")}\n </Button>\n </header>\n\n <div\n className=\"mb-6 flex gap-1 border-b border-border-secondary\"\n role=\"tablist\"\n >\n <button\n role=\"tab\"\n aria-selected={activeTab === \"overview\"}\n onClick={() => {\n setActiveTab(\"overview\");\n if (showErrors) navigate(\"../insights\");\n }}\n className={`border-b-2 px-3 py-2 text-sm ${activeTab === \"overview\" ? \"border-action-primary-bg text-text-primary\" : \"border-transparent text-text-secondary\"}`}\n >\n {tr(\"fluidgrids.insights.overviewTab\", \"Overview\")}\n </button>\n <button\n role=\"tab\"\n aria-selected={activeTab === \"errors\"}\n onClick={() => {\n setActiveTab(\"errors\");\n if (!showErrors) navigate(\"../insights/errors\");\n }}\n className={`border-b-2 px-3 py-2 text-sm ${activeTab === \"errors\" ? \"border-action-primary-bg text-text-primary\" : \"border-transparent text-text-secondary\"}`}\n >\n {tr(\"fluidgrids.insights.errorsTab\", \"Error analytics\")}\n </button>\n </div>\n\n {loading && !summary ? (\n <LoadingState />\n ) : activeTab === \"overview\" && summary ? (\n <OverviewContent\n summary={summary}\n successRate={successRate}\n failureRate={failureRate}\n topWorkflows={topWorkflows}\n topNodes={topNodes}\n tr={tr}\n />\n ) : (\n <ErrorContent\n summary={summary}\n failedRuns={failedRuns}\n failureBreakdown={failureBreakdown}\n commonError={commonError}\n retry={retry}\n retryLoading={retryLoading}\n tr={tr}\n />\n )}\n </div>\n );\n}\n\nfunction OverviewContent({\n summary,\n successRate,\n failureRate,\n topWorkflows,\n topNodes,\n tr,\n}: {\n summary: DashboardSummary;\n successRate: number;\n failureRate: number;\n topWorkflows: ReturnType<typeof getTopFailingWorkflows>;\n topNodes: ReturnType<typeof getTopFailingNodes>;\n tr: ReturnType<typeof useTr>;\n}) {\n const totalDuration =\n summary.runsCompletedCount * (summary.avgWorkflowExecutionTimeSeconds ?? 0);\n return (\n <div className=\"space-y-6\">\n <section\n className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\"\n aria-label={tr(\"fluidgrids.insights.healthLabel\", \"Workflow health\")}\n >\n <MetricCard\n icon=\"mdi:chart-line\"\n label={tr(\"fluidgrids.insights.successRate\", \"Success rate\")}\n value={`${successRate.toFixed(1)}%`}\n detail={`${summary.runsCompletedCount.toLocaleString()} completed runs`}\n tone=\"text-status-success-text\"\n />\n <MetricCard\n icon=\"mdi:clock-outline\"\n label={tr(\"fluidgrids.insights.avgDuration\", \"Average duration\")}\n value={formatDuration(summary.avgWorkflowExecutionTimeSeconds)}\n detail={`${summary.runsCountTotal.toLocaleString()} total runs`}\n />\n <MetricCard\n icon=\"mdi:alert-circle-outline\"\n label={tr(\"fluidgrids.insights.failedRuns\", \"Failed runs\")}\n value={summary.runsFailedCount.toLocaleString()}\n detail={`${failureRate.toFixed(1)}% of all runs`}\n tone=\"text-status-error-text\"\n />\n <MetricCard\n icon=\"mdi:timer-play-outline\"\n label={tr(\n \"fluidgrids.insights.timeProcessed\",\n \"Execution time processed\",\n )}\n value={formatDuration(totalDuration)}\n detail={tr(\n \"fluidgrids.insights.timeProcessedDetail\",\n \"Based on completed runs; time-saved baselines are not configured.\",\n )}\n />\n </section>\n\n <section className=\"grid gap-6 lg:grid-cols-2\">\n <InsightList\n title={tr(\n \"fluidgrids.insights.topFailingWorkflows\",\n \"Top failing workflows\",\n )}\n empty={tr(\n \"fluidgrids.insights.noFailedWorkflows\",\n \"No failed workflows in this period.\",\n )}\n >\n {topWorkflows.map((workflow) => (\n <div key={workflow.workflowKey} className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">\n {workflow.label}\n </span>\n <div className=\"h-2 w-28 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-error-bg\"\n style={{\n width: `${Math.max(8, percentage(workflow.count, topWorkflows[0]?.count ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-secondary\">\n {workflow.count}\n </span>\n </div>\n ))}\n </InsightList>\n <InsightList\n title={tr(\"fluidgrids.insights.topFailingNodes\", \"Top failing nodes\")}\n empty={tr(\n \"fluidgrids.insights.noFailedNodes\",\n \"No node failures in this period.\",\n )}\n >\n {topNodes.map((node) => (\n <div key={node.nodeType} className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">\n {node.nodeType}\n </span>\n <div className=\"h-2 w-28 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-warning-bg\"\n style={{\n width: `${Math.max(8, percentage(node.failureCount, topNodes[0]?.failureCount ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-secondary\">\n {node.failureCount}\n </span>\n </div>\n ))}\n </InsightList>\n </section>\n </div>\n );\n}\n\nfunction InsightList({\n title,\n empty,\n children,\n}: {\n title: string;\n empty: string;\n children: React.ReactNode;\n}) {\n const hasChildren = Array.isArray(children)\n ? children.length > 0\n : Boolean(children);\n return (\n <section className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">\n {title}\n </h2>\n {hasChildren ? (\n <div className=\"space-y-3\">{children}</div>\n ) : (\n <p className=\"text-sm text-text-secondary\">{empty}</p>\n )}\n </section>\n );\n}\n\nfunction ErrorContent({\n summary,\n failedRuns,\n failureBreakdown,\n commonError,\n retry,\n retryLoading,\n tr,\n}: {\n summary: DashboardSummary | null;\n failedRuns: FailedRun[];\n failureBreakdown: ReturnType<typeof getFailureBreakdown>;\n commonError?: { key: string; count: number };\n retry: (run: FailedRun) => Promise<void>;\n retryLoading: boolean;\n tr: ReturnType<typeof useTr>;\n}) {\n return (\n <div className=\"space-y-6\">\n <section className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricCard\n icon=\"mdi:alert-outline\"\n label={tr(\"fluidgrids.insights.failureRate\", \"Failure rate\")}\n value={`${summary ? percentage(summary.runsFailedCount, summary.runsCountTotal).toFixed(1) : \"0.0\"}%`}\n tone=\"text-status-error-text\"\n />\n <MetricCard\n icon=\"mdi:counter\"\n label={tr(\"fluidgrids.insights.failureCount\", \"Failures captured\")}\n value={failedRuns.length.toLocaleString()}\n detail={\n summary\n ? `${summary.runsFailedCount.toLocaleString()} total recorded`\n : undefined\n }\n />\n <MetricCard\n icon=\"mdi:alert-decagram-outline\"\n label={tr(\"fluidgrids.insights.commonError\", \"Most common error\")}\n value={commonError?.key ?? \"—\"}\n detail={commonError ? `${commonError.count} occurrences` : undefined}\n />\n <MetricCard\n icon=\"mdi:repeat\"\n label={tr(\n \"fluidgrids.insights.recoveredByRetry\",\n \"Recovered by retry\",\n )}\n value=\"—\"\n detail={tr(\n \"fluidgrids.insights.retryBaselineMissing\",\n \"Retry recovery baseline is not exposed by the service yet.\",\n )}\n tone=\"text-text-secondary\"\n />\n </section>\n <section className=\"grid gap-6 lg:grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]\">\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">\n {tr(\"fluidgrids.insights.errorsByType\", \"Errors by type\")}\n </h2>\n <div className=\"space-y-3\">\n {failureBreakdown.length === 0 && (\n <p className=\"text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.noErrors\",\n \"No errors in this period.\",\n )}\n </p>\n )}\n {failureBreakdown.map((entry) => (\n <div key={entry.key} className=\"flex items-center gap-3\">\n <span className=\"w-28 truncate text-sm text-text-secondary\">\n {entry.key}\n </span>\n <div className=\"h-2 flex-1 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-error-bg\"\n style={{\n width: `${Math.max(8, percentage(entry.count, failureBreakdown[0]?.count ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-primary\">\n {entry.count}\n </span>\n </div>\n ))}\n </div>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr(\"fluidgrids.insights.recentFailures\", \"Recent failures\")}\n </h2>\n <span className=\"text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.insights.sampleNote\",\n \"Showing the latest 100 failures\",\n )}\n </span>\n </div>\n <div className=\"divide-y divide-border-secondary\">\n {failedRuns.length === 0 && (\n <p className=\"py-3 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.noRecentFailures\",\n \"No recent failures.\",\n )}\n </p>\n )}\n {failedRuns.slice(0, 12).map((run) => (\n <div\n key={run.id}\n className=\"flex flex-col gap-2 py-3 sm:flex-row sm:items-center sm:gap-4\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {run.errorMessage || run.errorType || \"Workflow failed\"}\n </p>\n <p className=\"mt-0.5 truncate text-xs text-text-secondary\">\n {run.workflow?.name || run.workflowKey} ·{\" \"}\n {run.id.slice(0, 10)} · {formatDuration(run.duration)}\n </p>\n </div>\n <span className=\"rounded-full bg-status-error-bg-subtle px-2 py-1 text-xs text-status-error-text\">\n {run.errorType || \"UNKNOWN\"}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void retry(run)}\n disabled={retryLoading}\n >\n {tr(\"fluidgrids.insights.retry\", \"Retry\")}\n </Button>\n </div>\n ))}\n </div>\n </div>\n </section>\n </div>\n );\n}\n\nexport function ErrorAnalyticsPage() {\n return <InsightsPage showErrors />;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useWorkflowDefinitions } from './chunk-
|
|
2
|
-
import { getFluidGridsConfig } from './chunk-
|
|
1
|
+
import { useWorkflowDefinitions } from './chunk-XBIHI224.js';
|
|
2
|
+
import { getFluidGridsConfig } from './chunk-DFGJKGWH.js';
|
|
3
3
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
4
4
|
import { useState, useMemo, useCallback } from 'react';
|
|
5
5
|
import { useNavigate } from 'react-router';
|
|
@@ -470,5 +470,5 @@ function HistoryPage() {
|
|
|
470
470
|
}
|
|
471
471
|
|
|
472
472
|
export { HistoryPage };
|
|
473
|
-
//# sourceMappingURL=chunk-
|
|
474
|
-
//# sourceMappingURL=chunk-
|
|
473
|
+
//# sourceMappingURL=chunk-M2YFTRLL.js.map
|
|
474
|
+
//# sourceMappingURL=chunk-M2YFTRLL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/history/pages/HistoryPage.tsx"],"names":[],"mappings":"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","file":"chunk-G3RPRMP5.js","sourcesContent":["/**\n * HistoryPage — cross-workflow version history.\n *\n * Fetches every version row in one paginated `workflowDefinitions` query\n * (latestOnly defaults to false, so the list API already returns one row per\n * version) and resolves \"Changed By\" ids to human names via the shared\n * actor-profile lookup.\n */\nimport { useState, useMemo, useCallback } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Skeleton,\n Input,\n Badge,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n useActorProfiles,\n buildActorFallback,\n type ActorInput,\n} from \"@burdenoff/fe-libs/shared\";\nimport { useWorkflowDefinitions } from \"../../../hooks/useWorkflows\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { getFluidGridsConfig } from \"../../../config\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst PAGE_SIZE = 20;\n\n/** Upper bound on version rows fetched for the screen (newest first). */\nconst FETCH_LIMIT = 500;\n\nfunction useStatusStyles() {\n const tr = useTr();\n return useMemo<\n Record<\n string,\n {\n label: string;\n variant: \"default\" | \"secondary\" | \"outline\" | \"destructive\";\n }\n >\n >(\n () => ({\n ACTIVE: {\n label: tr(\"fluidgrids.history.historyPage.statusActive\", \"Active\"),\n variant: \"default\",\n },\n DRAFT: {\n label: tr(\"fluidgrids.history.historyPage.statusDraft\", \"Draft\"),\n variant: \"secondary\",\n },\n ARCHIVED: {\n label: tr(\"fluidgrids.history.historyPage.statusArchived\", \"Archived\"),\n variant: \"outline\",\n },\n DEPRECATED: {\n label: tr(\n \"fluidgrids.history.historyPage.statusDeprecated\",\n \"Deprecated\",\n ),\n variant: \"destructive\",\n },\n }),\n [tr],\n );\n}\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\nfunction HistoryTableSkeleton() {\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton\n key={i}\n className=\"h-14 w-full rounded-lg bg-card-foreground/10\"\n />\n ))}\n </div>\n );\n}\n\nfunction EmptyState() {\n const tr = useTr();\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <div className=\"rounded-full bg-background-secondary p-4 mb-4\">\n <Icon icon=\"mdi:history\" width={40} className=\"text-text-secondary\" />\n </div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">\n {tr(\"fluidgrids.history.historyPage.emptyTitle\", \"No version history\")}\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n {tr(\n \"fluidgrids.history.historyPage.emptyHint\",\n \"Version history will appear here once you create and update workflows.\",\n )}\n </p>\n </div>\n );\n}\n\nfunction ErrorState({\n message,\n onRetry,\n}: {\n message: string;\n onRetry: () => void;\n}) {\n const tr = useTr();\n return (\n <div className=\"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)]\">\n <Icon icon=\"mdi:alert-circle\" width={20} />\n <span className=\"font-medium\">\n {tr(\n \"fluidgrids.history.historyPage.errorHeading\",\n \"Error loading history\",\n )}\n </span>\n </div>\n <p className=\"mt-1 text-sm text-[var(--color-status-error-text)]\">\n {message}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onRetry}\n className=\"mt-3 border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]\"\n >\n {tr(\"fluidgrids.history.historyPage.errorRetry\", \"Retry\")}\n </Button>\n </div>\n );\n}\n\nfunction StatCard({\n label,\n value,\n valueClassName,\n}: {\n label: string;\n value: number;\n valueClassName?: string;\n}) {\n return (\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <p className=\"text-xs text-text-secondary\">{label}</p>\n <p\n className={`text-xl font-bold ${valueClassName ?? \"text-text-primary\"}`}\n >\n {value}\n </p>\n </div>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport function HistoryPage() {\n const tr = useTr();\n const navigate = useNavigate();\n const STATUS_STYLES = useStatusStyles();\n const [search, setSearch] = useState(\"\");\n const [workflowFilter, setWorkflowFilter] = useState<string>(\"all\");\n const [page, setPage] = useState(0);\n\n // One query returns every version row (latestOnly is false by default),\n // newest first — no per-workflow fan-out needed.\n const {\n workflows: versionRows,\n total,\n hasMore,\n loading,\n error,\n refetch,\n } = useWorkflowDefinitions({ limit: FETCH_LIMIT });\n\n const allRows = useMemo(\n () =>\n [...versionRows].sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n ),\n [versionRows],\n );\n\n // Distinct workflows (latest row per key) for the stat + filter dropdown.\n const distinctWorkflows = useMemo(() => {\n const byKey = new Map<string, { workflowKey: string; name: string }>();\n for (const row of allRows) {\n if (!byKey.has(row.workflowKey)) {\n byKey.set(row.workflowKey, {\n workflowKey: row.workflowKey,\n name: row.name,\n });\n }\n }\n return [...byKey.values()];\n }, [allRows]);\n\n // Resolve createdById → display names (workspace-scoped, cached, batched).\n const config = getFluidGridsConfig();\n const actorInputs = useMemo<ActorInput[]>(() => {\n const ids = new Set<string>();\n for (const row of allRows) {\n if (row.createdById) ids.add(row.createdById);\n }\n return [...ids].map((actorId) => ({ actorId, actorType: \"user\" }));\n }, [allRows]);\n const actorProfiles = useActorProfiles(actorInputs, {\n workspaceId: config.workspaceId || undefined,\n orgId: config.organizationId,\n authToken: config.authToken,\n });\n\n const changedByLabel = useCallback(\n (createdById?: string | null): string => {\n if (!createdById) return \"—\";\n return (\n actorProfiles[createdById]?.displayName ??\n buildActorFallback({ actorId: createdById, actorType: \"user\" })\n .displayName\n );\n },\n [actorProfiles],\n );\n\n // Filter rows\n const filteredRows = useMemo(() => {\n let rows = allRows;\n\n if (workflowFilter !== \"all\") {\n rows = rows.filter((r) => r.workflowKey === workflowFilter);\n }\n\n if (search.trim()) {\n const q = search.toLowerCase();\n rows = rows.filter(\n (r) =>\n r.name.toLowerCase().includes(q) ||\n r.version.toLowerCase().includes(q) ||\n r.workflowKey.toLowerCase().includes(q) ||\n changedByLabel(r.createdById).toLowerCase().includes(q),\n );\n }\n\n return rows;\n }, [allRows, workflowFilter, search, changedByLabel]);\n\n // Pagination\n const totalPages = Math.max(1, Math.ceil(filteredRows.length / PAGE_SIZE));\n const paginatedRows = filteredRows.slice(\n page * PAGE_SIZE,\n (page + 1) * PAGE_SIZE,\n );\n\n const handleNavigateToVersion = (workflowKey: string, version: string) => {\n navigate(`../workflow/${workflowKey}/${version}`);\n };\n\n const formatDate = (dateStr: string) => {\n try {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(new Date(dateStr));\n } catch {\n return dateStr;\n }\n };\n\n const countByStatus = (status: string) =>\n allRows.filter((r) => r.status === status).length;\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Header */}\n <div\n className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\"\n data-tour=\"fluidgrids-history-header\"\n >\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {tr(\"fluidgrids.history.historyPage.title\", \"Version History\")}\n </h1>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n \"fluidgrids.history.historyPage.subtitle\",\n \"Track changes and versions across all workflows\",\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"outline\" onClick={() => refetch()}>\n <Icon icon=\"mdi:refresh\" className=\"mr-2\" width={16} />\n {tr(\"fluidgrids.history.historyPage.refreshButton\", \"Refresh\")}\n </Button>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n <Icon icon=\"mdi:arrow-left\" className=\"mr-2\" width={16} />\n {tr(\n \"fluidgrids.history.historyPage.backToWorkflowsButton\",\n \"Back to Workflows\",\n )}\n </Button>\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col sm:flex-row gap-3 mb-6\">\n <div\n className=\"relative flex-1 max-w-sm\"\n data-tour=\"fluidgrids-history-search\"\n >\n <Icon\n icon=\"mdi:magnify\"\n width={18}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <Input\n placeholder={tr(\n \"fluidgrids.history.historyPage.searchPlaceholder\",\n \"Search by name, version, key, or author...\",\n )}\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setPage(0);\n }}\n className=\"pl-10 bg-background-secondary border-border-secondary\"\n />\n </div>\n <Select\n value={workflowFilter}\n onValueChange={(val) => {\n setWorkflowFilter(val);\n setPage(0);\n }}\n >\n <SelectTrigger\n className=\"w-[220px] bg-background-secondary border-border-secondary\"\n data-tour=\"fluidgrids-history-workflow-filter\"\n >\n <SelectValue\n placeholder={tr(\n \"fluidgrids.history.historyPage.workflowFilterPlaceholder\",\n \"All Workflows\",\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tr(\n \"fluidgrids.history.historyPage.workflowFilterAllOption\",\n \"All Workflows\",\n )}\n </SelectItem>\n {distinctWorkflows.map((w) => (\n <SelectItem key={w.workflowKey} value={w.workflowKey}>\n {w.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-5 gap-3 mb-6\">\n <StatCard\n label={tr(\n \"fluidgrids.history.historyPage.statTotalVersions\",\n \"Total Versions\",\n )}\n value={total || allRows.length}\n />\n <StatCard\n label={tr(\n \"fluidgrids.history.historyPage.statWorkflows\",\n \"Workflows\",\n )}\n value={distinctWorkflows.length}\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statActive\", \"Active\")}\n value={countByStatus(\"ACTIVE\")}\n valueClassName=\"text-[var(--color-status-success-text)]\"\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statDraft\", \"Draft\")}\n value={countByStatus(\"DRAFT\")}\n valueClassName=\"text-[var(--color-status-warning-text)]\"\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statArchived\", \"Archived\")}\n value={countByStatus(\"ARCHIVED\")}\n />\n </div>\n\n {hasMore && (\n <p className=\"text-xs text-text-secondary mb-4\">\n {tr(\n \"fluidgrids.history.historyPage.partialResultsHint\",\n \"Showing the {{shown}} most recent versions of {{total}}.\",\n { shown: allRows.length, total: total ?? allRows.length },\n )}\n </p>\n )}\n\n {/* Error State */}\n {error && (\n <div className=\"mb-6\">\n <ErrorState message={error.message} onRetry={refetch} />\n </div>\n )}\n\n {/* Table */}\n {loading ? (\n <HistoryTableSkeleton />\n ) : filteredRows.length === 0 ? (\n <EmptyState />\n ) : (\n <div className=\"overflow-x-auto rounded-lg border border-border-secondary\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-secondary bg-background-secondary\">\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnWorkflowName\",\n \"Workflow Name\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnVersion\",\n \"Version\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\"fluidgrids.history.historyPage.columnStatus\", \"Status\")}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnChangedBy\",\n \"Changed By\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnChangedAt\",\n \"Changed At\",\n )}\n </th>\n <th className=\"text-right px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnActions\",\n \"Actions\",\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {paginatedRows.map((row) => {\n const statusStyle =\n STATUS_STYLES[row.status] ?? STATUS_STYLES.DRAFT;\n return (\n <tr\n key={row.id}\n className=\"border-b border-border-secondary last:border-0 hover:bg-background-secondary/50 cursor-pointer transition-colors\"\n onClick={() =>\n handleNavigateToVersion(row.workflowKey, row.version)\n }\n >\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:workflow\"\n width={18}\n className=\"text-text-secondary\"\n />\n <div>\n <p className=\"font-medium text-text-primary\">\n {row.name}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {row.workflowKey}\n </p>\n </div>\n </div>\n </td>\n <td className=\"px-4 py-3\">\n <code className=\"text-xs bg-background-secondary px-2 py-0.5 rounded text-text-primary\">\n {row.version}\n </code>\n </td>\n <td className=\"px-4 py-3\">\n <Badge variant={statusStyle.variant}>\n {statusStyle.label}\n </Badge>\n </td>\n <td className=\"px-4 py-3 text-text-secondary\">\n <div\n className=\"flex items-center gap-1.5\"\n title={row.createdById ?? undefined}\n >\n <Icon icon=\"mdi:account\" width={16} />\n <span className=\"truncate max-w-[160px]\">\n {changedByLabel(row.createdById)}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-text-secondary\">\n {formatDate(row.updatedAt)}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleNavigateToVersion(\n row.workflowKey,\n row.version,\n );\n }}\n className=\"p-1.5 rounded hover:bg-background-secondary text-text-secondary hover:text-text-primary transition-colors\"\n >\n <Icon icon=\"mdi:open-in-new\" width={16} />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {tr(\n \"fluidgrids.history.historyPage.openInBuilderTooltip\",\n \"Open in builder\",\n )}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Pagination */}\n {filteredRows.length > PAGE_SIZE && (\n <div className=\"flex items-center justify-between mt-4 px-1\">\n <p className=\"text-sm text-text-secondary\">\n Showing {page * PAGE_SIZE + 1}–\n {Math.min((page + 1) * PAGE_SIZE, filteredRows.length)} of{\" \"}\n {filteredRows.length}\n </p>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page === 0}\n onClick={() => setPage((p) => p - 1)}\n >\n <Icon icon=\"mdi:chevron-left\" width={16} />\n {tr(\n \"fluidgrids.history.historyPage.previousPageButton\",\n \"Previous\",\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= totalPages - 1}\n onClick={() => setPage((p) => p + 1)}\n >\n {tr(\"fluidgrids.history.historyPage.nextPageButton\", \"Next\")}\n <Icon icon=\"mdi:chevron-right\" width={16} />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/history/pages/HistoryPage.tsx"],"names":[],"mappings":"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","file":"chunk-M2YFTRLL.js","sourcesContent":["/**\n * HistoryPage — cross-workflow version history.\n *\n * Fetches every version row in one paginated `workflowDefinitions` query\n * (latestOnly defaults to false, so the list API already returns one row per\n * version) and resolves \"Changed By\" ids to human names via the shared\n * actor-profile lookup.\n */\nimport { useState, useMemo, useCallback } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Skeleton,\n Input,\n Badge,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n useActorProfiles,\n buildActorFallback,\n type ActorInput,\n} from \"@burdenoff/fe-libs/shared\";\nimport { useWorkflowDefinitions } from \"../../../hooks/useWorkflows\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { getFluidGridsConfig } from \"../../../config\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst PAGE_SIZE = 20;\n\n/** Upper bound on version rows fetched for the screen (newest first). */\nconst FETCH_LIMIT = 500;\n\nfunction useStatusStyles() {\n const tr = useTr();\n return useMemo<\n Record<\n string,\n {\n label: string;\n variant: \"default\" | \"secondary\" | \"outline\" | \"destructive\";\n }\n >\n >(\n () => ({\n ACTIVE: {\n label: tr(\"fluidgrids.history.historyPage.statusActive\", \"Active\"),\n variant: \"default\",\n },\n DRAFT: {\n label: tr(\"fluidgrids.history.historyPage.statusDraft\", \"Draft\"),\n variant: \"secondary\",\n },\n ARCHIVED: {\n label: tr(\"fluidgrids.history.historyPage.statusArchived\", \"Archived\"),\n variant: \"outline\",\n },\n DEPRECATED: {\n label: tr(\n \"fluidgrids.history.historyPage.statusDeprecated\",\n \"Deprecated\",\n ),\n variant: \"destructive\",\n },\n }),\n [tr],\n );\n}\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\nfunction HistoryTableSkeleton() {\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton\n key={i}\n className=\"h-14 w-full rounded-lg bg-card-foreground/10\"\n />\n ))}\n </div>\n );\n}\n\nfunction EmptyState() {\n const tr = useTr();\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <div className=\"rounded-full bg-background-secondary p-4 mb-4\">\n <Icon icon=\"mdi:history\" width={40} className=\"text-text-secondary\" />\n </div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">\n {tr(\"fluidgrids.history.historyPage.emptyTitle\", \"No version history\")}\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n {tr(\n \"fluidgrids.history.historyPage.emptyHint\",\n \"Version history will appear here once you create and update workflows.\",\n )}\n </p>\n </div>\n );\n}\n\nfunction ErrorState({\n message,\n onRetry,\n}: {\n message: string;\n onRetry: () => void;\n}) {\n const tr = useTr();\n return (\n <div className=\"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)]\">\n <Icon icon=\"mdi:alert-circle\" width={20} />\n <span className=\"font-medium\">\n {tr(\n \"fluidgrids.history.historyPage.errorHeading\",\n \"Error loading history\",\n )}\n </span>\n </div>\n <p className=\"mt-1 text-sm text-[var(--color-status-error-text)]\">\n {message}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onRetry}\n className=\"mt-3 border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]\"\n >\n {tr(\"fluidgrids.history.historyPage.errorRetry\", \"Retry\")}\n </Button>\n </div>\n );\n}\n\nfunction StatCard({\n label,\n value,\n valueClassName,\n}: {\n label: string;\n value: number;\n valueClassName?: string;\n}) {\n return (\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <p className=\"text-xs text-text-secondary\">{label}</p>\n <p\n className={`text-xl font-bold ${valueClassName ?? \"text-text-primary\"}`}\n >\n {value}\n </p>\n </div>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport function HistoryPage() {\n const tr = useTr();\n const navigate = useNavigate();\n const STATUS_STYLES = useStatusStyles();\n const [search, setSearch] = useState(\"\");\n const [workflowFilter, setWorkflowFilter] = useState<string>(\"all\");\n const [page, setPage] = useState(0);\n\n // One query returns every version row (latestOnly is false by default),\n // newest first — no per-workflow fan-out needed.\n const {\n workflows: versionRows,\n total,\n hasMore,\n loading,\n error,\n refetch,\n } = useWorkflowDefinitions({ limit: FETCH_LIMIT });\n\n const allRows = useMemo(\n () =>\n [...versionRows].sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n ),\n [versionRows],\n );\n\n // Distinct workflows (latest row per key) for the stat + filter dropdown.\n const distinctWorkflows = useMemo(() => {\n const byKey = new Map<string, { workflowKey: string; name: string }>();\n for (const row of allRows) {\n if (!byKey.has(row.workflowKey)) {\n byKey.set(row.workflowKey, {\n workflowKey: row.workflowKey,\n name: row.name,\n });\n }\n }\n return [...byKey.values()];\n }, [allRows]);\n\n // Resolve createdById → display names (workspace-scoped, cached, batched).\n const config = getFluidGridsConfig();\n const actorInputs = useMemo<ActorInput[]>(() => {\n const ids = new Set<string>();\n for (const row of allRows) {\n if (row.createdById) ids.add(row.createdById);\n }\n return [...ids].map((actorId) => ({ actorId, actorType: \"user\" }));\n }, [allRows]);\n const actorProfiles = useActorProfiles(actorInputs, {\n workspaceId: config.workspaceId || undefined,\n orgId: config.organizationId,\n authToken: config.authToken,\n });\n\n const changedByLabel = useCallback(\n (createdById?: string | null): string => {\n if (!createdById) return \"—\";\n return (\n actorProfiles[createdById]?.displayName ??\n buildActorFallback({ actorId: createdById, actorType: \"user\" })\n .displayName\n );\n },\n [actorProfiles],\n );\n\n // Filter rows\n const filteredRows = useMemo(() => {\n let rows = allRows;\n\n if (workflowFilter !== \"all\") {\n rows = rows.filter((r) => r.workflowKey === workflowFilter);\n }\n\n if (search.trim()) {\n const q = search.toLowerCase();\n rows = rows.filter(\n (r) =>\n r.name.toLowerCase().includes(q) ||\n r.version.toLowerCase().includes(q) ||\n r.workflowKey.toLowerCase().includes(q) ||\n changedByLabel(r.createdById).toLowerCase().includes(q),\n );\n }\n\n return rows;\n }, [allRows, workflowFilter, search, changedByLabel]);\n\n // Pagination\n const totalPages = Math.max(1, Math.ceil(filteredRows.length / PAGE_SIZE));\n const paginatedRows = filteredRows.slice(\n page * PAGE_SIZE,\n (page + 1) * PAGE_SIZE,\n );\n\n const handleNavigateToVersion = (workflowKey: string, version: string) => {\n navigate(`../workflow/${workflowKey}/${version}`);\n };\n\n const formatDate = (dateStr: string) => {\n try {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(new Date(dateStr));\n } catch {\n return dateStr;\n }\n };\n\n const countByStatus = (status: string) =>\n allRows.filter((r) => r.status === status).length;\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Header */}\n <div\n className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\"\n data-tour=\"fluidgrids-history-header\"\n >\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {tr(\"fluidgrids.history.historyPage.title\", \"Version History\")}\n </h1>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n \"fluidgrids.history.historyPage.subtitle\",\n \"Track changes and versions across all workflows\",\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"outline\" onClick={() => refetch()}>\n <Icon icon=\"mdi:refresh\" className=\"mr-2\" width={16} />\n {tr(\"fluidgrids.history.historyPage.refreshButton\", \"Refresh\")}\n </Button>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n <Icon icon=\"mdi:arrow-left\" className=\"mr-2\" width={16} />\n {tr(\n \"fluidgrids.history.historyPage.backToWorkflowsButton\",\n \"Back to Workflows\",\n )}\n </Button>\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col sm:flex-row gap-3 mb-6\">\n <div\n className=\"relative flex-1 max-w-sm\"\n data-tour=\"fluidgrids-history-search\"\n >\n <Icon\n icon=\"mdi:magnify\"\n width={18}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <Input\n placeholder={tr(\n \"fluidgrids.history.historyPage.searchPlaceholder\",\n \"Search by name, version, key, or author...\",\n )}\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setPage(0);\n }}\n className=\"pl-10 bg-background-secondary border-border-secondary\"\n />\n </div>\n <Select\n value={workflowFilter}\n onValueChange={(val) => {\n setWorkflowFilter(val);\n setPage(0);\n }}\n >\n <SelectTrigger\n className=\"w-[220px] bg-background-secondary border-border-secondary\"\n data-tour=\"fluidgrids-history-workflow-filter\"\n >\n <SelectValue\n placeholder={tr(\n \"fluidgrids.history.historyPage.workflowFilterPlaceholder\",\n \"All Workflows\",\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tr(\n \"fluidgrids.history.historyPage.workflowFilterAllOption\",\n \"All Workflows\",\n )}\n </SelectItem>\n {distinctWorkflows.map((w) => (\n <SelectItem key={w.workflowKey} value={w.workflowKey}>\n {w.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-5 gap-3 mb-6\">\n <StatCard\n label={tr(\n \"fluidgrids.history.historyPage.statTotalVersions\",\n \"Total Versions\",\n )}\n value={total || allRows.length}\n />\n <StatCard\n label={tr(\n \"fluidgrids.history.historyPage.statWorkflows\",\n \"Workflows\",\n )}\n value={distinctWorkflows.length}\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statActive\", \"Active\")}\n value={countByStatus(\"ACTIVE\")}\n valueClassName=\"text-[var(--color-status-success-text)]\"\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statDraft\", \"Draft\")}\n value={countByStatus(\"DRAFT\")}\n valueClassName=\"text-[var(--color-status-warning-text)]\"\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statArchived\", \"Archived\")}\n value={countByStatus(\"ARCHIVED\")}\n />\n </div>\n\n {hasMore && (\n <p className=\"text-xs text-text-secondary mb-4\">\n {tr(\n \"fluidgrids.history.historyPage.partialResultsHint\",\n \"Showing the {{shown}} most recent versions of {{total}}.\",\n { shown: allRows.length, total: total ?? allRows.length },\n )}\n </p>\n )}\n\n {/* Error State */}\n {error && (\n <div className=\"mb-6\">\n <ErrorState message={error.message} onRetry={refetch} />\n </div>\n )}\n\n {/* Table */}\n {loading ? (\n <HistoryTableSkeleton />\n ) : filteredRows.length === 0 ? (\n <EmptyState />\n ) : (\n <div className=\"overflow-x-auto rounded-lg border border-border-secondary\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-secondary bg-background-secondary\">\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnWorkflowName\",\n \"Workflow Name\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnVersion\",\n \"Version\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\"fluidgrids.history.historyPage.columnStatus\", \"Status\")}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnChangedBy\",\n \"Changed By\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnChangedAt\",\n \"Changed At\",\n )}\n </th>\n <th className=\"text-right px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnActions\",\n \"Actions\",\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {paginatedRows.map((row) => {\n const statusStyle =\n STATUS_STYLES[row.status] ?? STATUS_STYLES.DRAFT;\n return (\n <tr\n key={row.id}\n className=\"border-b border-border-secondary last:border-0 hover:bg-background-secondary/50 cursor-pointer transition-colors\"\n onClick={() =>\n handleNavigateToVersion(row.workflowKey, row.version)\n }\n >\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:workflow\"\n width={18}\n className=\"text-text-secondary\"\n />\n <div>\n <p className=\"font-medium text-text-primary\">\n {row.name}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {row.workflowKey}\n </p>\n </div>\n </div>\n </td>\n <td className=\"px-4 py-3\">\n <code className=\"text-xs bg-background-secondary px-2 py-0.5 rounded text-text-primary\">\n {row.version}\n </code>\n </td>\n <td className=\"px-4 py-3\">\n <Badge variant={statusStyle.variant}>\n {statusStyle.label}\n </Badge>\n </td>\n <td className=\"px-4 py-3 text-text-secondary\">\n <div\n className=\"flex items-center gap-1.5\"\n title={row.createdById ?? undefined}\n >\n <Icon icon=\"mdi:account\" width={16} />\n <span className=\"truncate max-w-[160px]\">\n {changedByLabel(row.createdById)}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-text-secondary\">\n {formatDate(row.updatedAt)}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleNavigateToVersion(\n row.workflowKey,\n row.version,\n );\n }}\n className=\"p-1.5 rounded hover:bg-background-secondary text-text-secondary hover:text-text-primary transition-colors\"\n >\n <Icon icon=\"mdi:open-in-new\" width={16} />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {tr(\n \"fluidgrids.history.historyPage.openInBuilderTooltip\",\n \"Open in builder\",\n )}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Pagination */}\n {filteredRows.length > PAGE_SIZE && (\n <div className=\"flex items-center justify-between mt-4 px-1\">\n <p className=\"text-sm text-text-secondary\">\n Showing {page * PAGE_SIZE + 1}–\n {Math.min((page + 1) * PAGE_SIZE, filteredRows.length)} of{\" \"}\n {filteredRows.length}\n </p>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page === 0}\n onClick={() => setPage((p) => p - 1)}\n >\n <Icon icon=\"mdi:chevron-left\" width={16} />\n {tr(\n \"fluidgrids.history.historyPage.previousPageButton\",\n \"Previous\",\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= totalPages - 1}\n onClick={() => setPage((p) => p + 1)}\n >\n {tr(\"fluidgrids.history.historyPage.nextPageButton\", \"Next\")}\n <Icon icon=\"mdi:chevron-right\" width={16} />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { FluidGridsProvider, Card, FluidGridsMark } from './chunk-
|
|
1
|
+
import { FluidGridsProvider, Card, FluidGridsMark } from './chunk-5DQU54IB.js';
|
|
2
2
|
import { Input } from './chunk-P5PKRQAO.js';
|
|
3
3
|
import { Button } from './chunk-DBOMRIP5.js';
|
|
4
4
|
import { cn } from './chunk-3ZYUGTIT.js';
|
|
5
|
-
import { useWorkflowDefinition } from './chunk-
|
|
5
|
+
import { useWorkflowDefinition } from './chunk-XBIHI224.js';
|
|
6
6
|
import { useFlowStore } from './chunk-3B5YEXSW.js';
|
|
7
7
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
8
8
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
@@ -479,6 +479,9 @@ function WorkflowBuilder({
|
|
|
479
479
|
authToken,
|
|
480
480
|
workspaceId,
|
|
481
481
|
tenantId,
|
|
482
|
+
productId,
|
|
483
|
+
userId,
|
|
484
|
+
workspaceToken,
|
|
482
485
|
organizationId,
|
|
483
486
|
workspaceClient,
|
|
484
487
|
globalClient,
|
|
@@ -493,6 +496,9 @@ function WorkflowBuilder({
|
|
|
493
496
|
authToken,
|
|
494
497
|
workspaceId,
|
|
495
498
|
tenantId,
|
|
499
|
+
productId,
|
|
500
|
+
userId,
|
|
501
|
+
workspaceToken,
|
|
496
502
|
organizationId,
|
|
497
503
|
workspaceClient,
|
|
498
504
|
globalClient,
|
|
@@ -540,5 +546,5 @@ function WorkflowSearchRedirect() {
|
|
|
540
546
|
}
|
|
541
547
|
|
|
542
548
|
export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect };
|
|
543
|
-
//# sourceMappingURL=chunk-
|
|
544
|
-
//# sourceMappingURL=chunk-
|
|
549
|
+
//# sourceMappingURL=chunk-VGJKZYW2.js.map
|
|
550
|
+
//# sourceMappingURL=chunk-VGJKZYW2.js.map
|