@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.
Files changed (36) hide show
  1. package/dist/ExecutionDetailPage-H2KAEHLX.js +8 -0
  2. package/dist/{ExecutionDetailPage-G4FTQ5AF.js.map → ExecutionDetailPage-H2KAEHLX.js.map} +1 -1
  3. package/dist/ExecutionsListPage-ONF5IUB4.js +8 -0
  4. package/dist/{ExecutionsListPage-AAMQIVJS.js.map → ExecutionsListPage-ONF5IUB4.js.map} +1 -1
  5. package/dist/{WorkflowBuilder-2QYBWEWO.js → WorkflowBuilder-CLIMJZPI.js} +6 -6
  6. package/dist/{WorkflowBuilder-2QYBWEWO.js.map → WorkflowBuilder-CLIMJZPI.js.map} +1 -1
  7. package/dist/WorkflowsList-ZNSFZMAQ.js +10 -0
  8. package/dist/{WorkflowsList-ZTH4NVPS.js.map → WorkflowsList-ZNSFZMAQ.js.map} +1 -1
  9. package/dist/{blocks-7Q5XRFI7.js → blocks-M44L2H7I.js} +4 -4
  10. package/dist/{blocks-7Q5XRFI7.js.map → blocks-M44L2H7I.js.map} +1 -1
  11. package/dist/{chunk-47457KC3.js → chunk-42PCKNPK.js} +3 -3
  12. package/dist/{chunk-47457KC3.js.map → chunk-42PCKNPK.js.map} +1 -1
  13. package/dist/{chunk-U2OJNTKM.js → chunk-DZTLVUGS.js} +7 -7
  14. package/dist/{chunk-U2OJNTKM.js.map → chunk-DZTLVUGS.js.map} +1 -1
  15. package/dist/{chunk-3ZCTYLHL.js → chunk-ECX7WKZ3.js} +421 -40
  16. package/dist/chunk-ECX7WKZ3.js.map +1 -0
  17. package/dist/{chunk-3M2I2ITB.js → chunk-EPFS7HOM.js} +169 -57
  18. package/dist/chunk-EPFS7HOM.js.map +1 -0
  19. package/dist/{chunk-Y6U32527.js → chunk-GWO5RZQX.js} +4 -4
  20. package/dist/{chunk-Y6U32527.js.map → chunk-GWO5RZQX.js.map} +1 -1
  21. package/dist/{chunk-H7WSQN2I.js → chunk-IU65EQOS.js} +62 -3
  22. package/dist/chunk-IU65EQOS.js.map +1 -0
  23. package/dist/{chunk-LNY6ATSV.js → chunk-JTET2M65.js} +3 -3
  24. package/dist/{chunk-LNY6ATSV.js.map → chunk-JTET2M65.js.map} +1 -1
  25. package/dist/{chunk-D4XMKH2F.js → chunk-XPUAUQ3I.js} +3 -3
  26. package/dist/{chunk-D4XMKH2F.js.map → chunk-XPUAUQ3I.js.map} +1 -1
  27. package/dist/index.d.ts +207 -1
  28. package/dist/index.js +29 -16
  29. package/dist/index.js.map +1 -1
  30. package/package.json +1 -1
  31. package/dist/ExecutionDetailPage-G4FTQ5AF.js +0 -8
  32. package/dist/ExecutionsListPage-AAMQIVJS.js +0 -8
  33. package/dist/WorkflowsList-ZTH4NVPS.js +0 -10
  34. package/dist/chunk-3M2I2ITB.js.map +0 -1
  35. package/dist/chunk-3ZCTYLHL.js.map +0 -1
  36. package/dist/chunk-H7WSQN2I.js.map +0 -1
@@ -1,9 +1,9 @@
1
- import { ExecutionDetailDocument, ExecutionLogsDocument, ExecutionStatsDocument, throwIfResultError, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TerminateExecutionDocument, ExecutionsListDocument } from './chunk-H7WSQN2I.js';
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, useEffect, useRef } from 'react';
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, useExecutionLogs, useExecutionStats, useExecutionsStore, useExecutionsWithStore };
2028
- //# sourceMappingURL=chunk-3ZCTYLHL.js.map
2029
- //# sourceMappingURL=chunk-3ZCTYLHL.js.map
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