@tangle-network/sandbox-ui 0.21.0 → 0.21.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.
@@ -1,7 +1,9 @@
1
1
  import {
2
- Button,
2
+ Button
3
+ } from "./chunk-SM7IJY4I.js";
4
+ import {
3
5
  Logo
4
- } from "./chunk-7ZA5SEK3.js";
6
+ } from "./chunk-UHFJXO24.js";
5
7
  import {
6
8
  cn
7
9
  } from "./chunk-EI44GEQ5.js";
@@ -1639,6 +1641,141 @@ function ProfileComparison({
1639
1641
  ] });
1640
1642
  }
1641
1643
 
1644
+ // src/dashboard/metric-area-chart.tsx
1645
+ import * as React5 from "react";
1646
+ import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
1647
+ var TONE_VARS = {
1648
+ primary: "var(--brand-primary, hsl(var(--primary)))",
1649
+ success: "var(--status-running, #22c55e)",
1650
+ warning: "var(--status-creating, #eab308)",
1651
+ danger: "var(--status-error, #ef4444)"
1652
+ };
1653
+ function buildSegments(points, width, height, yMax) {
1654
+ if (points.length === 0 || yMax <= 0) return [];
1655
+ const t0 = points[0].at;
1656
+ const t1 = points[points.length - 1].at;
1657
+ const span = Math.max(1, t1 - t0);
1658
+ const x = (at) => points.length === 1 ? width / 2 : (at - t0) / span * width;
1659
+ const y = (v) => height - Math.min(1, Math.max(0, v / yMax)) * height;
1660
+ const segments = [];
1661
+ let run = [];
1662
+ const flush = () => {
1663
+ if (run.length === 0) return;
1664
+ const line = run.map((p, i) => `${i === 0 ? "M" : "L"}${p.px.toFixed(2)},${p.py.toFixed(2)}`).join(" ");
1665
+ const first = run[0];
1666
+ const last = run[run.length - 1];
1667
+ const area = `${line} L${last.px.toFixed(2)},${height} L${first.px.toFixed(2)},${height} Z`;
1668
+ segments.push({ path: line, area });
1669
+ run = [];
1670
+ };
1671
+ for (const point of points) {
1672
+ if (point.value === null) {
1673
+ flush();
1674
+ continue;
1675
+ }
1676
+ run.push({ px: x(point.at), py: y(point.value) });
1677
+ }
1678
+ flush();
1679
+ return segments;
1680
+ }
1681
+ function MetricAreaChart({
1682
+ points,
1683
+ label,
1684
+ formatValue,
1685
+ maxValue,
1686
+ detail,
1687
+ tone = "primary",
1688
+ height = 96,
1689
+ emptyState,
1690
+ className
1691
+ }) {
1692
+ const gradientId = React5.useId();
1693
+ const width = 400;
1694
+ const values = points.map((p) => p.value).filter((v) => v !== null);
1695
+ const latest = values.length > 0 ? values[values.length - 1] : null;
1696
+ const observedMax = values.length > 0 ? Math.max(...values) : 0;
1697
+ const yMax = maxValue ?? (observedMax > 0 ? observedMax * 1.1 : 1);
1698
+ const segments = buildSegments(points, width, height, yMax);
1699
+ const color = TONE_VARS[tone];
1700
+ return /* @__PURE__ */ jsxs12(
1701
+ "div",
1702
+ {
1703
+ className: cn(
1704
+ "rounded-lg border border-border bg-card p-4 shadow-sm",
1705
+ className
1706
+ ),
1707
+ "data-testid": `metric-chart-${label.toLowerCase().replace(/\s+/g, "-")}`,
1708
+ children: [
1709
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-baseline justify-between gap-3", children: [
1710
+ /* @__PURE__ */ jsx13("p", { className: "font-medium text-muted-foreground text-xs uppercase tracking-[0.12em]", children: label }),
1711
+ /* @__PURE__ */ jsxs12("div", { className: "text-right", children: [
1712
+ /* @__PURE__ */ jsx13("span", { className: "font-semibold text-foreground text-xl tabular-nums tracking-tight", children: latest === null ? "\u2014" : formatValue(latest) }),
1713
+ detail && /* @__PURE__ */ jsx13("span", { className: "ml-1.5 text-muted-foreground text-xs", children: detail })
1714
+ ] })
1715
+ ] }),
1716
+ /* @__PURE__ */ jsx13("div", { className: "mt-3", children: values.length === 0 ? /* @__PURE__ */ jsx13(
1717
+ "div",
1718
+ {
1719
+ className: "flex items-center justify-center text-muted-foreground text-xs",
1720
+ style: { height },
1721
+ children: emptyState ?? "Waiting for samples\u2026"
1722
+ }
1723
+ ) : /* @__PURE__ */ jsxs12(
1724
+ "svg",
1725
+ {
1726
+ viewBox: `0 0 ${width} ${height}`,
1727
+ preserveAspectRatio: "none",
1728
+ className: "block w-full",
1729
+ style: { height },
1730
+ role: "img",
1731
+ "aria-label": `${label} chart`,
1732
+ children: [
1733
+ [0.25, 0.5, 0.75].map((fraction) => /* @__PURE__ */ jsx13(
1734
+ "line",
1735
+ {
1736
+ x1: 0,
1737
+ x2: width,
1738
+ y1: height * fraction,
1739
+ y2: height * fraction,
1740
+ stroke: "currentColor",
1741
+ className: "text-border",
1742
+ strokeWidth: 1,
1743
+ strokeDasharray: "3 5",
1744
+ vectorEffect: "non-scaling-stroke"
1745
+ },
1746
+ fraction
1747
+ )),
1748
+ /* @__PURE__ */ jsx13("defs", { children: /* @__PURE__ */ jsxs12("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
1749
+ /* @__PURE__ */ jsx13("stop", { offset: "0%", stopColor: color, stopOpacity: 0.28 }),
1750
+ /* @__PURE__ */ jsx13("stop", { offset: "100%", stopColor: color, stopOpacity: 0.02 })
1751
+ ] }) }),
1752
+ segments.map((segment) => /* @__PURE__ */ jsxs12(React5.Fragment, { children: [
1753
+ /* @__PURE__ */ jsx13("path", { d: segment.area, fill: `url(#${gradientId})` }),
1754
+ /* @__PURE__ */ jsx13(
1755
+ "path",
1756
+ {
1757
+ d: segment.path,
1758
+ fill: "none",
1759
+ stroke: color,
1760
+ strokeWidth: 1.75,
1761
+ vectorEffect: "non-scaling-stroke",
1762
+ strokeLinejoin: "round",
1763
+ strokeLinecap: "round"
1764
+ }
1765
+ )
1766
+ ] }, segment.path))
1767
+ ]
1768
+ }
1769
+ ) }),
1770
+ /* @__PURE__ */ jsxs12("div", { className: "mt-1.5 flex justify-between text-[10px] text-muted-foreground tabular-nums", children: [
1771
+ /* @__PURE__ */ jsx13("span", { children: values.length > 0 ? formatValue(0) : "" }),
1772
+ /* @__PURE__ */ jsx13("span", { children: values.length > 0 ? formatValue(yMax) : "" })
1773
+ ] })
1774
+ ]
1775
+ }
1776
+ );
1777
+ }
1778
+
1642
1779
  // src/dashboard/variant-list.tsx
1643
1780
  import {
1644
1781
  Check as Check3,
@@ -1652,7 +1789,7 @@ import {
1652
1789
  } from "lucide-react";
1653
1790
  import { Button as Button3 } from "@tangle-network/ui/primitives";
1654
1791
  import { Badge as Badge2 } from "@tangle-network/ui/primitives";
1655
- import { Fragment as Fragment9, jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
1792
+ import { Fragment as Fragment10, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
1656
1793
  var statusConfig = {
1657
1794
  pending: {
1658
1795
  icon: Clock3,
@@ -1736,19 +1873,19 @@ function VariantList({
1736
1873
  isActioning,
1737
1874
  className
1738
1875
  }) {
1739
- return /* @__PURE__ */ jsx13("div", { className: `space-y-2 ${className || ""}`, children: variants.map((variant) => {
1876
+ return /* @__PURE__ */ jsx14("div", { className: `space-y-2 ${className || ""}`, children: variants.map((variant) => {
1740
1877
  const status = statusConfig[variant.status];
1741
1878
  const StatusIcon = status.icon;
1742
1879
  const isSelected = variant.id === selectedId;
1743
- return /* @__PURE__ */ jsxs12(
1880
+ return /* @__PURE__ */ jsxs13(
1744
1881
  "div",
1745
1882
  {
1746
1883
  className: `cursor-pointer rounded-lg border px-3 py-2.5 transition-colors ${isSelected ? "border-primary/30 bg-[var(--accent-surface-soft)]" : "border-border bg-card hover:border-primary/20 hover:bg-muted/50"}`,
1747
1884
  onClick: () => onSelect?.(variant.id),
1748
1885
  children: [
1749
- /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
1750
- /* @__PURE__ */ jsxs12(Badge2, { className: `shrink-0 ${status.bg} ${status.border} ${status.color}`, children: [
1751
- /* @__PURE__ */ jsx13(
1886
+ /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2", children: [
1887
+ /* @__PURE__ */ jsxs13(Badge2, { className: `shrink-0 ${status.bg} ${status.border} ${status.color}`, children: [
1888
+ /* @__PURE__ */ jsx14(
1752
1889
  StatusIcon,
1753
1890
  {
1754
1891
  className: `mr-1 h-3 w-3 ${status.animate ? "animate-spin" : ""}`
@@ -1756,27 +1893,27 @@ function VariantList({
1756
1893
  ),
1757
1894
  status.label
1758
1895
  ] }),
1759
- /* @__PURE__ */ jsx13("span", { className: "truncate text-sm font-medium text-foreground", children: variant.label }),
1760
- variant.sublabel && /* @__PURE__ */ jsxs12("span", { className: "shrink-0 text-xs text-muted-foreground", children: [
1896
+ /* @__PURE__ */ jsx14("span", { className: "truncate text-sm font-medium text-foreground", children: variant.label }),
1897
+ variant.sublabel && /* @__PURE__ */ jsxs13("span", { className: "shrink-0 text-xs text-muted-foreground", children: [
1761
1898
  "(",
1762
1899
  variant.sublabel,
1763
1900
  ")"
1764
1901
  ] }),
1765
- variant.durationMs && /* @__PURE__ */ jsxs12("span", { className: "flex shrink-0 items-center gap-1 text-xs text-muted-foreground", children: [
1766
- /* @__PURE__ */ jsx13(Timer, { className: "h-3 w-3" }),
1902
+ variant.durationMs && /* @__PURE__ */ jsxs13("span", { className: "flex shrink-0 items-center gap-1 text-xs text-muted-foreground", children: [
1903
+ /* @__PURE__ */ jsx14(Timer, { className: "h-3 w-3" }),
1767
1904
  (variant.durationMs / 1e3).toFixed(1),
1768
1905
  "s"
1769
1906
  ] }),
1770
- /* @__PURE__ */ jsxs12("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [
1771
- variant.outcome && /* @__PURE__ */ jsx13(
1907
+ /* @__PURE__ */ jsxs13("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [
1908
+ variant.outcome && /* @__PURE__ */ jsx14(
1772
1909
  Badge2,
1773
1910
  {
1774
1911
  className: `${outcomeConfig[variant.outcome].bg} ${outcomeConfig[variant.outcome].border} ${outcomeConfig[variant.outcome].color}`,
1775
1912
  children: outcomeConfig[variant.outcome].label
1776
1913
  }
1777
1914
  ),
1778
- variant.status === "completed" && variant.outcome === "pending_review" && onAccept && onReject && /* @__PURE__ */ jsxs12(Fragment9, { children: [
1779
- /* @__PURE__ */ jsxs12(
1915
+ variant.status === "completed" && variant.outcome === "pending_review" && onAccept && onReject && /* @__PURE__ */ jsxs13(Fragment10, { children: [
1916
+ /* @__PURE__ */ jsxs13(
1780
1917
  Button3,
1781
1918
  {
1782
1919
  variant: "outline",
@@ -1788,12 +1925,12 @@ function VariantList({
1788
1925
  },
1789
1926
  disabled: isActioning === variant.id,
1790
1927
  children: [
1791
- /* @__PURE__ */ jsx13(Check3, { className: "mr-1 h-3 w-3" }),
1928
+ /* @__PURE__ */ jsx14(Check3, { className: "mr-1 h-3 w-3" }),
1792
1929
  "Accept"
1793
1930
  ]
1794
1931
  }
1795
1932
  ),
1796
- /* @__PURE__ */ jsxs12(
1933
+ /* @__PURE__ */ jsxs13(
1797
1934
  Button3,
1798
1935
  {
1799
1936
  variant: "outline",
@@ -1805,13 +1942,13 @@ function VariantList({
1805
1942
  },
1806
1943
  disabled: isActioning === variant.id,
1807
1944
  children: [
1808
- /* @__PURE__ */ jsx13(X, { className: "mr-1 h-3 w-3" }),
1945
+ /* @__PURE__ */ jsx14(X, { className: "mr-1 h-3 w-3" }),
1809
1946
  "Reject"
1810
1947
  ]
1811
1948
  }
1812
1949
  )
1813
1950
  ] }),
1814
- variant.detailsUrl && /* @__PURE__ */ jsx13(
1951
+ variant.detailsUrl && /* @__PURE__ */ jsx14(
1815
1952
  Button3,
1816
1953
  {
1817
1954
  variant: "ghost",
@@ -1821,13 +1958,13 @@ function VariantList({
1821
1958
  e.stopPropagation();
1822
1959
  window.open(variant.detailsUrl, "_blank");
1823
1960
  },
1824
- children: /* @__PURE__ */ jsx13(ExternalLink2, { className: "h-3.5 w-3.5" })
1961
+ children: /* @__PURE__ */ jsx14(ExternalLink2, { className: "h-3.5 w-3.5" })
1825
1962
  }
1826
1963
  )
1827
1964
  ] })
1828
1965
  ] }),
1829
- variant.error && /* @__PURE__ */ jsx13("p", { className: "mt-1.5 text-xs text-[var(--surface-danger-text)]", children: variant.error }),
1830
- variant.summary && /* @__PURE__ */ jsx13("p", { className: "mt-1.5 line-clamp-2 text-xs text-muted-foreground", children: variant.summary })
1966
+ variant.error && /* @__PURE__ */ jsx14("p", { className: "mt-1.5 text-xs text-[var(--surface-danger-text)]", children: variant.error }),
1967
+ variant.summary && /* @__PURE__ */ jsx14("p", { className: "mt-1.5 line-clamp-2 text-xs text-muted-foreground", children: variant.summary })
1831
1968
  ]
1832
1969
  },
1833
1970
  variant.id
@@ -1838,7 +1975,7 @@ function VariantList({
1838
1975
  // src/dashboard/system-logs.tsx
1839
1976
  import { Terminal as Terminal3 } from "lucide-react";
1840
1977
  import { useEffect as useEffect2, useRef as useRef2, useState as useState4 } from "react";
1841
- import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
1978
+ import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
1842
1979
  function SystemLogsViewer({ apiUrl, token, className }) {
1843
1980
  const [logs, setLogs] = useState4([]);
1844
1981
  const [error, setError] = useState4(null);
@@ -1891,18 +2028,18 @@ function SystemLogsViewer({ apiUrl, token, className }) {
1891
2028
  const isAtBottom = scrollHeight - scrollTop - clientHeight < 20;
1892
2029
  setIsFollowing((prev) => prev === isAtBottom ? prev : isAtBottom);
1893
2030
  };
1894
- return /* @__PURE__ */ jsxs13("div", { className: cn("flex flex-col h-full bg-background text-foreground font-mono text-sm leading-relaxed overflow-hidden rounded-lg border border-border", className), children: [
1895
- /* @__PURE__ */ jsxs13("div", { className: "flex-none flex items-center justify-between border-b border-border bg-muted/50 backdrop-blur-md px-4 py-2", children: [
1896
- /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2", children: [
1897
- /* @__PURE__ */ jsx14(Terminal3, { className: "h-4 w-4 text-primary animate-pulse" }),
1898
- /* @__PURE__ */ jsx14("span", { className: "font-bold text-xs uppercase tracking-widest text-muted-foreground", children: "System Traces" })
2031
+ return /* @__PURE__ */ jsxs14("div", { className: cn("flex flex-col h-full bg-background text-foreground font-mono text-sm leading-relaxed overflow-hidden rounded-lg border border-border", className), children: [
2032
+ /* @__PURE__ */ jsxs14("div", { className: "flex-none flex items-center justify-between border-b border-border bg-muted/50 backdrop-blur-md px-4 py-2", children: [
2033
+ /* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-2", children: [
2034
+ /* @__PURE__ */ jsx15(Terminal3, { className: "h-4 w-4 text-primary animate-pulse" }),
2035
+ /* @__PURE__ */ jsx15("span", { className: "font-bold text-xs uppercase tracking-widest text-muted-foreground", children: "System Traces" })
1899
2036
  ] }),
1900
- /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-3", children: [
1901
- error && /* @__PURE__ */ jsxs13("span", { className: "text-destructive text-xs flex items-center gap-1", children: [
1902
- /* @__PURE__ */ jsx14("span", { className: "w-2 h-2 rounded-full bg-destructive animate-ping" }),
2037
+ /* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-3", children: [
2038
+ error && /* @__PURE__ */ jsxs14("span", { className: "text-destructive text-xs flex items-center gap-1", children: [
2039
+ /* @__PURE__ */ jsx15("span", { className: "w-2 h-2 rounded-full bg-destructive animate-ping" }),
1903
2040
  " Error fetching logs"
1904
2041
  ] }),
1905
- /* @__PURE__ */ jsx14(
2042
+ /* @__PURE__ */ jsx15(
1906
2043
  "button",
1907
2044
  {
1908
2045
  onClick: () => {
@@ -1917,29 +2054,29 @@ function SystemLogsViewer({ apiUrl, token, className }) {
1917
2054
  )
1918
2055
  ] })
1919
2056
  ] }),
1920
- /* @__PURE__ */ jsx14(
2057
+ /* @__PURE__ */ jsx15(
1921
2058
  "div",
1922
2059
  {
1923
2060
  ref: scrollRef,
1924
2061
  onScroll: handleScroll,
1925
2062
  className: "flex-1 overflow-y-auto p-4 space-y-1",
1926
- children: logs.length === 0 && !error ? /* @__PURE__ */ jsx14("div", { className: "flex h-full items-center justify-center text-muted-foreground italic", children: "Waiting for orchestrator logs..." }) : logs.map((log, i) => /* @__PURE__ */ jsxs13("div", { className: "break-words", children: [
1927
- /* @__PURE__ */ jsxs13("span", { className: "text-muted-foreground mr-3 select-none", children: [
2063
+ children: logs.length === 0 && !error ? /* @__PURE__ */ jsx15("div", { className: "flex h-full items-center justify-center text-muted-foreground italic", children: "Waiting for orchestrator logs..." }) : logs.map((log, i) => /* @__PURE__ */ jsxs14("div", { className: "break-words", children: [
2064
+ /* @__PURE__ */ jsxs14("span", { className: "text-muted-foreground mr-3 select-none", children: [
1928
2065
  "[",
1929
2066
  log.timestamp || i.toString().padStart(4, "0"),
1930
2067
  "]"
1931
2068
  ] }),
1932
- /* @__PURE__ */ jsxs13("span", { className: "text-primary/70 mr-2", children: [
2069
+ /* @__PURE__ */ jsxs14("span", { className: "text-primary/70 mr-2", children: [
1933
2070
  "[",
1934
2071
  log.level,
1935
2072
  "]"
1936
2073
  ] }),
1937
- /* @__PURE__ */ jsxs13("span", { className: "text-muted-foreground mr-2", children: [
2074
+ /* @__PURE__ */ jsxs14("span", { className: "text-muted-foreground mr-2", children: [
1938
2075
  "[",
1939
2076
  log.scope,
1940
2077
  "]"
1941
2078
  ] }),
1942
- /* @__PURE__ */ jsx14("span", { className: log.level.toUpperCase() === "ERROR" || log.message.toLowerCase().includes("failed") ? "text-destructive" : log.level.toUpperCase() === "WARN" ? "text-warning" : "text-foreground", children: log.message })
2079
+ /* @__PURE__ */ jsx15("span", { className: log.level.toUpperCase() === "ERROR" || log.message.toLowerCase().includes("failed") ? "text-destructive" : log.level.toUpperCase() === "WARN" ? "text-warning" : "text-foreground", children: log.message })
1943
2080
  ] }, `${log.timestamp}-${log.scope}-${i}`))
1944
2081
  }
1945
2082
  )
@@ -1950,50 +2087,50 @@ function SystemLogsViewer({ apiUrl, token, className }) {
1950
2087
  import { Clock as Clock4, Layers, MessageSquare, DollarSign } from "lucide-react";
1951
2088
  import { StatCard } from "@tangle-network/ui/primitives";
1952
2089
  import { Skeleton as Skeleton2 } from "@tangle-network/ui/primitives";
1953
- import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
2090
+ import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
1954
2091
  function UsageSummary({ data, loading = false, className }) {
1955
2092
  if (loading || !data) {
1956
- return /* @__PURE__ */ jsx15("div", { className: cn("grid grid-cols-2 gap-4 lg:grid-cols-4", className), children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ jsx15(Skeleton2, { className: "h-28 rounded-xl" }, i)) });
2093
+ return /* @__PURE__ */ jsx16("div", { className: cn("grid grid-cols-2 gap-4 lg:grid-cols-4", className), children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ jsx16(Skeleton2, { className: "h-28 rounded-xl" }, i)) });
1957
2094
  }
1958
- return /* @__PURE__ */ jsxs14("div", { className: cn("grid grid-cols-2 gap-4 lg:grid-cols-4", className), children: [
1959
- /* @__PURE__ */ jsx15(
2095
+ return /* @__PURE__ */ jsxs15("div", { className: cn("grid grid-cols-2 gap-4 lg:grid-cols-4", className), children: [
2096
+ /* @__PURE__ */ jsx16(
1960
2097
  StatCard,
1961
2098
  {
1962
2099
  variant: "sandbox",
1963
2100
  title: "Compute Hours",
1964
2101
  value: data.computeHours.toFixed(1),
1965
2102
  subtitle: "This billing period",
1966
- icon: /* @__PURE__ */ jsx15(Clock4, { className: "h-5 w-5" })
2103
+ icon: /* @__PURE__ */ jsx16(Clock4, { className: "h-5 w-5" })
1967
2104
  }
1968
2105
  ),
1969
- /* @__PURE__ */ jsx15(
2106
+ /* @__PURE__ */ jsx16(
1970
2107
  StatCard,
1971
2108
  {
1972
2109
  variant: "sandbox",
1973
2110
  title: "Active Sessions",
1974
2111
  value: data.activeSessions,
1975
2112
  subtitle: "Currently running",
1976
- icon: /* @__PURE__ */ jsx15(Layers, { className: "h-5 w-5" })
2113
+ icon: /* @__PURE__ */ jsx16(Layers, { className: "h-5 w-5" })
1977
2114
  }
1978
2115
  ),
1979
- /* @__PURE__ */ jsx15(
2116
+ /* @__PURE__ */ jsx16(
1980
2117
  StatCard,
1981
2118
  {
1982
2119
  variant: "sandbox",
1983
2120
  title: "Messages Sent",
1984
2121
  value: data.messagesSent.toLocaleString(),
1985
2122
  subtitle: "Agent interactions",
1986
- icon: /* @__PURE__ */ jsx15(MessageSquare, { className: "h-5 w-5" })
2123
+ icon: /* @__PURE__ */ jsx16(MessageSquare, { className: "h-5 w-5" })
1987
2124
  }
1988
2125
  ),
1989
- /* @__PURE__ */ jsx15(
2126
+ /* @__PURE__ */ jsx16(
1990
2127
  StatCard,
1991
2128
  {
1992
2129
  variant: "sandbox",
1993
2130
  title: "Estimated Cost",
1994
2131
  value: `$${data.estimatedCost.toFixed(2)}`,
1995
2132
  subtitle: "This billing period",
1996
- icon: /* @__PURE__ */ jsx15(DollarSign, { className: "h-5 w-5" })
2133
+ icon: /* @__PURE__ */ jsx16(DollarSign, { className: "h-5 w-5" })
1997
2134
  }
1998
2135
  )
1999
2136
  ] });
@@ -2001,66 +2138,66 @@ function UsageSummary({ data, loading = false, className }) {
2001
2138
 
2002
2139
  // src/dashboard/git-panel.tsx
2003
2140
  import { GitBranch, GitCommit, FileEdit, FilePlus, File } from "lucide-react";
2004
- import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
2141
+ import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
2005
2142
  function GitPanel({ status, log, loading = false, onRefresh, className }) {
2006
2143
  if (loading) {
2007
- return /* @__PURE__ */ jsx16("div", { className: cn("rounded-lg border border-border bg-card p-5", className), children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
2008
- /* @__PURE__ */ jsx16("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-primary border-t-transparent" }),
2144
+ return /* @__PURE__ */ jsx17("div", { className: cn("rounded-lg border border-border bg-card p-5", className), children: /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
2145
+ /* @__PURE__ */ jsx17("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-primary border-t-transparent" }),
2009
2146
  "Loading git info..."
2010
2147
  ] }) });
2011
2148
  }
2012
2149
  if (!status) {
2013
- return /* @__PURE__ */ jsx16("div", { className: cn("rounded-lg border border-border bg-card p-5", className), children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
2014
- /* @__PURE__ */ jsx16(GitBranch, { className: "h-4 w-4" }),
2150
+ return /* @__PURE__ */ jsx17("div", { className: cn("rounded-lg border border-border bg-card p-5", className), children: /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
2151
+ /* @__PURE__ */ jsx17(GitBranch, { className: "h-4 w-4" }),
2015
2152
  "No git repository detected"
2016
2153
  ] }) });
2017
2154
  }
2018
2155
  const changedCount = status.staged.length + status.modified.length + status.untracked.length;
2019
- return /* @__PURE__ */ jsxs15("div", { className: cn("rounded-lg border border-border bg-card overflow-hidden", className), children: [
2020
- /* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between border-b border-border bg-muted/30 px-4 py-3", children: [
2021
- /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
2022
- /* @__PURE__ */ jsx16(GitBranch, { className: "h-4 w-4 text-primary" }),
2023
- /* @__PURE__ */ jsx16("span", { className: "text-sm font-bold text-foreground", children: status.branch }),
2024
- status.isDirty && /* @__PURE__ */ jsxs15("span", { className: "rounded-full bg-[var(--surface-warning-bg)] px-1.5 py-0.5 text-[10px] font-bold text-[var(--surface-warning-text)]", children: [
2156
+ return /* @__PURE__ */ jsxs16("div", { className: cn("rounded-lg border border-border bg-card overflow-hidden", className), children: [
2157
+ /* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-between border-b border-border bg-muted/30 px-4 py-3", children: [
2158
+ /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
2159
+ /* @__PURE__ */ jsx17(GitBranch, { className: "h-4 w-4 text-primary" }),
2160
+ /* @__PURE__ */ jsx17("span", { className: "text-sm font-bold text-foreground", children: status.branch }),
2161
+ status.isDirty && /* @__PURE__ */ jsxs16("span", { className: "rounded-full bg-[var(--surface-warning-bg)] px-1.5 py-0.5 text-[10px] font-bold text-[var(--surface-warning-text)]", children: [
2025
2162
  changedCount,
2026
2163
  " change",
2027
2164
  changedCount !== 1 ? "s" : ""
2028
2165
  ] })
2029
2166
  ] }),
2030
- onRefresh && /* @__PURE__ */ jsx16("button", { type: "button", onClick: onRefresh, className: "text-xs text-muted-foreground hover:text-foreground transition-colors", children: "Refresh" })
2167
+ onRefresh && /* @__PURE__ */ jsx17("button", { type: "button", onClick: onRefresh, className: "text-xs text-muted-foreground hover:text-foreground transition-colors", children: "Refresh" })
2031
2168
  ] }),
2032
- changedCount > 0 && /* @__PURE__ */ jsx16("div", { className: "border-b border-border px-4 py-3", children: /* @__PURE__ */ jsxs15("div", { className: "space-y-1.5", children: [
2033
- status.staged.map((f) => /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-xs", children: [
2034
- /* @__PURE__ */ jsx16(FilePlus, { className: "h-3 w-3 text-[var(--surface-success-text)]" }),
2035
- /* @__PURE__ */ jsx16("span", { className: "font-mono text-foreground truncate", children: f }),
2036
- /* @__PURE__ */ jsx16("span", { className: "text-[var(--surface-success-text)] text-[10px] font-bold ml-auto", children: "STAGED" })
2169
+ changedCount > 0 && /* @__PURE__ */ jsx17("div", { className: "border-b border-border px-4 py-3", children: /* @__PURE__ */ jsxs16("div", { className: "space-y-1.5", children: [
2170
+ status.staged.map((f) => /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-xs", children: [
2171
+ /* @__PURE__ */ jsx17(FilePlus, { className: "h-3 w-3 text-[var(--surface-success-text)]" }),
2172
+ /* @__PURE__ */ jsx17("span", { className: "font-mono text-foreground truncate", children: f }),
2173
+ /* @__PURE__ */ jsx17("span", { className: "text-[var(--surface-success-text)] text-[10px] font-bold ml-auto", children: "STAGED" })
2037
2174
  ] }, `s-${f}`)),
2038
- status.modified.map((f) => /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-xs", children: [
2039
- /* @__PURE__ */ jsx16(FileEdit, { className: "h-3 w-3 text-[var(--surface-warning-text)]" }),
2040
- /* @__PURE__ */ jsx16("span", { className: "font-mono text-foreground truncate", children: f })
2175
+ status.modified.map((f) => /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-xs", children: [
2176
+ /* @__PURE__ */ jsx17(FileEdit, { className: "h-3 w-3 text-[var(--surface-warning-text)]" }),
2177
+ /* @__PURE__ */ jsx17("span", { className: "font-mono text-foreground truncate", children: f })
2041
2178
  ] }, `m-${f}`)),
2042
- status.untracked.map((f) => /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 text-xs", children: [
2043
- /* @__PURE__ */ jsx16(File, { className: "h-3 w-3 text-muted-foreground" }),
2044
- /* @__PURE__ */ jsx16("span", { className: "font-mono text-muted-foreground truncate", children: f })
2179
+ status.untracked.map((f) => /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 text-xs", children: [
2180
+ /* @__PURE__ */ jsx17(File, { className: "h-3 w-3 text-muted-foreground" }),
2181
+ /* @__PURE__ */ jsx17("span", { className: "font-mono text-muted-foreground truncate", children: f })
2045
2182
  ] }, `u-${f}`))
2046
2183
  ] }) }),
2047
- log.length > 0 && /* @__PURE__ */ jsxs15("div", { className: "px-4 py-3", children: [
2048
- /* @__PURE__ */ jsx16("div", { className: "mb-2 text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: "Recent Commits" }),
2049
- /* @__PURE__ */ jsx16("div", { className: "space-y-2", children: log.slice(0, 5).map((commit) => /* @__PURE__ */ jsxs15("div", { className: "flex items-start gap-2 text-xs", children: [
2050
- /* @__PURE__ */ jsx16(GitCommit, { className: "h-3 w-3 text-muted-foreground mt-0.5 shrink-0" }),
2051
- /* @__PURE__ */ jsxs15("div", { className: "min-w-0", children: [
2052
- /* @__PURE__ */ jsx16("span", { className: "font-mono text-primary mr-1.5", children: commit.shortSha }),
2053
- /* @__PURE__ */ jsx16("span", { className: "text-foreground", children: commit.message })
2184
+ log.length > 0 && /* @__PURE__ */ jsxs16("div", { className: "px-4 py-3", children: [
2185
+ /* @__PURE__ */ jsx17("div", { className: "mb-2 text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: "Recent Commits" }),
2186
+ /* @__PURE__ */ jsx17("div", { className: "space-y-2", children: log.slice(0, 5).map((commit) => /* @__PURE__ */ jsxs16("div", { className: "flex items-start gap-2 text-xs", children: [
2187
+ /* @__PURE__ */ jsx17(GitCommit, { className: "h-3 w-3 text-muted-foreground mt-0.5 shrink-0" }),
2188
+ /* @__PURE__ */ jsxs16("div", { className: "min-w-0", children: [
2189
+ /* @__PURE__ */ jsx17("span", { className: "font-mono text-primary mr-1.5", children: commit.shortSha }),
2190
+ /* @__PURE__ */ jsx17("span", { className: "text-foreground", children: commit.message })
2054
2191
  ] })
2055
2192
  ] }, commit.shortSha)) })
2056
2193
  ] }),
2057
- (status.ahead > 0 || status.behind > 0) && /* @__PURE__ */ jsxs15("div", { className: "border-t border-border px-4 py-2 flex items-center gap-3 text-xs text-muted-foreground", children: [
2058
- status.ahead > 0 && /* @__PURE__ */ jsxs15("span", { children: [
2194
+ (status.ahead > 0 || status.behind > 0) && /* @__PURE__ */ jsxs16("div", { className: "border-t border-border px-4 py-2 flex items-center gap-3 text-xs text-muted-foreground", children: [
2195
+ status.ahead > 0 && /* @__PURE__ */ jsxs16("span", { children: [
2059
2196
  "\u2191 ",
2060
2197
  status.ahead,
2061
2198
  " ahead"
2062
2199
  ] }),
2063
- status.behind > 0 && /* @__PURE__ */ jsxs15("span", { children: [
2200
+ status.behind > 0 && /* @__PURE__ */ jsxs16("span", { children: [
2064
2201
  "\u2193 ",
2065
2202
  status.behind,
2066
2203
  " behind"
@@ -2070,14 +2207,14 @@ function GitPanel({ status, log, loading = false, onRefresh, className }) {
2070
2207
  }
2071
2208
 
2072
2209
  // src/dashboard/ports-list.tsx
2073
- import * as React6 from "react";
2210
+ import * as React7 from "react";
2074
2211
  import { Copy as Copy3, Check as Check4, Globe, Plus as Plus4, Trash2 as Trash23 } from "lucide-react";
2075
- import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
2212
+ import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
2076
2213
  function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, className }) {
2077
- const [newPort, setNewPort] = React6.useState("");
2078
- const [copiedPort, setCopiedPort] = React6.useState(null);
2079
- const copyTimerRef = React6.useRef(null);
2080
- React6.useEffect(() => {
2214
+ const [newPort, setNewPort] = React7.useState("");
2215
+ const [copiedPort, setCopiedPort] = React7.useState(null);
2216
+ const copyTimerRef = React7.useRef(null);
2217
+ React7.useEffect(() => {
2081
2218
  return () => {
2082
2219
  if (copyTimerRef.current) clearTimeout(copyTimerRef.current);
2083
2220
  };
@@ -2099,48 +2236,48 @@ function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, clas
2099
2236
  setNewPort("");
2100
2237
  }
2101
2238
  };
2102
- return /* @__PURE__ */ jsxs16("div", { className: cn("space-y-4", className), children: [
2103
- ports.length > 0 ? /* @__PURE__ */ jsx17("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs16("table", { className: "w-full text-sm", children: [
2104
- /* @__PURE__ */ jsx17("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs16("tr", { children: [
2105
- /* @__PURE__ */ jsx17("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Port" }),
2106
- /* @__PURE__ */ jsx17("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Public URL" }),
2107
- /* @__PURE__ */ jsx17("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2108
- /* @__PURE__ */ jsx17("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-20" })
2239
+ return /* @__PURE__ */ jsxs17("div", { className: cn("space-y-4", className), children: [
2240
+ ports.length > 0 ? /* @__PURE__ */ jsx18("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs17("table", { className: "w-full text-sm", children: [
2241
+ /* @__PURE__ */ jsx18("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs17("tr", { children: [
2242
+ /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Port" }),
2243
+ /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Public URL" }),
2244
+ /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2245
+ /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-20" })
2109
2246
  ] }) }),
2110
- /* @__PURE__ */ jsx17("tbody", { className: "divide-y divide-border", children: ports.map((p) => /* @__PURE__ */ jsxs16("tr", { children: [
2111
- /* @__PURE__ */ jsx17("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: p.port }),
2112
- /* @__PURE__ */ jsx17("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs16(
2247
+ /* @__PURE__ */ jsx18("tbody", { className: "divide-y divide-border", children: ports.map((p) => /* @__PURE__ */ jsxs17("tr", { children: [
2248
+ /* @__PURE__ */ jsx18("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: p.port }),
2249
+ /* @__PURE__ */ jsx18("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs17(
2113
2250
  "button",
2114
2251
  {
2115
2252
  type: "button",
2116
2253
  onClick: () => handleCopy(p.url, p.port),
2117
2254
  className: "flex items-center gap-2 font-mono text-xs text-primary hover:underline cursor-pointer group",
2118
2255
  children: [
2119
- /* @__PURE__ */ jsx17("span", { className: "truncate max-w-[300px]", children: p.url }),
2120
- copiedPort === p.port ? /* @__PURE__ */ jsx17(Check4, { className: "h-3 w-3 text-[var(--surface-success-text)] shrink-0" }) : /* @__PURE__ */ jsx17(Copy3, { className: "h-3 w-3 opacity-0 group-hover:opacity-100 transition-opacity shrink-0" })
2256
+ /* @__PURE__ */ jsx18("span", { className: "truncate max-w-[300px]", children: p.url }),
2257
+ copiedPort === p.port ? /* @__PURE__ */ jsx18(Check4, { className: "h-3 w-3 text-[var(--surface-success-text)] shrink-0" }) : /* @__PURE__ */ jsx18(Copy3, { className: "h-3 w-3 opacity-0 group-hover:opacity-100 transition-opacity shrink-0" })
2121
2258
  ]
2122
2259
  }
2123
2260
  ) }),
2124
- /* @__PURE__ */ jsx17("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx17("span", { className: cn(
2261
+ /* @__PURE__ */ jsx18("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx18("span", { className: cn(
2125
2262
  "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-bold uppercase tracking-wider",
2126
2263
  p.status === "active" ? "bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]" : "bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]"
2127
2264
  ), children: p.status }) }),
2128
- /* @__PURE__ */ jsx17("td", { className: "px-4 py-3 text-right", children: onRemovePort && /* @__PURE__ */ jsx17(
2265
+ /* @__PURE__ */ jsx18("td", { className: "px-4 py-3 text-right", children: onRemovePort && /* @__PURE__ */ jsx18(
2129
2266
  "button",
2130
2267
  {
2131
2268
  type: "button",
2132
2269
  onClick: () => onRemovePort(p.port),
2133
2270
  className: "p-1 text-muted-foreground hover:text-destructive transition-colors rounded",
2134
- children: /* @__PURE__ */ jsx17(Trash23, { className: "h-3.5 w-3.5" })
2271
+ children: /* @__PURE__ */ jsx18(Trash23, { className: "h-3.5 w-3.5" })
2135
2272
  }
2136
2273
  ) })
2137
2274
  ] }, p.port)) })
2138
- ] }) }) : /* @__PURE__ */ jsxs16("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2139
- /* @__PURE__ */ jsx17(Globe, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2140
- /* @__PURE__ */ jsx17("p", { className: "text-sm text-muted-foreground", children: "No ports exposed yet" })
2275
+ ] }) }) : /* @__PURE__ */ jsxs17("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2276
+ /* @__PURE__ */ jsx18(Globe, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2277
+ /* @__PURE__ */ jsx18("p", { className: "text-sm text-muted-foreground", children: "No ports exposed yet" })
2141
2278
  ] }),
2142
- /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-3", children: [
2143
- /* @__PURE__ */ jsx17(
2279
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-3", children: [
2280
+ /* @__PURE__ */ jsx18(
2144
2281
  "input",
2145
2282
  {
2146
2283
  type: "number",
@@ -2153,7 +2290,7 @@ function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, clas
2153
2290
  className: "flex-1 rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2154
2291
  }
2155
2292
  ),
2156
- /* @__PURE__ */ jsxs16(
2293
+ /* @__PURE__ */ jsxs17(
2157
2294
  "button",
2158
2295
  {
2159
2296
  type: "button",
@@ -2161,7 +2298,7 @@ function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, clas
2161
2298
  disabled: !newPort || isExposing,
2162
2299
  className: "inline-flex items-center gap-2 rounded-lg bg-primary/20 border border-primary/30 px-4 py-2 text-sm font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors disabled:opacity-50",
2163
2300
  children: [
2164
- /* @__PURE__ */ jsx17(Plus4, { className: "h-4 w-4" }),
2301
+ /* @__PURE__ */ jsx18(Plus4, { className: "h-4 w-4" }),
2165
2302
  "Expose"
2166
2303
  ]
2167
2304
  }
@@ -2171,9 +2308,9 @@ function PortsList({ ports, onExposePort, onRemovePort, isExposing = false, clas
2171
2308
  }
2172
2309
 
2173
2310
  // src/dashboard/process-list.tsx
2174
- import * as React7 from "react";
2311
+ import * as React8 from "react";
2175
2312
  import { Activity as Activity3, Plus as Plus5, Skull, Terminal as Terminal4 } from "lucide-react";
2176
- import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
2313
+ import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
2177
2314
  function formatUptime(startedAt) {
2178
2315
  if (!startedAt) return "-";
2179
2316
  const ms = Date.now() - new Date(startedAt).getTime();
@@ -2183,7 +2320,7 @@ function formatUptime(startedAt) {
2183
2320
  return `${Math.floor(ms / 36e5)}h ${Math.floor(ms % 36e5 / 6e4)}m`;
2184
2321
  }
2185
2322
  function ProcessList({ processes, onSpawn, onKill, loading = false, className }) {
2186
- const [newCommand, setNewCommand] = React7.useState("");
2323
+ const [newCommand, setNewCommand] = React8.useState("");
2187
2324
  const handleSpawn = () => {
2188
2325
  const cmd = newCommand.trim();
2189
2326
  if (cmd) {
@@ -2191,43 +2328,43 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
2191
2328
  setNewCommand("");
2192
2329
  }
2193
2330
  };
2194
- return /* @__PURE__ */ jsxs17("div", { className: cn("space-y-4", className), children: [
2195
- loading ? /* @__PURE__ */ jsxs17("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2196
- /* @__PURE__ */ jsx18(Activity3, { className: "mx-auto h-6 w-6 text-muted-foreground animate-spin mb-2" }),
2197
- /* @__PURE__ */ jsx18("p", { className: "text-sm text-muted-foreground", children: "Loading processes..." })
2198
- ] }) : processes.length > 0 ? /* @__PURE__ */ jsx18("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs17("table", { className: "w-full text-sm", children: [
2199
- /* @__PURE__ */ jsx18("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs17("tr", { children: [
2200
- /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "PID" }),
2201
- /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Command" }),
2202
- /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2203
- /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Uptime" }),
2204
- /* @__PURE__ */ jsx18("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-20" })
2331
+ return /* @__PURE__ */ jsxs18("div", { className: cn("space-y-4", className), children: [
2332
+ loading ? /* @__PURE__ */ jsxs18("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2333
+ /* @__PURE__ */ jsx19(Activity3, { className: "mx-auto h-6 w-6 text-muted-foreground animate-spin mb-2" }),
2334
+ /* @__PURE__ */ jsx19("p", { className: "text-sm text-muted-foreground", children: "Loading processes..." })
2335
+ ] }) : processes.length > 0 ? /* @__PURE__ */ jsx19("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs18("table", { className: "w-full text-sm", children: [
2336
+ /* @__PURE__ */ jsx19("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs18("tr", { children: [
2337
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "PID" }),
2338
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Command" }),
2339
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Status" }),
2340
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Uptime" }),
2341
+ /* @__PURE__ */ jsx19("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-20" })
2205
2342
  ] }) }),
2206
- /* @__PURE__ */ jsx18("tbody", { className: "divide-y divide-border", children: processes.map((p) => /* @__PURE__ */ jsxs17("tr", { children: [
2207
- /* @__PURE__ */ jsx18("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: p.pid }),
2208
- /* @__PURE__ */ jsx18("td", { className: "px-4 py-3 font-mono text-xs text-foreground truncate max-w-[250px]", children: p.command }),
2209
- /* @__PURE__ */ jsx18("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx18("span", { className: cn(
2343
+ /* @__PURE__ */ jsx19("tbody", { className: "divide-y divide-border", children: processes.map((p) => /* @__PURE__ */ jsxs18("tr", { children: [
2344
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: p.pid }),
2345
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 font-mono text-xs text-foreground truncate max-w-[250px]", children: p.command }),
2346
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx19("span", { className: cn(
2210
2347
  "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-bold uppercase tracking-wider",
2211
2348
  p.running ? "bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]" : "bg-muted text-muted-foreground"
2212
2349
  ), children: p.running ? "running" : `exited (${p.exitCode ?? "?"})` }) }),
2213
- /* @__PURE__ */ jsx18("td", { className: "px-4 py-3 font-mono text-xs text-muted-foreground", children: formatUptime(p.startedAt) }),
2214
- /* @__PURE__ */ jsx18("td", { className: "px-4 py-3 text-right", children: p.running && /* @__PURE__ */ jsx18(
2350
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 font-mono text-xs text-muted-foreground", children: formatUptime(p.startedAt) }),
2351
+ /* @__PURE__ */ jsx19("td", { className: "px-4 py-3 text-right", children: p.running && /* @__PURE__ */ jsx19(
2215
2352
  "button",
2216
2353
  {
2217
2354
  type: "button",
2218
2355
  onClick: () => onKill(p.pid),
2219
2356
  className: "p-1 text-muted-foreground hover:text-destructive transition-colors rounded",
2220
2357
  title: "Kill process",
2221
- children: /* @__PURE__ */ jsx18(Skull, { className: "h-3.5 w-3.5" })
2358
+ children: /* @__PURE__ */ jsx19(Skull, { className: "h-3.5 w-3.5" })
2222
2359
  }
2223
2360
  ) })
2224
2361
  ] }, `${p.pid}-${p.startedAt ?? p.command}`)) })
2225
- ] }) }) : /* @__PURE__ */ jsxs17("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2226
- /* @__PURE__ */ jsx18(Terminal4, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2227
- /* @__PURE__ */ jsx18("p", { className: "text-sm text-muted-foreground", children: "No processes running" })
2362
+ ] }) }) : /* @__PURE__ */ jsxs18("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2363
+ /* @__PURE__ */ jsx19(Terminal4, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2364
+ /* @__PURE__ */ jsx19("p", { className: "text-sm text-muted-foreground", children: "No processes running" })
2228
2365
  ] }),
2229
- /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-3", children: [
2230
- /* @__PURE__ */ jsx18(
2366
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-3", children: [
2367
+ /* @__PURE__ */ jsx19(
2231
2368
  "input",
2232
2369
  {
2233
2370
  type: "text",
@@ -2238,7 +2375,7 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
2238
2375
  className: "flex-1 rounded-lg border border-border bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2239
2376
  }
2240
2377
  ),
2241
- /* @__PURE__ */ jsxs17(
2378
+ /* @__PURE__ */ jsxs18(
2242
2379
  "button",
2243
2380
  {
2244
2381
  type: "button",
@@ -2246,7 +2383,7 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
2246
2383
  disabled: !newCommand.trim(),
2247
2384
  className: "inline-flex items-center gap-2 rounded-lg bg-primary/20 border border-primary/30 px-4 py-2 text-sm font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors disabled:opacity-50",
2248
2385
  children: [
2249
- /* @__PURE__ */ jsx18(Plus5, { className: "h-4 w-4" }),
2386
+ /* @__PURE__ */ jsx19(Plus5, { className: "h-4 w-4" }),
2250
2387
  "Spawn"
2251
2388
  ]
2252
2389
  }
@@ -2256,11 +2393,11 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
2256
2393
  }
2257
2394
 
2258
2395
  // src/dashboard/network-config.tsx
2259
- import * as React8 from "react";
2396
+ import * as React9 from "react";
2260
2397
  import { Network as Network2, Plus as Plus6, Trash2 as Trash24, ShieldAlert } from "lucide-react";
2261
- import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
2398
+ import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
2262
2399
  function NetworkConfig({ config, onUpdate, loading = false, className }) {
2263
- const [newCidr, setNewCidr] = React8.useState("");
2400
+ const [newCidr, setNewCidr] = React9.useState("");
2264
2401
  const isValidCidr = (value) => {
2265
2402
  const match = value.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,2})$/);
2266
2403
  if (!match) return false;
@@ -2281,21 +2418,21 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2281
2418
  }
2282
2419
  };
2283
2420
  if (loading || !config) {
2284
- return /* @__PURE__ */ jsxs18("div", { className: cn("rounded-lg border border-border bg-muted/20 p-6 text-center", className), children: [
2285
- /* @__PURE__ */ jsx19(Network2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2286
- /* @__PURE__ */ jsx19("p", { className: "text-sm text-muted-foreground", children: "Loading network configuration..." })
2421
+ return /* @__PURE__ */ jsxs19("div", { className: cn("rounded-lg border border-border bg-muted/20 p-6 text-center", className), children: [
2422
+ /* @__PURE__ */ jsx20(Network2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2423
+ /* @__PURE__ */ jsx20("p", { className: "text-sm text-muted-foreground", children: "Loading network configuration..." })
2287
2424
  ] });
2288
2425
  }
2289
- return /* @__PURE__ */ jsxs18("div", { className: cn("space-y-4", className), children: [
2290
- /* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-between rounded-lg border border-border bg-card px-4 py-3", children: [
2291
- /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-3", children: [
2292
- /* @__PURE__ */ jsx19(ShieldAlert, { className: "h-4 w-4 text-muted-foreground" }),
2293
- /* @__PURE__ */ jsxs18("div", { children: [
2294
- /* @__PURE__ */ jsx19("p", { className: "text-sm font-medium text-foreground", children: "Block Outbound Traffic" }),
2295
- /* @__PURE__ */ jsx19("p", { className: "text-xs text-muted-foreground", children: "Prevent the sandbox from making external network requests" })
2426
+ return /* @__PURE__ */ jsxs19("div", { className: cn("space-y-4", className), children: [
2427
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between rounded-lg border border-border bg-card px-4 py-3", children: [
2428
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-3", children: [
2429
+ /* @__PURE__ */ jsx20(ShieldAlert, { className: "h-4 w-4 text-muted-foreground" }),
2430
+ /* @__PURE__ */ jsxs19("div", { children: [
2431
+ /* @__PURE__ */ jsx20("p", { className: "text-sm font-medium text-foreground", children: "Block Outbound Traffic" }),
2432
+ /* @__PURE__ */ jsx20("p", { className: "text-xs text-muted-foreground", children: "Prevent the sandbox from making external network requests" })
2296
2433
  ] })
2297
2434
  ] }),
2298
- /* @__PURE__ */ jsx19(
2435
+ /* @__PURE__ */ jsx20(
2299
2436
  "button",
2300
2437
  {
2301
2438
  type: "button",
@@ -2307,7 +2444,7 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2307
2444
  "relative inline-flex h-6 w-11 items-center rounded-full transition-colors",
2308
2445
  config.blockOutbound ? "bg-destructive" : "bg-muted"
2309
2446
  ),
2310
- children: /* @__PURE__ */ jsx19(
2447
+ children: /* @__PURE__ */ jsx20(
2311
2448
  "span",
2312
2449
  {
2313
2450
  className: cn(
@@ -2319,22 +2456,22 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2319
2456
  }
2320
2457
  )
2321
2458
  ] }),
2322
- /* @__PURE__ */ jsxs18("div", { children: [
2323
- /* @__PURE__ */ jsx19("h4", { className: "text-xs font-medium text-muted-foreground mb-2 uppercase tracking-wider", children: "Allowlist (CIDR)" }),
2324
- config.allowList.length > 0 ? /* @__PURE__ */ jsx19("div", { className: "space-y-1.5 mb-3", children: config.allowList.map((cidr) => /* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-between rounded border border-border bg-muted/20 px-3 py-2", children: [
2325
- /* @__PURE__ */ jsx19("span", { className: "font-mono text-xs text-foreground", children: cidr }),
2326
- /* @__PURE__ */ jsx19(
2459
+ /* @__PURE__ */ jsxs19("div", { children: [
2460
+ /* @__PURE__ */ jsx20("h4", { className: "text-xs font-medium text-muted-foreground mb-2 uppercase tracking-wider", children: "Allowlist (CIDR)" }),
2461
+ config.allowList.length > 0 ? /* @__PURE__ */ jsx20("div", { className: "space-y-1.5 mb-3", children: config.allowList.map((cidr) => /* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between rounded border border-border bg-muted/20 px-3 py-2", children: [
2462
+ /* @__PURE__ */ jsx20("span", { className: "font-mono text-xs text-foreground", children: cidr }),
2463
+ /* @__PURE__ */ jsx20(
2327
2464
  "button",
2328
2465
  {
2329
2466
  type: "button",
2330
2467
  onClick: () => handleRemoveCidr(cidr),
2331
2468
  className: "p-1 text-muted-foreground hover:text-destructive transition-colors rounded",
2332
- children: /* @__PURE__ */ jsx19(Trash24, { className: "h-3 w-3" })
2469
+ children: /* @__PURE__ */ jsx20(Trash24, { className: "h-3 w-3" })
2333
2470
  }
2334
2471
  )
2335
- ] }, cidr)) }) : /* @__PURE__ */ jsx19("p", { className: "text-xs text-muted-foreground mb-3", children: "No CIDR rules configured. All traffic is allowed." }),
2336
- /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-3", children: [
2337
- /* @__PURE__ */ jsx19(
2472
+ ] }, cidr)) }) : /* @__PURE__ */ jsx20("p", { className: "text-xs text-muted-foreground mb-3", children: "No CIDR rules configured. All traffic is allowed." }),
2473
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-3", children: [
2474
+ /* @__PURE__ */ jsx20(
2338
2475
  "input",
2339
2476
  {
2340
2477
  type: "text",
@@ -2345,7 +2482,7 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2345
2482
  className: "flex-1 rounded-lg border border-border bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2346
2483
  }
2347
2484
  ),
2348
- /* @__PURE__ */ jsxs18(
2485
+ /* @__PURE__ */ jsxs19(
2349
2486
  "button",
2350
2487
  {
2351
2488
  type: "button",
@@ -2353,7 +2490,7 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2353
2490
  disabled: !newCidr.trim(),
2354
2491
  className: "inline-flex items-center gap-2 rounded-lg bg-primary/20 border border-primary/30 px-4 py-2 text-sm font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors disabled:opacity-50",
2355
2492
  children: [
2356
- /* @__PURE__ */ jsx19(Plus6, { className: "h-4 w-4" }),
2493
+ /* @__PURE__ */ jsx20(Plus6, { className: "h-4 w-4" }),
2357
2494
  "Add"
2358
2495
  ]
2359
2496
  }
@@ -2364,9 +2501,9 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
2364
2501
  }
2365
2502
 
2366
2503
  // src/dashboard/backend-config.tsx
2367
- import * as React9 from "react";
2504
+ import * as React10 from "react";
2368
2505
  import { Bot, Plus as Plus7, RefreshCw as RefreshCw2, Trash2 as Trash25, Server, Wrench } from "lucide-react";
2369
- import { Fragment as Fragment10, jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
2506
+ import { Fragment as Fragment11, jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
2370
2507
  function BackendConfig({
2371
2508
  status,
2372
2509
  mcpServers,
@@ -2376,10 +2513,10 @@ function BackendConfig({
2376
2513
  loading = false,
2377
2514
  className
2378
2515
  }) {
2379
- const [showAddMcp, setShowAddMcp] = React9.useState(false);
2380
- const [mcpName, setMcpName] = React9.useState("");
2381
- const [mcpCommand, setMcpCommand] = React9.useState("");
2382
- const [mcpArgs, setMcpArgs] = React9.useState("");
2516
+ const [showAddMcp, setShowAddMcp] = React10.useState(false);
2517
+ const [mcpName, setMcpName] = React10.useState("");
2518
+ const [mcpCommand, setMcpCommand] = React10.useState("");
2519
+ const [mcpArgs, setMcpArgs] = React10.useState("");
2383
2520
  const handleAddMcp = () => {
2384
2521
  const name = mcpName.trim();
2385
2522
  const command = mcpCommand.trim();
@@ -2396,91 +2533,91 @@ function BackendConfig({
2396
2533
  }
2397
2534
  };
2398
2535
  if (loading || !status) {
2399
- return /* @__PURE__ */ jsxs19("div", { className: cn("rounded-lg border border-border bg-muted/20 p-6 text-center", className), children: [
2400
- /* @__PURE__ */ jsx20(Bot, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2401
- /* @__PURE__ */ jsx20("p", { className: "text-sm text-muted-foreground", children: "Loading backend status..." })
2536
+ return /* @__PURE__ */ jsxs20("div", { className: cn("rounded-lg border border-border bg-muted/20 p-6 text-center", className), children: [
2537
+ /* @__PURE__ */ jsx21(Bot, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2538
+ /* @__PURE__ */ jsx21("p", { className: "text-sm text-muted-foreground", children: "Loading backend status..." })
2402
2539
  ] });
2403
2540
  }
2404
- return /* @__PURE__ */ jsxs19("div", { className: cn("space-y-4", className), children: [
2405
- /* @__PURE__ */ jsxs19("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: [
2406
- /* @__PURE__ */ jsxs19("div", { className: "px-4 py-3 border-b border-border bg-muted/30 flex items-center justify-between", children: [
2407
- /* @__PURE__ */ jsx20("h4", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider", children: "Agent Status" }),
2408
- /* @__PURE__ */ jsxs19(
2541
+ return /* @__PURE__ */ jsxs20("div", { className: cn("space-y-4", className), children: [
2542
+ /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: [
2543
+ /* @__PURE__ */ jsxs20("div", { className: "px-4 py-3 border-b border-border bg-muted/30 flex items-center justify-between", children: [
2544
+ /* @__PURE__ */ jsx21("h4", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider", children: "Agent Status" }),
2545
+ /* @__PURE__ */ jsxs20(
2409
2546
  "button",
2410
2547
  {
2411
2548
  type: "button",
2412
2549
  onClick: onRestart,
2413
2550
  className: "inline-flex items-center gap-1.5 rounded-md bg-muted px-2.5 py-1 text-xs font-medium text-foreground hover:bg-muted/80 transition-colors border border-border",
2414
2551
  children: [
2415
- /* @__PURE__ */ jsx20(RefreshCw2, { className: "h-3 w-3" }),
2552
+ /* @__PURE__ */ jsx21(RefreshCw2, { className: "h-3 w-3" }),
2416
2553
  "Restart"
2417
2554
  ]
2418
2555
  }
2419
2556
  )
2420
2557
  ] }),
2421
- /* @__PURE__ */ jsx20("div", { className: "p-4", children: /* @__PURE__ */ jsxs19("dl", { className: "grid grid-cols-[100px_1fr] gap-y-3 text-sm", children: [
2422
- /* @__PURE__ */ jsx20("dt", { className: "text-muted-foreground", children: "Status" }),
2423
- /* @__PURE__ */ jsx20("dd", { children: /* @__PURE__ */ jsx20("span", { className: cn(
2558
+ /* @__PURE__ */ jsx21("div", { className: "p-4", children: /* @__PURE__ */ jsxs20("dl", { className: "grid grid-cols-[100px_1fr] gap-y-3 text-sm", children: [
2559
+ /* @__PURE__ */ jsx21("dt", { className: "text-muted-foreground", children: "Status" }),
2560
+ /* @__PURE__ */ jsx21("dd", { children: /* @__PURE__ */ jsx21("span", { className: cn(
2424
2561
  "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-bold uppercase tracking-wider",
2425
2562
  status.running ? "bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]" : "bg-destructive/10 text-destructive"
2426
2563
  ), children: status.running ? "Running" : "Stopped" }) }),
2427
- /* @__PURE__ */ jsx20("dt", { className: "text-muted-foreground", children: "Model" }),
2428
- /* @__PURE__ */ jsx20("dd", { className: "font-mono text-xs", children: status.model ?? "Default" }),
2429
- status.provider && /* @__PURE__ */ jsxs19(Fragment10, { children: [
2430
- /* @__PURE__ */ jsx20("dt", { className: "text-muted-foreground", children: "Provider" }),
2431
- /* @__PURE__ */ jsx20("dd", { className: "font-mono text-xs", children: status.provider })
2564
+ /* @__PURE__ */ jsx21("dt", { className: "text-muted-foreground", children: "Model" }),
2565
+ /* @__PURE__ */ jsx21("dd", { className: "font-mono text-xs", children: status.model ?? "Default" }),
2566
+ status.provider && /* @__PURE__ */ jsxs20(Fragment11, { children: [
2567
+ /* @__PURE__ */ jsx21("dt", { className: "text-muted-foreground", children: "Provider" }),
2568
+ /* @__PURE__ */ jsx21("dd", { className: "font-mono text-xs", children: status.provider })
2432
2569
  ] })
2433
2570
  ] }) })
2434
2571
  ] }),
2435
- /* @__PURE__ */ jsxs19("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: [
2436
- /* @__PURE__ */ jsxs19("div", { className: "px-4 py-3 border-b border-border bg-muted/30 flex items-center justify-between", children: [
2437
- /* @__PURE__ */ jsxs19("h4", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider flex items-center gap-2", children: [
2438
- /* @__PURE__ */ jsx20(Wrench, { className: "h-3.5 w-3.5" }),
2572
+ /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: [
2573
+ /* @__PURE__ */ jsxs20("div", { className: "px-4 py-3 border-b border-border bg-muted/30 flex items-center justify-between", children: [
2574
+ /* @__PURE__ */ jsxs20("h4", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider flex items-center gap-2", children: [
2575
+ /* @__PURE__ */ jsx21(Wrench, { className: "h-3.5 w-3.5" }),
2439
2576
  "MCP Servers"
2440
2577
  ] }),
2441
- /* @__PURE__ */ jsxs19(
2578
+ /* @__PURE__ */ jsxs20(
2442
2579
  "button",
2443
2580
  {
2444
2581
  type: "button",
2445
2582
  onClick: () => setShowAddMcp(!showAddMcp),
2446
2583
  className: "inline-flex items-center gap-1.5 rounded-md bg-primary/20 border border-primary/30 px-2.5 py-1 text-xs font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors",
2447
2584
  children: [
2448
- /* @__PURE__ */ jsx20(Plus7, { className: "h-3 w-3" }),
2585
+ /* @__PURE__ */ jsx21(Plus7, { className: "h-3 w-3" }),
2449
2586
  "Add"
2450
2587
  ]
2451
2588
  }
2452
2589
  )
2453
2590
  ] }),
2454
- mcpServers.length > 0 ? /* @__PURE__ */ jsx20("div", { className: "divide-y divide-border", children: mcpServers.map((s) => /* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between px-4 py-3", children: [
2455
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-3 min-w-0", children: [
2456
- /* @__PURE__ */ jsx20(Server, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }),
2457
- /* @__PURE__ */ jsxs19("div", { className: "min-w-0", children: [
2458
- /* @__PURE__ */ jsx20("p", { className: "text-sm font-medium text-foreground truncate", children: s.name }),
2459
- /* @__PURE__ */ jsxs19("p", { className: "text-xs font-mono text-muted-foreground truncate", children: [
2591
+ mcpServers.length > 0 ? /* @__PURE__ */ jsx21("div", { className: "divide-y divide-border", children: mcpServers.map((s) => /* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-between px-4 py-3", children: [
2592
+ /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-3 min-w-0", children: [
2593
+ /* @__PURE__ */ jsx21(Server, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }),
2594
+ /* @__PURE__ */ jsxs20("div", { className: "min-w-0", children: [
2595
+ /* @__PURE__ */ jsx21("p", { className: "text-sm font-medium text-foreground truncate", children: s.name }),
2596
+ /* @__PURE__ */ jsxs20("p", { className: "text-xs font-mono text-muted-foreground truncate", children: [
2460
2597
  s.command,
2461
2598
  " ",
2462
2599
  s.args?.join(" ") ?? ""
2463
2600
  ] })
2464
2601
  ] })
2465
2602
  ] }),
2466
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-2 shrink-0", children: [
2467
- s.status && /* @__PURE__ */ jsx20("span", { className: cn(
2603
+ /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2 shrink-0", children: [
2604
+ s.status && /* @__PURE__ */ jsx21("span", { className: cn(
2468
2605
  "inline-flex items-center rounded-full px-1.5 py-0.5 text-[9px] font-bold uppercase",
2469
2606
  s.status === "running" ? "bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]" : s.status === "error" ? "bg-destructive/10 text-destructive" : "bg-muted text-muted-foreground"
2470
2607
  ), children: s.status }),
2471
- /* @__PURE__ */ jsx20(
2608
+ /* @__PURE__ */ jsx21(
2472
2609
  "button",
2473
2610
  {
2474
2611
  type: "button",
2475
2612
  onClick: () => onRemoveMcp(s.name),
2476
2613
  className: "p-1 text-muted-foreground hover:text-destructive transition-colors rounded",
2477
- children: /* @__PURE__ */ jsx20(Trash25, { className: "h-3.5 w-3.5" })
2614
+ children: /* @__PURE__ */ jsx21(Trash25, { className: "h-3.5 w-3.5" })
2478
2615
  }
2479
2616
  )
2480
2617
  ] })
2481
- ] }, s.name)) }) : /* @__PURE__ */ jsx20("div", { className: "p-4 text-center", children: /* @__PURE__ */ jsx20("p", { className: "text-xs text-muted-foreground", children: "No MCP servers configured" }) }),
2482
- showAddMcp && /* @__PURE__ */ jsxs19("div", { className: "p-4 border-t border-border bg-muted/10 space-y-2", children: [
2483
- /* @__PURE__ */ jsx20(
2618
+ ] }, s.name)) }) : /* @__PURE__ */ jsx21("div", { className: "p-4 text-center", children: /* @__PURE__ */ jsx21("p", { className: "text-xs text-muted-foreground", children: "No MCP servers configured" }) }),
2619
+ showAddMcp && /* @__PURE__ */ jsxs20("div", { className: "p-4 border-t border-border bg-muted/10 space-y-2", children: [
2620
+ /* @__PURE__ */ jsx21(
2484
2621
  "input",
2485
2622
  {
2486
2623
  type: "text",
@@ -2490,7 +2627,7 @@ function BackendConfig({
2490
2627
  className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2491
2628
  }
2492
2629
  ),
2493
- /* @__PURE__ */ jsx20(
2630
+ /* @__PURE__ */ jsx21(
2494
2631
  "input",
2495
2632
  {
2496
2633
  type: "text",
@@ -2500,7 +2637,7 @@ function BackendConfig({
2500
2637
  className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2501
2638
  }
2502
2639
  ),
2503
- /* @__PURE__ */ jsx20(
2640
+ /* @__PURE__ */ jsx21(
2504
2641
  "input",
2505
2642
  {
2506
2643
  type: "text",
@@ -2510,8 +2647,8 @@ function BackendConfig({
2510
2647
  className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2511
2648
  }
2512
2649
  ),
2513
- /* @__PURE__ */ jsxs19("div", { className: "flex justify-end gap-2 pt-1", children: [
2514
- /* @__PURE__ */ jsx20(
2650
+ /* @__PURE__ */ jsxs20("div", { className: "flex justify-end gap-2 pt-1", children: [
2651
+ /* @__PURE__ */ jsx21(
2515
2652
  "button",
2516
2653
  {
2517
2654
  type: "button",
@@ -2520,7 +2657,7 @@ function BackendConfig({
2520
2657
  children: "Cancel"
2521
2658
  }
2522
2659
  ),
2523
- /* @__PURE__ */ jsx20(
2660
+ /* @__PURE__ */ jsx21(
2524
2661
  "button",
2525
2662
  {
2526
2663
  type: "button",
@@ -2537,9 +2674,9 @@ function BackendConfig({
2537
2674
  }
2538
2675
 
2539
2676
  // src/dashboard/snapshot-list.tsx
2540
- import * as React10 from "react";
2677
+ import * as React11 from "react";
2541
2678
  import { Camera, Clock as Clock5, HardDrive, Plus as Plus8, RotateCcw } from "lucide-react";
2542
- import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
2679
+ import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2543
2680
  function formatBytes(bytes) {
2544
2681
  if (bytes == null || bytes < 0) return "-";
2545
2682
  if (bytes === 0) return "0 B";
@@ -2554,33 +2691,33 @@ function formatDate(dateStr) {
2554
2691
  return d.toLocaleDateString(void 0, { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
2555
2692
  }
2556
2693
  function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loading = false, className }) {
2557
- const [showCreate, setShowCreate] = React10.useState(false);
2558
- const [tags, setTags] = React10.useState("");
2694
+ const [showCreate, setShowCreate] = React11.useState(false);
2695
+ const [tags, setTags] = React11.useState("");
2559
2696
  const handleCreate = () => {
2560
2697
  const tagList = tags.trim() ? tags.trim().split(",").map((t) => t.trim()).filter(Boolean) : void 0;
2561
2698
  onCreate(tagList);
2562
2699
  setTags("");
2563
2700
  setShowCreate(false);
2564
2701
  };
2565
- return /* @__PURE__ */ jsxs20("div", { className: cn("space-y-4", className), children: [
2566
- /* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-between", children: [
2567
- /* @__PURE__ */ jsx21("h3", { className: "text-sm font-bold text-foreground", children: "Snapshots" }),
2568
- /* @__PURE__ */ jsxs20(
2702
+ return /* @__PURE__ */ jsxs21("div", { className: cn("space-y-4", className), children: [
2703
+ /* @__PURE__ */ jsxs21("div", { className: "flex items-center justify-between", children: [
2704
+ /* @__PURE__ */ jsx22("h3", { className: "text-sm font-bold text-foreground", children: "Snapshots" }),
2705
+ /* @__PURE__ */ jsxs21(
2569
2706
  "button",
2570
2707
  {
2571
2708
  type: "button",
2572
2709
  onClick: () => setShowCreate(!showCreate),
2573
2710
  className: "inline-flex items-center gap-1.5 rounded-lg bg-primary/20 border border-primary/30 px-3 py-1.5 text-xs font-medium text-primary hover:bg-primary hover:text-primary-foreground transition-colors",
2574
2711
  children: [
2575
- /* @__PURE__ */ jsx21(Plus8, { className: "h-3.5 w-3.5" }),
2712
+ /* @__PURE__ */ jsx22(Plus8, { className: "h-3.5 w-3.5" }),
2576
2713
  "Create Snapshot"
2577
2714
  ]
2578
2715
  }
2579
2716
  )
2580
2717
  ] }),
2581
- showCreate && /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-primary/20 bg-primary/5 p-4 space-y-3", children: [
2582
- /* @__PURE__ */ jsx21("p", { className: "text-sm text-foreground font-medium", children: "Create a new snapshot of the current sandbox state." }),
2583
- /* @__PURE__ */ jsx21(
2718
+ showCreate && /* @__PURE__ */ jsxs21("div", { className: "rounded-lg border border-primary/20 bg-primary/5 p-4 space-y-3", children: [
2719
+ /* @__PURE__ */ jsx22("p", { className: "text-sm text-foreground font-medium", children: "Create a new snapshot of the current sandbox state." }),
2720
+ /* @__PURE__ */ jsx22(
2584
2721
  "input",
2585
2722
  {
2586
2723
  type: "text",
@@ -2591,8 +2728,8 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
2591
2728
  className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
2592
2729
  }
2593
2730
  ),
2594
- /* @__PURE__ */ jsxs20("div", { className: "flex justify-end gap-2", children: [
2595
- /* @__PURE__ */ jsx21(
2731
+ /* @__PURE__ */ jsxs21("div", { className: "flex justify-end gap-2", children: [
2732
+ /* @__PURE__ */ jsx22(
2596
2733
  "button",
2597
2734
  {
2598
2735
  type: "button",
@@ -2601,44 +2738,44 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
2601
2738
  children: "Cancel"
2602
2739
  }
2603
2740
  ),
2604
- /* @__PURE__ */ jsxs20(
2741
+ /* @__PURE__ */ jsxs21(
2605
2742
  "button",
2606
2743
  {
2607
2744
  type: "button",
2608
2745
  onClick: handleCreate,
2609
2746
  className: "rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 transition-colors",
2610
2747
  children: [
2611
- /* @__PURE__ */ jsx21(Camera, { className: "h-3 w-3 mr-1.5 inline" }),
2748
+ /* @__PURE__ */ jsx22(Camera, { className: "h-3 w-3 mr-1.5 inline" }),
2612
2749
  "Create"
2613
2750
  ]
2614
2751
  }
2615
2752
  )
2616
2753
  ] })
2617
2754
  ] }),
2618
- loading ? /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2619
- /* @__PURE__ */ jsx21(Camera, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2620
- /* @__PURE__ */ jsx21("p", { className: "text-sm text-muted-foreground", children: "Loading snapshots..." })
2621
- ] }) : snapshots.length > 0 ? /* @__PURE__ */ jsx21("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs20("table", { className: "w-full text-sm", children: [
2622
- /* @__PURE__ */ jsx21("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs20("tr", { children: [
2623
- /* @__PURE__ */ jsx21("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "ID" }),
2624
- /* @__PURE__ */ jsx21("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Created" }),
2625
- /* @__PURE__ */ jsx21("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Size" }),
2626
- /* @__PURE__ */ jsx21("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Tags" }),
2627
- /* @__PURE__ */ jsx21("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-24" })
2755
+ loading ? /* @__PURE__ */ jsxs21("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2756
+ /* @__PURE__ */ jsx22(Camera, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
2757
+ /* @__PURE__ */ jsx22("p", { className: "text-sm text-muted-foreground", children: "Loading snapshots..." })
2758
+ ] }) : snapshots.length > 0 ? /* @__PURE__ */ jsx22("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ jsxs21("table", { className: "w-full text-sm", children: [
2759
+ /* @__PURE__ */ jsx22("thead", { className: "bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxs21("tr", { children: [
2760
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "ID" }),
2761
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Created" }),
2762
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Size" }),
2763
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-left text-xs font-medium text-muted-foreground", children: "Tags" }),
2764
+ /* @__PURE__ */ jsx22("th", { className: "px-4 py-2.5 text-right text-xs font-medium text-muted-foreground w-24" })
2628
2765
  ] }) }),
2629
- /* @__PURE__ */ jsx21("tbody", { className: "divide-y divide-border", children: snapshots.map((s) => /* @__PURE__ */ jsxs20("tr", { children: [
2630
- /* @__PURE__ */ jsx21("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: s.id.slice(0, 12) }),
2631
- /* @__PURE__ */ jsx21("td", { className: "px-4 py-3 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs20("span", { className: "inline-flex items-center gap-1.5", children: [
2632
- /* @__PURE__ */ jsx21(Clock5, { className: "h-3 w-3" }),
2766
+ /* @__PURE__ */ jsx22("tbody", { className: "divide-y divide-border", children: snapshots.map((s) => /* @__PURE__ */ jsxs21("tr", { children: [
2767
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3 font-mono text-xs text-foreground", children: s.id.slice(0, 12) }),
2768
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs21("span", { className: "inline-flex items-center gap-1.5", children: [
2769
+ /* @__PURE__ */ jsx22(Clock5, { className: "h-3 w-3" }),
2633
2770
  formatDate(s.createdAt)
2634
2771
  ] }) }),
2635
- /* @__PURE__ */ jsx21("td", { className: "px-4 py-3 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs20("span", { className: "inline-flex items-center gap-1.5", children: [
2636
- /* @__PURE__ */ jsx21(HardDrive, { className: "h-3 w-3" }),
2772
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs21("span", { className: "inline-flex items-center gap-1.5", children: [
2773
+ /* @__PURE__ */ jsx22(HardDrive, { className: "h-3 w-3" }),
2637
2774
  formatBytes(s.sizeBytes)
2638
2775
  ] }) }),
2639
- /* @__PURE__ */ jsx21("td", { className: "px-4 py-3", children: s.tags?.length ? /* @__PURE__ */ jsx21("div", { className: "flex items-center gap-1 flex-wrap", children: s.tags.map((tag) => /* @__PURE__ */ jsx21("span", { className: "rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground border border-border", children: tag }, tag)) }) : /* @__PURE__ */ jsx21("span", { className: "text-xs text-muted-foreground", children: "-" }) }),
2640
- /* @__PURE__ */ jsx21("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-end gap-2", children: [
2641
- /* @__PURE__ */ jsxs20(
2776
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3", children: s.tags?.length ? /* @__PURE__ */ jsx22("div", { className: "flex items-center gap-1 flex-wrap", children: s.tags.map((tag) => /* @__PURE__ */ jsx22("span", { className: "rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground border border-border", children: tag }, tag)) }) : /* @__PURE__ */ jsx22("span", { className: "text-xs text-muted-foreground", children: "-" }) }),
2777
+ /* @__PURE__ */ jsx22("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsxs21("div", { className: "flex items-center justify-end gap-2", children: [
2778
+ /* @__PURE__ */ jsxs21(
2642
2779
  "button",
2643
2780
  {
2644
2781
  type: "button",
@@ -2646,12 +2783,12 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
2646
2783
  className: "inline-flex items-center gap-1.5 rounded-md bg-muted px-2.5 py-1 text-xs font-medium text-foreground hover:bg-muted/80 transition-colors border border-border",
2647
2784
  title: "Restore to new sandbox",
2648
2785
  children: [
2649
- /* @__PURE__ */ jsx21(RotateCcw, { className: "h-3 w-3" }),
2786
+ /* @__PURE__ */ jsx22(RotateCcw, { className: "h-3 w-3" }),
2650
2787
  "Restore"
2651
2788
  ]
2652
2789
  }
2653
2790
  ),
2654
- onSaveAsTemplate && /* @__PURE__ */ jsx21(
2791
+ onSaveAsTemplate && /* @__PURE__ */ jsx22(
2655
2792
  "button",
2656
2793
  {
2657
2794
  type: "button",
@@ -2663,16 +2800,16 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
2663
2800
  )
2664
2801
  ] }) })
2665
2802
  ] }, s.id)) })
2666
- ] }) }) : /* @__PURE__ */ jsxs20("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2667
- /* @__PURE__ */ jsx21(Camera, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2668
- /* @__PURE__ */ jsx21("p", { className: "text-sm text-muted-foreground", children: "No snapshots yet" }),
2669
- /* @__PURE__ */ jsx21("p", { className: "text-xs text-muted-foreground mt-1", children: "Create a snapshot to save the current state of your sandbox." })
2803
+ ] }) }) : /* @__PURE__ */ jsxs21("div", { className: "rounded-lg border border-border bg-muted/20 p-6 text-center", children: [
2804
+ /* @__PURE__ */ jsx22(Camera, { className: "mx-auto h-8 w-8 text-muted-foreground mb-2" }),
2805
+ /* @__PURE__ */ jsx22("p", { className: "text-sm text-muted-foreground", children: "No snapshots yet" }),
2806
+ /* @__PURE__ */ jsx22("p", { className: "text-xs text-muted-foreground mt-1", children: "Create a snapshot to save the current state of your sandbox." })
2670
2807
  ] })
2671
2808
  ] });
2672
2809
  }
2673
2810
 
2674
2811
  // src/dashboard/promo-banner.tsx
2675
- import { Fragment as Fragment11, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2812
+ import { Fragment as Fragment12, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
2676
2813
  function PromoBanner({
2677
2814
  title,
2678
2815
  description,
@@ -2687,21 +2824,21 @@ function PromoBanner({
2687
2824
  "mt-6 inline-flex items-center gap-2 rounded-md border border-white/20 bg-[var(--btn-primary-bg)] px-4 py-2 text-sm font-medium text-[var(--btn-primary-text)] transition-colors",
2688
2825
  disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-[var(--btn-primary-hover)]"
2689
2826
  );
2690
- const buttonContent = /* @__PURE__ */ jsxs21(Fragment11, { children: [
2827
+ const buttonContent = /* @__PURE__ */ jsxs22(Fragment12, { children: [
2691
2828
  buttonLabel,
2692
- /* @__PURE__ */ jsxs21("svg", { "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "h-4 w-4", children: [
2693
- /* @__PURE__ */ jsx22("path", { d: "M5 12h14" }),
2694
- /* @__PURE__ */ jsx22("path", { d: "m12 5 7 7-7 7" })
2829
+ /* @__PURE__ */ jsxs22("svg", { "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "h-4 w-4", children: [
2830
+ /* @__PURE__ */ jsx23("path", { d: "M5 12h14" }),
2831
+ /* @__PURE__ */ jsx23("path", { d: "m12 5 7 7-7 7" })
2695
2832
  ] })
2696
2833
  ] });
2697
- return /* @__PURE__ */ jsxs21("div", { className: cn("relative overflow-hidden rounded-xl bg-[var(--brand-strong)] p-8 md:flex md:items-center md:justify-between", className), children: [
2698
- /* @__PURE__ */ jsxs21("div", { className: "relative z-10", children: [
2699
- /* @__PURE__ */ jsx22("h3", { className: "text-xl font-bold text-[var(--brand-strong-text)]", children: title }),
2700
- /* @__PURE__ */ jsx22("p", { className: "mt-2 max-w-md text-sm text-[var(--brand-strong-text-muted)]", children: description }),
2701
- href && !disabled ? /* @__PURE__ */ jsx22("a", { href, target: "_blank", rel: "noopener noreferrer", onClick, className: buttonClasses, children: buttonContent }) : /* @__PURE__ */ jsx22("button", { type: "button", onClick, disabled, className: buttonClasses, children: buttonContent })
2834
+ return /* @__PURE__ */ jsxs22("div", { className: cn("relative overflow-hidden rounded-xl bg-[var(--brand-strong)] p-8 md:flex md:items-center md:justify-between", className), children: [
2835
+ /* @__PURE__ */ jsxs22("div", { className: "relative z-10", children: [
2836
+ /* @__PURE__ */ jsx23("h3", { className: "text-xl font-bold text-[var(--brand-strong-text)]", children: title }),
2837
+ /* @__PURE__ */ jsx23("p", { className: "mt-2 max-w-md text-sm text-[var(--brand-strong-text-muted)]", children: description }),
2838
+ href && !disabled ? /* @__PURE__ */ jsx23("a", { href, target: "_blank", rel: "noopener noreferrer", onClick, className: buttonClasses, children: buttonContent }) : /* @__PURE__ */ jsx23("button", { type: "button", onClick, disabled, className: buttonClasses, children: buttonContent })
2702
2839
  ] }),
2703
- icon && /* @__PURE__ */ jsx22("div", { className: "relative z-10 mt-6 flex items-center md:mt-0", children: /* @__PURE__ */ jsx22("div", { className: "flex h-16 w-16 items-center justify-center rounded-2xl border border-white/10 bg-white/10", children: icon }) }),
2704
- /* @__PURE__ */ jsx22("div", { className: "pointer-events-none absolute inset-y-0 right-0 w-1/3 bg-gradient-to-l from-white/5 to-transparent" })
2840
+ icon && /* @__PURE__ */ jsx23("div", { className: "relative z-10 mt-6 flex items-center md:mt-0", children: /* @__PURE__ */ jsx23("div", { className: "flex h-16 w-16 items-center justify-center rounded-2xl border border-white/10 bg-white/10", children: icon }) }),
2841
+ /* @__PURE__ */ jsx23("div", { className: "pointer-events-none absolute inset-y-0 right-0 w-1/3 bg-gradient-to-l from-white/5 to-transparent" })
2705
2842
  ] });
2706
2843
  }
2707
2844
 
@@ -2740,6 +2877,7 @@ export {
2740
2877
  DashboardLayout,
2741
2878
  ProfileSelector,
2742
2879
  ProfileComparison,
2880
+ MetricAreaChart,
2743
2881
  VariantList,
2744
2882
  SystemLogsViewer,
2745
2883
  UsageSummary,