@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.
- package/dist/auth.js +3 -1
- package/dist/chat.d.ts +61 -1
- package/dist/chat.js +13 -3
- package/dist/{chunk-R6NONXFC.js → chunk-BP6ZTBI6.js} +2 -2
- package/dist/{chunk-IOB2PW5Z.js → chunk-R3ZMMCT3.js} +5 -13
- package/dist/chunk-SM7IJY4I.js +178 -0
- package/dist/{chunk-76IQLPW2.js → chunk-SOKKTB7W.js} +29 -5
- package/dist/{chunk-666PYT5K.js → chunk-TAAYDQGM.js} +101 -11
- package/dist/{chunk-7ZA5SEK3.js → chunk-UHFJXO24.js} +1 -177
- package/dist/{chunk-FLWMBK77.js → chunk-ZNYEJERQ.js} +403 -265
- package/dist/dashboard.d.ts +34 -1
- package/dist/dashboard.js +5 -2
- package/dist/globals.css +33 -198
- package/dist/hooks.d.ts +63 -2
- package/dist/hooks.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +23 -9
- package/dist/pages.js +134 -121
- package/dist/primitives.js +5 -3
- package/dist/styles.css +33 -198
- package/dist/workspace.js +1 -1
- package/package.json +12 -17
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
-
Button
|
|
2
|
+
Button
|
|
3
|
+
} from "./chunk-SM7IJY4I.js";
|
|
4
|
+
import {
|
|
3
5
|
Logo
|
|
4
|
-
} from "./chunk-
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1750
|
-
/* @__PURE__ */
|
|
1751
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1760
|
-
variant.sublabel && /* @__PURE__ */
|
|
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__ */
|
|
1766
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1771
|
-
variant.outcome && /* @__PURE__ */
|
|
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__ */
|
|
1779
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1928
|
+
/* @__PURE__ */ jsx14(Check3, { className: "mr-1 h-3 w-3" }),
|
|
1792
1929
|
"Accept"
|
|
1793
1930
|
]
|
|
1794
1931
|
}
|
|
1795
1932
|
),
|
|
1796
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1961
|
+
children: /* @__PURE__ */ jsx14(ExternalLink2, { className: "h-3.5 w-3.5" })
|
|
1825
1962
|
}
|
|
1826
1963
|
)
|
|
1827
1964
|
] })
|
|
1828
1965
|
] }),
|
|
1829
|
-
variant.error && /* @__PURE__ */
|
|
1830
|
-
variant.summary && /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
1895
|
-
/* @__PURE__ */
|
|
1896
|
-
/* @__PURE__ */
|
|
1897
|
-
/* @__PURE__ */
|
|
1898
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1901
|
-
error && /* @__PURE__ */
|
|
1902
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1927
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2069
|
+
/* @__PURE__ */ jsxs14("span", { className: "text-primary/70 mr-2", children: [
|
|
1933
2070
|
"[",
|
|
1934
2071
|
log.level,
|
|
1935
2072
|
"]"
|
|
1936
2073
|
] }),
|
|
1937
|
-
/* @__PURE__ */
|
|
2074
|
+
/* @__PURE__ */ jsxs14("span", { className: "text-muted-foreground mr-2", children: [
|
|
1938
2075
|
"[",
|
|
1939
2076
|
log.scope,
|
|
1940
2077
|
"]"
|
|
1941
2078
|
] }),
|
|
1942
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1959
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2103
|
+
icon: /* @__PURE__ */ jsx16(Clock4, { className: "h-5 w-5" })
|
|
1967
2104
|
}
|
|
1968
2105
|
),
|
|
1969
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2113
|
+
icon: /* @__PURE__ */ jsx16(Layers, { className: "h-5 w-5" })
|
|
1977
2114
|
}
|
|
1978
2115
|
),
|
|
1979
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2123
|
+
icon: /* @__PURE__ */ jsx16(MessageSquare, { className: "h-5 w-5" })
|
|
1987
2124
|
}
|
|
1988
2125
|
),
|
|
1989
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
2008
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2014
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2020
|
-
/* @__PURE__ */
|
|
2021
|
-
/* @__PURE__ */
|
|
2022
|
-
/* @__PURE__ */
|
|
2023
|
-
/* @__PURE__ */
|
|
2024
|
-
status.isDirty && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2033
|
-
status.staged.map((f) => /* @__PURE__ */
|
|
2034
|
-
/* @__PURE__ */
|
|
2035
|
-
/* @__PURE__ */
|
|
2036
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2039
|
-
/* @__PURE__ */
|
|
2040
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2043
|
-
/* @__PURE__ */
|
|
2044
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2048
|
-
/* @__PURE__ */
|
|
2049
|
-
/* @__PURE__ */
|
|
2050
|
-
/* @__PURE__ */
|
|
2051
|
-
/* @__PURE__ */
|
|
2052
|
-
/* @__PURE__ */
|
|
2053
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2058
|
-
status.ahead > 0 && /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
2078
|
-
const [copiedPort, setCopiedPort] =
|
|
2079
|
-
const copyTimerRef =
|
|
2080
|
-
|
|
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__ */
|
|
2103
|
-
ports.length > 0 ? /* @__PURE__ */
|
|
2104
|
-
/* @__PURE__ */
|
|
2105
|
-
/* @__PURE__ */
|
|
2106
|
-
/* @__PURE__ */
|
|
2107
|
-
/* @__PURE__ */
|
|
2108
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2111
|
-
/* @__PURE__ */
|
|
2112
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2120
|
-
copiedPort === p.port ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2271
|
+
children: /* @__PURE__ */ jsx18(Trash23, { className: "h-3.5 w-3.5" })
|
|
2135
2272
|
}
|
|
2136
2273
|
) })
|
|
2137
2274
|
] }, p.port)) })
|
|
2138
|
-
] }) }) : /* @__PURE__ */
|
|
2139
|
-
/* @__PURE__ */
|
|
2140
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2143
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
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__ */
|
|
2195
|
-
loading ? /* @__PURE__ */
|
|
2196
|
-
/* @__PURE__ */
|
|
2197
|
-
/* @__PURE__ */
|
|
2198
|
-
] }) : processes.length > 0 ? /* @__PURE__ */
|
|
2199
|
-
/* @__PURE__ */
|
|
2200
|
-
/* @__PURE__ */
|
|
2201
|
-
/* @__PURE__ */
|
|
2202
|
-
/* @__PURE__ */
|
|
2203
|
-
/* @__PURE__ */
|
|
2204
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2207
|
-
/* @__PURE__ */
|
|
2208
|
-
/* @__PURE__ */
|
|
2209
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2214
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2226
|
-
/* @__PURE__ */
|
|
2227
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2230
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
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__ */
|
|
2285
|
-
/* @__PURE__ */
|
|
2286
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2290
|
-
/* @__PURE__ */
|
|
2291
|
-
/* @__PURE__ */
|
|
2292
|
-
/* @__PURE__ */
|
|
2293
|
-
/* @__PURE__ */
|
|
2294
|
-
/* @__PURE__ */
|
|
2295
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2323
|
-
/* @__PURE__ */
|
|
2324
|
-
config.allowList.length > 0 ? /* @__PURE__ */
|
|
2325
|
-
/* @__PURE__ */
|
|
2326
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2469
|
+
children: /* @__PURE__ */ jsx20(Trash24, { className: "h-3 w-3" })
|
|
2333
2470
|
}
|
|
2334
2471
|
)
|
|
2335
|
-
] }, cidr)) }) : /* @__PURE__ */
|
|
2336
|
-
/* @__PURE__ */
|
|
2337
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
2380
|
-
const [mcpName, setMcpName] =
|
|
2381
|
-
const [mcpCommand, setMcpCommand] =
|
|
2382
|
-
const [mcpArgs, setMcpArgs] =
|
|
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__ */
|
|
2400
|
-
/* @__PURE__ */
|
|
2401
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2405
|
-
/* @__PURE__ */
|
|
2406
|
-
/* @__PURE__ */
|
|
2407
|
-
/* @__PURE__ */
|
|
2408
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2552
|
+
/* @__PURE__ */ jsx21(RefreshCw2, { className: "h-3 w-3" }),
|
|
2416
2553
|
"Restart"
|
|
2417
2554
|
]
|
|
2418
2555
|
}
|
|
2419
2556
|
)
|
|
2420
2557
|
] }),
|
|
2421
|
-
/* @__PURE__ */
|
|
2422
|
-
/* @__PURE__ */
|
|
2423
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2428
|
-
/* @__PURE__ */
|
|
2429
|
-
status.provider && /* @__PURE__ */
|
|
2430
|
-
/* @__PURE__ */
|
|
2431
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2436
|
-
/* @__PURE__ */
|
|
2437
|
-
/* @__PURE__ */
|
|
2438
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2455
|
-
/* @__PURE__ */
|
|
2456
|
-
/* @__PURE__ */
|
|
2457
|
-
/* @__PURE__ */
|
|
2458
|
-
/* @__PURE__ */
|
|
2459
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2467
|
-
s.status && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2614
|
+
children: /* @__PURE__ */ jsx21(Trash25, { className: "h-3.5 w-3.5" })
|
|
2478
2615
|
}
|
|
2479
2616
|
)
|
|
2480
2617
|
] })
|
|
2481
|
-
] }, s.name)) }) : /* @__PURE__ */
|
|
2482
|
-
showAddMcp && /* @__PURE__ */
|
|
2483
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2514
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
2558
|
-
const [tags, setTags] =
|
|
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__ */
|
|
2566
|
-
/* @__PURE__ */
|
|
2567
|
-
/* @__PURE__ */
|
|
2568
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2582
|
-
/* @__PURE__ */
|
|
2583
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2595
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2619
|
-
/* @__PURE__ */
|
|
2620
|
-
/* @__PURE__ */
|
|
2621
|
-
] }) : snapshots.length > 0 ? /* @__PURE__ */
|
|
2622
|
-
/* @__PURE__ */
|
|
2623
|
-
/* @__PURE__ */
|
|
2624
|
-
/* @__PURE__ */
|
|
2625
|
-
/* @__PURE__ */
|
|
2626
|
-
/* @__PURE__ */
|
|
2627
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2630
|
-
/* @__PURE__ */
|
|
2631
|
-
/* @__PURE__ */
|
|
2632
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2636
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2640
|
-
/* @__PURE__ */
|
|
2641
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2786
|
+
/* @__PURE__ */ jsx22(RotateCcw, { className: "h-3 w-3" }),
|
|
2650
2787
|
"Restore"
|
|
2651
2788
|
]
|
|
2652
2789
|
}
|
|
2653
2790
|
),
|
|
2654
|
-
onSaveAsTemplate && /* @__PURE__ */
|
|
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__ */
|
|
2667
|
-
/* @__PURE__ */
|
|
2668
|
-
/* @__PURE__ */
|
|
2669
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
2827
|
+
const buttonContent = /* @__PURE__ */ jsxs22(Fragment12, { children: [
|
|
2691
2828
|
buttonLabel,
|
|
2692
|
-
/* @__PURE__ */
|
|
2693
|
-
/* @__PURE__ */
|
|
2694
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2698
|
-
/* @__PURE__ */
|
|
2699
|
-
/* @__PURE__ */
|
|
2700
|
-
/* @__PURE__ */
|
|
2701
|
-
href && !disabled ? /* @__PURE__ */
|
|
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__ */
|
|
2704
|
-
/* @__PURE__ */
|
|
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,
|