@burdenoff/fluidgrids-fe-sdk 2026.730.1 → 2026.730.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ExecutionDetailPage-H2KAEHLX.js +8 -0
- package/dist/{ExecutionDetailPage-G4FTQ5AF.js.map → ExecutionDetailPage-H2KAEHLX.js.map} +1 -1
- package/dist/ExecutionsListPage-ONF5IUB4.js +8 -0
- package/dist/{ExecutionsListPage-AAMQIVJS.js.map → ExecutionsListPage-ONF5IUB4.js.map} +1 -1
- package/dist/{WorkflowBuilder-2QYBWEWO.js → WorkflowBuilder-CLIMJZPI.js} +6 -6
- package/dist/{WorkflowBuilder-2QYBWEWO.js.map → WorkflowBuilder-CLIMJZPI.js.map} +1 -1
- package/dist/WorkflowsList-ZNSFZMAQ.js +10 -0
- package/dist/{WorkflowsList-ZTH4NVPS.js.map → WorkflowsList-ZNSFZMAQ.js.map} +1 -1
- package/dist/{blocks-7Q5XRFI7.js → blocks-M44L2H7I.js} +4 -4
- package/dist/{blocks-7Q5XRFI7.js.map → blocks-M44L2H7I.js.map} +1 -1
- package/dist/{chunk-47457KC3.js → chunk-42PCKNPK.js} +3 -3
- package/dist/{chunk-47457KC3.js.map → chunk-42PCKNPK.js.map} +1 -1
- package/dist/{chunk-U2OJNTKM.js → chunk-DZTLVUGS.js} +7 -7
- package/dist/{chunk-U2OJNTKM.js.map → chunk-DZTLVUGS.js.map} +1 -1
- package/dist/{chunk-3ZCTYLHL.js → chunk-ECX7WKZ3.js} +421 -40
- package/dist/chunk-ECX7WKZ3.js.map +1 -0
- package/dist/{chunk-3M2I2ITB.js → chunk-EPFS7HOM.js} +169 -57
- package/dist/chunk-EPFS7HOM.js.map +1 -0
- package/dist/{chunk-Y6U32527.js → chunk-GWO5RZQX.js} +4 -4
- package/dist/{chunk-Y6U32527.js.map → chunk-GWO5RZQX.js.map} +1 -1
- package/dist/{chunk-H7WSQN2I.js → chunk-IU65EQOS.js} +62 -3
- package/dist/chunk-IU65EQOS.js.map +1 -0
- package/dist/{chunk-LNY6ATSV.js → chunk-JTET2M65.js} +3 -3
- package/dist/{chunk-LNY6ATSV.js.map → chunk-JTET2M65.js.map} +1 -1
- package/dist/{chunk-D4XMKH2F.js → chunk-XPUAUQ3I.js} +3 -3
- package/dist/{chunk-D4XMKH2F.js.map → chunk-XPUAUQ3I.js.map} +1 -1
- package/dist/index.d.ts +207 -1
- package/dist/index.js +29 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-G4FTQ5AF.js +0 -8
- package/dist/ExecutionsListPage-AAMQIVJS.js +0 -8
- package/dist/WorkflowsList-ZTH4NVPS.js +0 -10
- package/dist/chunk-3M2I2ITB.js.map +0 -1
- package/dist/chunk-3ZCTYLHL.js.map +0 -1
- package/dist/chunk-H7WSQN2I.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ExecutionDetailDocument,
|
|
1
|
+
import { ExecutionDetailDocument, ExecutionStatsDocument, throwIfResultError, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TerminateExecutionDocument, ExecutionsListDocument } from './chunk-IU65EQOS.js';
|
|
2
2
|
import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
|
|
3
3
|
import { Icon } from '@iconify/react';
|
|
4
4
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
5
5
|
import { create } from 'zustand';
|
|
6
|
-
import { useState, useCallback, useMemo,
|
|
6
|
+
import { useState, useCallback, useMemo, useRef, useEffect } from 'react';
|
|
7
7
|
import { Button } from '@burdenoff/fe-libs/button';
|
|
8
8
|
import { useNavigate } from 'react-router-dom';
|
|
9
9
|
import { gql } from '@apollo/client';
|
|
@@ -1561,6 +1561,422 @@ function NodeTimeline({
|
|
|
1561
1561
|
}) })
|
|
1562
1562
|
] });
|
|
1563
1563
|
}
|
|
1564
|
+
var LEVEL_ORDER = ["DEBUG", "INFO", "WARN", "ERROR"];
|
|
1565
|
+
var LEVEL_TEXT_CLASS = {
|
|
1566
|
+
DEBUG: "text-text-secondary",
|
|
1567
|
+
INFO: "text-text-primary",
|
|
1568
|
+
WARN: "text-[var(--color-status-warning-text)]",
|
|
1569
|
+
ERROR: "text-[var(--color-status-error-text)]"
|
|
1570
|
+
};
|
|
1571
|
+
var LEVEL_BADGE_CLASS = {
|
|
1572
|
+
DEBUG: "bg-muted text-tertiary",
|
|
1573
|
+
INFO: "bg-[var(--color-status-info-bg)] text-[var(--color-status-info-text)]",
|
|
1574
|
+
WARN: "bg-[var(--color-status-warning-bg)] text-[var(--color-status-warning-text)]",
|
|
1575
|
+
ERROR: "bg-[var(--color-status-error-bg)] text-[var(--color-status-error-text)]"
|
|
1576
|
+
};
|
|
1577
|
+
function formatTimestamp(iso) {
|
|
1578
|
+
const date = new Date(iso);
|
|
1579
|
+
const time = date.toLocaleTimeString("en-US", {
|
|
1580
|
+
hour12: false,
|
|
1581
|
+
hour: "2-digit",
|
|
1582
|
+
minute: "2-digit",
|
|
1583
|
+
second: "2-digit"
|
|
1584
|
+
});
|
|
1585
|
+
return `${time}.${String(date.getMilliseconds()).padStart(3, "0")}`;
|
|
1586
|
+
}
|
|
1587
|
+
function groupLines(lines, nodeStates) {
|
|
1588
|
+
const byNode = /* @__PURE__ */ new Map();
|
|
1589
|
+
const order = [];
|
|
1590
|
+
for (const line of lines) {
|
|
1591
|
+
const key = line.nodeId ?? "__run__";
|
|
1592
|
+
let group = byNode.get(key);
|
|
1593
|
+
if (!group) {
|
|
1594
|
+
const state = line.nodeId ? nodeStates.find((ns) => ns.nodeId === line.nodeId) : void 0;
|
|
1595
|
+
group = {
|
|
1596
|
+
key,
|
|
1597
|
+
nodeId: line.nodeId ?? null,
|
|
1598
|
+
label: line.nodeId ? `${line.nodeId}${state?.nodeType ? ` \xB7 ${state.nodeType}` : ""}` : "Run",
|
|
1599
|
+
status: state?.status,
|
|
1600
|
+
lines: [],
|
|
1601
|
+
hasError: false
|
|
1602
|
+
};
|
|
1603
|
+
byNode.set(key, group);
|
|
1604
|
+
order.push(key);
|
|
1605
|
+
}
|
|
1606
|
+
group.lines.push(line);
|
|
1607
|
+
if (line.level === "ERROR") group.hasError = true;
|
|
1608
|
+
}
|
|
1609
|
+
return order.map((key) => byNode.get(key));
|
|
1610
|
+
}
|
|
1611
|
+
function RunLogViewer({
|
|
1612
|
+
runId,
|
|
1613
|
+
lines,
|
|
1614
|
+
nodeStates,
|
|
1615
|
+
loading,
|
|
1616
|
+
error,
|
|
1617
|
+
hasMore,
|
|
1618
|
+
limitReached,
|
|
1619
|
+
streaming,
|
|
1620
|
+
active,
|
|
1621
|
+
minLevel,
|
|
1622
|
+
onMinLevelChange,
|
|
1623
|
+
onLoadMore
|
|
1624
|
+
}) {
|
|
1625
|
+
const [search, setSearch] = useState("");
|
|
1626
|
+
const [showTimestamps, setShowTimestamps] = useState(true);
|
|
1627
|
+
const [wrap, setWrap] = useState(true);
|
|
1628
|
+
const [follow, setFollow] = useState(true);
|
|
1629
|
+
const [collapsed, setCollapsed] = useState(/* @__PURE__ */ new Set());
|
|
1630
|
+
const [expanded, setExpanded] = useState(/* @__PURE__ */ new Set());
|
|
1631
|
+
const [highlighted, setHighlighted] = useState(null);
|
|
1632
|
+
const scrollRef = useRef(null);
|
|
1633
|
+
const bottomRef = useRef(null);
|
|
1634
|
+
const visible = useMemo(() => {
|
|
1635
|
+
if (!search.trim()) return lines;
|
|
1636
|
+
const needle = search.toLowerCase();
|
|
1637
|
+
return lines.filter((line) => line.message.toLowerCase().includes(needle));
|
|
1638
|
+
}, [lines, search]);
|
|
1639
|
+
const groups = useMemo(
|
|
1640
|
+
() => groupLines(visible, nodeStates),
|
|
1641
|
+
[visible, nodeStates]
|
|
1642
|
+
);
|
|
1643
|
+
const isCollapsed = useCallback(
|
|
1644
|
+
(group) => {
|
|
1645
|
+
if (collapsed.has(group.key)) return true;
|
|
1646
|
+
if (expanded.has(group.key)) return false;
|
|
1647
|
+
if (group.nodeId === null) return false;
|
|
1648
|
+
return !group.hasError && group.status !== "RUNNING";
|
|
1649
|
+
},
|
|
1650
|
+
[collapsed, expanded]
|
|
1651
|
+
);
|
|
1652
|
+
const toggleGroup = useCallback(
|
|
1653
|
+
(key, currentlyCollapsed) => {
|
|
1654
|
+
setCollapsed((prev) => {
|
|
1655
|
+
const next = new Set(prev);
|
|
1656
|
+
if (currentlyCollapsed) next.delete(key);
|
|
1657
|
+
else next.add(key);
|
|
1658
|
+
return next;
|
|
1659
|
+
});
|
|
1660
|
+
setExpanded((prev) => {
|
|
1661
|
+
const next = new Set(prev);
|
|
1662
|
+
if (currentlyCollapsed) next.add(key);
|
|
1663
|
+
else next.delete(key);
|
|
1664
|
+
return next;
|
|
1665
|
+
});
|
|
1666
|
+
},
|
|
1667
|
+
[]
|
|
1668
|
+
);
|
|
1669
|
+
useEffect(() => {
|
|
1670
|
+
if (!follow) return;
|
|
1671
|
+
bottomRef.current?.scrollIntoView({ block: "end" });
|
|
1672
|
+
}, [visible.length, follow]);
|
|
1673
|
+
const handleScroll = useCallback(() => {
|
|
1674
|
+
const el = scrollRef.current;
|
|
1675
|
+
if (!el) return;
|
|
1676
|
+
const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;
|
|
1677
|
+
setFollow(atBottom);
|
|
1678
|
+
}, []);
|
|
1679
|
+
useEffect(() => {
|
|
1680
|
+
const hash = window.location.hash;
|
|
1681
|
+
if (!hash.startsWith("#L")) return;
|
|
1682
|
+
const target = hash.slice(2);
|
|
1683
|
+
if (!lines.some((line) => line.id === target)) return;
|
|
1684
|
+
setHighlighted(target);
|
|
1685
|
+
setFollow(false);
|
|
1686
|
+
const timer = setTimeout(() => {
|
|
1687
|
+
document.getElementById(`L${target}`)?.scrollIntoView({ block: "center", behavior: "smooth" });
|
|
1688
|
+
}, 50);
|
|
1689
|
+
return () => clearTimeout(timer);
|
|
1690
|
+
}, [lines]);
|
|
1691
|
+
const copyLineLink = useCallback((lineId) => {
|
|
1692
|
+
const url = `${window.location.origin}${window.location.pathname}#L${lineId}`;
|
|
1693
|
+
void navigator.clipboard?.writeText(url);
|
|
1694
|
+
setHighlighted(lineId);
|
|
1695
|
+
}, []);
|
|
1696
|
+
const downloadRaw = useCallback(() => {
|
|
1697
|
+
const body = lines.map((line) => {
|
|
1698
|
+
const node = line.nodeId ? ` [${line.nodeId}]` : "";
|
|
1699
|
+
return `${line.timestamp} ${line.level.padEnd(5)}${node} ${line.message}`;
|
|
1700
|
+
}).join("\n");
|
|
1701
|
+
const url = URL.createObjectURL(
|
|
1702
|
+
new Blob([body], { type: "text/plain;charset=utf-8" })
|
|
1703
|
+
);
|
|
1704
|
+
const anchor = document.createElement("a");
|
|
1705
|
+
anchor.href = url;
|
|
1706
|
+
anchor.download = `run-${runId}.log`;
|
|
1707
|
+
anchor.click();
|
|
1708
|
+
URL.revokeObjectURL(url);
|
|
1709
|
+
}, [lines, runId]);
|
|
1710
|
+
if (loading && lines.length === 0) {
|
|
1711
|
+
return /* @__PURE__ */ jsx("div", { className: "space-y-2", "data-testid": "run-log-loading", children: [...Array(6)].map((_, i) => /* @__PURE__ */ jsx(
|
|
1712
|
+
"div",
|
|
1713
|
+
{
|
|
1714
|
+
className: "h-6 bg-background-tertiary rounded animate-pulse"
|
|
1715
|
+
},
|
|
1716
|
+
i
|
|
1717
|
+
)) });
|
|
1718
|
+
}
|
|
1719
|
+
if (error && lines.length === 0) {
|
|
1720
|
+
return /* @__PURE__ */ jsxs("div", { className: "bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg p-6 text-center", children: [
|
|
1721
|
+
/* @__PURE__ */ jsx(
|
|
1722
|
+
Icon,
|
|
1723
|
+
{
|
|
1724
|
+
icon: "mdi:alert-circle",
|
|
1725
|
+
className: "mx-auto text-[var(--color-status-error-text)] mb-3",
|
|
1726
|
+
width: 32
|
|
1727
|
+
}
|
|
1728
|
+
),
|
|
1729
|
+
/* @__PURE__ */ jsx("p", { className: "text-[var(--color-status-error-text)]", children: error.message })
|
|
1730
|
+
] });
|
|
1731
|
+
}
|
|
1732
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", "data-testid": "run-log-viewer", children: [
|
|
1733
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
1734
|
+
/* @__PURE__ */ jsxs("div", { className: "relative flex-1 min-w-[200px]", children: [
|
|
1735
|
+
/* @__PURE__ */ jsx(
|
|
1736
|
+
Icon,
|
|
1737
|
+
{
|
|
1738
|
+
icon: "mdi:magnify",
|
|
1739
|
+
className: "absolute left-2 top-1/2 -translate-y-1/2 text-text-secondary",
|
|
1740
|
+
width: 16
|
|
1741
|
+
}
|
|
1742
|
+
),
|
|
1743
|
+
/* @__PURE__ */ jsx(
|
|
1744
|
+
"input",
|
|
1745
|
+
{
|
|
1746
|
+
type: "search",
|
|
1747
|
+
value: search,
|
|
1748
|
+
onChange: (e) => setSearch(e.target.value),
|
|
1749
|
+
placeholder: "Search log",
|
|
1750
|
+
"aria-label": "Search log",
|
|
1751
|
+
className: "w-full pl-8 pr-3 py-1.5 text-sm rounded border border-border-secondary bg-background-primary text-text-primary"
|
|
1752
|
+
}
|
|
1753
|
+
)
|
|
1754
|
+
] }),
|
|
1755
|
+
/* @__PURE__ */ jsxs(
|
|
1756
|
+
"select",
|
|
1757
|
+
{
|
|
1758
|
+
value: minLevel ?? "ALL",
|
|
1759
|
+
onChange: (e) => onMinLevelChange(
|
|
1760
|
+
e.target.value === "ALL" ? null : e.target.value
|
|
1761
|
+
),
|
|
1762
|
+
"aria-label": "Minimum log level",
|
|
1763
|
+
className: "px-2 py-1.5 text-sm rounded border border-border-secondary bg-background-primary text-text-primary",
|
|
1764
|
+
children: [
|
|
1765
|
+
/* @__PURE__ */ jsx("option", { value: "ALL", children: "All levels" }),
|
|
1766
|
+
LEVEL_ORDER.map((level) => /* @__PURE__ */ jsxs("option", { value: level, children: [
|
|
1767
|
+
level,
|
|
1768
|
+
" and above"
|
|
1769
|
+
] }, level))
|
|
1770
|
+
]
|
|
1771
|
+
}
|
|
1772
|
+
),
|
|
1773
|
+
/* @__PURE__ */ jsxs(
|
|
1774
|
+
Button,
|
|
1775
|
+
{
|
|
1776
|
+
variant: "outline",
|
|
1777
|
+
size: "sm",
|
|
1778
|
+
onClick: () => setShowTimestamps((v) => !v),
|
|
1779
|
+
"aria-pressed": showTimestamps,
|
|
1780
|
+
children: [
|
|
1781
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:clock-outline", className: "mr-1", width: 16 }),
|
|
1782
|
+
"Timestamps"
|
|
1783
|
+
]
|
|
1784
|
+
}
|
|
1785
|
+
),
|
|
1786
|
+
/* @__PURE__ */ jsxs(
|
|
1787
|
+
Button,
|
|
1788
|
+
{
|
|
1789
|
+
variant: "outline",
|
|
1790
|
+
size: "sm",
|
|
1791
|
+
onClick: () => setWrap((v) => !v),
|
|
1792
|
+
"aria-pressed": wrap,
|
|
1793
|
+
children: [
|
|
1794
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:wrap", className: "mr-1", width: 16 }),
|
|
1795
|
+
"Wrap"
|
|
1796
|
+
]
|
|
1797
|
+
}
|
|
1798
|
+
),
|
|
1799
|
+
active && /* @__PURE__ */ jsxs(
|
|
1800
|
+
Button,
|
|
1801
|
+
{
|
|
1802
|
+
variant: "outline",
|
|
1803
|
+
size: "sm",
|
|
1804
|
+
onClick: () => setFollow((v) => !v),
|
|
1805
|
+
"aria-pressed": follow,
|
|
1806
|
+
children: [
|
|
1807
|
+
/* @__PURE__ */ jsx(
|
|
1808
|
+
Icon,
|
|
1809
|
+
{
|
|
1810
|
+
icon: follow ? "mdi:pause" : "mdi:arrow-down-bold",
|
|
1811
|
+
className: "mr-1",
|
|
1812
|
+
width: 16
|
|
1813
|
+
}
|
|
1814
|
+
),
|
|
1815
|
+
follow ? "Following" : "Follow"
|
|
1816
|
+
]
|
|
1817
|
+
}
|
|
1818
|
+
),
|
|
1819
|
+
/* @__PURE__ */ jsxs(
|
|
1820
|
+
Button,
|
|
1821
|
+
{
|
|
1822
|
+
variant: "outline",
|
|
1823
|
+
size: "sm",
|
|
1824
|
+
onClick: downloadRaw,
|
|
1825
|
+
disabled: lines.length === 0,
|
|
1826
|
+
children: [
|
|
1827
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:download", className: "mr-1", width: 16 }),
|
|
1828
|
+
"Raw"
|
|
1829
|
+
]
|
|
1830
|
+
}
|
|
1831
|
+
)
|
|
1832
|
+
] }),
|
|
1833
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3 text-xs text-text-secondary", children: [
|
|
1834
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
1835
|
+
visible.length,
|
|
1836
|
+
" line",
|
|
1837
|
+
visible.length === 1 ? "" : "s",
|
|
1838
|
+
search.trim() && ` matching \u201C${search}\u201D`
|
|
1839
|
+
] }),
|
|
1840
|
+
active && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
|
|
1841
|
+
/* @__PURE__ */ jsx(
|
|
1842
|
+
"span",
|
|
1843
|
+
{
|
|
1844
|
+
className: `inline-block w-2 h-2 rounded-full ${streaming ? "bg-[var(--color-status-success-bg)]" : "bg-[var(--color-status-info-bg)]"}`
|
|
1845
|
+
}
|
|
1846
|
+
),
|
|
1847
|
+
streaming ? "Streaming" : "Polling"
|
|
1848
|
+
] }),
|
|
1849
|
+
hasMore && /* @__PURE__ */ jsx(
|
|
1850
|
+
"button",
|
|
1851
|
+
{
|
|
1852
|
+
onClick: onLoadMore,
|
|
1853
|
+
className: "text-action-primary-text hover:underline",
|
|
1854
|
+
children: "Load older lines"
|
|
1855
|
+
}
|
|
1856
|
+
)
|
|
1857
|
+
] }),
|
|
1858
|
+
limitReached && /* @__PURE__ */ jsx("div", { className: "px-3 py-2 rounded border border-[var(--color-status-warning-border)] bg-[var(--color-status-warning-bg-subtle)] text-[var(--color-status-warning-text)] text-sm", children: "This run hit its log limit \u2014 later lines were dropped. Reduce logging inside loops, or split the workflow into sub-workflows." }),
|
|
1859
|
+
/* @__PURE__ */ jsxs(
|
|
1860
|
+
"div",
|
|
1861
|
+
{
|
|
1862
|
+
ref: scrollRef,
|
|
1863
|
+
onScroll: handleScroll,
|
|
1864
|
+
className: "max-h-[600px] overflow-auto rounded-lg border border-border-secondary bg-background-primary",
|
|
1865
|
+
children: [
|
|
1866
|
+
groups.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "text-center py-10 text-text-secondary", children: [
|
|
1867
|
+
/* @__PURE__ */ jsx(
|
|
1868
|
+
Icon,
|
|
1869
|
+
{
|
|
1870
|
+
icon: "mdi:text-box-outline",
|
|
1871
|
+
className: "mx-auto mb-2",
|
|
1872
|
+
width: 32
|
|
1873
|
+
}
|
|
1874
|
+
),
|
|
1875
|
+
/* @__PURE__ */ jsx("p", { children: search.trim() ? "No lines match your search" : active ? "Waiting for the first log line\u2026" : "This run produced no log output" })
|
|
1876
|
+
] }) : groups.map((group) => {
|
|
1877
|
+
const groupCollapsed = isCollapsed(group);
|
|
1878
|
+
return /* @__PURE__ */ jsxs(
|
|
1879
|
+
"div",
|
|
1880
|
+
{
|
|
1881
|
+
className: "border-b border-border-secondary last:border-b-0",
|
|
1882
|
+
children: [
|
|
1883
|
+
/* @__PURE__ */ jsxs(
|
|
1884
|
+
"button",
|
|
1885
|
+
{
|
|
1886
|
+
onClick: () => toggleGroup(group.key, groupCollapsed),
|
|
1887
|
+
"aria-expanded": !groupCollapsed,
|
|
1888
|
+
className: "w-full flex items-center gap-2 px-3 py-2 text-left hover:bg-background-tertiary transition-colors",
|
|
1889
|
+
children: [
|
|
1890
|
+
/* @__PURE__ */ jsx(
|
|
1891
|
+
Icon,
|
|
1892
|
+
{
|
|
1893
|
+
icon: groupCollapsed ? "mdi:chevron-right" : "mdi:chevron-down",
|
|
1894
|
+
width: 18,
|
|
1895
|
+
className: "text-text-secondary flex-shrink-0"
|
|
1896
|
+
}
|
|
1897
|
+
),
|
|
1898
|
+
/* @__PURE__ */ jsx(
|
|
1899
|
+
"span",
|
|
1900
|
+
{
|
|
1901
|
+
className: `text-sm font-medium truncate ${group.hasError ? "text-[var(--color-status-error-text)]" : "text-text-primary"}`,
|
|
1902
|
+
children: group.label
|
|
1903
|
+
}
|
|
1904
|
+
),
|
|
1905
|
+
group.status === "RUNNING" && /* @__PURE__ */ jsx(
|
|
1906
|
+
Icon,
|
|
1907
|
+
{
|
|
1908
|
+
icon: "mdi:loading",
|
|
1909
|
+
className: "animate-spin text-[var(--color-status-info-text)] flex-shrink-0",
|
|
1910
|
+
width: 14
|
|
1911
|
+
}
|
|
1912
|
+
),
|
|
1913
|
+
/* @__PURE__ */ jsx("span", { className: "ml-auto text-xs text-text-secondary flex-shrink-0", children: group.lines.length })
|
|
1914
|
+
]
|
|
1915
|
+
}
|
|
1916
|
+
),
|
|
1917
|
+
!groupCollapsed && /* @__PURE__ */ jsx("div", { className: "font-mono text-xs", children: group.lines.map((line) => /* @__PURE__ */ jsxs(
|
|
1918
|
+
"div",
|
|
1919
|
+
{
|
|
1920
|
+
id: `L${line.id}`,
|
|
1921
|
+
className: `group flex items-start gap-2 px-3 py-0.5 hover:bg-background-tertiary ${highlighted === line.id ? "bg-[var(--color-status-info-bg-subtle)]" : ""}`,
|
|
1922
|
+
children: [
|
|
1923
|
+
showTimestamps && /* @__PURE__ */ jsx("span", { className: "text-text-secondary whitespace-nowrap select-none", children: formatTimestamp(line.timestamp) }),
|
|
1924
|
+
/* @__PURE__ */ jsx(
|
|
1925
|
+
"span",
|
|
1926
|
+
{
|
|
1927
|
+
className: `px-1 rounded uppercase text-[10px] leading-4 font-medium flex-shrink-0 ${LEVEL_BADGE_CLASS[line.level]}`,
|
|
1928
|
+
children: line.level
|
|
1929
|
+
}
|
|
1930
|
+
),
|
|
1931
|
+
line.attempt > 1 && /* @__PURE__ */ jsxs(
|
|
1932
|
+
"span",
|
|
1933
|
+
{
|
|
1934
|
+
className: "text-text-secondary flex-shrink-0",
|
|
1935
|
+
title: `Attempt ${line.attempt}`,
|
|
1936
|
+
children: [
|
|
1937
|
+
"#",
|
|
1938
|
+
line.attempt
|
|
1939
|
+
]
|
|
1940
|
+
}
|
|
1941
|
+
),
|
|
1942
|
+
/* @__PURE__ */ jsxs(
|
|
1943
|
+
"span",
|
|
1944
|
+
{
|
|
1945
|
+
className: `flex-1 ${LEVEL_TEXT_CLASS[line.level]} ${wrap ? "whitespace-pre-wrap break-words" : "whitespace-pre overflow-x-auto"}`,
|
|
1946
|
+
children: [
|
|
1947
|
+
line.message,
|
|
1948
|
+
line.truncated && /* @__PURE__ */ jsxs("span", { className: "text-text-secondary", children: [
|
|
1949
|
+
" ",
|
|
1950
|
+
"(truncated)"
|
|
1951
|
+
] })
|
|
1952
|
+
]
|
|
1953
|
+
}
|
|
1954
|
+
),
|
|
1955
|
+
/* @__PURE__ */ jsx(
|
|
1956
|
+
"button",
|
|
1957
|
+
{
|
|
1958
|
+
onClick: () => copyLineLink(line.id),
|
|
1959
|
+
title: "Copy link to this line",
|
|
1960
|
+
"aria-label": "Copy link to this line",
|
|
1961
|
+
className: "opacity-0 group-hover:opacity-100 text-text-secondary hover:text-text-primary flex-shrink-0",
|
|
1962
|
+
children: /* @__PURE__ */ jsx(Icon, { icon: "mdi:link-variant", width: 14 })
|
|
1963
|
+
}
|
|
1964
|
+
)
|
|
1965
|
+
]
|
|
1966
|
+
},
|
|
1967
|
+
line.id
|
|
1968
|
+
)) })
|
|
1969
|
+
]
|
|
1970
|
+
},
|
|
1971
|
+
group.key
|
|
1972
|
+
);
|
|
1973
|
+
}),
|
|
1974
|
+
/* @__PURE__ */ jsx("div", { ref: bottomRef })
|
|
1975
|
+
]
|
|
1976
|
+
}
|
|
1977
|
+
)
|
|
1978
|
+
] });
|
|
1979
|
+
}
|
|
1564
1980
|
function Pagination({
|
|
1565
1981
|
totalItems,
|
|
1566
1982
|
showPageSize = true
|
|
@@ -1807,41 +2223,6 @@ function useExecution(id) {
|
|
|
1807
2223
|
refetch: fetchData
|
|
1808
2224
|
};
|
|
1809
2225
|
}
|
|
1810
|
-
function useExecutionLogs(runId, limit = 100) {
|
|
1811
|
-
const [logs, setLogs] = useState([]);
|
|
1812
|
-
const [loading, setLoading] = useState(true);
|
|
1813
|
-
const [error, setError] = useState(null);
|
|
1814
|
-
const fetchData = useCallback(async () => {
|
|
1815
|
-
if (!runId) {
|
|
1816
|
-
setLoading(false);
|
|
1817
|
-
return;
|
|
1818
|
-
}
|
|
1819
|
-
setLoading(true);
|
|
1820
|
-
setError(null);
|
|
1821
|
-
try {
|
|
1822
|
-
const client = getFluidGridsClient();
|
|
1823
|
-
const result = await client.query({
|
|
1824
|
-
query: ExecutionLogsDocument,
|
|
1825
|
-
variables: { runId, limit },
|
|
1826
|
-
fetchPolicy: "network-only"
|
|
1827
|
-
});
|
|
1828
|
-
setLogs(result.data?.workflowExecutionLogs ?? []);
|
|
1829
|
-
} catch (err) {
|
|
1830
|
-
setError(err);
|
|
1831
|
-
} finally {
|
|
1832
|
-
setLoading(false);
|
|
1833
|
-
}
|
|
1834
|
-
}, [runId, limit]);
|
|
1835
|
-
useEffect(() => {
|
|
1836
|
-
fetchData();
|
|
1837
|
-
}, [fetchData]);
|
|
1838
|
-
return {
|
|
1839
|
-
logs,
|
|
1840
|
-
loading,
|
|
1841
|
-
error,
|
|
1842
|
-
refetch: fetchData
|
|
1843
|
-
};
|
|
1844
|
-
}
|
|
1845
2226
|
function useExecutionStats(options = {}) {
|
|
1846
2227
|
const [stats, setStats] = useState(null);
|
|
1847
2228
|
const [loading, setLoading] = useState(true);
|
|
@@ -2024,6 +2405,6 @@ function useAutoRefresh(refetchFn, enabled = true, interval = 5e3) {
|
|
|
2024
2405
|
}, [enabled, interval, refetchFn]);
|
|
2025
2406
|
}
|
|
2026
2407
|
|
|
2027
|
-
export { ExecutionCards, ExecutionFilters, ExecutionStats, ExecutionStatusBadge, ExecutionTable, ExecutionTimeline, NodeTimeline, Pagination, useAutoRefresh, useExecution, useExecutionActions,
|
|
2028
|
-
//# sourceMappingURL=chunk-
|
|
2029
|
-
//# sourceMappingURL=chunk-
|
|
2408
|
+
export { ExecutionCards, ExecutionFilters, ExecutionStats, ExecutionStatusBadge, ExecutionTable, ExecutionTimeline, NodeTimeline, Pagination, RunLogViewer, useAutoRefresh, useExecution, useExecutionActions, useExecutionStats, useExecutionsStore, useExecutionsWithStore };
|
|
2409
|
+
//# sourceMappingURL=chunk-ECX7WKZ3.js.map
|
|
2410
|
+
//# sourceMappingURL=chunk-ECX7WKZ3.js.map
|