@xenosystem/blocks 0.13.0 → 0.13.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/chunk-GQWAIPDF.js +125 -0
- package/dist/{chunk-OCEZTO2D.js → chunk-SFSCCISX.js} +59 -30
- package/dist/data/index.js +169 -295
- package/dist/edit/index.js +50 -146
- package/dist/icons/index.d.ts +20 -2
- package/dist/icons/index.js +41 -8
- package/dist/ops/index.js +140 -199
- package/dist/time/index.js +25 -44
- package/package.json +3 -3
package/dist/ops/index.js
CHANGED
|
@@ -6,6 +6,12 @@ import {
|
|
|
6
6
|
statusLabel,
|
|
7
7
|
terminalThemeVar
|
|
8
8
|
} from "../chunk-WE6A2DTY.js";
|
|
9
|
+
import {
|
|
10
|
+
CancelGlyph,
|
|
11
|
+
ClearGlyph,
|
|
12
|
+
CopyGlyph,
|
|
13
|
+
RetryGlyph
|
|
14
|
+
} from "../chunk-GQWAIPDF.js";
|
|
9
15
|
import "../chunk-2KG3PWR4.js";
|
|
10
16
|
|
|
11
17
|
// src/ops/console/panel.ts
|
|
@@ -616,41 +622,7 @@ import {
|
|
|
616
622
|
ToolbarGroup
|
|
617
623
|
} from "@xenosystem/components/chrome";
|
|
618
624
|
import { computeWindow } from "@xenosystem/tree-core";
|
|
619
|
-
|
|
620
|
-
// src/ops/console/react/icons.tsx
|
|
621
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
622
|
-
function Svg({ children }) {
|
|
623
|
-
return /* @__PURE__ */ jsx(
|
|
624
|
-
"svg",
|
|
625
|
-
{
|
|
626
|
-
width: 11,
|
|
627
|
-
height: 11,
|
|
628
|
-
viewBox: "0 0 24 24",
|
|
629
|
-
fill: "none",
|
|
630
|
-
stroke: "currentColor",
|
|
631
|
-
strokeWidth: "1.5",
|
|
632
|
-
strokeLinecap: "round",
|
|
633
|
-
strokeLinejoin: "round",
|
|
634
|
-
"aria-hidden": "true",
|
|
635
|
-
children
|
|
636
|
-
}
|
|
637
|
-
);
|
|
638
|
-
}
|
|
639
|
-
function CopyGlyph() {
|
|
640
|
-
return /* @__PURE__ */ jsxs(Svg, { children: [
|
|
641
|
-
/* @__PURE__ */ jsx("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2" }),
|
|
642
|
-
/* @__PURE__ */ jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
|
|
643
|
-
] });
|
|
644
|
-
}
|
|
645
|
-
function ClearGlyph() {
|
|
646
|
-
return /* @__PURE__ */ jsxs(Svg, { children: [
|
|
647
|
-
/* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "3" }),
|
|
648
|
-
/* @__PURE__ */ jsx("path", { d: "m6 6 12 12" })
|
|
649
|
-
] });
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
// src/ops/console/react/ConsolePanelView.tsx
|
|
653
|
-
import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
625
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
654
626
|
var TONE = {
|
|
655
627
|
trace: "neutral",
|
|
656
628
|
debug: "neutral",
|
|
@@ -698,12 +670,12 @@ function ConsolePanelView({
|
|
|
698
670
|
rowCount: state.rows.length
|
|
699
671
|
});
|
|
700
672
|
const slice = state.rows.slice(window.startIndex, window.endIndex);
|
|
701
|
-
return /* @__PURE__ */
|
|
702
|
-
/* @__PURE__ */
|
|
673
|
+
return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
|
|
674
|
+
/* @__PURE__ */ jsx(
|
|
703
675
|
Toolbar,
|
|
704
676
|
{
|
|
705
|
-
left: /* @__PURE__ */
|
|
706
|
-
/* @__PURE__ */
|
|
677
|
+
left: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
678
|
+
/* @__PURE__ */ jsx(
|
|
707
679
|
SearchField,
|
|
708
680
|
{
|
|
709
681
|
value: state.filter.search ?? "",
|
|
@@ -711,7 +683,7 @@ function ConsolePanelView({
|
|
|
711
683
|
placeholder: "Filter\u2026"
|
|
712
684
|
}
|
|
713
685
|
),
|
|
714
|
-
/* @__PURE__ */
|
|
686
|
+
/* @__PURE__ */ jsx(
|
|
715
687
|
SegmentedControl,
|
|
716
688
|
{
|
|
717
689
|
size: "sm",
|
|
@@ -722,39 +694,39 @@ function ConsolePanelView({
|
|
|
722
694
|
}
|
|
723
695
|
)
|
|
724
696
|
] }),
|
|
725
|
-
right: /* @__PURE__ */
|
|
726
|
-
state.counts.error > 0 ? /* @__PURE__ */
|
|
727
|
-
state.counts.warn > 0 ? /* @__PURE__ */
|
|
728
|
-
/* @__PURE__ */
|
|
697
|
+
right: /* @__PURE__ */ jsxs(ToolbarGroup, { end: true, children: [
|
|
698
|
+
state.counts.error > 0 ? /* @__PURE__ */ jsx(Badge, { tone: "error", children: String(state.counts.error) }) : null,
|
|
699
|
+
state.counts.warn > 0 ? /* @__PURE__ */ jsx(Badge, { tone: "warning", children: String(state.counts.warn) }) : null,
|
|
700
|
+
/* @__PURE__ */ jsx(
|
|
729
701
|
IconButton,
|
|
730
702
|
{
|
|
731
|
-
icon: /* @__PURE__ */
|
|
703
|
+
icon: /* @__PURE__ */ jsx(CopyGlyph, {}),
|
|
732
704
|
label: "Copy visible",
|
|
733
705
|
onClick: () => {
|
|
734
706
|
void navigator?.clipboard?.writeText(controller.copyVisible());
|
|
735
707
|
}
|
|
736
708
|
}
|
|
737
709
|
),
|
|
738
|
-
/* @__PURE__ */
|
|
710
|
+
/* @__PURE__ */ jsx(IconButton, { icon: /* @__PURE__ */ jsx(ClearGlyph, {}), label: "Clear", onClick: () => controller.clear() })
|
|
739
711
|
] })
|
|
740
712
|
}
|
|
741
713
|
),
|
|
742
|
-
state.sources.length > 1 ? /* @__PURE__ */
|
|
714
|
+
state.sources.length > 1 ? /* @__PURE__ */ jsx("div", { style: { display: "flex", gap: 4, padding: "2px 6px", flexWrap: "wrap" }, children: state.sources.map((source) => /* @__PURE__ */ jsx(
|
|
743
715
|
"span",
|
|
744
716
|
{
|
|
745
717
|
onClick: () => controller.toggleSource(source.id),
|
|
746
718
|
style: { cursor: "pointer", opacity: source.enabled ? 1 : 0.4 },
|
|
747
|
-
children: /* @__PURE__ */
|
|
719
|
+
children: /* @__PURE__ */ jsx(Badge, { title: `${source.count} records`, children: source.label ?? source.id })
|
|
748
720
|
},
|
|
749
721
|
source.id
|
|
750
722
|
)) }) : null,
|
|
751
|
-
state.rows.length === 0 ? /* @__PURE__ */
|
|
723
|
+
state.rows.length === 0 ? /* @__PURE__ */ jsx(
|
|
752
724
|
EmptyState,
|
|
753
725
|
{
|
|
754
726
|
title: state.total > 0 ? "No matches" : "No output",
|
|
755
727
|
hint: state.total > 0 ? "Nothing matches the current filter." : emptyHint ?? "Run something to see its output here."
|
|
756
728
|
}
|
|
757
|
-
) : /* @__PURE__ */
|
|
729
|
+
) : /* @__PURE__ */ jsx(ScrollArea, { children: /* @__PURE__ */ jsx("div", { ref: scrollRef, onScroll, style: { height: "100%", overflow: "auto" }, children: /* @__PURE__ */ jsx("div", { style: { height: window.totalHeight, position: "relative" }, children: /* @__PURE__ */ jsx("div", { style: { transform: `translateY(${window.offsetTop}px)` }, children: /* @__PURE__ */ jsx(RowList, { role: "log", children: slice.map((record) => /* @__PURE__ */ jsx(
|
|
758
730
|
LogRow,
|
|
759
731
|
{
|
|
760
732
|
record,
|
|
@@ -766,7 +738,7 @@ function ConsolePanelView({
|
|
|
766
738
|
},
|
|
767
739
|
record.id
|
|
768
740
|
)) }) }) }) }) }),
|
|
769
|
-
/* @__PURE__ */
|
|
741
|
+
/* @__PURE__ */ jsx(
|
|
770
742
|
StatusBar,
|
|
771
743
|
{
|
|
772
744
|
left: `${state.rows.length} of ${state.total}` + (state.dropped > 0 ? ` \xB7 ${state.dropped} dropped` : "") + // A patch that addressed nothing is the one streaming failure with no visible symptom:
|
|
@@ -785,8 +757,8 @@ function LogRow({
|
|
|
785
757
|
expanded,
|
|
786
758
|
onToggle
|
|
787
759
|
}) {
|
|
788
|
-
return /* @__PURE__ */
|
|
789
|
-
/* @__PURE__ */
|
|
760
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
761
|
+
/* @__PURE__ */ jsx(
|
|
790
762
|
Row,
|
|
791
763
|
{
|
|
792
764
|
style: { height: rowHeight, alignItems: "flex-start" },
|
|
@@ -799,11 +771,11 @@ function LogRow({
|
|
|
799
771
|
e.preventDefault();
|
|
800
772
|
controller.requestContextMenu(record.id, e.clientX, e.clientY);
|
|
801
773
|
},
|
|
802
|
-
label: /* @__PURE__ */
|
|
803
|
-
showTimestamps ? /* @__PURE__ */
|
|
804
|
-
/* @__PURE__ */
|
|
805
|
-
record.source ? /* @__PURE__ */
|
|
806
|
-
/* @__PURE__ */
|
|
774
|
+
label: /* @__PURE__ */ jsxs("span", { style: { display: "flex", gap: 6, alignItems: "center", minWidth: 0 }, children: [
|
|
775
|
+
showTimestamps ? /* @__PURE__ */ jsx("span", { style: { opacity: 0.45, fontVariantNumeric: "tabular-nums", flex: "0 0 auto" }, children: new Date(record.ts).toISOString().slice(11, 23) }) : null,
|
|
776
|
+
/* @__PURE__ */ jsx(Badge, { tone: TONE[record.level], children: record.level }),
|
|
777
|
+
record.source ? /* @__PURE__ */ jsx("span", { style: { opacity: 0.55 }, children: record.source }) : null,
|
|
778
|
+
/* @__PURE__ */ jsx(
|
|
807
779
|
"span",
|
|
808
780
|
{
|
|
809
781
|
style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", minWidth: 0 },
|
|
@@ -813,11 +785,11 @@ function LogRow({
|
|
|
813
785
|
] }),
|
|
814
786
|
trailing: (record.count ?? 1) > 1 ? (
|
|
815
787
|
// The best feature in any incumbent: a run of identical lines is one row with a count.
|
|
816
|
-
/* @__PURE__ */
|
|
788
|
+
/* @__PURE__ */ jsx(Badge, { title: "Repeated consecutively", children: `x${record.count}` })
|
|
817
789
|
) : null
|
|
818
790
|
}
|
|
819
791
|
),
|
|
820
|
-
expanded && record.data !== void 0 ? /* @__PURE__ */
|
|
792
|
+
expanded && record.data !== void 0 ? /* @__PURE__ */ jsx(
|
|
821
793
|
"pre",
|
|
822
794
|
{
|
|
823
795
|
style: {
|
|
@@ -1748,38 +1720,7 @@ import {
|
|
|
1748
1720
|
Toolbar as Toolbar2,
|
|
1749
1721
|
ToolbarGroup as ToolbarGroup2
|
|
1750
1722
|
} from "@xenosystem/components/chrome";
|
|
1751
|
-
|
|
1752
|
-
// src/ops/runs/react/icons.tsx
|
|
1753
|
-
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1754
|
-
function Svg2({ children }) {
|
|
1755
|
-
return /* @__PURE__ */ jsx3(
|
|
1756
|
-
"svg",
|
|
1757
|
-
{
|
|
1758
|
-
width: 11,
|
|
1759
|
-
height: 11,
|
|
1760
|
-
viewBox: "0 0 24 24",
|
|
1761
|
-
fill: "none",
|
|
1762
|
-
stroke: "currentColor",
|
|
1763
|
-
strokeWidth: "1.5",
|
|
1764
|
-
strokeLinecap: "round",
|
|
1765
|
-
strokeLinejoin: "round",
|
|
1766
|
-
"aria-hidden": "true",
|
|
1767
|
-
children
|
|
1768
|
-
}
|
|
1769
|
-
);
|
|
1770
|
-
}
|
|
1771
|
-
function CancelGlyph() {
|
|
1772
|
-
return /* @__PURE__ */ jsx3(Svg2, { children: /* @__PURE__ */ jsx3("rect", { x: "5", y: "5", width: "14", height: "14", rx: "2" }) });
|
|
1773
|
-
}
|
|
1774
|
-
function RetryGlyph() {
|
|
1775
|
-
return /* @__PURE__ */ jsxs3(Svg2, { children: [
|
|
1776
|
-
/* @__PURE__ */ jsx3("path", { d: "M21 12a9 9 0 1 1-3.36-7" }),
|
|
1777
|
-
/* @__PURE__ */ jsx3("path", { d: "M21 3v6h-6" })
|
|
1778
|
-
] });
|
|
1779
|
-
}
|
|
1780
|
-
|
|
1781
|
-
// src/ops/runs/react/RunsPanelView.tsx
|
|
1782
|
-
import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1723
|
+
import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
1783
1724
|
var TONE2 = {
|
|
1784
1725
|
requested: "neutral",
|
|
1785
1726
|
queued: "neutral",
|
|
@@ -1804,11 +1745,11 @@ function RunsPanelView({
|
|
|
1804
1745
|
}) {
|
|
1805
1746
|
const state = useSyncExternalStore2(controller.subscribe, controller.getState, controller.getState);
|
|
1806
1747
|
const active = new Set(state.filter.statuses ?? []);
|
|
1807
|
-
return /* @__PURE__ */
|
|
1808
|
-
/* @__PURE__ */
|
|
1748
|
+
return /* @__PURE__ */ jsxs2("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
|
|
1749
|
+
/* @__PURE__ */ jsx2(
|
|
1809
1750
|
Toolbar2,
|
|
1810
1751
|
{
|
|
1811
|
-
left: /* @__PURE__ */
|
|
1752
|
+
left: /* @__PURE__ */ jsx2(
|
|
1812
1753
|
SearchField2,
|
|
1813
1754
|
{
|
|
1814
1755
|
value: state.filter.search ?? "",
|
|
@@ -1816,41 +1757,41 @@ function RunsPanelView({
|
|
|
1816
1757
|
placeholder: "Filter runs\u2026"
|
|
1817
1758
|
}
|
|
1818
1759
|
),
|
|
1819
|
-
right: /* @__PURE__ */
|
|
1760
|
+
right: /* @__PURE__ */ jsx2(ToolbarGroup2, { end: true, children: /* @__PURE__ */ jsx2(TextButton, { onClick: () => controller.clearTerminal(), children: "Clear finished" }) })
|
|
1820
1761
|
}
|
|
1821
1762
|
),
|
|
1822
|
-
/* @__PURE__ */
|
|
1823
|
-
ALL_STATUSES.filter((s) => state.counts[s] > 0).map((status) => /* @__PURE__ */
|
|
1763
|
+
/* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: 4, padding: "2px 6px", flexWrap: "wrap" }, children: [
|
|
1764
|
+
ALL_STATUSES.filter((s) => state.counts[s] > 0).map((status) => /* @__PURE__ */ jsx2(
|
|
1824
1765
|
"span",
|
|
1825
1766
|
{
|
|
1826
1767
|
onClick: () => controller.setStatuses(
|
|
1827
1768
|
active.has(status) ? [...active].filter((s) => s !== status) : [...active, status]
|
|
1828
1769
|
),
|
|
1829
1770
|
style: { cursor: "pointer", opacity: active.size === 0 || active.has(status) ? 1 : 0.4 },
|
|
1830
|
-
children: /* @__PURE__ */
|
|
1771
|
+
children: /* @__PURE__ */ jsx2(Badge2, { tone: TONE2[status], children: `${status} ${state.counts[status]}` })
|
|
1831
1772
|
},
|
|
1832
1773
|
status
|
|
1833
1774
|
)),
|
|
1834
|
-
state.sources.length > 1 ? state.sources.map((source) => /* @__PURE__ */
|
|
1775
|
+
state.sources.length > 1 ? state.sources.map((source) => /* @__PURE__ */ jsx2(
|
|
1835
1776
|
"span",
|
|
1836
1777
|
{
|
|
1837
1778
|
onClick: () => controller.toggleSource(source.id),
|
|
1838
1779
|
style: { cursor: "pointer", opacity: source.enabled ? 1 : 0.4 },
|
|
1839
|
-
children: /* @__PURE__ */
|
|
1780
|
+
children: /* @__PURE__ */ jsx2(Badge2, { title: `${source.count} runs`, children: source.label })
|
|
1840
1781
|
},
|
|
1841
1782
|
source.id
|
|
1842
1783
|
)) : null
|
|
1843
1784
|
] }),
|
|
1844
|
-
state.rows.length === 0 ? /* @__PURE__ */
|
|
1785
|
+
state.rows.length === 0 ? /* @__PURE__ */ jsx2(
|
|
1845
1786
|
EmptyState2,
|
|
1846
1787
|
{
|
|
1847
1788
|
title: state.total > 0 ? "No matching runs" : "No runs yet",
|
|
1848
1789
|
hint: state.total > 0 ? "Nothing matches the current filter." : emptyHint ?? "Run something to see it here."
|
|
1849
1790
|
}
|
|
1850
|
-
) : /* @__PURE__ */
|
|
1851
|
-
(row) => row.kind === "run" ? /* @__PURE__ */
|
|
1791
|
+
) : /* @__PURE__ */ jsx2(ScrollArea2, { children: /* @__PURE__ */ jsx2(RowList2, { role: "list", children: state.rows.map(
|
|
1792
|
+
(row) => row.kind === "run" ? /* @__PURE__ */ jsx2(RunRow, { row, controller, showProgress, now }, row.key) : /* @__PURE__ */ jsx2(StepRow, { row, controller, showProgress }, row.key)
|
|
1852
1793
|
) }) }),
|
|
1853
|
-
/* @__PURE__ */
|
|
1794
|
+
/* @__PURE__ */ jsx2(
|
|
1854
1795
|
StatusBar2,
|
|
1855
1796
|
{
|
|
1856
1797
|
left: `${state.runs.length} of ${state.total}${state.dropped > 0 ? ` \xB7 ${state.dropped} dropped` : ""}`,
|
|
@@ -1863,7 +1804,7 @@ function RunsPanelView({
|
|
|
1863
1804
|
] });
|
|
1864
1805
|
}
|
|
1865
1806
|
function TruncationBadge({ reason }) {
|
|
1866
|
-
return /* @__PURE__ */
|
|
1807
|
+
return /* @__PURE__ */ jsx2(
|
|
1867
1808
|
Badge2,
|
|
1868
1809
|
{
|
|
1869
1810
|
tone: "warning",
|
|
@@ -1877,9 +1818,9 @@ function RowLabel({
|
|
|
1877
1818
|
text,
|
|
1878
1819
|
trailing
|
|
1879
1820
|
}) {
|
|
1880
|
-
return /* @__PURE__ */
|
|
1881
|
-
/* @__PURE__ */
|
|
1882
|
-
/* @__PURE__ */
|
|
1821
|
+
return /* @__PURE__ */ jsxs2("span", { style: { display: "flex", gap: 6, alignItems: "center", minWidth: 0 }, children: [
|
|
1822
|
+
/* @__PURE__ */ jsx2(Badge2, { tone: toneOf(status), children: status }),
|
|
1823
|
+
/* @__PURE__ */ jsx2("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: text }),
|
|
1883
1824
|
trailing
|
|
1884
1825
|
] });
|
|
1885
1826
|
}
|
|
@@ -1891,8 +1832,8 @@ function RunRow({
|
|
|
1891
1832
|
}) {
|
|
1892
1833
|
const run = row.run;
|
|
1893
1834
|
const duration = durationOf(run, now());
|
|
1894
|
-
return /* @__PURE__ */
|
|
1895
|
-
/* @__PURE__ */
|
|
1835
|
+
return /* @__PURE__ */ jsxs2(Fragment2, { children: [
|
|
1836
|
+
/* @__PURE__ */ jsx2(
|
|
1896
1837
|
Row2,
|
|
1897
1838
|
{
|
|
1898
1839
|
noIcon: true,
|
|
@@ -1904,19 +1845,19 @@ function RunRow({
|
|
|
1904
1845
|
e.preventDefault();
|
|
1905
1846
|
controller.requestContextMenu(run.id, e.clientX, e.clientY);
|
|
1906
1847
|
},
|
|
1907
|
-
label: /* @__PURE__ */
|
|
1848
|
+
label: /* @__PURE__ */ jsx2(
|
|
1908
1849
|
RowLabel,
|
|
1909
1850
|
{
|
|
1910
1851
|
status: run.status,
|
|
1911
1852
|
text: run.label,
|
|
1912
|
-
trailing: /* @__PURE__ */
|
|
1913
|
-
run.trigger ? /* @__PURE__ */
|
|
1914
|
-
(run.retryCount ?? 0) > 0 ? /* @__PURE__ */
|
|
1915
|
-
row.truncated ? /* @__PURE__ */
|
|
1853
|
+
trailing: /* @__PURE__ */ jsxs2(Fragment2, { children: [
|
|
1854
|
+
run.trigger ? /* @__PURE__ */ jsx2("span", { style: { opacity: 0.5, fontSize: 9 }, children: run.trigger }) : null,
|
|
1855
|
+
(run.retryCount ?? 0) > 0 ? /* @__PURE__ */ jsx2(Badge2, { title: "Retries so far", children: `retry x${run.retryCount}` }) : null,
|
|
1856
|
+
row.truncated ? /* @__PURE__ */ jsx2(TruncationBadge, { reason: row.truncated }) : null
|
|
1916
1857
|
] })
|
|
1917
1858
|
}
|
|
1918
1859
|
),
|
|
1919
|
-
meta: showProgress && run.progress !== void 0 ? /* @__PURE__ */
|
|
1860
|
+
meta: showProgress && run.progress !== void 0 ? /* @__PURE__ */ jsx2("span", { style: { width: 48, display: "inline-flex" }, children: /* @__PURE__ */ jsx2(
|
|
1920
1861
|
ProportionBar,
|
|
1921
1862
|
{
|
|
1922
1863
|
label: `${Math.round(run.progress * 100)}%`,
|
|
@@ -1925,22 +1866,22 @@ function RunRow({
|
|
|
1925
1866
|
{ value: Math.max(0, 1 - run.progress), opacity: 0.06 }
|
|
1926
1867
|
]
|
|
1927
1868
|
}
|
|
1928
|
-
) }) : duration !== null ? /* @__PURE__ */
|
|
1929
|
-
trailing: /* @__PURE__ */
|
|
1930
|
-
canCancel(run) ? /* @__PURE__ */
|
|
1869
|
+
) }) : duration !== null ? /* @__PURE__ */ jsx2("span", { style: { fontVariantNumeric: "tabular-nums", opacity: 0.6 }, children: formatDuration(duration) }) : null,
|
|
1870
|
+
trailing: /* @__PURE__ */ jsxs2(Fragment2, { children: [
|
|
1871
|
+
canCancel(run) ? /* @__PURE__ */ jsx2(
|
|
1931
1872
|
IconButton2,
|
|
1932
1873
|
{
|
|
1933
1874
|
size: "sm",
|
|
1934
|
-
icon: /* @__PURE__ */
|
|
1875
|
+
icon: /* @__PURE__ */ jsx2(CancelGlyph, {}),
|
|
1935
1876
|
label: `Cancel ${run.label}`,
|
|
1936
1877
|
onClick: () => controller.cancel(run.id)
|
|
1937
1878
|
}
|
|
1938
1879
|
) : null,
|
|
1939
|
-
canRetry(run) ? /* @__PURE__ */
|
|
1880
|
+
canRetry(run) ? /* @__PURE__ */ jsx2(
|
|
1940
1881
|
IconButton2,
|
|
1941
1882
|
{
|
|
1942
1883
|
size: "sm",
|
|
1943
|
-
icon: /* @__PURE__ */
|
|
1884
|
+
icon: /* @__PURE__ */ jsx2(RetryGlyph, {}),
|
|
1944
1885
|
label: `Retry ${run.label}`,
|
|
1945
1886
|
onClick: () => controller.retry(run.id)
|
|
1946
1887
|
}
|
|
@@ -1948,8 +1889,8 @@ function RunRow({
|
|
|
1948
1889
|
] })
|
|
1949
1890
|
}
|
|
1950
1891
|
),
|
|
1951
|
-
run.error ? /* @__PURE__ */
|
|
1952
|
-
/* @__PURE__ */
|
|
1892
|
+
run.error ? /* @__PURE__ */ jsxs2("div", { style: { padding: "0 10px 3px 24px", fontSize: 10, opacity: 0.75 }, children: [
|
|
1893
|
+
/* @__PURE__ */ jsx2(Badge2, { tone: "error", children: run.error.code }),
|
|
1953
1894
|
" ",
|
|
1954
1895
|
run.error.message
|
|
1955
1896
|
] }) : null
|
|
@@ -1962,7 +1903,7 @@ function StepRow({
|
|
|
1962
1903
|
}) {
|
|
1963
1904
|
const step = row.step;
|
|
1964
1905
|
const elapsed = step.startedAt !== void 0 && step.endedAt !== void 0 ? step.endedAt - step.startedAt : null;
|
|
1965
|
-
return /* @__PURE__ */
|
|
1906
|
+
return /* @__PURE__ */ jsx2(
|
|
1966
1907
|
Row2,
|
|
1967
1908
|
{
|
|
1968
1909
|
noIcon: true,
|
|
@@ -1971,15 +1912,15 @@ function StepRow({
|
|
|
1971
1912
|
if (row.hasChildren) controller.toggleExpanded(row.runId, row.stepPath);
|
|
1972
1913
|
controller.activate(row.runId, row.stepPath);
|
|
1973
1914
|
},
|
|
1974
|
-
label: /* @__PURE__ */
|
|
1915
|
+
label: /* @__PURE__ */ jsx2(
|
|
1975
1916
|
RowLabel,
|
|
1976
1917
|
{
|
|
1977
1918
|
status: step.status,
|
|
1978
1919
|
text: step.label,
|
|
1979
|
-
trailing: row.truncated ? /* @__PURE__ */
|
|
1920
|
+
trailing: row.truncated ? /* @__PURE__ */ jsx2(TruncationBadge, { reason: row.truncated }) : null
|
|
1980
1921
|
}
|
|
1981
1922
|
),
|
|
1982
|
-
meta: showProgress && step.progress !== void 0 ? /* @__PURE__ */
|
|
1923
|
+
meta: showProgress && step.progress !== void 0 ? /* @__PURE__ */ jsx2("span", { style: { width: 48, display: "inline-flex" }, children: /* @__PURE__ */ jsx2(
|
|
1983
1924
|
ProportionBar,
|
|
1984
1925
|
{
|
|
1985
1926
|
label: `${Math.round(step.progress * 100)}%`,
|
|
@@ -1988,7 +1929,7 @@ function StepRow({
|
|
|
1988
1929
|
{ value: Math.max(0, 1 - step.progress), opacity: 0.06 }
|
|
1989
1930
|
]
|
|
1990
1931
|
}
|
|
1991
|
-
) }) : elapsed !== null ? /* @__PURE__ */
|
|
1932
|
+
) }) : elapsed !== null ? /* @__PURE__ */ jsx2("span", { style: { fontVariantNumeric: "tabular-nums", opacity: 0.6 }, children: formatDuration(elapsed) }) : null
|
|
1992
1933
|
}
|
|
1993
1934
|
);
|
|
1994
1935
|
}
|
|
@@ -2547,12 +2488,12 @@ import {
|
|
|
2547
2488
|
Toolbar as Toolbar3,
|
|
2548
2489
|
ToolbarGroup as ToolbarGroup3
|
|
2549
2490
|
} from "@xenosystem/components/chrome";
|
|
2550
|
-
import { jsx as
|
|
2491
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
2551
2492
|
function CloseIcon() {
|
|
2552
|
-
return /* @__PURE__ */
|
|
2493
|
+
return /* @__PURE__ */ jsx3("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx3("path", { d: "M18 6 6 18M6 6l12 12" }) });
|
|
2553
2494
|
}
|
|
2554
2495
|
function PlusIcon() {
|
|
2555
|
-
return /* @__PURE__ */
|
|
2496
|
+
return /* @__PURE__ */ jsx3("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx3("path", { d: "M12 5v14M5 12h14" }) });
|
|
2556
2497
|
}
|
|
2557
2498
|
function TerminalSurface({
|
|
2558
2499
|
id,
|
|
@@ -2584,7 +2525,7 @@ function TerminalSurface({
|
|
|
2584
2525
|
useEffect2(() => {
|
|
2585
2526
|
if (visible2) controller.fit(id);
|
|
2586
2527
|
}, [visible2, id, controller]);
|
|
2587
|
-
return /* @__PURE__ */
|
|
2528
|
+
return /* @__PURE__ */ jsx3(
|
|
2588
2529
|
"div",
|
|
2589
2530
|
{
|
|
2590
2531
|
ref,
|
|
@@ -2607,7 +2548,7 @@ function TerminalPanelView({
|
|
|
2607
2548
|
const state = useSyncExternalStore3(controller.subscribe, controller.getState, controller.getState);
|
|
2608
2549
|
const active = state.instances.find((i) => i.active);
|
|
2609
2550
|
if (!createEmulator) {
|
|
2610
|
-
return /* @__PURE__ */
|
|
2551
|
+
return /* @__PURE__ */ jsx3(
|
|
2611
2552
|
EmptyState3,
|
|
2612
2553
|
{
|
|
2613
2554
|
title: "No emulator configured",
|
|
@@ -2615,18 +2556,18 @@ function TerminalPanelView({
|
|
|
2615
2556
|
}
|
|
2616
2557
|
);
|
|
2617
2558
|
}
|
|
2618
|
-
return /* @__PURE__ */
|
|
2619
|
-
multiInstance ? /* @__PURE__ */
|
|
2559
|
+
return /* @__PURE__ */ jsxs3("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
|
|
2560
|
+
multiInstance ? /* @__PURE__ */ jsx3(
|
|
2620
2561
|
Toolbar3,
|
|
2621
2562
|
{
|
|
2622
|
-
left: /* @__PURE__ */
|
|
2563
|
+
left: /* @__PURE__ */ jsx3("div", { style: { display: "flex", gap: 2, alignItems: "center", overflowX: "auto" }, children: state.instances.map((instance) => {
|
|
2623
2564
|
const label = statusLabel(instance.session);
|
|
2624
|
-
return /* @__PURE__ */
|
|
2565
|
+
return /* @__PURE__ */ jsxs3(
|
|
2625
2566
|
"div",
|
|
2626
2567
|
{
|
|
2627
2568
|
style: { display: "flex", alignItems: "center", gap: 2 },
|
|
2628
2569
|
children: [
|
|
2629
|
-
/* @__PURE__ */
|
|
2570
|
+
/* @__PURE__ */ jsx3(
|
|
2630
2571
|
TextButton2,
|
|
2631
2572
|
{
|
|
2632
2573
|
strong: instance.active,
|
|
@@ -2634,13 +2575,13 @@ function TerminalPanelView({
|
|
|
2634
2575
|
children: instance.session.title ?? instance.session.id.slice(0, 8)
|
|
2635
2576
|
}
|
|
2636
2577
|
),
|
|
2637
|
-
label ? /* @__PURE__ */
|
|
2638
|
-
/* @__PURE__ */
|
|
2578
|
+
label ? /* @__PURE__ */ jsx3(Badge3, { tone: instance.session.status === "failed" ? "error" : "neutral", children: label }) : null,
|
|
2579
|
+
/* @__PURE__ */ jsx3(
|
|
2639
2580
|
IconButton3,
|
|
2640
2581
|
{
|
|
2641
2582
|
label: "Close terminal",
|
|
2642
2583
|
size: "sm",
|
|
2643
|
-
icon: /* @__PURE__ */
|
|
2584
|
+
icon: /* @__PURE__ */ jsx3(CloseIcon, {}),
|
|
2644
2585
|
onClick: () => controller.close(instance.session.id)
|
|
2645
2586
|
}
|
|
2646
2587
|
)
|
|
@@ -2649,16 +2590,16 @@ function TerminalPanelView({
|
|
|
2649
2590
|
instance.session.id
|
|
2650
2591
|
);
|
|
2651
2592
|
}) }),
|
|
2652
|
-
right: /* @__PURE__ */
|
|
2653
|
-
/* @__PURE__ */
|
|
2654
|
-
/* @__PURE__ */
|
|
2593
|
+
right: /* @__PURE__ */ jsxs3(ToolbarGroup3, { end: true, children: [
|
|
2594
|
+
/* @__PURE__ */ jsx3(IconButton3, { label: "New terminal", icon: /* @__PURE__ */ jsx3(PlusIcon, {}), onClick: () => controller.open() }),
|
|
2595
|
+
/* @__PURE__ */ jsx3(TextButton2, { onClick: () => controller.setSearch(state.search === null ? "" : null), children: "Find" })
|
|
2655
2596
|
] })
|
|
2656
2597
|
}
|
|
2657
2598
|
) : null,
|
|
2658
|
-
state.search !== null ? /* @__PURE__ */
|
|
2599
|
+
state.search !== null ? /* @__PURE__ */ jsx3(
|
|
2659
2600
|
Toolbar3,
|
|
2660
2601
|
{
|
|
2661
|
-
left: /* @__PURE__ */
|
|
2602
|
+
left: /* @__PURE__ */ jsx3(
|
|
2662
2603
|
SearchField3,
|
|
2663
2604
|
{
|
|
2664
2605
|
value: state.search,
|
|
@@ -2667,13 +2608,13 @@ function TerminalPanelView({
|
|
|
2667
2608
|
autoFocus: true
|
|
2668
2609
|
}
|
|
2669
2610
|
),
|
|
2670
|
-
right: /* @__PURE__ */
|
|
2671
|
-
/* @__PURE__ */
|
|
2672
|
-
/* @__PURE__ */
|
|
2611
|
+
right: /* @__PURE__ */ jsxs3(ToolbarGroup3, { end: true, children: [
|
|
2612
|
+
/* @__PURE__ */ jsx3(TextButton2, { onClick: () => controller.find("previous"), children: "Previous" }),
|
|
2613
|
+
/* @__PURE__ */ jsx3(TextButton2, { onClick: () => controller.find("next"), children: "Next" })
|
|
2673
2614
|
] })
|
|
2674
2615
|
}
|
|
2675
2616
|
) : null,
|
|
2676
|
-
/* @__PURE__ */
|
|
2617
|
+
/* @__PURE__ */ jsx3("div", { style: { position: "relative", flex: 1, minHeight: 0 }, children: state.instances.length === 0 ? /* @__PURE__ */ jsx3(EmptyState3, { title: "No terminal", hint: "Open one to get a shell." }) : state.instances.map((instance) => /* @__PURE__ */ jsx3(
|
|
2677
2618
|
TerminalSurface,
|
|
2678
2619
|
{
|
|
2679
2620
|
id: instance.session.id,
|
|
@@ -2683,7 +2624,7 @@ function TerminalPanelView({
|
|
|
2683
2624
|
},
|
|
2684
2625
|
instance.session.id
|
|
2685
2626
|
)) }),
|
|
2686
|
-
/* @__PURE__ */
|
|
2627
|
+
/* @__PURE__ */ jsx3(
|
|
2687
2628
|
StatusBar3,
|
|
2688
2629
|
{
|
|
2689
2630
|
left: active?.session.cwd,
|
|
@@ -3297,7 +3238,7 @@ import {
|
|
|
3297
3238
|
Toolbar as Toolbar4,
|
|
3298
3239
|
ToolbarGroup as ToolbarGroup4
|
|
3299
3240
|
} from "@xenosystem/components/chrome";
|
|
3300
|
-
import { Fragment as Fragment3, jsx as
|
|
3241
|
+
import { Fragment as Fragment3, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
3301
3242
|
var MARK = {
|
|
3302
3243
|
added: { background: "var(--xeno-hover)" },
|
|
3303
3244
|
removed: { background: "var(--xeno-border-subtle)" },
|
|
@@ -3314,7 +3255,7 @@ function LineText({
|
|
|
3314
3255
|
showWhitespace
|
|
3315
3256
|
}) {
|
|
3316
3257
|
if (line.segments?.length) {
|
|
3317
|
-
return /* @__PURE__ */
|
|
3258
|
+
return /* @__PURE__ */ jsx4(Fragment3, { children: line.segments.map((segment, i) => /* @__PURE__ */ jsx4(
|
|
3318
3259
|
"span",
|
|
3319
3260
|
{
|
|
3320
3261
|
style: segment.kind === "equal" ? void 0 : {
|
|
@@ -3329,9 +3270,9 @@ function LineText({
|
|
|
3329
3270
|
}
|
|
3330
3271
|
const tokens = highlighter?.highlight(line.text, language) ?? null;
|
|
3331
3272
|
if (tokens) {
|
|
3332
|
-
return /* @__PURE__ */
|
|
3273
|
+
return /* @__PURE__ */ jsx4(Fragment3, { children: tokens.map((token, i) => /* @__PURE__ */ jsx4("span", { className: token.token ? `xeno-tok-${token.token}` : void 0, children: visible(token.text, showWhitespace) }, i)) });
|
|
3333
3274
|
}
|
|
3334
|
-
return /* @__PURE__ */
|
|
3275
|
+
return /* @__PURE__ */ jsx4(Fragment3, { children: visible(line.text, showWhitespace) });
|
|
3335
3276
|
}
|
|
3336
3277
|
var GUTTER = {
|
|
3337
3278
|
display: "inline-block",
|
|
@@ -3344,28 +3285,28 @@ var GUTTER = {
|
|
|
3344
3285
|
};
|
|
3345
3286
|
function DecisionChip({ decision }) {
|
|
3346
3287
|
if (!decision) return null;
|
|
3347
|
-
if (decision.state === "pending") return /* @__PURE__ */
|
|
3288
|
+
if (decision.state === "pending") return /* @__PURE__ */ jsx4(Badge4, { children: "deciding\u2026" });
|
|
3348
3289
|
if (decision.state === "conflict") {
|
|
3349
|
-
return /* @__PURE__ */
|
|
3290
|
+
return /* @__PURE__ */ jsx4(Badge4, { tone: "error", title: decision.message ?? "The file changed since this was reviewed.", children: "conflict \u2014 re-review" });
|
|
3350
3291
|
}
|
|
3351
3292
|
if (decision.state === "failed") {
|
|
3352
|
-
return /* @__PURE__ */
|
|
3293
|
+
return /* @__PURE__ */ jsx4(Badge4, { tone: "error", title: decision.message ?? void 0, children: "failed" });
|
|
3353
3294
|
}
|
|
3354
3295
|
if (isSettled(decision.state)) {
|
|
3355
|
-
return /* @__PURE__ */
|
|
3296
|
+
return /* @__PURE__ */ jsx4(Badge4, { tone: "success", children: decision.action === "accept" ? "accepted" : "rejected" });
|
|
3356
3297
|
}
|
|
3357
3298
|
return null;
|
|
3358
3299
|
}
|
|
3359
3300
|
function DiffPanelView({ controller, highlighter, review = false }) {
|
|
3360
3301
|
const state = useSyncExternalStore4(controller.subscribe, controller.getState, controller.getState);
|
|
3361
3302
|
if (state.status === "idle") {
|
|
3362
|
-
return /* @__PURE__ */
|
|
3303
|
+
return /* @__PURE__ */ jsx4(EmptyState4, { title: "Diff", hint: "Nothing to compare yet." });
|
|
3363
3304
|
}
|
|
3364
3305
|
if (state.status === "computing") {
|
|
3365
|
-
return /* @__PURE__ */
|
|
3306
|
+
return /* @__PURE__ */ jsx4(EmptyState4, { title: "Comparing\u2026", hint: "The host is computing the differences." });
|
|
3366
3307
|
}
|
|
3367
3308
|
if (state.status === "failed") {
|
|
3368
|
-
return /* @__PURE__ */
|
|
3309
|
+
return /* @__PURE__ */ jsx4(
|
|
3369
3310
|
EmptyState4,
|
|
3370
3311
|
{
|
|
3371
3312
|
title: "Comparison failed",
|
|
@@ -3374,10 +3315,10 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3374
3315
|
);
|
|
3375
3316
|
}
|
|
3376
3317
|
if (state.identical) {
|
|
3377
|
-
return /* @__PURE__ */
|
|
3318
|
+
return /* @__PURE__ */ jsx4(EmptyState4, { title: "No changes", hint: "The two sides are identical." });
|
|
3378
3319
|
}
|
|
3379
3320
|
const mono = "var(--xeno-font-mono)";
|
|
3380
|
-
const renderLine = (line, file, key) => /* @__PURE__ */
|
|
3321
|
+
const renderLine = (line, file, key) => /* @__PURE__ */ jsxs4(
|
|
3381
3322
|
"div",
|
|
3382
3323
|
{
|
|
3383
3324
|
style: {
|
|
@@ -3388,13 +3329,13 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3388
3329
|
lineHeight: "16px"
|
|
3389
3330
|
},
|
|
3390
3331
|
children: [
|
|
3391
|
-
/* @__PURE__ */
|
|
3392
|
-
/* @__PURE__ */
|
|
3393
|
-
/* @__PURE__ */
|
|
3332
|
+
/* @__PURE__ */ jsx4("span", { style: GUTTER, children: line.oldLineNumber ?? "" }),
|
|
3333
|
+
/* @__PURE__ */ jsx4("span", { style: GUTTER, children: line.newLineNumber ?? "" }),
|
|
3334
|
+
/* @__PURE__ */ jsxs4("span", { style: { opacity: 0.45, userSelect: "none" }, children: [
|
|
3394
3335
|
SIGIL[line.kind],
|
|
3395
3336
|
" "
|
|
3396
3337
|
] }),
|
|
3397
|
-
/* @__PURE__ */
|
|
3338
|
+
/* @__PURE__ */ jsx4(
|
|
3398
3339
|
LineText,
|
|
3399
3340
|
{
|
|
3400
3341
|
line,
|
|
@@ -3407,7 +3348,7 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3407
3348
|
},
|
|
3408
3349
|
key
|
|
3409
3350
|
);
|
|
3410
|
-
const renderSplitCell = (line, file, side) => /* @__PURE__ */
|
|
3351
|
+
const renderSplitCell = (line, file, side) => /* @__PURE__ */ jsxs4(
|
|
3411
3352
|
"div",
|
|
3412
3353
|
{
|
|
3413
3354
|
style: {
|
|
@@ -3421,8 +3362,8 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3421
3362
|
lineHeight: "16px"
|
|
3422
3363
|
},
|
|
3423
3364
|
children: [
|
|
3424
|
-
/* @__PURE__ */
|
|
3425
|
-
line ? /* @__PURE__ */
|
|
3365
|
+
/* @__PURE__ */ jsx4("span", { style: GUTTER, children: (side === "l" ? line?.oldLineNumber : line?.newLineNumber) ?? "" }),
|
|
3366
|
+
line ? /* @__PURE__ */ jsx4(
|
|
3426
3367
|
LineText,
|
|
3427
3368
|
{
|
|
3428
3369
|
line,
|
|
@@ -3434,11 +3375,11 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3434
3375
|
]
|
|
3435
3376
|
}
|
|
3436
3377
|
);
|
|
3437
|
-
return /* @__PURE__ */
|
|
3438
|
-
/* @__PURE__ */
|
|
3378
|
+
return /* @__PURE__ */ jsxs4("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
|
|
3379
|
+
/* @__PURE__ */ jsx4(
|
|
3439
3380
|
Toolbar4,
|
|
3440
3381
|
{
|
|
3441
|
-
left: /* @__PURE__ */
|
|
3382
|
+
left: /* @__PURE__ */ jsx4(
|
|
3442
3383
|
SegmentedControl2,
|
|
3443
3384
|
{
|
|
3444
3385
|
label: "View",
|
|
@@ -3450,22 +3391,22 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3450
3391
|
]
|
|
3451
3392
|
}
|
|
3452
3393
|
),
|
|
3453
|
-
right: /* @__PURE__ */
|
|
3454
|
-
/* @__PURE__ */
|
|
3455
|
-
/* @__PURE__ */
|
|
3456
|
-
/* @__PURE__ */
|
|
3457
|
-
/* @__PURE__ */
|
|
3394
|
+
right: /* @__PURE__ */ jsxs4(ToolbarGroup4, { end: true, children: [
|
|
3395
|
+
/* @__PURE__ */ jsx4(TextButton3, { onClick: () => controller.setWrap(!state.wrap), children: state.wrap ? "No wrap" : "Wrap" }),
|
|
3396
|
+
/* @__PURE__ */ jsx4(TextButton3, { onClick: () => controller.setShowWhitespace(!state.showWhitespace), children: state.showWhitespace ? "Hide \u2423" : "Show \u2423" }),
|
|
3397
|
+
/* @__PURE__ */ jsx4(TextButton3, { onClick: () => controller.previousHunk(), children: "Prev" }),
|
|
3398
|
+
/* @__PURE__ */ jsx4(TextButton3, { onClick: () => controller.nextHunk(), children: "Next" })
|
|
3458
3399
|
] })
|
|
3459
3400
|
}
|
|
3460
3401
|
),
|
|
3461
|
-
state.review && state.review.conflicts > 0 ? /* @__PURE__ */
|
|
3402
|
+
state.review && state.review.conflicts > 0 ? /* @__PURE__ */ jsx4("div", { style: { padding: "2px 8px", fontSize: 9 }, children: /* @__PURE__ */ jsxs4(Badge4, { tone: "error", children: [
|
|
3462
3403
|
state.review.conflicts,
|
|
3463
3404
|
" conflict",
|
|
3464
3405
|
state.review.conflicts === 1 ? "" : "s",
|
|
3465
3406
|
" \u2014 the file changed since review"
|
|
3466
3407
|
] }) }) : null,
|
|
3467
|
-
/* @__PURE__ */
|
|
3468
|
-
/* @__PURE__ */
|
|
3408
|
+
/* @__PURE__ */ jsx4(ScrollArea3, { children: state.files.map((file) => /* @__PURE__ */ jsxs4("div", { style: { borderBottom: "1px solid var(--xeno-border-subtle)" }, children: [
|
|
3409
|
+
/* @__PURE__ */ jsxs4(
|
|
3469
3410
|
"div",
|
|
3470
3411
|
{
|
|
3471
3412
|
style: {
|
|
@@ -3479,10 +3420,10 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3479
3420
|
zIndex: 1
|
|
3480
3421
|
},
|
|
3481
3422
|
children: [
|
|
3482
|
-
/* @__PURE__ */
|
|
3483
|
-
/* @__PURE__ */
|
|
3484
|
-
/* @__PURE__ */
|
|
3485
|
-
/* @__PURE__ */
|
|
3423
|
+
/* @__PURE__ */ jsx4(TextButton3, { onClick: () => controller.setCollapsed(file.file.path, !file.collapsed), children: file.collapsed ? "\u25B8" : "\u25BE" }),
|
|
3424
|
+
/* @__PURE__ */ jsx4("span", { style: { fontSize: 11, fontWeight: 600 }, children: file.file.oldPath && file.file.oldPath !== file.file.path ? `${file.file.oldPath} \u2192 ${file.file.path}` : file.file.path }),
|
|
3425
|
+
/* @__PURE__ */ jsx4(Badge4, { children: file.file.status }),
|
|
3426
|
+
/* @__PURE__ */ jsxs4("span", { style: { fontSize: 10, fontVariantNumeric: "tabular-nums", opacity: 0.6 }, children: [
|
|
3486
3427
|
"+",
|
|
3487
3428
|
file.additions,
|
|
3488
3429
|
" \u2212",
|
|
@@ -3495,11 +3436,11 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3495
3436
|
// 🔴 Never an empty body. "Binary — not compared" and "no changes" are different
|
|
3496
3437
|
// facts, and a reviewer who reads the first as the second approves something nobody
|
|
3497
3438
|
// looked at.
|
|
3498
|
-
/* @__PURE__ */
|
|
3439
|
+
/* @__PURE__ */ jsx4("div", { style: { padding: "6px 12px", fontSize: 10, opacity: 0.6 }, children: omissionLabel(file.file.omitted) })
|
|
3499
3440
|
) : file.file.hunks.map((hunk) => {
|
|
3500
3441
|
const decision = file.decisions[hunk.id];
|
|
3501
3442
|
const focused = state.cursor?.path === file.file.path && state.cursor.hunkId === hunk.id;
|
|
3502
|
-
return /* @__PURE__ */
|
|
3443
|
+
return /* @__PURE__ */ jsxs4(
|
|
3503
3444
|
"div",
|
|
3504
3445
|
{
|
|
3505
3446
|
onContextMenu: (event) => {
|
|
@@ -3516,7 +3457,7 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3516
3457
|
opacity: isSettled(decision?.state ?? "undecided") ? 0.55 : 1
|
|
3517
3458
|
},
|
|
3518
3459
|
children: [
|
|
3519
|
-
/* @__PURE__ */
|
|
3460
|
+
/* @__PURE__ */ jsxs4(
|
|
3520
3461
|
"div",
|
|
3521
3462
|
{
|
|
3522
3463
|
style: {
|
|
@@ -3528,16 +3469,16 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3528
3469
|
opacity: 0.55
|
|
3529
3470
|
},
|
|
3530
3471
|
children: [
|
|
3531
|
-
/* @__PURE__ */
|
|
3532
|
-
/* @__PURE__ */
|
|
3533
|
-
review ? /* @__PURE__ */
|
|
3472
|
+
/* @__PURE__ */ jsx4("span", { style: { fontFamily: mono }, children: hunk.header ?? `@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@` }),
|
|
3473
|
+
/* @__PURE__ */ jsx4(DecisionChip, { decision }),
|
|
3474
|
+
review ? /* @__PURE__ */ jsx4("span", { style: { marginLeft: "auto", display: "flex", gap: 4 }, children: needsAttention(decision?.state ?? "undecided") ? /* @__PURE__ */ jsx4(
|
|
3534
3475
|
TextButton3,
|
|
3535
3476
|
{
|
|
3536
3477
|
onClick: () => controller.clearDecision(file.file.path, hunk.id),
|
|
3537
3478
|
children: "Re-review"
|
|
3538
3479
|
}
|
|
3539
|
-
) : /* @__PURE__ */
|
|
3540
|
-
/* @__PURE__ */
|
|
3480
|
+
) : /* @__PURE__ */ jsxs4(Fragment3, { children: [
|
|
3481
|
+
/* @__PURE__ */ jsx4(
|
|
3541
3482
|
TextButton3,
|
|
3542
3483
|
{
|
|
3543
3484
|
disabled: decision?.state === "pending",
|
|
@@ -3545,7 +3486,7 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3545
3486
|
children: "Accept"
|
|
3546
3487
|
}
|
|
3547
3488
|
),
|
|
3548
|
-
/* @__PURE__ */
|
|
3489
|
+
/* @__PURE__ */ jsx4(
|
|
3549
3490
|
TextButton3,
|
|
3550
3491
|
{
|
|
3551
3492
|
disabled: decision?.state === "pending",
|
|
@@ -3557,7 +3498,7 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3557
3498
|
]
|
|
3558
3499
|
}
|
|
3559
3500
|
),
|
|
3560
|
-
state.view === "unified" ? hunk.lines.map((line, i) => renderLine(line, file, `${hunk.id}-${i}`)) : splitRows(hunk).map((row, i) => /* @__PURE__ */
|
|
3501
|
+
state.view === "unified" ? hunk.lines.map((line, i) => renderLine(line, file, `${hunk.id}-${i}`)) : splitRows(hunk).map((row, i) => /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: 1 }, children: [
|
|
3561
3502
|
renderSplitCell(row.left, file, "l"),
|
|
3562
3503
|
renderSplitCell(row.right, file, "r")
|
|
3563
3504
|
] }, `${hunk.id}-s${i}`))
|
|
@@ -3567,7 +3508,7 @@ function DiffPanelView({ controller, highlighter, review = false }) {
|
|
|
3567
3508
|
);
|
|
3568
3509
|
})
|
|
3569
3510
|
] }, file.file.path)) }),
|
|
3570
|
-
/* @__PURE__ */
|
|
3511
|
+
/* @__PURE__ */ jsx4(
|
|
3571
3512
|
StatusBar4,
|
|
3572
3513
|
{
|
|
3573
3514
|
left: `${state.totals.files} file${state.totals.files === 1 ? "" : "s"} \xB7 +${state.totals.additions} \u2212${state.totals.deletions}`,
|