@xenosystem/blocks 0.13.0 → 0.13.1

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/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__ */ jsxs2("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
702
- /* @__PURE__ */ jsx2(
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__ */ jsxs2(Fragment, { children: [
706
- /* @__PURE__ */ jsx2(
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__ */ jsx2(
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__ */ jsxs2(ToolbarGroup, { end: true, children: [
726
- state.counts.error > 0 ? /* @__PURE__ */ jsx2(Badge, { tone: "error", children: String(state.counts.error) }) : null,
727
- state.counts.warn > 0 ? /* @__PURE__ */ jsx2(Badge, { tone: "warning", children: String(state.counts.warn) }) : null,
728
- /* @__PURE__ */ jsx2(
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__ */ jsx2(CopyGlyph, {}),
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__ */ jsx2(IconButton, { icon: /* @__PURE__ */ jsx2(ClearGlyph, {}), label: "Clear", onClick: () => controller.clear() })
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__ */ jsx2("div", { style: { display: "flex", gap: 4, padding: "2px 6px", flexWrap: "wrap" }, children: state.sources.map((source) => /* @__PURE__ */ jsx2(
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__ */ jsx2(Badge, { title: `${source.count} records`, children: source.label ?? source.id })
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__ */ jsx2(
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__ */ jsx2(ScrollArea, { children: /* @__PURE__ */ jsx2("div", { ref: scrollRef, onScroll, style: { height: "100%", overflow: "auto" }, children: /* @__PURE__ */ jsx2("div", { style: { height: window.totalHeight, position: "relative" }, children: /* @__PURE__ */ jsx2("div", { style: { transform: `translateY(${window.offsetTop}px)` }, children: /* @__PURE__ */ jsx2(RowList, { role: "log", children: slice.map((record) => /* @__PURE__ */ jsx2(
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__ */ jsx2(
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__ */ jsxs2(Fragment, { children: [
789
- /* @__PURE__ */ jsx2(
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__ */ jsxs2("span", { style: { display: "flex", gap: 6, alignItems: "center", minWidth: 0 }, children: [
803
- showTimestamps ? /* @__PURE__ */ jsx2("span", { style: { opacity: 0.45, fontVariantNumeric: "tabular-nums", flex: "0 0 auto" }, children: new Date(record.ts).toISOString().slice(11, 23) }) : null,
804
- /* @__PURE__ */ jsx2(Badge, { tone: TONE[record.level], children: record.level }),
805
- record.source ? /* @__PURE__ */ jsx2("span", { style: { opacity: 0.55 }, children: record.source }) : null,
806
- /* @__PURE__ */ jsx2(
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__ */ jsx2(Badge, { title: "Repeated consecutively", children: `x${record.count}` })
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__ */ jsx2(
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__ */ jsxs4("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
1808
- /* @__PURE__ */ jsx4(
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__ */ jsx4(
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__ */ jsx4(ToolbarGroup2, { end: true, children: /* @__PURE__ */ jsx4(TextButton, { onClick: () => controller.clearTerminal(), children: "Clear finished" }) })
1760
+ right: /* @__PURE__ */ jsx2(ToolbarGroup2, { end: true, children: /* @__PURE__ */ jsx2(TextButton, { onClick: () => controller.clearTerminal(), children: "Clear finished" }) })
1820
1761
  }
1821
1762
  ),
1822
- /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: 4, padding: "2px 6px", flexWrap: "wrap" }, children: [
1823
- ALL_STATUSES.filter((s) => state.counts[s] > 0).map((status) => /* @__PURE__ */ jsx4(
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__ */ jsx4(Badge2, { tone: TONE2[status], children: `${status} ${state.counts[status]}` })
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__ */ jsx4(
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__ */ jsx4(Badge2, { title: `${source.count} runs`, children: source.label })
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__ */ jsx4(
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__ */ jsx4(ScrollArea2, { children: /* @__PURE__ */ jsx4(RowList2, { role: "list", children: state.rows.map(
1851
- (row) => row.kind === "run" ? /* @__PURE__ */ jsx4(RunRow, { row, controller, showProgress, now }, row.key) : /* @__PURE__ */ jsx4(StepRow, { row, controller, showProgress }, row.key)
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__ */ jsx4(
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__ */ jsx4(
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__ */ jsxs4("span", { style: { display: "flex", gap: 6, alignItems: "center", minWidth: 0 }, children: [
1881
- /* @__PURE__ */ jsx4(Badge2, { tone: toneOf(status), children: status }),
1882
- /* @__PURE__ */ jsx4("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: text }),
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__ */ jsxs4(Fragment2, { children: [
1895
- /* @__PURE__ */ jsx4(
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__ */ jsx4(
1848
+ label: /* @__PURE__ */ jsx2(
1908
1849
  RowLabel,
1909
1850
  {
1910
1851
  status: run.status,
1911
1852
  text: run.label,
1912
- trailing: /* @__PURE__ */ jsxs4(Fragment2, { children: [
1913
- run.trigger ? /* @__PURE__ */ jsx4("span", { style: { opacity: 0.5, fontSize: 9 }, children: run.trigger }) : null,
1914
- (run.retryCount ?? 0) > 0 ? /* @__PURE__ */ jsx4(Badge2, { title: "Retries so far", children: `retry x${run.retryCount}` }) : null,
1915
- row.truncated ? /* @__PURE__ */ jsx4(TruncationBadge, { reason: row.truncated }) : null
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__ */ jsx4("span", { style: { width: 48, display: "inline-flex" }, children: /* @__PURE__ */ jsx4(
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__ */ jsx4("span", { style: { fontVariantNumeric: "tabular-nums", opacity: 0.6 }, children: formatDuration(duration) }) : null,
1929
- trailing: /* @__PURE__ */ jsxs4(Fragment2, { children: [
1930
- canCancel(run) ? /* @__PURE__ */ jsx4(
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__ */ jsx4(CancelGlyph, {}),
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__ */ jsx4(
1880
+ canRetry(run) ? /* @__PURE__ */ jsx2(
1940
1881
  IconButton2,
1941
1882
  {
1942
1883
  size: "sm",
1943
- icon: /* @__PURE__ */ jsx4(RetryGlyph, {}),
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__ */ jsxs4("div", { style: { padding: "0 10px 3px 24px", fontSize: 10, opacity: 0.75 }, children: [
1952
- /* @__PURE__ */ jsx4(Badge2, { tone: "error", children: run.error.code }),
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__ */ jsx4(
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__ */ jsx4(
1915
+ label: /* @__PURE__ */ jsx2(
1975
1916
  RowLabel,
1976
1917
  {
1977
1918
  status: step.status,
1978
1919
  text: step.label,
1979
- trailing: row.truncated ? /* @__PURE__ */ jsx4(TruncationBadge, { reason: row.truncated }) : null
1920
+ trailing: row.truncated ? /* @__PURE__ */ jsx2(TruncationBadge, { reason: row.truncated }) : null
1980
1921
  }
1981
1922
  ),
1982
- meta: showProgress && step.progress !== void 0 ? /* @__PURE__ */ jsx4("span", { style: { width: 48, display: "inline-flex" }, children: /* @__PURE__ */ jsx4(
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__ */ jsx4("span", { style: { fontVariantNumeric: "tabular-nums", opacity: 0.6 }, children: formatDuration(elapsed) }) : null
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 jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
2491
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
2551
2492
  function CloseIcon() {
2552
- return /* @__PURE__ */ jsx5("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx5("path", { d: "M18 6 6 18M6 6l12 12" }) });
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__ */ jsx5("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx5("path", { d: "M12 5v14M5 12h14" }) });
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__ */ jsx5(
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__ */ jsx5(
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__ */ jsxs5("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
2619
- multiInstance ? /* @__PURE__ */ jsx5(
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__ */ jsx5("div", { style: { display: "flex", gap: 2, alignItems: "center", overflowX: "auto" }, children: state.instances.map((instance) => {
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__ */ jsxs5(
2565
+ return /* @__PURE__ */ jsxs3(
2625
2566
  "div",
2626
2567
  {
2627
2568
  style: { display: "flex", alignItems: "center", gap: 2 },
2628
2569
  children: [
2629
- /* @__PURE__ */ jsx5(
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__ */ jsx5(Badge3, { tone: instance.session.status === "failed" ? "error" : "neutral", children: label }) : null,
2638
- /* @__PURE__ */ jsx5(
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__ */ jsx5(CloseIcon, {}),
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__ */ jsxs5(ToolbarGroup3, { end: true, children: [
2653
- /* @__PURE__ */ jsx5(IconButton3, { label: "New terminal", icon: /* @__PURE__ */ jsx5(PlusIcon, {}), onClick: () => controller.open() }),
2654
- /* @__PURE__ */ jsx5(TextButton2, { onClick: () => controller.setSearch(state.search === null ? "" : null), children: "Find" })
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__ */ jsx5(
2599
+ state.search !== null ? /* @__PURE__ */ jsx3(
2659
2600
  Toolbar3,
2660
2601
  {
2661
- left: /* @__PURE__ */ jsx5(
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__ */ jsxs5(ToolbarGroup3, { end: true, children: [
2671
- /* @__PURE__ */ jsx5(TextButton2, { onClick: () => controller.find("previous"), children: "Previous" }),
2672
- /* @__PURE__ */ jsx5(TextButton2, { onClick: () => controller.find("next"), children: "Next" })
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__ */ jsx5("div", { style: { position: "relative", flex: 1, minHeight: 0 }, children: state.instances.length === 0 ? /* @__PURE__ */ jsx5(EmptyState3, { title: "No terminal", hint: "Open one to get a shell." }) : state.instances.map((instance) => /* @__PURE__ */ jsx5(
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__ */ jsx5(
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 jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
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__ */ jsx6(Fragment3, { children: line.segments.map((segment, i) => /* @__PURE__ */ jsx6(
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__ */ jsx6(Fragment3, { children: tokens.map((token, i) => /* @__PURE__ */ jsx6("span", { className: token.token ? `xeno-tok-${token.token}` : void 0, children: visible(token.text, showWhitespace) }, i)) });
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__ */ jsx6(Fragment3, { children: visible(line.text, showWhitespace) });
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__ */ jsx6(Badge4, { children: "deciding\u2026" });
3288
+ if (decision.state === "pending") return /* @__PURE__ */ jsx4(Badge4, { children: "deciding\u2026" });
3348
3289
  if (decision.state === "conflict") {
3349
- return /* @__PURE__ */ jsx6(Badge4, { tone: "error", title: decision.message ?? "The file changed since this was reviewed.", children: "conflict \u2014 re-review" });
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__ */ jsx6(Badge4, { tone: "error", title: decision.message ?? void 0, children: "failed" });
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__ */ jsx6(Badge4, { tone: "success", children: decision.action === "accept" ? "accepted" : "rejected" });
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__ */ jsx6(EmptyState4, { title: "Diff", hint: "Nothing to compare yet." });
3303
+ return /* @__PURE__ */ jsx4(EmptyState4, { title: "Diff", hint: "Nothing to compare yet." });
3363
3304
  }
3364
3305
  if (state.status === "computing") {
3365
- return /* @__PURE__ */ jsx6(EmptyState4, { title: "Comparing\u2026", hint: "The host is computing the differences." });
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__ */ jsx6(
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__ */ jsx6(EmptyState4, { title: "No changes", hint: "The two sides are identical." });
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__ */ jsxs6(
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__ */ jsx6("span", { style: GUTTER, children: line.oldLineNumber ?? "" }),
3392
- /* @__PURE__ */ jsx6("span", { style: GUTTER, children: line.newLineNumber ?? "" }),
3393
- /* @__PURE__ */ jsxs6("span", { style: { opacity: 0.45, userSelect: "none" }, children: [
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__ */ jsx6(
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__ */ jsxs6(
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__ */ jsx6("span", { style: GUTTER, children: (side === "l" ? line?.oldLineNumber : line?.newLineNumber) ?? "" }),
3425
- line ? /* @__PURE__ */ jsx6(
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__ */ jsxs6("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
3438
- /* @__PURE__ */ jsx6(
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__ */ jsx6(
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__ */ jsxs6(ToolbarGroup4, { end: true, children: [
3454
- /* @__PURE__ */ jsx6(TextButton3, { onClick: () => controller.setWrap(!state.wrap), children: state.wrap ? "No wrap" : "Wrap" }),
3455
- /* @__PURE__ */ jsx6(TextButton3, { onClick: () => controller.setShowWhitespace(!state.showWhitespace), children: state.showWhitespace ? "Hide \u2423" : "Show \u2423" }),
3456
- /* @__PURE__ */ jsx6(TextButton3, { onClick: () => controller.previousHunk(), children: "Prev" }),
3457
- /* @__PURE__ */ jsx6(TextButton3, { onClick: () => controller.nextHunk(), children: "Next" })
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__ */ jsx6("div", { style: { padding: "2px 8px", fontSize: 9 }, children: /* @__PURE__ */ jsxs6(Badge4, { tone: "error", children: [
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__ */ jsx6(ScrollArea3, { children: state.files.map((file) => /* @__PURE__ */ jsxs6("div", { style: { borderBottom: "1px solid var(--xeno-border-subtle)" }, children: [
3468
- /* @__PURE__ */ jsxs6(
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__ */ jsx6(TextButton3, { onClick: () => controller.setCollapsed(file.file.path, !file.collapsed), children: file.collapsed ? "\u25B8" : "\u25BE" }),
3483
- /* @__PURE__ */ jsx6("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 }),
3484
- /* @__PURE__ */ jsx6(Badge4, { children: file.file.status }),
3485
- /* @__PURE__ */ jsxs6("span", { style: { fontSize: 10, fontVariantNumeric: "tabular-nums", opacity: 0.6 }, children: [
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__ */ jsx6("div", { style: { padding: "6px 12px", fontSize: 10, opacity: 0.6 }, children: omissionLabel(file.file.omitted) })
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__ */ jsxs6(
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__ */ jsxs6(
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__ */ jsx6("span", { style: { fontFamily: mono }, children: hunk.header ?? `@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@` }),
3532
- /* @__PURE__ */ jsx6(DecisionChip, { decision }),
3533
- review ? /* @__PURE__ */ jsx6("span", { style: { marginLeft: "auto", display: "flex", gap: 4 }, children: needsAttention(decision?.state ?? "undecided") ? /* @__PURE__ */ jsx6(
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__ */ jsxs6(Fragment3, { children: [
3540
- /* @__PURE__ */ jsx6(
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__ */ jsx6(
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__ */ jsxs6("div", { style: { display: "flex", gap: 1 }, children: [
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__ */ jsx6(
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}`,