clairo 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +1126 -472
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -4,13 +4,13 @@
4
4
  import meow from "meow";
5
5
 
6
6
  // src/app.tsx
7
- import { useCallback as useCallback11, useMemo as useMemo4, useState as useState21 } from "react";
8
- import { Box as Box22, Text as Text19, useApp, useInput as useInput18 } from "ink";
7
+ import { useCallback as useCallback11, useMemo as useMemo4, useState as useState22 } from "react";
8
+ import { Box as Box22, Text as Text21, useApp, useInput as useInput18 } from "ink";
9
9
 
10
10
  // src/components/github/GitHubView.tsx
11
- import { useCallback as useCallback8, useEffect as useEffect8, useRef as useRef5, useState as useState11 } from "react";
11
+ import { useCallback as useCallback8, useEffect as useEffect9, useRef as useRef5, useState as useState12 } from "react";
12
12
  import { TitledBox as TitledBox3 } from "@mishieck/ink-titled-box";
13
- import { Box as Box6, Text as Text5, useInput as useInput4 } from "ink";
13
+ import { Box as Box6, Text as Text7, useInput as useInput4 } from "ink";
14
14
  import { ScrollView as ScrollView4 } from "ink-scroll-view";
15
15
 
16
16
  // src/hooks/github/useGitRepo.ts
@@ -1535,14 +1535,25 @@ ${detail}
1535
1535
  // src/components/github/PRDetailsBox.tsx
1536
1536
  import open from "open";
1537
1537
  import { useRef as useRef2 } from "react";
1538
- import { Box as Box3, Text as Text2, useInput, useStdout } from "ink";
1538
+ import { Box as Box3, Text as Text3, useInput, useStdout } from "ink";
1539
1539
  import { ScrollView } from "ink-scroll-view";
1540
1540
 
1541
+ // src/components/ui/Badge.tsx
1542
+ import { Text } from "ink";
1543
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
1544
+ function Badge({ color, background, children }) {
1545
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1546
+ /* @__PURE__ */ jsx(Text, { color: background, children: "\uE0B6" }),
1547
+ /* @__PURE__ */ jsx(Text, { color, backgroundColor: background, bold: true, children }),
1548
+ /* @__PURE__ */ jsx(Text, { color: background, children: "\uE0B4" })
1549
+ ] });
1550
+ }
1551
+
1541
1552
  // src/components/ui/Divider.tsx
1542
1553
  import { Box } from "ink";
1543
- import { jsx } from "react/jsx-runtime";
1554
+ import { jsx as jsx2 } from "react/jsx-runtime";
1544
1555
  function Divider({ color }) {
1545
- return /* @__PURE__ */ jsx(
1556
+ return /* @__PURE__ */ jsx2(
1546
1557
  Box,
1547
1558
  {
1548
1559
  flexGrow: 1,
@@ -1560,18 +1571,18 @@ function Divider({ color }) {
1560
1571
  // src/components/ui/Markdown.tsx
1561
1572
  import Table from "cli-table3";
1562
1573
  import { marked } from "marked";
1563
- import { Box as Box2, Text } from "ink";
1574
+ import { Box as Box2, Text as Text2 } from "ink";
1564
1575
  import Link from "ink-link";
1565
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
1576
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
1566
1577
  function Markdown({ children }) {
1567
1578
  const tokens = marked.lexer(children);
1568
- return /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", children: tokens.map((token, idx) => /* @__PURE__ */ jsx2(TokenRenderer, { token }, idx)) });
1579
+ return /* @__PURE__ */ jsx3(Box2, { flexDirection: "column", children: tokens.map((token, idx) => /* @__PURE__ */ jsx3(TokenRenderer, { token }, idx)) });
1569
1580
  }
1570
1581
  function TokenRenderer({ token }) {
1571
1582
  var _a, _b;
1572
1583
  switch (token.type) {
1573
1584
  case "heading":
1574
- return /* @__PURE__ */ jsx2(Box2, { marginTop: token.depth === 1 ? 0 : 1, children: /* @__PURE__ */ jsx2(Text, { bold: true, underline: token.depth === 1, children: renderInline(token.tokens) }) });
1585
+ return /* @__PURE__ */ jsx3(Box2, { marginTop: token.depth === 1 ? 0 : 1, children: /* @__PURE__ */ jsx3(Text2, { bold: true, underline: token.depth === 1, children: renderInline(token.tokens) }) });
1575
1586
  case "paragraph": {
1576
1587
  const hasLinks = (_a = token.tokens) == null ? void 0 : _a.some(
1577
1588
  (t) => {
@@ -1580,31 +1591,31 @@ function TokenRenderer({ token }) {
1580
1591
  }
1581
1592
  );
1582
1593
  if (hasLinks) {
1583
- return /* @__PURE__ */ jsx2(Box2, { flexDirection: "row", flexWrap: "wrap", children: renderInline(token.tokens) });
1594
+ return /* @__PURE__ */ jsx3(Box2, { flexDirection: "row", flexWrap: "wrap", children: renderInline(token.tokens) });
1584
1595
  }
1585
- return /* @__PURE__ */ jsx2(Text, { children: renderInline(token.tokens) });
1596
+ return /* @__PURE__ */ jsx3(Text2, { children: renderInline(token.tokens) });
1586
1597
  }
1587
1598
  case "code":
1588
- return /* @__PURE__ */ jsx2(Box2, { marginY: 1, paddingX: 1, borderStyle: "single", borderColor: "gray", children: /* @__PURE__ */ jsx2(Text, { dimColor: true, children: token.text }) });
1599
+ return /* @__PURE__ */ jsx3(Box2, { marginY: 1, paddingX: 1, borderStyle: "single", borderColor: "gray", children: /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: token.text }) });
1589
1600
  case "blockquote":
1590
- return /* @__PURE__ */ jsxs(Box2, { marginLeft: 2, children: [
1591
- /* @__PURE__ */ jsx2(Text, { color: "gray", children: "\u2502 " }),
1592
- /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", children: (_b = token.tokens) == null ? void 0 : _b.map((t, idx) => /* @__PURE__ */ jsx2(TokenRenderer, { token: t }, idx)) })
1601
+ return /* @__PURE__ */ jsxs2(Box2, { marginLeft: 2, children: [
1602
+ /* @__PURE__ */ jsx3(Text2, { color: "gray", children: "\u2502 " }),
1603
+ /* @__PURE__ */ jsx3(Box2, { flexDirection: "column", children: (_b = token.tokens) == null ? void 0 : _b.map((t, idx) => /* @__PURE__ */ jsx3(TokenRenderer, { token: t }, idx)) })
1593
1604
  ] });
1594
1605
  case "list":
1595
- return /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", marginY: 1, children: token.items.map((item, idx) => /* @__PURE__ */ jsxs(Box2, { children: [
1596
- /* @__PURE__ */ jsx2(Text, { children: token.ordered ? `${idx + 1}. ` : "\u2022 " }),
1597
- /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", children: item.tokens.map((t, i) => /* @__PURE__ */ jsx2(TokenRenderer, { token: t }, i)) })
1606
+ return /* @__PURE__ */ jsx3(Box2, { flexDirection: "column", marginY: 1, children: token.items.map((item, idx) => /* @__PURE__ */ jsxs2(Box2, { children: [
1607
+ /* @__PURE__ */ jsx3(Text2, { children: token.ordered ? `${idx + 1}. ` : "\u2022 " }),
1608
+ /* @__PURE__ */ jsx3(Box2, { flexDirection: "column", children: item.tokens.map((t, i) => /* @__PURE__ */ jsx3(TokenRenderer, { token: t }, i)) })
1598
1609
  ] }, idx)) });
1599
1610
  case "table":
1600
- return /* @__PURE__ */ jsx2(TableRenderer, { token });
1611
+ return /* @__PURE__ */ jsx3(TableRenderer, { token });
1601
1612
  case "hr":
1602
- return /* @__PURE__ */ jsx2(Text, { dimColor: true, children: "\u2500".repeat(40) });
1613
+ return /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "\u2500".repeat(40) });
1603
1614
  case "space":
1604
1615
  return null;
1605
1616
  default:
1606
1617
  if ("text" in token && typeof token.text === "string") {
1607
- return /* @__PURE__ */ jsx2(Text, { children: token.text });
1618
+ return /* @__PURE__ */ jsx3(Text2, { children: token.text });
1608
1619
  }
1609
1620
  return null;
1610
1621
  }
@@ -1617,39 +1628,39 @@ function TableRenderer({ token }) {
1617
1628
  for (const row of token.rows) {
1618
1629
  table.push(row.map((cell) => renderInlineToString(cell.tokens)));
1619
1630
  }
1620
- return /* @__PURE__ */ jsx2(Text, { children: table.toString() });
1631
+ return /* @__PURE__ */ jsx3(Text2, { children: table.toString() });
1621
1632
  }
1622
1633
  function renderInline(tokens) {
1623
1634
  if (!tokens) return null;
1624
1635
  return tokens.map((token, idx) => {
1625
1636
  switch (token.type) {
1626
1637
  case "text":
1627
- return /* @__PURE__ */ jsx2(Text, { children: token.text }, idx);
1638
+ return /* @__PURE__ */ jsx3(Text2, { children: token.text }, idx);
1628
1639
  case "strong":
1629
- return /* @__PURE__ */ jsx2(Text, { bold: true, children: renderInline(token.tokens) }, idx);
1640
+ return /* @__PURE__ */ jsx3(Text2, { bold: true, children: renderInline(token.tokens) }, idx);
1630
1641
  case "em":
1631
- return /* @__PURE__ */ jsx2(Text, { italic: true, children: renderInline(token.tokens) }, idx);
1642
+ return /* @__PURE__ */ jsx3(Text2, { italic: true, children: renderInline(token.tokens) }, idx);
1632
1643
  case "codespan":
1633
- return /* @__PURE__ */ jsxs(Text, { color: "yellow", children: [
1644
+ return /* @__PURE__ */ jsxs2(Text2, { color: "yellow", children: [
1634
1645
  "`",
1635
1646
  token.text,
1636
1647
  "`"
1637
1648
  ] }, idx);
1638
1649
  case "link":
1639
- return /* @__PURE__ */ jsx2(Link, { url: token.href, children: /* @__PURE__ */ jsx2(Text, { color: "blue", children: renderInlineToString(token.tokens) }) }, idx);
1650
+ return /* @__PURE__ */ jsx3(Link, { url: token.href, children: /* @__PURE__ */ jsx3(Text2, { color: "blue", children: renderInlineToString(token.tokens) }) }, idx);
1640
1651
  case "image":
1641
- return /* @__PURE__ */ jsxs(Text, { color: "blue", children: [
1652
+ return /* @__PURE__ */ jsxs2(Text2, { color: "blue", children: [
1642
1653
  "[Image: ",
1643
1654
  token.text || token.href,
1644
1655
  "]"
1645
1656
  ] }, idx);
1646
1657
  case "br":
1647
- return /* @__PURE__ */ jsx2(Text, { children: "\n" }, idx);
1658
+ return /* @__PURE__ */ jsx3(Text2, { children: "\n" }, idx);
1648
1659
  case "del":
1649
- return /* @__PURE__ */ jsx2(Text, { strikethrough: true, children: renderInline(token.tokens) }, idx);
1660
+ return /* @__PURE__ */ jsx3(Text2, { strikethrough: true, children: renderInline(token.tokens) }, idx);
1650
1661
  default:
1651
1662
  if ("text" in token && typeof token.text === "string") {
1652
- return /* @__PURE__ */ jsx2(Text, { children: token.text }, idx);
1663
+ return /* @__PURE__ */ jsx3(Text2, { children: token.text }, idx);
1653
1664
  }
1654
1665
  return null;
1655
1666
  }
@@ -1669,7 +1680,7 @@ function renderInlineToString(tokens) {
1669
1680
  }
1670
1681
 
1671
1682
  // src/components/github/PRDetailsBox.tsx
1672
- import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
1683
+ import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1673
1684
  function PRDetailsBox({ pr, loading, error, isActive }) {
1674
1685
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
1675
1686
  const scrollRef = useRef2(null);
@@ -1700,9 +1711,9 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1700
1711
  const titlePart = `\u256D ${displayTitle} `;
1701
1712
  const dashCount = Math.max(0, columnWidth - titlePart.length - 1);
1702
1713
  const topBorder = `${titlePart}${"\u2500".repeat(dashCount)}\u256E`;
1703
- return /* @__PURE__ */ jsxs2(Box3, { flexDirection: "column", flexGrow: 1, children: [
1704
- /* @__PURE__ */ jsx3(Text2, { color: borderColor, children: topBorder }),
1705
- /* @__PURE__ */ jsx3(
1714
+ return /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", flexGrow: 1, children: [
1715
+ /* @__PURE__ */ jsx4(Text3, { color: borderColor, children: topBorder }),
1716
+ /* @__PURE__ */ jsx4(
1706
1717
  Box3,
1707
1718
  {
1708
1719
  flexDirection: "column",
@@ -1712,22 +1723,20 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1712
1723
  borderStyle: "round",
1713
1724
  borderTop: false,
1714
1725
  borderColor,
1715
- children: /* @__PURE__ */ jsx3(ScrollView, { ref: scrollRef, children: /* @__PURE__ */ jsxs2(Box3, { flexDirection: "column", paddingX: 1, children: [
1716
- loading && /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Loading details..." }),
1717
- error && /* @__PURE__ */ jsx3(Text2, { color: "red", children: error }),
1718
- !loading && !error && !pr && /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Select a PR to view details" }),
1719
- !loading && !error && pr && /* @__PURE__ */ jsxs2(Fragment, { children: [
1720
- /* @__PURE__ */ jsxs2(Box3, { children: [
1721
- /* @__PURE__ */ jsxs2(Text2, { bold: true, children: [
1726
+ children: /* @__PURE__ */ jsx4(ScrollView, { ref: scrollRef, children: /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", paddingX: 1, children: [
1727
+ loading && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Loading details..." }),
1728
+ error && /* @__PURE__ */ jsx4(Text3, { color: "red", children: error }),
1729
+ !loading && !error && !pr && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Select a PR to view details" }),
1730
+ !loading && !error && pr && /* @__PURE__ */ jsxs3(Fragment2, { children: [
1731
+ /* @__PURE__ */ jsxs3(Box3, { children: [
1732
+ /* @__PURE__ */ jsxs3(Text3, { bold: true, children: [
1722
1733
  pr.title,
1723
1734
  " "
1724
1735
  ] }),
1725
- /* @__PURE__ */ jsx3(Text2, { color: mergeDisplay.color, children: "\uE0B6" }),
1726
- /* @__PURE__ */ jsx3(Text2, { color: "black", backgroundColor: mergeDisplay.color, bold: true, children: `${mergeDisplay.text}` }),
1727
- /* @__PURE__ */ jsx3(Text2, { color: mergeDisplay.color, children: "\uE0B4" })
1736
+ /* @__PURE__ */ jsx4(Badge, { color: "black", background: mergeDisplay.color, children: mergeDisplay.text })
1728
1737
  ] }),
1729
- /* @__PURE__ */ jsxs2(Box3, { children: [
1730
- /* @__PURE__ */ jsxs2(Text2, { dimColor: true, children: [
1738
+ /* @__PURE__ */ jsxs3(Box3, { children: [
1739
+ /* @__PURE__ */ jsxs3(Text3, { dimColor: true, children: [
1731
1740
  pr.baseRefName,
1732
1741
  " \u2190 ",
1733
1742
  pr.headRefName,
@@ -1741,52 +1750,48 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1741
1750
  " |",
1742
1751
  " "
1743
1752
  ] }),
1744
- /* @__PURE__ */ jsxs2(Text2, { color: "green", children: [
1753
+ /* @__PURE__ */ jsxs3(Text3, { color: "green", children: [
1745
1754
  "+",
1746
1755
  pr.additions
1747
1756
  ] }),
1748
- /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: " " }),
1749
- /* @__PURE__ */ jsxs2(Text2, { color: "red", children: [
1757
+ /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: " " }),
1758
+ /* @__PURE__ */ jsxs3(Text3, { color: "red", children: [
1750
1759
  "-",
1751
1760
  pr.deletions
1752
1761
  ] })
1753
1762
  ] }),
1754
- (((_c = pr.labels) == null ? void 0 : _c.length) ?? 0) > 0 && /* @__PURE__ */ jsx3(Box3, { gap: 1, children: pr.labels.map((l) => /* @__PURE__ */ jsxs2(Box3, { children: [
1755
- /* @__PURE__ */ jsx3(Text2, { color: "gray", children: "\uE0B6" }),
1756
- /* @__PURE__ */ jsx3(Text2, { color: "black", backgroundColor: "gray", children: l.name }),
1757
- /* @__PURE__ */ jsx3(Text2, { color: "gray", children: "\uE0B4" })
1758
- ] }, l.name)) }),
1759
- /* @__PURE__ */ jsx3(Box3, { marginTop: 1, children: /* @__PURE__ */ jsx3(Divider, {}) }),
1760
- (((_d = pr.assignees) == null ? void 0 : _d.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, children: [
1761
- /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Assignees: " }),
1762
- /* @__PURE__ */ jsx3(Text2, { children: pr.assignees.map((a) => a.login).join(", ") })
1763
+ (((_c = pr.labels) == null ? void 0 : _c.length) ?? 0) > 0 && /* @__PURE__ */ jsx4(Box3, { gap: 1, children: pr.labels.map((l) => /* @__PURE__ */ jsx4(Box3, { children: /* @__PURE__ */ jsx4(Badge, { color: "black", background: "gray", children: l.name }) }, l.name)) }),
1764
+ /* @__PURE__ */ jsx4(Box3, { marginTop: 1, children: /* @__PURE__ */ jsx4(Divider, {}) }),
1765
+ (((_d = pr.assignees) == null ? void 0 : _d.length) ?? 0) > 0 && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, children: [
1766
+ /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Assignees: " }),
1767
+ /* @__PURE__ */ jsx4(Text3, { children: pr.assignees.map((a) => a.login).join(", ") })
1763
1768
  ] }),
1764
- ((((_e = pr.reviews) == null ? void 0 : _e.length) ?? 0) > 0 || (((_f = pr.reviewRequests) == null ? void 0 : _f.length) ?? 0) > 0) && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, flexDirection: "column", children: [
1765
- /* @__PURE__ */ jsxs2(Box3, { children: [
1766
- /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Reviews: " }),
1767
- /* @__PURE__ */ jsx3(Text2, { color: reviewDisplay.color, children: reviewDisplay.text })
1769
+ ((((_e = pr.reviews) == null ? void 0 : _e.length) ?? 0) > 0 || (((_f = pr.reviewRequests) == null ? void 0 : _f.length) ?? 0) > 0) && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, flexDirection: "column", children: [
1770
+ /* @__PURE__ */ jsxs3(Box3, { children: [
1771
+ /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Reviews: " }),
1772
+ /* @__PURE__ */ jsx4(Text3, { color: reviewDisplay.color, children: reviewDisplay.text })
1768
1773
  ] }),
1769
1774
  (_g = pr.reviews) == null ? void 0 : _g.map((review, idx) => {
1770
1775
  const color = review.state === "APPROVED" ? "green" : review.state === "CHANGES_REQUESTED" ? "red" : review.state === "COMMENTED" ? "blue" : "yellow";
1771
1776
  const icon = review.state === "APPROVED" ? "\u2713" : review.state === "CHANGES_REQUESTED" ? "\u2717" : review.state === "COMMENTED" ? "\u{1F4AC}" : "\u25CB";
1772
- return /* @__PURE__ */ jsxs2(Text2, { color, children: [
1777
+ return /* @__PURE__ */ jsxs3(Text3, { color, children: [
1773
1778
  " ",
1774
1779
  icon,
1775
1780
  " ",
1776
1781
  review.author.login
1777
1782
  ] }, idx);
1778
1783
  }),
1779
- (_h = pr.reviewRequests) == null ? void 0 : _h.map((r, idx) => /* @__PURE__ */ jsxs2(Text2, { color: "yellow", children: [
1784
+ (_h = pr.reviewRequests) == null ? void 0 : _h.map((r, idx) => /* @__PURE__ */ jsxs3(Text3, { color: "yellow", children: [
1780
1785
  " ",
1781
1786
  "\u25CB ",
1782
1787
  r.login ?? r.name ?? r.slug ?? "Team",
1783
1788
  " ",
1784
- /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "(pending)" })
1789
+ /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "(pending)" })
1785
1790
  ] }, `pending-${idx}`))
1786
1791
  ] }),
1787
- (((_i = pr.statusCheckRollup) == null ? void 0 : _i.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, flexDirection: "column", children: [
1788
- /* @__PURE__ */ jsx3(Divider, {}),
1789
- /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Checks:" }),
1792
+ (((_i = pr.statusCheckRollup) == null ? void 0 : _i.length) ?? 0) > 0 && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, flexDirection: "column", children: [
1793
+ /* @__PURE__ */ jsx4(Divider, {}),
1794
+ /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Checks:" }),
1790
1795
  Array.from(
1791
1796
  ((_j = pr.statusCheckRollup) == null ? void 0 : _j.reduce((acc, check) => {
1792
1797
  const key = check.name ?? check.context ?? "";
@@ -1800,7 +1805,7 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1800
1805
  const jobName = check.name ?? check.context;
1801
1806
  const displayName = check.workflowName ? `${check.workflowName} / ${jobName}` : jobName;
1802
1807
  const status = resolveCheckStatus(check);
1803
- return /* @__PURE__ */ jsxs2(Text2, { color: CHECK_COLORS[status], children: [
1808
+ return /* @__PURE__ */ jsxs3(Text3, { color: CHECK_COLORS[status], children: [
1804
1809
  " ",
1805
1810
  CHECK_ICONS[status],
1806
1811
  " ",
@@ -1808,10 +1813,10 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1808
1813
  ] }, idx);
1809
1814
  })
1810
1815
  ] }),
1811
- pr.body && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, flexDirection: "column", children: [
1812
- /* @__PURE__ */ jsx3(Divider, {}),
1813
- /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Description:" }),
1814
- /* @__PURE__ */ jsx3(Markdown, { children: pr.body })
1816
+ pr.body && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, flexDirection: "column", children: [
1817
+ /* @__PURE__ */ jsx4(Divider, {}),
1818
+ /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Description:" }),
1819
+ /* @__PURE__ */ jsx4(Markdown, { children: pr.body })
1815
1820
  ] })
1816
1821
  ] })
1817
1822
  ] }) })
@@ -1822,11 +1827,10 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1822
1827
 
1823
1828
  // src/components/github/PullRequestsBox.tsx
1824
1829
  import open2 from "open";
1825
- import { useState as useState10 } from "react";
1830
+ import { useState as useState11 } from "react";
1826
1831
  import { TitledBox } from "@mishieck/ink-titled-box";
1827
- import { Box as Box4, Text as Text3, useInput as useInput3 } from "ink";
1832
+ import { Box as Box4, Text as Text5, useInput as useInput3 } from "ink";
1828
1833
  import { ScrollView as ScrollView2 } from "ink-scroll-view";
1829
- import Spinner from "ink-spinner";
1830
1834
 
1831
1835
  // src/hooks/jira/useJiraTickets.ts
1832
1836
  import { useCallback as useCallback4, useState as useState5 } from "react";
@@ -2600,8 +2604,665 @@ async function copyToClipboard(text) {
2600
2604
  }
2601
2605
  }
2602
2606
 
2607
+ // node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js
2608
+ var ANSI_BACKGROUND_OFFSET = 10;
2609
+ var wrapAnsi16 = (offset = 0) => (code) => `\x1B[${code + offset}m`;
2610
+ var wrapAnsi256 = (offset = 0) => (code) => `\x1B[${38 + offset};5;${code}m`;
2611
+ var wrapAnsi16m = (offset = 0) => (red, green, blue) => `\x1B[${38 + offset};2;${red};${green};${blue}m`;
2612
+ var styles = {
2613
+ modifier: {
2614
+ reset: [0, 0],
2615
+ // 21 isn't widely supported and 22 does the same thing
2616
+ bold: [1, 22],
2617
+ dim: [2, 22],
2618
+ italic: [3, 23],
2619
+ underline: [4, 24],
2620
+ overline: [53, 55],
2621
+ inverse: [7, 27],
2622
+ hidden: [8, 28],
2623
+ strikethrough: [9, 29]
2624
+ },
2625
+ color: {
2626
+ black: [30, 39],
2627
+ red: [31, 39],
2628
+ green: [32, 39],
2629
+ yellow: [33, 39],
2630
+ blue: [34, 39],
2631
+ magenta: [35, 39],
2632
+ cyan: [36, 39],
2633
+ white: [37, 39],
2634
+ // Bright color
2635
+ blackBright: [90, 39],
2636
+ gray: [90, 39],
2637
+ // Alias of `blackBright`
2638
+ grey: [90, 39],
2639
+ // Alias of `blackBright`
2640
+ redBright: [91, 39],
2641
+ greenBright: [92, 39],
2642
+ yellowBright: [93, 39],
2643
+ blueBright: [94, 39],
2644
+ magentaBright: [95, 39],
2645
+ cyanBright: [96, 39],
2646
+ whiteBright: [97, 39]
2647
+ },
2648
+ bgColor: {
2649
+ bgBlack: [40, 49],
2650
+ bgRed: [41, 49],
2651
+ bgGreen: [42, 49],
2652
+ bgYellow: [43, 49],
2653
+ bgBlue: [44, 49],
2654
+ bgMagenta: [45, 49],
2655
+ bgCyan: [46, 49],
2656
+ bgWhite: [47, 49],
2657
+ // Bright color
2658
+ bgBlackBright: [100, 49],
2659
+ bgGray: [100, 49],
2660
+ // Alias of `bgBlackBright`
2661
+ bgGrey: [100, 49],
2662
+ // Alias of `bgBlackBright`
2663
+ bgRedBright: [101, 49],
2664
+ bgGreenBright: [102, 49],
2665
+ bgYellowBright: [103, 49],
2666
+ bgBlueBright: [104, 49],
2667
+ bgMagentaBright: [105, 49],
2668
+ bgCyanBright: [106, 49],
2669
+ bgWhiteBright: [107, 49]
2670
+ }
2671
+ };
2672
+ var modifierNames = Object.keys(styles.modifier);
2673
+ var foregroundColorNames = Object.keys(styles.color);
2674
+ var backgroundColorNames = Object.keys(styles.bgColor);
2675
+ var colorNames = [...foregroundColorNames, ...backgroundColorNames];
2676
+ function assembleStyles() {
2677
+ const codes = /* @__PURE__ */ new Map();
2678
+ for (const [groupName, group] of Object.entries(styles)) {
2679
+ for (const [styleName, style] of Object.entries(group)) {
2680
+ styles[styleName] = {
2681
+ open: `\x1B[${style[0]}m`,
2682
+ close: `\x1B[${style[1]}m`
2683
+ };
2684
+ group[styleName] = styles[styleName];
2685
+ codes.set(style[0], style[1]);
2686
+ }
2687
+ Object.defineProperty(styles, groupName, {
2688
+ value: group,
2689
+ enumerable: false
2690
+ });
2691
+ }
2692
+ Object.defineProperty(styles, "codes", {
2693
+ value: codes,
2694
+ enumerable: false
2695
+ });
2696
+ styles.color.close = "\x1B[39m";
2697
+ styles.bgColor.close = "\x1B[49m";
2698
+ styles.color.ansi = wrapAnsi16();
2699
+ styles.color.ansi256 = wrapAnsi256();
2700
+ styles.color.ansi16m = wrapAnsi16m();
2701
+ styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);
2702
+ styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
2703
+ styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
2704
+ Object.defineProperties(styles, {
2705
+ rgbToAnsi256: {
2706
+ value(red, green, blue) {
2707
+ if (red === green && green === blue) {
2708
+ if (red < 8) {
2709
+ return 16;
2710
+ }
2711
+ if (red > 248) {
2712
+ return 231;
2713
+ }
2714
+ return Math.round((red - 8) / 247 * 24) + 232;
2715
+ }
2716
+ return 16 + 36 * Math.round(red / 255 * 5) + 6 * Math.round(green / 255 * 5) + Math.round(blue / 255 * 5);
2717
+ },
2718
+ enumerable: false
2719
+ },
2720
+ hexToRgb: {
2721
+ value(hex) {
2722
+ const matches = /[a-f\d]{6}|[a-f\d]{3}/i.exec(hex.toString(16));
2723
+ if (!matches) {
2724
+ return [0, 0, 0];
2725
+ }
2726
+ let [colorString] = matches;
2727
+ if (colorString.length === 3) {
2728
+ colorString = [...colorString].map((character) => character + character).join("");
2729
+ }
2730
+ const integer = Number.parseInt(colorString, 16);
2731
+ return [
2732
+ /* eslint-disable no-bitwise */
2733
+ integer >> 16 & 255,
2734
+ integer >> 8 & 255,
2735
+ integer & 255
2736
+ /* eslint-enable no-bitwise */
2737
+ ];
2738
+ },
2739
+ enumerable: false
2740
+ },
2741
+ hexToAnsi256: {
2742
+ value: (hex) => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
2743
+ enumerable: false
2744
+ },
2745
+ ansi256ToAnsi: {
2746
+ value(code) {
2747
+ if (code < 8) {
2748
+ return 30 + code;
2749
+ }
2750
+ if (code < 16) {
2751
+ return 90 + (code - 8);
2752
+ }
2753
+ let red;
2754
+ let green;
2755
+ let blue;
2756
+ if (code >= 232) {
2757
+ red = ((code - 232) * 10 + 8) / 255;
2758
+ green = red;
2759
+ blue = red;
2760
+ } else {
2761
+ code -= 16;
2762
+ const remainder = code % 36;
2763
+ red = Math.floor(code / 36) / 5;
2764
+ green = Math.floor(remainder / 6) / 5;
2765
+ blue = remainder % 6 / 5;
2766
+ }
2767
+ const value = Math.max(red, green, blue) * 2;
2768
+ if (value === 0) {
2769
+ return 30;
2770
+ }
2771
+ let result = 30 + (Math.round(blue) << 2 | Math.round(green) << 1 | Math.round(red));
2772
+ if (value === 2) {
2773
+ result += 60;
2774
+ }
2775
+ return result;
2776
+ },
2777
+ enumerable: false
2778
+ },
2779
+ rgbToAnsi: {
2780
+ value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),
2781
+ enumerable: false
2782
+ },
2783
+ hexToAnsi: {
2784
+ value: (hex) => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),
2785
+ enumerable: false
2786
+ }
2787
+ });
2788
+ return styles;
2789
+ }
2790
+ var ansiStyles = assembleStyles();
2791
+ var ansi_styles_default = ansiStyles;
2792
+
2793
+ // node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js
2794
+ import process2 from "process";
2795
+ import os from "os";
2796
+ import tty from "tty";
2797
+ function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process2.argv) {
2798
+ const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
2799
+ const position = argv.indexOf(prefix + flag);
2800
+ const terminatorPosition = argv.indexOf("--");
2801
+ return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
2802
+ }
2803
+ var { env } = process2;
2804
+ var flagForceColor;
2805
+ if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) {
2806
+ flagForceColor = 0;
2807
+ } else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) {
2808
+ flagForceColor = 1;
2809
+ }
2810
+ function envForceColor() {
2811
+ if ("FORCE_COLOR" in env) {
2812
+ if (env.FORCE_COLOR === "true") {
2813
+ return 1;
2814
+ }
2815
+ if (env.FORCE_COLOR === "false") {
2816
+ return 0;
2817
+ }
2818
+ return env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);
2819
+ }
2820
+ }
2821
+ function translateLevel(level) {
2822
+ if (level === 0) {
2823
+ return false;
2824
+ }
2825
+ return {
2826
+ level,
2827
+ hasBasic: true,
2828
+ has256: level >= 2,
2829
+ has16m: level >= 3
2830
+ };
2831
+ }
2832
+ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
2833
+ const noFlagForceColor = envForceColor();
2834
+ if (noFlagForceColor !== void 0) {
2835
+ flagForceColor = noFlagForceColor;
2836
+ }
2837
+ const forceColor = sniffFlags ? flagForceColor : noFlagForceColor;
2838
+ if (forceColor === 0) {
2839
+ return 0;
2840
+ }
2841
+ if (sniffFlags) {
2842
+ if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) {
2843
+ return 3;
2844
+ }
2845
+ if (hasFlag("color=256")) {
2846
+ return 2;
2847
+ }
2848
+ }
2849
+ if ("TF_BUILD" in env && "AGENT_NAME" in env) {
2850
+ return 1;
2851
+ }
2852
+ if (haveStream && !streamIsTTY && forceColor === void 0) {
2853
+ return 0;
2854
+ }
2855
+ const min = forceColor || 0;
2856
+ if (env.TERM === "dumb") {
2857
+ return min;
2858
+ }
2859
+ if (process2.platform === "win32") {
2860
+ const osRelease = os.release().split(".");
2861
+ if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
2862
+ return Number(osRelease[2]) >= 14931 ? 3 : 2;
2863
+ }
2864
+ return 1;
2865
+ }
2866
+ if ("CI" in env) {
2867
+ if (["GITHUB_ACTIONS", "GITEA_ACTIONS", "CIRCLECI"].some((key) => key in env)) {
2868
+ return 3;
2869
+ }
2870
+ if (["TRAVIS", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env) || env.CI_NAME === "codeship") {
2871
+ return 1;
2872
+ }
2873
+ return min;
2874
+ }
2875
+ if ("TEAMCITY_VERSION" in env) {
2876
+ return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
2877
+ }
2878
+ if (env.COLORTERM === "truecolor") {
2879
+ return 3;
2880
+ }
2881
+ if (env.TERM === "xterm-kitty") {
2882
+ return 3;
2883
+ }
2884
+ if (env.TERM === "xterm-ghostty") {
2885
+ return 3;
2886
+ }
2887
+ if (env.TERM === "wezterm") {
2888
+ return 3;
2889
+ }
2890
+ if ("TERM_PROGRAM" in env) {
2891
+ const version = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
2892
+ switch (env.TERM_PROGRAM) {
2893
+ case "iTerm.app": {
2894
+ return version >= 3 ? 3 : 2;
2895
+ }
2896
+ case "Apple_Terminal": {
2897
+ return 2;
2898
+ }
2899
+ }
2900
+ }
2901
+ if (/-256(color)?$/i.test(env.TERM)) {
2902
+ return 2;
2903
+ }
2904
+ if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
2905
+ return 1;
2906
+ }
2907
+ if ("COLORTERM" in env) {
2908
+ return 1;
2909
+ }
2910
+ return min;
2911
+ }
2912
+ function createSupportsColor(stream, options = {}) {
2913
+ const level = _supportsColor(stream, {
2914
+ streamIsTTY: stream && stream.isTTY,
2915
+ ...options
2916
+ });
2917
+ return translateLevel(level);
2918
+ }
2919
+ var supportsColor = {
2920
+ stdout: createSupportsColor({ isTTY: tty.isatty(1) }),
2921
+ stderr: createSupportsColor({ isTTY: tty.isatty(2) })
2922
+ };
2923
+ var supports_color_default = supportsColor;
2924
+
2925
+ // node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js
2926
+ function stringReplaceAll(string, substring, replacer) {
2927
+ let index = string.indexOf(substring);
2928
+ if (index === -1) {
2929
+ return string;
2930
+ }
2931
+ const substringLength = substring.length;
2932
+ let endIndex = 0;
2933
+ let returnValue = "";
2934
+ do {
2935
+ returnValue += string.slice(endIndex, index) + substring + replacer;
2936
+ endIndex = index + substringLength;
2937
+ index = string.indexOf(substring, endIndex);
2938
+ } while (index !== -1);
2939
+ returnValue += string.slice(endIndex);
2940
+ return returnValue;
2941
+ }
2942
+ function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {
2943
+ let endIndex = 0;
2944
+ let returnValue = "";
2945
+ do {
2946
+ const gotCR = string[index - 1] === "\r";
2947
+ returnValue += string.slice(endIndex, gotCR ? index - 1 : index) + prefix + (gotCR ? "\r\n" : "\n") + postfix;
2948
+ endIndex = index + 1;
2949
+ index = string.indexOf("\n", endIndex);
2950
+ } while (index !== -1);
2951
+ returnValue += string.slice(endIndex);
2952
+ return returnValue;
2953
+ }
2954
+
2955
+ // node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js
2956
+ var { stdout: stdoutColor, stderr: stderrColor } = supports_color_default;
2957
+ var GENERATOR = /* @__PURE__ */ Symbol("GENERATOR");
2958
+ var STYLER = /* @__PURE__ */ Symbol("STYLER");
2959
+ var IS_EMPTY = /* @__PURE__ */ Symbol("IS_EMPTY");
2960
+ var levelMapping = [
2961
+ "ansi",
2962
+ "ansi",
2963
+ "ansi256",
2964
+ "ansi16m"
2965
+ ];
2966
+ var styles2 = /* @__PURE__ */ Object.create(null);
2967
+ var applyOptions = (object, options = {}) => {
2968
+ if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {
2969
+ throw new Error("The `level` option should be an integer from 0 to 3");
2970
+ }
2971
+ const colorLevel = stdoutColor ? stdoutColor.level : 0;
2972
+ object.level = options.level === void 0 ? colorLevel : options.level;
2973
+ };
2974
+ var chalkFactory = (options) => {
2975
+ const chalk2 = (...strings) => strings.join(" ");
2976
+ applyOptions(chalk2, options);
2977
+ Object.setPrototypeOf(chalk2, createChalk.prototype);
2978
+ return chalk2;
2979
+ };
2980
+ function createChalk(options) {
2981
+ return chalkFactory(options);
2982
+ }
2983
+ Object.setPrototypeOf(createChalk.prototype, Function.prototype);
2984
+ for (const [styleName, style] of Object.entries(ansi_styles_default)) {
2985
+ styles2[styleName] = {
2986
+ get() {
2987
+ const builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);
2988
+ Object.defineProperty(this, styleName, { value: builder });
2989
+ return builder;
2990
+ }
2991
+ };
2992
+ }
2993
+ styles2.visible = {
2994
+ get() {
2995
+ const builder = createBuilder(this, this[STYLER], true);
2996
+ Object.defineProperty(this, "visible", { value: builder });
2997
+ return builder;
2998
+ }
2999
+ };
3000
+ var getModelAnsi = (model, level, type, ...arguments_) => {
3001
+ if (model === "rgb") {
3002
+ if (level === "ansi16m") {
3003
+ return ansi_styles_default[type].ansi16m(...arguments_);
3004
+ }
3005
+ if (level === "ansi256") {
3006
+ return ansi_styles_default[type].ansi256(ansi_styles_default.rgbToAnsi256(...arguments_));
3007
+ }
3008
+ return ansi_styles_default[type].ansi(ansi_styles_default.rgbToAnsi(...arguments_));
3009
+ }
3010
+ if (model === "hex") {
3011
+ return getModelAnsi("rgb", level, type, ...ansi_styles_default.hexToRgb(...arguments_));
3012
+ }
3013
+ return ansi_styles_default[type][model](...arguments_);
3014
+ };
3015
+ var usedModels = ["rgb", "hex", "ansi256"];
3016
+ for (const model of usedModels) {
3017
+ styles2[model] = {
3018
+ get() {
3019
+ const { level } = this;
3020
+ return function(...arguments_) {
3021
+ const styler = createStyler(getModelAnsi(model, levelMapping[level], "color", ...arguments_), ansi_styles_default.color.close, this[STYLER]);
3022
+ return createBuilder(this, styler, this[IS_EMPTY]);
3023
+ };
3024
+ }
3025
+ };
3026
+ const bgModel = "bg" + model[0].toUpperCase() + model.slice(1);
3027
+ styles2[bgModel] = {
3028
+ get() {
3029
+ const { level } = this;
3030
+ return function(...arguments_) {
3031
+ const styler = createStyler(getModelAnsi(model, levelMapping[level], "bgColor", ...arguments_), ansi_styles_default.bgColor.close, this[STYLER]);
3032
+ return createBuilder(this, styler, this[IS_EMPTY]);
3033
+ };
3034
+ }
3035
+ };
3036
+ }
3037
+ var proto = Object.defineProperties(() => {
3038
+ }, {
3039
+ ...styles2,
3040
+ level: {
3041
+ enumerable: true,
3042
+ get() {
3043
+ return this[GENERATOR].level;
3044
+ },
3045
+ set(level) {
3046
+ this[GENERATOR].level = level;
3047
+ }
3048
+ }
3049
+ });
3050
+ var createStyler = (open6, close, parent) => {
3051
+ let openAll;
3052
+ let closeAll;
3053
+ if (parent === void 0) {
3054
+ openAll = open6;
3055
+ closeAll = close;
3056
+ } else {
3057
+ openAll = parent.openAll + open6;
3058
+ closeAll = close + parent.closeAll;
3059
+ }
3060
+ return {
3061
+ open: open6,
3062
+ close,
3063
+ openAll,
3064
+ closeAll,
3065
+ parent
3066
+ };
3067
+ };
3068
+ var createBuilder = (self, _styler, _isEmpty) => {
3069
+ const builder = (...arguments_) => applyStyle(builder, arguments_.length === 1 ? "" + arguments_[0] : arguments_.join(" "));
3070
+ Object.setPrototypeOf(builder, proto);
3071
+ builder[GENERATOR] = self;
3072
+ builder[STYLER] = _styler;
3073
+ builder[IS_EMPTY] = _isEmpty;
3074
+ return builder;
3075
+ };
3076
+ var applyStyle = (self, string) => {
3077
+ if (self.level <= 0 || !string) {
3078
+ return self[IS_EMPTY] ? "" : string;
3079
+ }
3080
+ let styler = self[STYLER];
3081
+ if (styler === void 0) {
3082
+ return string;
3083
+ }
3084
+ const { openAll, closeAll } = styler;
3085
+ if (string.includes("\x1B")) {
3086
+ while (styler !== void 0) {
3087
+ string = stringReplaceAll(string, styler.close, styler.open);
3088
+ styler = styler.parent;
3089
+ }
3090
+ }
3091
+ const lfIndex = string.indexOf("\n");
3092
+ if (lfIndex !== -1) {
3093
+ string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);
3094
+ }
3095
+ return openAll + string + closeAll;
3096
+ };
3097
+ Object.defineProperties(createChalk.prototype, styles2);
3098
+ var chalk = createChalk();
3099
+ var chalkStderr = createChalk({ level: stderrColor ? stderrColor.level : 0 });
3100
+ var source_default = chalk;
3101
+
3102
+ // src/components/ui/AnimatedText.tsx
3103
+ import { useEffect as useEffect8, useState as useState10 } from "react";
3104
+ import { Text as Text4 } from "ink";
3105
+ import { jsx as jsx5 } from "react/jsx-runtime";
3106
+ function hexToRgb(hex) {
3107
+ const h = hex.replace("#", "");
3108
+ const n = h.length === 3 ? parseInt(h[0] + h[0] + h[1] + h[1] + h[2] + h[2], 16) : parseInt(h, 16);
3109
+ return [n >> 16 & 255, n >> 8 & 255, n & 255];
3110
+ }
3111
+ var DELAYS = {
3112
+ pulse: 16,
3113
+ neon: 500,
3114
+ radar: 50,
3115
+ karaoke: 50,
3116
+ rainbow: 15,
3117
+ glitch: 55
3118
+ };
3119
+ var GLITCH_CHARS = "\u2593\u2592\u2591\u2588\u2580\u2584\u258C\u2590\u2500\u2502\u2524\u2510\u2514\u2518\u251C\u252C\u2534\u253C";
3120
+ var TOTAL_PULSE_FRAMES = 120;
3121
+ function lerp(a, b, t) {
3122
+ return Math.round(a + (b - a) * t);
3123
+ }
3124
+ function applyPulse(text, frame, config) {
3125
+ const [br, bg, bb] = hexToRgb((config == null ? void 0 : config.baseColor) ?? "#E6E6E6");
3126
+ const [pr, pg, pb] = hexToRgb((config == null ? void 0 : config.pulseColor) ?? "#FF1010");
3127
+ const t = (Math.sin(frame / TOTAL_PULSE_FRAMES * Math.PI * 2) + 1) / 2;
3128
+ const r = lerp(br, pr, t);
3129
+ const g = lerp(bg, pg, t);
3130
+ const b = lerp(bb, pb, t);
3131
+ return source_default.rgb(r, g, b)(text);
3132
+ }
3133
+ function applyNeon(text, frame, config) {
3134
+ const on = frame % 2 === 0;
3135
+ const onColor = (config == null ? void 0 : config.onColor) ?? "#00FFFF";
3136
+ const offColor = (config == null ? void 0 : config.offColor) ?? "#325050";
3137
+ return on ? source_default.hex(onColor)(text) : source_default.hex(offColor)(text);
3138
+ }
3139
+ function applyRadar(text, frame, config) {
3140
+ const [br, bg, bb] = hexToRgb((config == null ? void 0 : config.baseColor) ?? "#3C3C3C");
3141
+ const depth = Math.max(1, Math.floor(text.length * 0.2));
3142
+ const globalPos = frame % (text.length + depth);
3143
+ const chars = [];
3144
+ for (let i = 0; i < text.length; i++) {
3145
+ const pos = -(i - globalPos);
3146
+ if (pos > 0 && pos <= depth - 1) {
3147
+ const t = (depth - pos) / depth;
3148
+ chars.push(source_default.rgb(lerp(br, 255, t), lerp(bg, 255, t), lerp(bb, 255, t))(text[i]));
3149
+ } else {
3150
+ chars.push(source_default.rgb(br, bg, bb)(text[i]));
3151
+ }
3152
+ }
3153
+ return chars.join("");
3154
+ }
3155
+ function applyKaraoke(text, frame, config) {
3156
+ const highlightColor = (config == null ? void 0 : config.highlightColor) ?? "#FFBB00";
3157
+ const baseColor = (config == null ? void 0 : config.baseColor) ?? "#FFFFFF";
3158
+ const pos = frame % (text.length + 20) - 10;
3159
+ if (pos < 0) {
3160
+ return source_default.hex(baseColor)(text);
3161
+ }
3162
+ return source_default.hex(highlightColor).bold(text.substring(0, pos)) + source_default.hex(baseColor)(text.substring(pos));
3163
+ }
3164
+ function hsvToRgb(h, s, v) {
3165
+ const i = Math.floor(h / 60) % 6;
3166
+ const f = h / 60 - Math.floor(h / 60);
3167
+ const p = v * (1 - s);
3168
+ const q = v * (1 - f * s);
3169
+ const t = v * (1 - (1 - f) * s);
3170
+ const map = [
3171
+ [v, t, p],
3172
+ [q, v, p],
3173
+ [p, v, t],
3174
+ [p, q, v],
3175
+ [t, p, v],
3176
+ [v, p, q]
3177
+ ];
3178
+ return map[i].map((c) => Math.round(c * 255));
3179
+ }
3180
+ function applyRainbow(text, frame, config) {
3181
+ const sat = (config == null ? void 0 : config.saturation) ?? 1;
3182
+ const bri = (config == null ? void 0 : config.brightness) ?? 1;
3183
+ const hueStart = 5 * frame % 360;
3184
+ const chars = [];
3185
+ for (let i = 0; i < text.length; i++) {
3186
+ const hue = (hueStart + i * 360 / Math.max(text.length, 1)) % 360;
3187
+ const [r, g, b] = hsvToRgb(hue, sat, bri);
3188
+ chars.push(source_default.rgb(r, g, b)(text[i]));
3189
+ }
3190
+ return chars.join("");
3191
+ }
3192
+ function applyGlitch(text, frame) {
3193
+ if (frame % 2 + frame % 3 + frame % 11 + frame % 29 + frame % 37 > 52) {
3194
+ return text.replace(/[^\r\n]/g, " ");
3195
+ }
3196
+ const chunkSize = Math.max(3, Math.round(text.length * 0.02));
3197
+ const chars = [];
3198
+ for (let i = 0; i < text.length; i++) {
3199
+ const skip = Math.round(Math.max(0, (Math.random() - 0.8) * chunkSize));
3200
+ chars.push(text.substring(i, i + skip).replace(/[^\r\n]/g, " "));
3201
+ i += skip;
3202
+ if (text[i]) {
3203
+ if (text[i] !== "\n" && text[i] !== "\r" && Math.random() > 0.995) {
3204
+ chars.push(GLITCH_CHARS[Math.floor(Math.random() * GLITCH_CHARS.length)]);
3205
+ } else if (Math.random() > 5e-3) {
3206
+ chars.push(text[i]);
3207
+ }
3208
+ }
3209
+ }
3210
+ return chars.join("");
3211
+ }
3212
+ function applyAnimation(text, name, frame, config) {
3213
+ switch (name) {
3214
+ case "pulse":
3215
+ return applyPulse(text, frame, config);
3216
+ case "neon":
3217
+ return applyNeon(text, frame, config);
3218
+ case "radar":
3219
+ return applyRadar(text, frame, config);
3220
+ case "karaoke":
3221
+ return applyKaraoke(text, frame, config);
3222
+ case "rainbow":
3223
+ return applyRainbow(text, frame, config);
3224
+ case "glitch":
3225
+ return applyGlitch(text, frame);
3226
+ }
3227
+ }
3228
+ function flattenChildren(children) {
3229
+ if (typeof children === "string") return children;
3230
+ if (typeof children === "number") return String(children);
3231
+ if (children == null || typeof children === "boolean") return "";
3232
+ if (Array.isArray(children)) return children.map(flattenChildren).join("");
3233
+ return "";
3234
+ }
3235
+ function AnimatedText({
3236
+ name = "pulse",
3237
+ speed = 1,
3238
+ bold,
3239
+ italic,
3240
+ underline,
3241
+ strikethrough,
3242
+ dimColor,
3243
+ config,
3244
+ children
3245
+ }) {
3246
+ const [frame, setFrame] = useState10(0);
3247
+ const text = flattenChildren(children);
3248
+ useEffect8(() => {
3249
+ const delay = DELAYS[name] / speed;
3250
+ const interval = setInterval(() => {
3251
+ setFrame((f) => f + 1);
3252
+ }, delay);
3253
+ return () => clearInterval(interval);
3254
+ }, [name, speed]);
3255
+ let animated = applyAnimation(text, name, frame, config);
3256
+ if (bold) animated = source_default.bold(animated);
3257
+ if (italic) animated = source_default.italic(animated);
3258
+ if (underline) animated = source_default.underline(animated);
3259
+ if (strikethrough) animated = source_default.strikethrough(animated);
3260
+ if (dimColor) animated = source_default.dim(animated);
3261
+ return /* @__PURE__ */ jsx5(Text4, { children: animated });
3262
+ }
3263
+
2603
3264
  // src/components/github/PullRequestsBox.tsx
2604
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
3265
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
2605
3266
  function PullRequestsBox({
2606
3267
  prs,
2607
3268
  selectedPR,
@@ -2614,7 +3275,7 @@ function PullRequestsBox({
2614
3275
  isActive,
2615
3276
  isGeneratingPR
2616
3277
  }) {
2617
- const [copied, setCopied] = useState10(false);
3278
+ const [copied, setCopied] = useState11(false);
2618
3279
  const selectedIndex = prs.findIndex((p) => p.number === (selectedPR == null ? void 0 : selectedPR.number));
2619
3280
  const { highlightedIndex, scrollRef } = useListNavigation({
2620
3281
  items: prs,
@@ -2651,43 +3312,40 @@ function PullRequestsBox({
2651
3312
  const subtitle = branch ? ` (${branch})` : "";
2652
3313
  const copiedIndicator = copied ? " [Copied!]" : "";
2653
3314
  const borderColor = isActive ? "yellow" : void 0;
2654
- return /* @__PURE__ */ jsx4(
3315
+ return /* @__PURE__ */ jsx6(
2655
3316
  TitledBox,
2656
3317
  {
2657
3318
  borderStyle: "round",
2658
3319
  titles: [`${title}${subtitle}${copiedIndicator}`],
2659
3320
  borderColor,
2660
3321
  height: 5,
2661
- children: /* @__PURE__ */ jsxs3(Box4, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
2662
- loading && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Loading PRs..." }),
2663
- error && /* @__PURE__ */ jsx4(Text3, { color: "red", children: error }),
2664
- isGeneratingPR && /* @__PURE__ */ jsxs3(Text3, { color: "yellow", children: [
2665
- /* @__PURE__ */ jsx4(Spinner, { type: "dots" }),
2666
- " Generating PR with Claude... (Esc to cancel)"
2667
- ] }),
2668
- !loading && !error && /* @__PURE__ */ jsxs3(ScrollView2, { ref: scrollRef, children: [
2669
- prs.length === 0 && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "No PRs for this branch" }, "empty"),
3322
+ children: /* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
3323
+ loading && /* @__PURE__ */ jsx6(Text5, { dimColor: true, children: "Loading PRs..." }),
3324
+ error && /* @__PURE__ */ jsx6(Text5, { color: "red", children: error }),
3325
+ isGeneratingPR && /* @__PURE__ */ jsx6(AnimatedText, { name: "radar", config: { baseColor: "#CC6600" }, children: "Generating PR with Claude... (Esc to cancel)" }),
3326
+ !loading && !error && /* @__PURE__ */ jsxs4(ScrollView2, { ref: scrollRef, children: [
3327
+ prs.length === 0 && /* @__PURE__ */ jsx6(Text5, { dimColor: true, children: "No PRs for this branch" }, "empty"),
2670
3328
  prs.map((pr, idx) => {
2671
3329
  const isHighlighted = isActive && idx === highlightedIndex;
2672
3330
  const isSelected = pr.number === (selectedPR == null ? void 0 : selectedPR.number);
2673
3331
  const cursor = isHighlighted ? ">" : " ";
2674
3332
  const indicator = isSelected ? " *" : "";
2675
- return /* @__PURE__ */ jsxs3(Box4, { children: [
2676
- /* @__PURE__ */ jsxs3(Text3, { color: isHighlighted ? "yellow" : void 0, children: [
3333
+ return /* @__PURE__ */ jsxs4(Box4, { children: [
3334
+ /* @__PURE__ */ jsxs4(Text5, { color: isHighlighted ? "yellow" : void 0, children: [
2677
3335
  cursor,
2678
3336
  " "
2679
3337
  ] }),
2680
- /* @__PURE__ */ jsxs3(Text3, { color: isSelected ? "green" : void 0, children: [
3338
+ /* @__PURE__ */ jsxs4(Text5, { color: isSelected ? "green" : void 0, children: [
2681
3339
  "#",
2682
3340
  pr.number,
2683
3341
  " ",
2684
3342
  pr.isDraft ? "[Draft] " : "",
2685
3343
  pr.title
2686
3344
  ] }),
2687
- /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: indicator })
3345
+ /* @__PURE__ */ jsx6(Text5, { dimColor: true, children: indicator })
2688
3346
  ] }, pr.number);
2689
3347
  }),
2690
- /* @__PURE__ */ jsxs3(Text3, { color: "blue", children: [
3348
+ /* @__PURE__ */ jsxs4(Text5, { color: "blue", children: [
2691
3349
  isActive && highlightedIndex === prs.length ? "> " : " ",
2692
3350
  "+ Create new PR"
2693
3351
  ] }, "create")
@@ -2699,9 +3357,9 @@ function PullRequestsBox({
2699
3357
 
2700
3358
  // src/components/github/RemotesBox.tsx
2701
3359
  import { TitledBox as TitledBox2 } from "@mishieck/ink-titled-box";
2702
- import { Box as Box5, Text as Text4 } from "ink";
3360
+ import { Box as Box5, Text as Text6 } from "ink";
2703
3361
  import { ScrollView as ScrollView3 } from "ink-scroll-view";
2704
- import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
3362
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
2705
3363
  function RemotesBox({ remotes, selectedRemote, onSelect, loading, error, isActive }) {
2706
3364
  const selectedIndex = remotes.findIndex((r) => r.name === selectedRemote);
2707
3365
  const { highlightedIndex, scrollRef } = useListNavigation({
@@ -2712,52 +3370,52 @@ function RemotesBox({ remotes, selectedRemote, onSelect, loading, error, isActiv
2712
3370
  });
2713
3371
  const title = "[1] Remotes";
2714
3372
  const borderColor = isActive ? "yellow" : void 0;
2715
- return /* @__PURE__ */ jsx5(TitledBox2, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs4(Box5, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
2716
- loading && /* @__PURE__ */ jsx5(Text4, { dimColor: true, children: "Loading..." }),
2717
- error && /* @__PURE__ */ jsx5(Text4, { color: "red", children: error }),
2718
- !loading && !error && remotes.length === 0 && /* @__PURE__ */ jsx5(Text4, { dimColor: true, children: "No remotes configured" }),
2719
- !loading && !error && remotes.length > 0 && /* @__PURE__ */ jsx5(ScrollView3, { ref: scrollRef, children: remotes.map((remote, idx) => {
3373
+ return /* @__PURE__ */ jsx7(TitledBox2, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
3374
+ loading && /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: "Loading..." }),
3375
+ error && /* @__PURE__ */ jsx7(Text6, { color: "red", children: error }),
3376
+ !loading && !error && remotes.length === 0 && /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: "No remotes configured" }),
3377
+ !loading && !error && remotes.length > 0 && /* @__PURE__ */ jsx7(ScrollView3, { ref: scrollRef, children: remotes.map((remote, idx) => {
2720
3378
  const isHighlighted = isActive && idx === highlightedIndex;
2721
3379
  const isSelected = remote.name === selectedRemote;
2722
3380
  const cursor = isHighlighted ? ">" : " ";
2723
3381
  const indicator = isSelected ? " *" : "";
2724
- return /* @__PURE__ */ jsxs4(Box5, { children: [
2725
- /* @__PURE__ */ jsxs4(Text4, { color: isHighlighted ? "yellow" : void 0, children: [
3382
+ return /* @__PURE__ */ jsxs5(Box5, { children: [
3383
+ /* @__PURE__ */ jsxs5(Text6, { color: isHighlighted ? "yellow" : void 0, children: [
2726
3384
  cursor,
2727
3385
  " "
2728
3386
  ] }),
2729
- /* @__PURE__ */ jsxs4(Text4, { color: isSelected ? "green" : void 0, children: [
3387
+ /* @__PURE__ */ jsxs5(Text6, { color: isSelected ? "green" : void 0, children: [
2730
3388
  remote.name,
2731
3389
  " (",
2732
3390
  remote.url,
2733
3391
  ")"
2734
3392
  ] }),
2735
- /* @__PURE__ */ jsx5(Text4, { dimColor: true, children: indicator })
3393
+ /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: indicator })
2736
3394
  ] }, remote.name);
2737
3395
  }) })
2738
3396
  ] }) });
2739
3397
  }
2740
3398
 
2741
3399
  // src/components/github/GitHubView.tsx
2742
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
3400
+ import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
2743
3401
  function GitHubView({ isActive, onFocusedBoxChange, onLogUpdated }) {
2744
3402
  const repo = useGitRepo();
2745
3403
  const pullRequests = usePullRequests();
2746
- const [focusedBox, setFocusedBox] = useState11("remotes");
2747
- const [isGeneratingPR, setIsGeneratingPR] = useState11(false);
3404
+ const [focusedBox, setFocusedBox] = useState12("remotes");
3405
+ const [isGeneratingPR, setIsGeneratingPR] = useState12(false);
2748
3406
  const claudeProcessRef = useRef5(null);
2749
3407
  const previewScrollRef = useRef5(null);
2750
- const [prPreview, setPrPreview] = useState11(null);
2751
- useEffect8(() => {
3408
+ const [prPreview, setPrPreview] = useState12(null);
3409
+ useEffect9(() => {
2752
3410
  if (repo.loading || !repo.currentBranch || !repo.currentRepoSlug) return;
2753
3411
  pullRequests.fetchPRsAndDetails(repo.currentBranch, repo.currentRepoSlug);
2754
3412
  }, [repo.loading, repo.currentBranch, repo.currentRepoSlug, pullRequests.fetchPRsAndDetails]);
2755
- useEffect8(() => {
3413
+ useEffect9(() => {
2756
3414
  if (isActive) {
2757
3415
  repo.refreshBranch();
2758
3416
  }
2759
3417
  }, [isActive, repo.refreshBranch]);
2760
- useEffect8(() => {
3418
+ useEffect9(() => {
2761
3419
  onFocusedBoxChange == null ? void 0 : onFocusedBoxChange(focusedBox);
2762
3420
  }, [focusedBox, onFocusedBoxChange]);
2763
3421
  const handleRemoteSelect = useCallback8(
@@ -2776,7 +3434,7 @@ function GitHubView({ isActive, onFocusedBoxChange, onLogUpdated }) {
2776
3434
  onLogUpdatedRef.current = onLogUpdated;
2777
3435
  const prsRef = useRef5(pullRequests.prs);
2778
3436
  prsRef.current = pullRequests.prs;
2779
- useEffect8(() => {
3437
+ useEffect9(() => {
2780
3438
  return () => {
2781
3439
  var _a;
2782
3440
  (_a = claudeProcessRef.current) == null ? void 0 : _a.cancel();
@@ -2799,9 +3457,9 @@ function GitHubView({ isActive, onFocusedBoxChange, onLogUpdated }) {
2799
3457
  const branch = repo.currentBranch;
2800
3458
  const repoPath = repo.repoPath;
2801
3459
  const owner = remoteResult.data.owner;
2802
- const process2 = generatePRContent();
2803
- claudeProcessRef.current = process2;
2804
- process2.promise.then((result) => {
3460
+ const process3 = generatePRContent();
3461
+ claudeProcessRef.current = process3;
3462
+ process3.promise.then((result) => {
2805
3463
  claudeProcessRef.current = null;
2806
3464
  setIsGeneratingPR(false);
2807
3465
  if (!result.success) {
@@ -2955,10 +3613,10 @@ ${body}`;
2955
3613
  { isActive }
2956
3614
  );
2957
3615
  if (repo.isRepo === false) {
2958
- return /* @__PURE__ */ jsx6(TitledBox3, { borderStyle: "round", titles: ["Error"], flexGrow: 1, children: /* @__PURE__ */ jsx6(Text5, { color: "red", children: "Current directory is not a git repository" }) });
3616
+ return /* @__PURE__ */ jsx8(TitledBox3, { borderStyle: "round", titles: ["Error"], flexGrow: 1, children: /* @__PURE__ */ jsx8(Text7, { color: "red", children: "Current directory is not a git repository" }) });
2959
3617
  }
2960
- return /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", flexGrow: 1, children: [
2961
- /* @__PURE__ */ jsx6(
3618
+ return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", flexGrow: 1, children: [
3619
+ /* @__PURE__ */ jsx8(
2962
3620
  RemotesBox,
2963
3621
  {
2964
3622
  remotes: repo.remotes,
@@ -2969,7 +3627,7 @@ ${body}`;
2969
3627
  isActive: isActive && !prPreview && focusedBox === "remotes"
2970
3628
  }
2971
3629
  ),
2972
- /* @__PURE__ */ jsx6(
3630
+ /* @__PURE__ */ jsx8(
2973
3631
  PullRequestsBox,
2974
3632
  {
2975
3633
  prs: pullRequests.prs,
@@ -2984,7 +3642,7 @@ ${body}`;
2984
3642
  isGeneratingPR
2985
3643
  }
2986
3644
  ),
2987
- /* @__PURE__ */ jsx6(
3645
+ /* @__PURE__ */ jsx8(
2988
3646
  PRDetailsBox,
2989
3647
  {
2990
3648
  pr: pullRequests.prDetails,
@@ -2993,28 +3651,28 @@ ${body}`;
2993
3651
  isActive: isActive && !prPreview && focusedBox === "details"
2994
3652
  }
2995
3653
  ),
2996
- prPreview && /* @__PURE__ */ jsx6(TitledBox3, { borderStyle: "round", titles: ["PR Preview"], borderColor: "yellow", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", paddingX: 1, flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
2997
- /* @__PURE__ */ jsx6(Box6, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: /* @__PURE__ */ jsx6(ScrollView4, { ref: previewScrollRef, children: /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", children: [
2998
- /* @__PURE__ */ jsx6(Text5, { bold: true, children: prPreview.title }),
2999
- /* @__PURE__ */ jsx6(Text5, { children: "" }),
3000
- /* @__PURE__ */ jsx6(Text5, { children: prPreview.body })
3654
+ prPreview && /* @__PURE__ */ jsx8(TitledBox3, { borderStyle: "round", titles: ["PR Preview"], borderColor: "yellow", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", paddingX: 1, flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
3655
+ /* @__PURE__ */ jsx8(Box6, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: /* @__PURE__ */ jsx8(ScrollView4, { ref: previewScrollRef, children: /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", children: [
3656
+ /* @__PURE__ */ jsx8(Text7, { bold: true, children: prPreview.title }),
3657
+ /* @__PURE__ */ jsx8(Text7, { children: "" }),
3658
+ /* @__PURE__ */ jsx8(Text7, { children: prPreview.body })
3001
3659
  ] }) }) }),
3002
- /* @__PURE__ */ jsx6(Text5, { dimColor: true, children: "Enter to apply, Esc to dismiss, j/k to scroll" })
3660
+ /* @__PURE__ */ jsx8(Text7, { dimColor: true, children: "Enter to apply, Esc to dismiss, j/k to scroll" })
3003
3661
  ] }) })
3004
3662
  ] });
3005
3663
  }
3006
3664
 
3007
3665
  // src/components/jira-browser/JiraBrowserView.tsx
3008
- import { useCallback as useCallback10, useEffect as useEffect12, useMemo as useMemo3, useRef as useRef7, useState as useState16 } from "react";
3666
+ import { useCallback as useCallback10, useEffect as useEffect13, useMemo as useMemo3, useRef as useRef7, useState as useState17 } from "react";
3009
3667
  import { Box as Box12, useInput as useInput10 } from "ink";
3010
3668
 
3011
3669
  // src/components/jira-browser/AddViewModal.tsx
3012
- import { useState as useState12 } from "react";
3013
- import { Box as Box8, Text as Text7, useInput as useInput6 } from "ink";
3670
+ import { useState as useState13 } from "react";
3671
+ import { Box as Box8, Text as Text9, useInput as useInput6 } from "ink";
3014
3672
 
3015
3673
  // src/components/ui/TextInput.tsx
3016
- import { Box as Box7, Text as Text6, useInput as useInput5 } from "ink";
3017
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
3674
+ import { Box as Box7, Text as Text8, useInput as useInput5 } from "ink";
3675
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
3018
3676
  function TextInput({ value, onChange, placeholder, isActive, mask }) {
3019
3677
  useInput5(
3020
3678
  (input, key) => {
@@ -3038,18 +3696,18 @@ function TextInput({ value, onChange, placeholder, isActive, mask }) {
3038
3696
  );
3039
3697
  const displayValue = mask ? "*".repeat(value.length) : value;
3040
3698
  const showPlaceholder = value.length === 0 && placeholder;
3041
- return /* @__PURE__ */ jsx7(Box7, { children: /* @__PURE__ */ jsxs6(Text6, { children: [
3042
- showPlaceholder ? /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: placeholder }) : /* @__PURE__ */ jsx7(Text6, { children: displayValue }),
3043
- isActive && /* @__PURE__ */ jsx7(Text6, { backgroundColor: "yellow", children: " " })
3699
+ return /* @__PURE__ */ jsx9(Box7, { children: /* @__PURE__ */ jsxs7(Text8, { children: [
3700
+ showPlaceholder ? /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: placeholder }) : /* @__PURE__ */ jsx9(Text8, { children: displayValue }),
3701
+ isActive && /* @__PURE__ */ jsx9(Text8, { backgroundColor: "yellow", children: " " })
3044
3702
  ] }) });
3045
3703
  }
3046
3704
 
3047
3705
  // src/components/jira-browser/AddViewModal.tsx
3048
- import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
3706
+ import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
3049
3707
  function AddViewModal({ onSubmit, onCancel, loading, error }) {
3050
- const [url, setUrl] = useState12("");
3051
- const [name, setName] = useState12("");
3052
- const [activeField, setActiveField] = useState12("url");
3708
+ const [url, setUrl] = useState13("");
3709
+ const [name, setName] = useState13("");
3710
+ const [activeField, setActiveField] = useState13("url");
3053
3711
  const canSubmit = url.trim().length > 0;
3054
3712
  useInput6(
3055
3713
  (_input, key) => {
@@ -3069,14 +3727,14 @@ function AddViewModal({ onSubmit, onCancel, loading, error }) {
3069
3727
  },
3070
3728
  { isActive: !loading }
3071
3729
  );
3072
- return /* @__PURE__ */ jsxs7(Box8, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
3073
- /* @__PURE__ */ jsx8(Text7, { bold: true, color: "yellow", children: "Add Jira View" }),
3074
- /* @__PURE__ */ jsx8(Text7, { dimColor: true, children: "Tab to switch fields, Enter to save, Esc to cancel" }),
3075
- /* @__PURE__ */ jsx8(Box8, { marginTop: 1 }),
3076
- error && /* @__PURE__ */ jsx8(Box8, { marginBottom: 1, children: /* @__PURE__ */ jsx8(Text7, { color: "red", children: error }) }),
3077
- /* @__PURE__ */ jsxs7(Box8, { children: [
3078
- /* @__PURE__ */ jsx8(Text7, { color: "blue", children: "URL: " }),
3079
- /* @__PURE__ */ jsx8(
3730
+ return /* @__PURE__ */ jsxs8(Box8, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
3731
+ /* @__PURE__ */ jsx10(Text9, { bold: true, color: "yellow", children: "Add Jira View" }),
3732
+ /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "Tab to switch fields, Enter to save, Esc to cancel" }),
3733
+ /* @__PURE__ */ jsx10(Box8, { marginTop: 1 }),
3734
+ error && /* @__PURE__ */ jsx10(Box8, { marginBottom: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "red", children: error }) }),
3735
+ /* @__PURE__ */ jsxs8(Box8, { children: [
3736
+ /* @__PURE__ */ jsx10(Text9, { color: "blue", children: "URL: " }),
3737
+ /* @__PURE__ */ jsx10(
3080
3738
  TextInput,
3081
3739
  {
3082
3740
  value: url,
@@ -3086,9 +3744,9 @@ function AddViewModal({ onSubmit, onCancel, loading, error }) {
3086
3744
  }
3087
3745
  )
3088
3746
  ] }),
3089
- /* @__PURE__ */ jsxs7(Box8, { marginTop: 1, children: [
3090
- /* @__PURE__ */ jsx8(Text7, { color: "blue", children: "Name: " }),
3091
- /* @__PURE__ */ jsx8(
3747
+ /* @__PURE__ */ jsxs8(Box8, { marginTop: 1, children: [
3748
+ /* @__PURE__ */ jsx10(Text9, { color: "blue", children: "Name: " }),
3749
+ /* @__PURE__ */ jsx10(
3092
3750
  TextInput,
3093
3751
  {
3094
3752
  value: name,
@@ -3098,27 +3756,27 @@ function AddViewModal({ onSubmit, onCancel, loading, error }) {
3098
3756
  }
3099
3757
  )
3100
3758
  ] }),
3101
- loading && /* @__PURE__ */ jsx8(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx8(Text7, { color: "yellow", children: "Validating view..." }) }),
3102
- /* @__PURE__ */ jsx8(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx8(Text7, { dimColor: true, children: "Supports: filter URLs, JQL URLs, board URLs" }) })
3759
+ loading && /* @__PURE__ */ jsx10(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "yellow", children: "Validating view..." }) }),
3760
+ /* @__PURE__ */ jsx10(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "Supports: filter URLs, JQL URLs, board URLs" }) })
3103
3761
  ] });
3104
3762
  }
3105
3763
 
3106
3764
  // src/components/jira-browser/JiraSavedViewBrowserBox.tsx
3107
3765
  import open4 from "open";
3108
- import { useCallback as useCallback9, useEffect as useEffect10, useMemo as useMemo2, useState as useState14 } from "react";
3766
+ import { useCallback as useCallback9, useEffect as useEffect11, useMemo as useMemo2, useState as useState15 } from "react";
3109
3767
  import { TitledBox as TitledBox4 } from "@mishieck/ink-titled-box";
3110
- import { Box as Box10, Text as Text9, useInput as useInput8 } from "ink";
3768
+ import { Box as Box10, Text as Text11, useInput as useInput8 } from "ink";
3111
3769
  import { ScrollView as ScrollView6 } from "ink-scroll-view";
3112
- import Spinner3 from "ink-spinner";
3770
+ import Spinner2 from "ink-spinner";
3113
3771
 
3114
3772
  // src/components/jira-browser/JiraIssueDetailView.tsx
3115
3773
  import open3 from "open";
3116
- import { useEffect as useEffect9, useRef as useRef6, useState as useState13 } from "react";
3117
- import { Box as Box9, Text as Text8, useInput as useInput7 } from "ink";
3774
+ import { useEffect as useEffect10, useRef as useRef6, useState as useState14 } from "react";
3775
+ import { Box as Box9, Text as Text10, useInput as useInput7 } from "ink";
3118
3776
  import { ScrollView as ScrollView5 } from "ink-scroll-view";
3119
3777
  import SelectInput from "ink-select-input";
3120
- import Spinner2 from "ink-spinner";
3121
- import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
3778
+ import Spinner from "ink-spinner";
3779
+ import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
3122
3780
  function JiraIssueDetailView({
3123
3781
  issueKey,
3124
3782
  issueSummary,
@@ -3132,15 +3790,15 @@ function JiraIssueDetailView({
3132
3790
  }) {
3133
3791
  var _a, _b;
3134
3792
  const scrollRef = useRef6(null);
3135
- const [detail, setDetail] = useState13(null);
3136
- const [loading, setLoading] = useState13(true);
3137
- const [error, setError] = useState13(null);
3138
- const [mode, setMode] = useState13("normal");
3139
- const [transitions, setTransitions] = useState13([]);
3140
- const [transitionsLoading, setTransitionsLoading] = useState13(false);
3141
- const [actionLoading, setActionLoading] = useState13(null);
3142
- const [actionError, setActionError] = useState13(null);
3143
- useEffect9(() => {
3793
+ const [detail, setDetail] = useState14(null);
3794
+ const [loading, setLoading] = useState14(true);
3795
+ const [error, setError] = useState14(null);
3796
+ const [mode, setMode] = useState14("normal");
3797
+ const [transitions, setTransitions] = useState14([]);
3798
+ const [transitionsLoading, setTransitionsLoading] = useState14(false);
3799
+ const [actionLoading, setActionLoading] = useState14(null);
3800
+ const [actionError, setActionError] = useState14(null);
3801
+ useEffect10(() => {
3144
3802
  setLoading(true);
3145
3803
  setError(null);
3146
3804
  getIssueDetail(auth, issueKey).then((result) => {
@@ -3261,44 +3919,44 @@ function JiraIssueDetailView({
3261
3919
  const descriptionMd = (detail == null ? void 0 : detail.fields.description) ? adfToMarkdown(detail.fields.description) : null;
3262
3920
  const comments = (detail == null ? void 0 : detail.fields.comment.comments) ?? [];
3263
3921
  const totalComments = (detail == null ? void 0 : detail.fields.comment.total) ?? 0;
3264
- return /* @__PURE__ */ jsxs8(Box9, { flexDirection: "column", flexGrow: 1, children: [
3265
- /* @__PURE__ */ jsxs8(Box9, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
3266
- loading && /* @__PURE__ */ jsx9(Box9, { paddingX: 1, children: /* @__PURE__ */ jsxs8(Text8, { color: "yellow", children: [
3267
- /* @__PURE__ */ jsx9(Spinner2, { type: "dots" }),
3922
+ return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", flexGrow: 1, children: [
3923
+ /* @__PURE__ */ jsxs9(Box9, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
3924
+ loading && /* @__PURE__ */ jsx11(Box9, { paddingX: 1, children: /* @__PURE__ */ jsxs9(Text10, { color: "yellow", children: [
3925
+ /* @__PURE__ */ jsx11(Spinner, { type: "dots" }),
3268
3926
  " Loading issue details..."
3269
3927
  ] }) }),
3270
- error && /* @__PURE__ */ jsx9(Box9, { paddingX: 1, children: /* @__PURE__ */ jsx9(Text8, { color: "red", children: error }) }),
3271
- !loading && !error && detail && /* @__PURE__ */ jsx9(ScrollView5, { ref: scrollRef, children: /* @__PURE__ */ jsxs8(Box9, { flexDirection: "column", paddingX: 1, children: [
3272
- /* @__PURE__ */ jsxs8(Box9, { children: [
3273
- /* @__PURE__ */ jsx9(Text8, { bold: true, color: "blue", children: detail.key }),
3274
- /* @__PURE__ */ jsxs8(Text8, { bold: true, children: [
3928
+ error && /* @__PURE__ */ jsx11(Box9, { paddingX: 1, children: /* @__PURE__ */ jsx11(Text10, { color: "red", children: error }) }),
3929
+ !loading && !error && detail && /* @__PURE__ */ jsx11(ScrollView5, { ref: scrollRef, children: /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", paddingX: 1, children: [
3930
+ /* @__PURE__ */ jsxs9(Box9, { children: [
3931
+ /* @__PURE__ */ jsx11(Text10, { bold: true, color: "blue", children: detail.key }),
3932
+ /* @__PURE__ */ jsxs9(Text10, { bold: true, children: [
3275
3933
  " ",
3276
3934
  detail.fields.summary
3277
3935
  ] })
3278
3936
  ] }),
3279
- /* @__PURE__ */ jsxs8(Box9, { gap: 1, children: [
3280
- /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "Status:" }),
3281
- /* @__PURE__ */ jsx9(Text8, { color: statusColor, children: detail.fields.status.name }),
3282
- /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "Assignee:" }),
3283
- /* @__PURE__ */ jsx9(Text8, { children: ((_a = detail.fields.assignee) == null ? void 0 : _a.displayName) ?? "Unassigned" }),
3284
- /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "Reporter:" }),
3285
- /* @__PURE__ */ jsx9(Text8, { children: ((_b = detail.fields.reporter) == null ? void 0 : _b.displayName) ?? "Unknown" })
3937
+ /* @__PURE__ */ jsxs9(Box9, { gap: 1, children: [
3938
+ /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Status:" }),
3939
+ /* @__PURE__ */ jsx11(Text10, { color: statusColor, children: detail.fields.status.name }),
3940
+ /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Assignee:" }),
3941
+ /* @__PURE__ */ jsx11(Text10, { children: ((_a = detail.fields.assignee) == null ? void 0 : _a.displayName) ?? "Unassigned" }),
3942
+ /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Reporter:" }),
3943
+ /* @__PURE__ */ jsx11(Text10, { children: ((_b = detail.fields.reporter) == null ? void 0 : _b.displayName) ?? "Unknown" })
3286
3944
  ] }),
3287
- /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx9(Divider, {}) }),
3288
- /* @__PURE__ */ jsxs8(Box9, { marginTop: 1, flexDirection: "column", children: [
3289
- /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "Description:" }),
3290
- descriptionMd ? /* @__PURE__ */ jsx9(Markdown, { children: descriptionMd }) : /* @__PURE__ */ jsx9(Text8, { dimColor: true, italic: true, children: "No description" })
3945
+ /* @__PURE__ */ jsx11(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx11(Divider, {}) }),
3946
+ /* @__PURE__ */ jsxs9(Box9, { marginTop: 1, flexDirection: "column", children: [
3947
+ /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Description:" }),
3948
+ descriptionMd ? /* @__PURE__ */ jsx11(Markdown, { children: descriptionMd }) : /* @__PURE__ */ jsx11(Text10, { dimColor: true, italic: true, children: "No description" })
3291
3949
  ] }),
3292
- /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx9(Divider, {}) }),
3293
- /* @__PURE__ */ jsxs8(Box9, { marginTop: 1, flexDirection: "column", children: [
3294
- /* @__PURE__ */ jsxs8(Text8, { dimColor: true, children: [
3950
+ /* @__PURE__ */ jsx11(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx11(Divider, {}) }),
3951
+ /* @__PURE__ */ jsxs9(Box9, { marginTop: 1, flexDirection: "column", children: [
3952
+ /* @__PURE__ */ jsxs9(Text10, { dimColor: true, children: [
3295
3953
  "Comments (",
3296
3954
  totalComments,
3297
3955
  "):"
3298
3956
  ] }),
3299
- comments.length === 0 && /* @__PURE__ */ jsx9(Text8, { dimColor: true, italic: true, children: "No comments" }),
3300
- comments.map((comment) => /* @__PURE__ */ jsx9(CommentBlock, { comment }, comment.id)),
3301
- comments.length < totalComments && /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsxs8(Text8, { dimColor: true, children: [
3957
+ comments.length === 0 && /* @__PURE__ */ jsx11(Text10, { dimColor: true, italic: true, children: "No comments" }),
3958
+ comments.map((comment) => /* @__PURE__ */ jsx11(CommentBlock, { comment }, comment.id)),
3959
+ comments.length < totalComments && /* @__PURE__ */ jsx11(Box9, { marginTop: 1, children: /* @__PURE__ */ jsxs9(Text10, { dimColor: true, children: [
3302
3960
  "Showing ",
3303
3961
  comments.length,
3304
3962
  " of ",
@@ -3308,40 +3966,40 @@ function JiraIssueDetailView({
3308
3966
  ] })
3309
3967
  ] }) })
3310
3968
  ] }),
3311
- mode === "transitions" && /* @__PURE__ */ jsxs8(Box9, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [
3312
- /* @__PURE__ */ jsx9(Text8, { bold: true, color: "yellow", children: "Change Status" }),
3313
- /* @__PURE__ */ jsx9(
3969
+ mode === "transitions" && /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [
3970
+ /* @__PURE__ */ jsx11(Text10, { bold: true, color: "yellow", children: "Change Status" }),
3971
+ /* @__PURE__ */ jsx11(
3314
3972
  SelectInput,
3315
3973
  {
3316
3974
  items: transitions.map((t) => ({ label: t.name, value: t.id })),
3317
3975
  onSelect: handleTransitionSelect
3318
3976
  }
3319
3977
  ),
3320
- /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "Esc to cancel" })
3978
+ /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Esc to cancel" })
3321
3979
  ] }),
3322
- /* @__PURE__ */ jsxs8(Box9, { paddingX: 1, flexDirection: "column", children: [
3323
- actionLoading && /* @__PURE__ */ jsxs8(Text8, { color: "yellow", children: [
3324
- /* @__PURE__ */ jsx9(Spinner2, { type: "dots" }),
3980
+ /* @__PURE__ */ jsxs9(Box9, { paddingX: 1, flexDirection: "column", children: [
3981
+ actionLoading && /* @__PURE__ */ jsxs9(Text10, { color: "yellow", children: [
3982
+ /* @__PURE__ */ jsx11(Spinner, { type: "dots" }),
3325
3983
  " ",
3326
3984
  actionLoading
3327
3985
  ] }),
3328
- actionError && /* @__PURE__ */ jsx9(Text8, { color: "red", children: actionError }),
3329
- transitionsLoading && /* @__PURE__ */ jsxs8(Text8, { color: "yellow", children: [
3330
- /* @__PURE__ */ jsx9(Spinner2, { type: "dots" }),
3986
+ actionError && /* @__PURE__ */ jsx11(Text10, { color: "red", children: actionError }),
3987
+ transitionsLoading && /* @__PURE__ */ jsxs9(Text10, { color: "yellow", children: [
3988
+ /* @__PURE__ */ jsx11(Spinner, { type: "dots" }),
3331
3989
  " Loading transitions..."
3332
3990
  ] }),
3333
- !actionLoading && !transitionsLoading && mode === "normal" && /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "Esc close \xB7 j/k scroll \xB7 s status \xB7 a assign \xB7 A unassign \xB7 o open \xB7 y copy" })
3991
+ !actionLoading && !transitionsLoading && mode === "normal" && /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Esc close \xB7 j/k scroll \xB7 s status \xB7 a assign \xB7 A unassign \xB7 o open \xB7 y copy" })
3334
3992
  ] })
3335
3993
  ] });
3336
3994
  }
3337
3995
  function CommentBlock({ comment }) {
3338
3996
  const bodyMd = adfToMarkdown(comment.body);
3339
- return /* @__PURE__ */ jsxs8(Box9, { marginTop: 1, flexDirection: "column", children: [
3340
- /* @__PURE__ */ jsxs8(Box9, { gap: 1, children: [
3341
- /* @__PURE__ */ jsx9(Text8, { bold: true, children: comment.author.displayName }),
3342
- /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: timeAgo(comment.created) })
3997
+ return /* @__PURE__ */ jsxs9(Box9, { marginTop: 1, flexDirection: "column", children: [
3998
+ /* @__PURE__ */ jsxs9(Box9, { gap: 1, children: [
3999
+ /* @__PURE__ */ jsx11(Text10, { bold: true, children: comment.author.displayName }),
4000
+ /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: timeAgo(comment.created) })
3343
4001
  ] }),
3344
- bodyMd ? /* @__PURE__ */ jsx9(Markdown, { children: bodyMd }) : /* @__PURE__ */ jsx9(Text8, { dimColor: true, italic: true, children: "Empty comment" })
4002
+ bodyMd ? /* @__PURE__ */ jsx11(Markdown, { children: bodyMd }) : /* @__PURE__ */ jsx11(Text10, { dimColor: true, italic: true, children: "Empty comment" })
3345
4003
  ] });
3346
4004
  }
3347
4005
  function getStatusColor(status) {
@@ -3352,7 +4010,7 @@ function getStatusColor(status) {
3352
4010
  }
3353
4011
 
3354
4012
  // src/components/jira-browser/JiraSavedViewBrowserBox.tsx
3355
- import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
4013
+ import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
3356
4014
  function groupBySprint(issues) {
3357
4015
  const groups = /* @__PURE__ */ new Map();
3358
4016
  for (const issue of issues) {
@@ -3400,17 +4058,17 @@ function JiraSavedViewBrowserBox({
3400
4058
  onInputModeChange,
3401
4059
  onLogUpdated
3402
4060
  }) {
3403
- const [issues, setIssues] = useState14([]);
3404
- const [loading, setLoading] = useState14(false);
3405
- const [error, setError] = useState14(null);
3406
- const [total, setTotal] = useState14(0);
3407
- const [highlightedIndex, setHighlightedIndex] = useState14(0);
3408
- const [inputText, setInputText] = useState14("");
3409
- const [searchText, setSearchText] = useState14("");
3410
- const [isFiltering, setIsFiltering] = useState14(false);
3411
- const [assigneeFilter, setAssigneeFilter] = useState14("all");
3412
- const [detailIssue, setDetailIssue] = useState14(null);
3413
- useEffect10(() => {
4061
+ const [issues, setIssues] = useState15([]);
4062
+ const [loading, setLoading] = useState15(false);
4063
+ const [error, setError] = useState15(null);
4064
+ const [total, setTotal] = useState15(0);
4065
+ const [highlightedIndex, setHighlightedIndex] = useState15(0);
4066
+ const [inputText, setInputText] = useState15("");
4067
+ const [searchText, setSearchText] = useState15("");
4068
+ const [isFiltering, setIsFiltering] = useState15(false);
4069
+ const [assigneeFilter, setAssigneeFilter] = useState15("all");
4070
+ const [detailIssue, setDetailIssue] = useState15(null);
4071
+ useEffect11(() => {
3414
4072
  onInputModeChange == null ? void 0 : onInputModeChange(isFiltering || detailIssue !== null);
3415
4073
  }, [isFiltering, detailIssue, onInputModeChange]);
3416
4074
  const title = "[6] Issues";
@@ -3470,7 +4128,7 @@ function JiraSavedViewBrowserBox({
3470
4128
  },
3471
4129
  [view, auth]
3472
4130
  );
3473
- useEffect10(() => {
4131
+ useEffect11(() => {
3474
4132
  if (view && auth) {
3475
4133
  setSearchText("");
3476
4134
  setInputText("");
@@ -3594,7 +4252,7 @@ function JiraSavedViewBrowserBox({
3594
4252
  if (assigneeFilter === "unassigned") filterParts.push("unassigned");
3595
4253
  if (assigneeFilter === "me") filterParts.push("mine");
3596
4254
  if (searchText) filterParts.push(`"${searchText}"`);
3597
- return /* @__PURE__ */ jsx10(TitledBox4, { borderStyle: "round", titles: [displayTitle], borderColor, flexGrow: 1, children: /* @__PURE__ */ jsx10(Box10, { flexDirection: "column", flexGrow: 1, children: detailIssue && auth ? /* @__PURE__ */ jsx10(
4255
+ return /* @__PURE__ */ jsx12(TitledBox4, { borderStyle: "round", titles: [displayTitle], borderColor, flexGrow: 1, children: /* @__PURE__ */ jsx12(Box10, { flexDirection: "column", flexGrow: 1, children: detailIssue && auth ? /* @__PURE__ */ jsx12(
3598
4256
  JiraIssueDetailView,
3599
4257
  {
3600
4258
  issueKey: detailIssue.key,
@@ -3607,15 +4265,15 @@ function JiraSavedViewBrowserBox({
3607
4265
  onIssueUpdated: handleIssueUpdated,
3608
4266
  onLogUpdated
3609
4267
  }
3610
- ) : /* @__PURE__ */ jsxs9(Fragment2, { children: [
3611
- (isFiltering || hasActiveFilters) && /* @__PURE__ */ jsxs9(Box10, { paddingX: 1, children: [
3612
- /* @__PURE__ */ jsx10(Text9, { color: "blue", children: "Search: " }),
3613
- isFiltering ? /* @__PURE__ */ jsxs9(Fragment2, { children: [
3614
- /* @__PURE__ */ jsx10(Text9, { children: inputText }),
3615
- /* @__PURE__ */ jsx10(Text9, { backgroundColor: "yellow", children: " " })
3616
- ] }) : /* @__PURE__ */ jsxs9(Fragment2, { children: [
3617
- /* @__PURE__ */ jsx10(Text9, { children: filterParts.join(" + ") }),
3618
- /* @__PURE__ */ jsxs9(Text9, { dimColor: true, children: [
4268
+ ) : /* @__PURE__ */ jsxs10(Fragment3, { children: [
4269
+ (isFiltering || hasActiveFilters) && /* @__PURE__ */ jsxs10(Box10, { paddingX: 1, children: [
4270
+ /* @__PURE__ */ jsx12(Text11, { color: "blue", children: "Search: " }),
4271
+ isFiltering ? /* @__PURE__ */ jsxs10(Fragment3, { children: [
4272
+ /* @__PURE__ */ jsx12(Text11, { children: inputText }),
4273
+ /* @__PURE__ */ jsx12(Text11, { backgroundColor: "yellow", children: " " })
4274
+ ] }) : /* @__PURE__ */ jsxs10(Fragment3, { children: [
4275
+ /* @__PURE__ */ jsx12(Text11, { children: filterParts.join(" + ") }),
4276
+ /* @__PURE__ */ jsxs10(Text11, { dimColor: true, children: [
3619
4277
  " ",
3620
4278
  "(",
3621
4279
  filteredIssues.length,
@@ -3625,38 +4283,38 @@ function JiraSavedViewBrowserBox({
3625
4283
  ] })
3626
4284
  ] })
3627
4285
  ] }),
3628
- /* @__PURE__ */ jsxs9(Box10, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
3629
- !view && /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "Select a view to browse issues" }) }),
3630
- view && loading && issues.length === 0 && /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsxs9(Text9, { color: "yellow", children: [
3631
- /* @__PURE__ */ jsx10(Spinner3, { type: "dots" }),
4286
+ /* @__PURE__ */ jsxs10(Box10, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
4287
+ !view && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: "Select a view to browse issues" }) }),
4288
+ view && loading && issues.length === 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsxs10(Text11, { color: "yellow", children: [
4289
+ /* @__PURE__ */ jsx12(Spinner2, { type: "dots" }),
3632
4290
  " Loading issues..."
3633
4291
  ] }) }),
3634
- view && error && /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "red", children: error }) }),
3635
- view && !loading && !error && issues.length === 0 && /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: searchText ? "No issues match search" : "No issues found" }) }),
3636
- view && !loading && !error && filteredIssues.length === 0 && issues.length > 0 && /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "No issues match filter" }) }),
3637
- rows.length > 0 && /* @__PURE__ */ jsx10(ScrollView6, { ref: scrollRef, children: rows.map((row, rowIdx) => {
4292
+ view && error && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { color: "red", children: error }) }),
4293
+ view && !loading && !error && issues.length === 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: searchText ? "No issues match search" : "No issues found" }) }),
4294
+ view && !loading && !error && filteredIssues.length === 0 && issues.length > 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: "No issues match filter" }) }),
4295
+ rows.length > 0 && /* @__PURE__ */ jsx12(ScrollView6, { ref: scrollRef, children: rows.map((row, rowIdx) => {
3638
4296
  if (row.type === "header") {
3639
4297
  const stateLabel = row.state === "active" ? " (active)" : "";
3640
- return /* @__PURE__ */ jsx10(Box10, { paddingX: 1, marginTop: rowIdx > 0 ? 1 : 0, children: /* @__PURE__ */ jsxs9(Text9, { bold: true, color: "magenta", children: [
4298
+ return /* @__PURE__ */ jsx12(Box10, { paddingX: 1, marginTop: rowIdx > 0 ? 1 : 0, children: /* @__PURE__ */ jsxs10(Text11, { bold: true, color: "magenta", children: [
3641
4299
  row.label,
3642
- stateLabel && /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: stateLabel })
4300
+ stateLabel && /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: stateLabel })
3643
4301
  ] }) }, `header-${row.label}`);
3644
4302
  }
3645
4303
  const navIdx = navigableIndices.indexOf(rowIdx);
3646
4304
  const isHighlighted = navIdx === highlightedIndex;
3647
4305
  const cursor = isHighlighted ? ">" : " ";
3648
4306
  const statusColor = getStatusColor2(row.issue.fields.status.name);
3649
- return /* @__PURE__ */ jsxs9(Box10, { paddingX: 1, children: [
3650
- /* @__PURE__ */ jsxs9(Text9, { color: isHighlighted ? "yellow" : void 0, children: [
4307
+ return /* @__PURE__ */ jsxs10(Box10, { paddingX: 1, children: [
4308
+ /* @__PURE__ */ jsxs10(Text11, { color: isHighlighted ? "yellow" : void 0, children: [
3651
4309
  cursor,
3652
4310
  " "
3653
4311
  ] }),
3654
- /* @__PURE__ */ jsx10(Text9, { bold: true, color: "blue", children: row.issue.key }),
3655
- /* @__PURE__ */ jsxs9(Text9, { children: [
4312
+ /* @__PURE__ */ jsx12(Text11, { bold: true, color: "blue", children: row.issue.key }),
4313
+ /* @__PURE__ */ jsxs10(Text11, { children: [
3656
4314
  " ",
3657
4315
  row.issue.fields.summary
3658
4316
  ] }),
3659
- /* @__PURE__ */ jsxs9(Text9, { color: statusColor, children: [
4317
+ /* @__PURE__ */ jsxs10(Text11, { color: statusColor, children: [
3660
4318
  " [",
3661
4319
  row.issue.fields.status.name,
3662
4320
  "]"
@@ -3664,14 +4322,14 @@ function JiraSavedViewBrowserBox({
3664
4322
  ] }, row.issue.key);
3665
4323
  }) })
3666
4324
  ] }),
3667
- view && !loading && issues.length > 0 && /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsxs9(Text9, { dimColor: true, children: [
4325
+ view && !loading && issues.length > 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsxs10(Text11, { dimColor: true, children: [
3668
4326
  issues.length,
3669
4327
  " of ",
3670
4328
  total,
3671
4329
  " loaded",
3672
4330
  hasMore && " \xB7 l to load more"
3673
4331
  ] }) }),
3674
- view && loading && issues.length > 0 && /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "Loading more..." }) })
4332
+ view && loading && issues.length > 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: "Loading more..." }) })
3675
4333
  ] }) }) });
3676
4334
  }
3677
4335
  function getStatusColor2(status) {
@@ -3682,11 +4340,11 @@ function getStatusColor2(status) {
3682
4340
  }
3683
4341
 
3684
4342
  // src/components/jira-browser/JiraSavedViewsBox.tsx
3685
- import { useEffect as useEffect11, useState as useState15 } from "react";
4343
+ import { useEffect as useEffect12, useState as useState16 } from "react";
3686
4344
  import { TitledBox as TitledBox5 } from "@mishieck/ink-titled-box";
3687
- import { Box as Box11, Text as Text10, useInput as useInput9 } from "ink";
4345
+ import { Box as Box11, Text as Text12, useInput as useInput9 } from "ink";
3688
4346
  import { ScrollView as ScrollView7 } from "ink-scroll-view";
3689
- import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
4347
+ import { Fragment as Fragment4, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
3690
4348
  function JiraSavedViewsBox({
3691
4349
  views,
3692
4350
  selectedViewId,
@@ -3700,9 +4358,9 @@ function JiraSavedViewsBox({
3700
4358
  onInputModeChange
3701
4359
  }) {
3702
4360
  const scrollRef = useScrollToIndex(highlightedIndex);
3703
- const [renaming, setRenaming] = useState15(null);
3704
- const [renameValue, setRenameValue] = useState15("");
3705
- useEffect11(() => {
4361
+ const [renaming, setRenaming] = useState16(null);
4362
+ const [renameValue, setRenameValue] = useState16("");
4363
+ useEffect12(() => {
3706
4364
  onInputModeChange == null ? void 0 : onInputModeChange(renaming !== null);
3707
4365
  }, [renaming, onInputModeChange]);
3708
4366
  const title = "[5] Views";
@@ -3755,23 +4413,23 @@ function JiraSavedViewsBox({
3755
4413
  },
3756
4414
  { isActive }
3757
4415
  );
3758
- return /* @__PURE__ */ jsx11(TitledBox5, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs10(Box11, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
3759
- views.length === 0 && /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "No saved views" }),
3760
- views.length > 0 && /* @__PURE__ */ jsx11(ScrollView7, { ref: scrollRef, children: views.map((view, idx) => {
4416
+ return /* @__PURE__ */ jsx13(TitledBox5, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
4417
+ views.length === 0 && /* @__PURE__ */ jsx13(Text12, { dimColor: true, children: "No saved views" }),
4418
+ views.length > 0 && /* @__PURE__ */ jsx13(ScrollView7, { ref: scrollRef, children: views.map((view, idx) => {
3761
4419
  const isHighlighted = isActive && idx === highlightedIndex;
3762
4420
  const isSelected = view.id === selectedViewId;
3763
4421
  const isRenaming = view.id === renaming;
3764
4422
  const cursor = isHighlighted ? ">" : " ";
3765
4423
  const nameColor = isSelected ? "green" : void 0;
3766
4424
  const indicator = isSelected ? " *" : "";
3767
- return /* @__PURE__ */ jsxs10(Box11, { children: [
3768
- /* @__PURE__ */ jsxs10(Text10, { color: isHighlighted ? "yellow" : void 0, children: [
4425
+ return /* @__PURE__ */ jsxs11(Box11, { children: [
4426
+ /* @__PURE__ */ jsxs11(Text12, { color: isHighlighted ? "yellow" : void 0, children: [
3769
4427
  cursor,
3770
4428
  " "
3771
4429
  ] }),
3772
- isRenaming ? /* @__PURE__ */ jsx11(TextInput, { value: renameValue, onChange: setRenameValue, isActive: true }) : /* @__PURE__ */ jsxs10(Fragment3, { children: [
3773
- /* @__PURE__ */ jsx11(Text10, { color: nameColor, children: view.name }),
3774
- /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: indicator })
4430
+ isRenaming ? /* @__PURE__ */ jsx13(TextInput, { value: renameValue, onChange: setRenameValue, isActive: true }) : /* @__PURE__ */ jsxs11(Fragment4, { children: [
4431
+ /* @__PURE__ */ jsx13(Text12, { color: nameColor, children: view.name }),
4432
+ /* @__PURE__ */ jsx13(Text12, { dimColor: true, children: indicator })
3775
4433
  ] })
3776
4434
  ] }, view.id);
3777
4435
  }) })
@@ -3779,7 +4437,7 @@ function JiraSavedViewsBox({
3779
4437
  }
3780
4438
 
3781
4439
  // src/components/jira-browser/JiraBrowserView.tsx
3782
- import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
4440
+ import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
3783
4441
  function JiraBrowserView({
3784
4442
  isActive,
3785
4443
  focusedBox,
@@ -3789,14 +4447,14 @@ function JiraBrowserView({
3789
4447
  }) {
3790
4448
  const repo = useGitRepo();
3791
4449
  const modal = useModal();
3792
- const [views, setViews] = useState16([]);
3793
- const [selectedViewId, setSelectedViewId] = useState16(null);
3794
- const [highlightedIndex, setHighlightedIndex] = useState16(0);
3795
- const [addError, setAddError] = useState16(void 0);
3796
- const [addLoading, setAddLoading] = useState16(false);
3797
- const [myAccountId, setMyAccountId] = useState16(null);
3798
- const [myDisplayName, setMyDisplayName] = useState16(null);
3799
- const [inputModeActive, setInputModeActive] = useState16(false);
4450
+ const [views, setViews] = useState17([]);
4451
+ const [selectedViewId, setSelectedViewId] = useState17(null);
4452
+ const [highlightedIndex, setHighlightedIndex] = useState17(0);
4453
+ const [addError, setAddError] = useState17(void 0);
4454
+ const [addLoading, setAddLoading] = useState17(false);
4455
+ const [myAccountId, setMyAccountId] = useState17(null);
4456
+ const [myDisplayName, setMyDisplayName] = useState17(null);
4457
+ const [inputModeActive, setInputModeActive] = useState17(false);
3800
4458
  const lastRepoRef = useRef7(null);
3801
4459
  const auth = useMemo3(() => {
3802
4460
  if (!repo.repoPath || !isJiraConfigured(repo.repoPath)) return null;
@@ -3806,7 +4464,7 @@ function JiraBrowserView({
3806
4464
  return { siteUrl, email: creds.email, apiToken: creds.apiToken };
3807
4465
  }, [repo.repoPath]);
3808
4466
  const selectedView = useMemo3(() => views.find((v) => v.id === selectedViewId) ?? null, [views, selectedViewId]);
3809
- useEffect12(() => {
4467
+ useEffect13(() => {
3810
4468
  if (!repo.repoPath || repo.repoPath === lastRepoRef.current) return;
3811
4469
  lastRepoRef.current = repo.repoPath;
3812
4470
  const loaded = getSavedViews(repo.repoPath);
@@ -3815,7 +4473,7 @@ function JiraBrowserView({
3815
4473
  setSelectedViewId(loaded[0].id);
3816
4474
  }
3817
4475
  }, [repo.repoPath]);
3818
- useEffect12(() => {
4476
+ useEffect13(() => {
3819
4477
  if (!auth) {
3820
4478
  setMyAccountId(null);
3821
4479
  return;
@@ -3827,10 +4485,10 @@ function JiraBrowserView({
3827
4485
  }
3828
4486
  });
3829
4487
  }, [auth == null ? void 0 : auth.siteUrl, auth == null ? void 0 : auth.email]);
3830
- useEffect12(() => {
4488
+ useEffect13(() => {
3831
4489
  onModalChange == null ? void 0 : onModalChange(modal.isOpen || inputModeActive);
3832
4490
  }, [modal.isOpen, inputModeActive, onModalChange]);
3833
- useEffect12(() => {
4491
+ useEffect13(() => {
3834
4492
  if (!isActive) modal.close();
3835
4493
  }, [isActive, modal.close]);
3836
4494
  const refreshViews = useCallback10(() => {
@@ -3892,7 +4550,7 @@ function JiraBrowserView({
3892
4550
  { isActive: isActive && !modal.isOpen }
3893
4551
  );
3894
4552
  if (modal.type === "add") {
3895
- return /* @__PURE__ */ jsx12(Box12, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx12(
4553
+ return /* @__PURE__ */ jsx14(Box12, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx14(
3896
4554
  AddViewModal,
3897
4555
  {
3898
4556
  onSubmit: handleAddView,
@@ -3905,8 +4563,8 @@ function JiraBrowserView({
3905
4563
  }
3906
4564
  ) });
3907
4565
  }
3908
- return /* @__PURE__ */ jsxs11(Box12, { flexDirection: "column", flexGrow: 1, children: [
3909
- /* @__PURE__ */ jsx12(
4566
+ return /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", flexGrow: 1, children: [
4567
+ /* @__PURE__ */ jsx14(
3910
4568
  JiraSavedViewsBox,
3911
4569
  {
3912
4570
  views,
@@ -3921,7 +4579,7 @@ function JiraBrowserView({
3921
4579
  onInputModeChange: setInputModeActive
3922
4580
  }
3923
4581
  ),
3924
- /* @__PURE__ */ jsx12(
4582
+ /* @__PURE__ */ jsx14(
3925
4583
  JiraSavedViewBrowserBox,
3926
4584
  {
3927
4585
  view: selectedView,
@@ -3938,14 +4596,14 @@ function JiraBrowserView({
3938
4596
 
3939
4597
  // src/components/jira/JiraView.tsx
3940
4598
  import open5 from "open";
3941
- import { useEffect as useEffect14, useRef as useRef8 } from "react";
4599
+ import { useEffect as useEffect15, useRef as useRef8 } from "react";
3942
4600
 
3943
4601
  // src/components/jira/LinkTicketModal.tsx
3944
- import { useState as useState17 } from "react";
3945
- import { Box as Box13, Text as Text11, useInput as useInput11 } from "ink";
3946
- import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
4602
+ import { useState as useState18 } from "react";
4603
+ import { Box as Box13, Text as Text13, useInput as useInput11 } from "ink";
4604
+ import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
3947
4605
  function LinkTicketModal({ onSubmit, onCancel, loading, error }) {
3948
- const [ticketInput, setTicketInput] = useState17("");
4606
+ const [ticketInput, setTicketInput] = useState18("");
3949
4607
  const canSubmit = ticketInput.trim().length > 0;
3950
4608
  useInput11(
3951
4609
  (_input, key) => {
@@ -3960,35 +4618,35 @@ function LinkTicketModal({ onSubmit, onCancel, loading, error }) {
3960
4618
  },
3961
4619
  { isActive: !loading }
3962
4620
  );
3963
- return /* @__PURE__ */ jsxs12(Box13, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
3964
- /* @__PURE__ */ jsx13(Text11, { bold: true, color: "yellow", children: "Link Jira Ticket" }),
3965
- /* @__PURE__ */ jsx13(Text11, { dimColor: true, children: "Type ticket ID, Enter to submit, Esc to cancel" }),
3966
- /* @__PURE__ */ jsx13(Box13, { marginTop: 1 }),
3967
- error && /* @__PURE__ */ jsx13(Box13, { marginBottom: 1, children: /* @__PURE__ */ jsx13(Text11, { color: "red", children: error }) }),
3968
- /* @__PURE__ */ jsxs12(Box13, { children: [
3969
- /* @__PURE__ */ jsx13(Text11, { color: "blue", children: "Ticket: " }),
3970
- /* @__PURE__ */ jsx13(TextInput, { value: ticketInput, onChange: setTicketInput, placeholder: "PROJ-123", isActive: !loading })
4621
+ return /* @__PURE__ */ jsxs13(Box13, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
4622
+ /* @__PURE__ */ jsx15(Text13, { bold: true, color: "yellow", children: "Link Jira Ticket" }),
4623
+ /* @__PURE__ */ jsx15(Text13, { dimColor: true, children: "Type ticket ID, Enter to submit, Esc to cancel" }),
4624
+ /* @__PURE__ */ jsx15(Box13, { marginTop: 1 }),
4625
+ error && /* @__PURE__ */ jsx15(Box13, { marginBottom: 1, children: /* @__PURE__ */ jsx15(Text13, { color: "red", children: error }) }),
4626
+ /* @__PURE__ */ jsxs13(Box13, { children: [
4627
+ /* @__PURE__ */ jsx15(Text13, { color: "blue", children: "Ticket: " }),
4628
+ /* @__PURE__ */ jsx15(TextInput, { value: ticketInput, onChange: setTicketInput, placeholder: "PROJ-123", isActive: !loading })
3971
4629
  ] }),
3972
- loading && /* @__PURE__ */ jsx13(Box13, { marginTop: 1, children: /* @__PURE__ */ jsx13(Text11, { color: "yellow", children: "Fetching ticket..." }) }),
3973
- /* @__PURE__ */ jsx13(Box13, { marginTop: 1, children: /* @__PURE__ */ jsx13(Text11, { dimColor: true, children: "Examples: PROJ-123 or https://company.atlassian.net/browse/PROJ-123" }) })
4630
+ loading && /* @__PURE__ */ jsx15(Box13, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text13, { color: "yellow", children: "Fetching ticket..." }) }),
4631
+ /* @__PURE__ */ jsx15(Box13, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text13, { dimColor: true, children: "Examples: PROJ-123 or https://company.atlassian.net/browse/PROJ-123" }) })
3974
4632
  ] });
3975
4633
  }
3976
4634
 
3977
4635
  // src/components/jira/JiraView.tsx
3978
4636
  import { TitledBox as TitledBox6 } from "@mishieck/ink-titled-box";
3979
- import { Box as Box17, Text as Text15, useInput as useInput14 } from "ink";
4637
+ import { Box as Box17, Text as Text17, useInput as useInput14 } from "ink";
3980
4638
 
3981
4639
  // src/components/jira/ChangeStatusModal.tsx
3982
- import { useEffect as useEffect13, useState as useState18 } from "react";
3983
- import { Box as Box14, Text as Text12, useInput as useInput12 } from "ink";
4640
+ import { useEffect as useEffect14, useState as useState19 } from "react";
4641
+ import { Box as Box14, Text as Text14, useInput as useInput12 } from "ink";
3984
4642
  import SelectInput2 from "ink-select-input";
3985
- import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
4643
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
3986
4644
  function ChangeStatusModal({ repoPath, ticketKey, currentStatus, onComplete, onCancel }) {
3987
- const [transitions, setTransitions] = useState18([]);
3988
- const [loading, setLoading] = useState18(true);
3989
- const [applying, setApplying] = useState18(false);
3990
- const [error, setError] = useState18(null);
3991
- useEffect13(() => {
4645
+ const [transitions, setTransitions] = useState19([]);
4646
+ const [loading, setLoading] = useState19(true);
4647
+ const [applying, setApplying] = useState19(false);
4648
+ const [error, setError] = useState19(null);
4649
+ useEffect14(() => {
3992
4650
  const fetchTransitions = async () => {
3993
4651
  const siteUrl = getJiraSiteUrl(repoPath);
3994
4652
  const creds = getJiraCredentials(repoPath);
@@ -4050,23 +4708,23 @@ function ChangeStatusModal({ repoPath, ticketKey, currentStatus, onComplete, onC
4050
4708
  0,
4051
4709
  transitions.findIndex((t) => t.to.name === currentStatus)
4052
4710
  );
4053
- return /* @__PURE__ */ jsxs13(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
4054
- /* @__PURE__ */ jsxs13(Text12, { bold: true, color: "yellow", children: [
4711
+ return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
4712
+ /* @__PURE__ */ jsxs14(Text14, { bold: true, color: "yellow", children: [
4055
4713
  "Change Status: ",
4056
4714
  ticketKey
4057
4715
  ] }),
4058
- loading && /* @__PURE__ */ jsx14(Text12, { dimColor: true, children: "Loading transitions..." }),
4059
- error && /* @__PURE__ */ jsx14(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx14(Text12, { color: "red", children: error }) }),
4060
- !loading && !error && transitions.length === 0 && /* @__PURE__ */ jsx14(Text12, { dimColor: true, children: "No available transitions" }),
4061
- !loading && !error && transitions.length > 0 && !applying && /* @__PURE__ */ jsx14(Box14, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx14(SelectInput2, { items, initialIndex, onSelect: handleSelect }) }),
4062
- applying && /* @__PURE__ */ jsx14(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx14(Text12, { color: "yellow", children: "Updating status..." }) }),
4063
- /* @__PURE__ */ jsx14(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx14(Text12, { dimColor: true, children: "Esc to cancel" }) })
4716
+ loading && /* @__PURE__ */ jsx16(Text14, { dimColor: true, children: "Loading transitions..." }),
4717
+ error && /* @__PURE__ */ jsx16(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text14, { color: "red", children: error }) }),
4718
+ !loading && !error && transitions.length === 0 && /* @__PURE__ */ jsx16(Text14, { dimColor: true, children: "No available transitions" }),
4719
+ !loading && !error && transitions.length > 0 && !applying && /* @__PURE__ */ jsx16(Box14, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx16(SelectInput2, { items, initialIndex, onSelect: handleSelect }) }),
4720
+ applying && /* @__PURE__ */ jsx16(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text14, { color: "yellow", children: "Updating status..." }) }),
4721
+ /* @__PURE__ */ jsx16(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text14, { dimColor: true, children: "Esc to cancel" }) })
4064
4722
  ] });
4065
4723
  }
4066
4724
 
4067
4725
  // src/components/jira/ConfigureJiraSiteModal.tsx
4068
- import { useState as useState19 } from "react";
4069
- import { Box as Box15, Text as Text13, useInput as useInput13 } from "ink";
4726
+ import { useState as useState20 } from "react";
4727
+ import { Box as Box15, Text as Text15, useInput as useInput13 } from "ink";
4070
4728
  import { ScrollView as ScrollView8 } from "ink-scroll-view";
4071
4729
 
4072
4730
  // src/lib/editor.ts
@@ -4098,7 +4756,7 @@ function openInEditor(content, filename) {
4098
4756
  }
4099
4757
 
4100
4758
  // src/components/jira/ConfigureJiraSiteModal.tsx
4101
- import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
4759
+ import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
4102
4760
  var MAX_VISIBLE_ITEMS = 4;
4103
4761
  function ConfigureJiraSiteModal({
4104
4762
  initialSiteUrl,
@@ -4110,13 +4768,13 @@ function ConfigureJiraSiteModal({
4110
4768
  error
4111
4769
  }) {
4112
4770
  const hasExisting = existingConfigs.length > 0;
4113
- const [mode, setMode] = useState19(hasExisting ? "choose" : "manual");
4114
- const [selectedExisting, setSelectedExisting] = useState19(0);
4771
+ const [mode, setMode] = useState20(hasExisting ? "choose" : "manual");
4772
+ const [selectedExisting, setSelectedExisting] = useState20(0);
4115
4773
  const scrollRef = useScrollToIndex(selectedExisting);
4116
- const [siteUrl, setSiteUrl] = useState19(initialSiteUrl ?? "");
4117
- const [email, setEmail] = useState19(initialEmail ?? "");
4118
- const [apiToken, setApiToken] = useState19("");
4119
- const [selectedItem, setSelectedItem] = useState19("siteUrl");
4774
+ const [siteUrl, setSiteUrl] = useState20(initialSiteUrl ?? "");
4775
+ const [email, setEmail] = useState20(initialEmail ?? "");
4776
+ const [apiToken, setApiToken] = useState20("");
4777
+ const [selectedItem, setSelectedItem] = useState20("siteUrl");
4120
4778
  const items = ["siteUrl", "email", "apiToken", "submit"];
4121
4779
  const canSubmit = siteUrl.trim() && email.trim() && apiToken.trim();
4122
4780
  const chooseItems = existingConfigs.length + 1;
@@ -4192,38 +4850,38 @@ function ConfigureJiraSiteModal({
4192
4850
  const prefix = isSelected ? "> " : " ";
4193
4851
  const color = isSelected ? "yellow" : void 0;
4194
4852
  const displayValue = isSensitive && value ? "*".repeat(Math.min(value.length, 20)) : value;
4195
- return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", children: [
4196
- /* @__PURE__ */ jsxs14(Text13, { color, bold: isSelected, children: [
4853
+ return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
4854
+ /* @__PURE__ */ jsxs15(Text15, { color, bold: isSelected, children: [
4197
4855
  prefix,
4198
4856
  label
4199
4857
  ] }),
4200
- value !== void 0 && /* @__PURE__ */ jsx15(Box15, { marginLeft: 4, children: /* @__PURE__ */ jsx15(Text13, { dimColor: true, children: displayValue || "(empty - press Enter to edit)" }) })
4858
+ value !== void 0 && /* @__PURE__ */ jsx17(Box15, { marginLeft: 4, children: /* @__PURE__ */ jsx17(Text15, { dimColor: true, children: displayValue || "(empty - press Enter to edit)" }) })
4201
4859
  ] });
4202
4860
  };
4203
4861
  if (mode === "choose") {
4204
4862
  const totalItems = existingConfigs.length + 1;
4205
4863
  const listHeight = Math.min(totalItems * 2, MAX_VISIBLE_ITEMS * 2);
4206
- return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
4207
- /* @__PURE__ */ jsx15(Text13, { bold: true, color: "cyan", children: "Configure Jira Site" }),
4208
- /* @__PURE__ */ jsx15(Text13, { dimColor: true, children: "Select an existing configuration or enter new credentials" }),
4209
- /* @__PURE__ */ jsx15(Box15, { marginTop: 1 }),
4210
- error && /* @__PURE__ */ jsx15(Box15, { marginBottom: 1, children: /* @__PURE__ */ jsx15(Text13, { color: "red", children: error }) }),
4211
- /* @__PURE__ */ jsx15(Box15, { height: listHeight, overflow: "hidden", children: /* @__PURE__ */ jsxs14(ScrollView8, { ref: scrollRef, children: [
4864
+ return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
4865
+ /* @__PURE__ */ jsx17(Text15, { bold: true, color: "cyan", children: "Configure Jira Site" }),
4866
+ /* @__PURE__ */ jsx17(Text15, { dimColor: true, children: "Select an existing configuration or enter new credentials" }),
4867
+ /* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
4868
+ error && /* @__PURE__ */ jsx17(Box15, { marginBottom: 1, children: /* @__PURE__ */ jsx17(Text15, { color: "red", children: error }) }),
4869
+ /* @__PURE__ */ jsx17(Box15, { height: listHeight, overflow: "hidden", children: /* @__PURE__ */ jsxs15(ScrollView8, { ref: scrollRef, children: [
4212
4870
  existingConfigs.map((config, idx) => {
4213
4871
  const isSelected = selectedExisting === idx;
4214
- return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", children: [
4215
- /* @__PURE__ */ jsxs14(Text13, { color: isSelected ? "yellow" : void 0, bold: isSelected, children: [
4872
+ return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
4873
+ /* @__PURE__ */ jsxs15(Text15, { color: isSelected ? "yellow" : void 0, bold: isSelected, children: [
4216
4874
  isSelected ? "> " : " ",
4217
4875
  config.siteUrl
4218
4876
  ] }),
4219
- /* @__PURE__ */ jsxs14(Text13, { dimColor: true, children: [
4877
+ /* @__PURE__ */ jsxs15(Text15, { dimColor: true, children: [
4220
4878
  " ",
4221
4879
  config.email
4222
4880
  ] })
4223
4881
  ] }, config.siteUrl + config.email);
4224
4882
  }),
4225
- /* @__PURE__ */ jsx15(Box15, { children: /* @__PURE__ */ jsxs14(
4226
- Text13,
4883
+ /* @__PURE__ */ jsx17(Box15, { children: /* @__PURE__ */ jsxs15(
4884
+ Text15,
4227
4885
  {
4228
4886
  color: selectedExisting === existingConfigs.length ? "yellow" : void 0,
4229
4887
  bold: selectedExisting === existingConfigs.length,
@@ -4234,44 +4892,44 @@ function ConfigureJiraSiteModal({
4234
4892
  }
4235
4893
  ) })
4236
4894
  ] }) }),
4237
- loading && /* @__PURE__ */ jsx15(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text13, { color: "yellow", children: "Validating credentials..." }) })
4895
+ loading && /* @__PURE__ */ jsx17(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx17(Text15, { color: "yellow", children: "Validating credentials..." }) })
4238
4896
  ] });
4239
4897
  }
4240
- return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
4241
- /* @__PURE__ */ jsx15(Text13, { bold: true, color: "cyan", children: "Configure Jira Site" }),
4242
- /* @__PURE__ */ jsxs14(Text13, { dimColor: true, children: [
4898
+ return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
4899
+ /* @__PURE__ */ jsx17(Text15, { bold: true, color: "cyan", children: "Configure Jira Site" }),
4900
+ /* @__PURE__ */ jsxs15(Text15, { dimColor: true, children: [
4243
4901
  "Up/Down to select, Enter to edit, Esc to ",
4244
4902
  hasExisting ? "go back" : "cancel"
4245
4903
  ] }),
4246
- /* @__PURE__ */ jsx15(Box15, { marginTop: 1 }),
4247
- error && /* @__PURE__ */ jsx15(Box15, { marginBottom: 1, children: /* @__PURE__ */ jsx15(Text13, { color: "red", children: error }) }),
4904
+ /* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
4905
+ error && /* @__PURE__ */ jsx17(Box15, { marginBottom: 1, children: /* @__PURE__ */ jsx17(Text15, { color: "red", children: error }) }),
4248
4906
  renderItem("siteUrl", "Site URL (e.g., https://company.atlassian.net)", siteUrl),
4249
- /* @__PURE__ */ jsx15(Box15, { marginTop: 1 }),
4907
+ /* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
4250
4908
  renderItem("email", "Email", email),
4251
- /* @__PURE__ */ jsx15(Box15, { marginTop: 1 }),
4909
+ /* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
4252
4910
  renderItem("apiToken", "API Token", apiToken, true),
4253
- /* @__PURE__ */ jsx15(Box15, { marginTop: 1 }),
4254
- /* @__PURE__ */ jsx15(Box15, { children: /* @__PURE__ */ jsxs14(Text13, { color: selectedItem === "submit" ? "green" : void 0, bold: selectedItem === "submit", children: [
4911
+ /* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
4912
+ /* @__PURE__ */ jsx17(Box15, { children: /* @__PURE__ */ jsxs15(Text15, { color: selectedItem === "submit" ? "green" : void 0, bold: selectedItem === "submit", children: [
4255
4913
  selectedItem === "submit" ? "> " : " ",
4256
4914
  canSubmit ? "[Save Configuration]" : "[Fill all fields first]"
4257
4915
  ] }) }),
4258
- loading && /* @__PURE__ */ jsx15(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text13, { color: "yellow", children: "Validating credentials..." }) }),
4259
- /* @__PURE__ */ jsx15(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text13, { dimColor: true, children: "Get your API token from: https://id.atlassian.com/manage-profile/security/api-tokens" }) })
4916
+ loading && /* @__PURE__ */ jsx17(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx17(Text15, { color: "yellow", children: "Validating credentials..." }) }),
4917
+ /* @__PURE__ */ jsx17(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx17(Text15, { dimColor: true, children: "Get your API token from: https://id.atlassian.com/manage-profile/security/api-tokens" }) })
4260
4918
  ] });
4261
4919
  }
4262
4920
 
4263
4921
  // src/components/jira/TicketItem.tsx
4264
- import { Box as Box16, Text as Text14 } from "ink";
4265
- import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
4922
+ import { Box as Box16, Text as Text16 } from "ink";
4923
+ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
4266
4924
  function TicketItem({ ticketKey, summary, status, isHighlighted, isSelected }) {
4267
4925
  const prefix = isHighlighted ? "> " : isSelected ? "\u25CF " : " ";
4268
4926
  const textColor = isSelected ? "green" : void 0;
4269
- return /* @__PURE__ */ jsx16(Box16, { children: /* @__PURE__ */ jsxs15(Text14, { color: textColor, children: [
4927
+ return /* @__PURE__ */ jsx18(Box16, { children: /* @__PURE__ */ jsxs16(Text16, { color: textColor, children: [
4270
4928
  prefix,
4271
- /* @__PURE__ */ jsx16(Text14, { bold: true, color: "blue", children: ticketKey }),
4929
+ /* @__PURE__ */ jsx18(Text16, { bold: true, color: "blue", children: ticketKey }),
4272
4930
  " ",
4273
4931
  summary,
4274
- status && /* @__PURE__ */ jsxs15(Text14, { dimColor: true, children: [
4932
+ status && /* @__PURE__ */ jsxs16(Text16, { dimColor: true, children: [
4275
4933
  " [",
4276
4934
  status,
4277
4935
  "]"
@@ -4280,7 +4938,7 @@ function TicketItem({ ticketKey, summary, status, isHighlighted, isSelected }) {
4280
4938
  }
4281
4939
 
4282
4940
  // src/components/jira/JiraView.tsx
4283
- import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
4941
+ import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
4284
4942
  function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated }) {
4285
4943
  const repo = useGitRepo();
4286
4944
  const jira = useJiraTickets();
@@ -4288,7 +4946,7 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
4288
4946
  const nav = useListNavigation({ items: jira.tickets });
4289
4947
  const currentTicket = jira.tickets[nav.index] ?? null;
4290
4948
  const lastInitRef = useRef8(null);
4291
- useEffect14(() => {
4949
+ useEffect15(() => {
4292
4950
  if (repo.loading || !repo.repoPath || !repo.currentBranch) return;
4293
4951
  const current = { branch: repo.currentBranch };
4294
4952
  const last = lastInitRef.current;
@@ -4296,17 +4954,17 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
4296
4954
  lastInitRef.current = current;
4297
4955
  jira.initializeJiraState(repo.repoPath, repo.currentBranch, repo.currentRepoSlug);
4298
4956
  }, [repo.loading, repo.repoPath, repo.currentBranch, repo.currentRepoSlug, jira.initializeJiraState]);
4299
- useEffect14(() => {
4957
+ useEffect15(() => {
4300
4958
  if (isActive) {
4301
4959
  repo.refreshBranch();
4302
4960
  } else {
4303
4961
  modal.close();
4304
4962
  }
4305
4963
  }, [isActive, repo.refreshBranch, modal.close]);
4306
- useEffect14(() => {
4964
+ useEffect15(() => {
4307
4965
  onModalChange == null ? void 0 : onModalChange(modal.isOpen);
4308
4966
  }, [modal.isOpen, onModalChange]);
4309
- useEffect14(() => {
4967
+ useEffect15(() => {
4310
4968
  onJiraStateChange == null ? void 0 : onJiraStateChange(jira.jiraState);
4311
4969
  }, [jira.jiraState, onJiraStateChange]);
4312
4970
  const handleConfigureSubmit = async (siteUrl, email, apiToken) => {
@@ -4378,13 +5036,13 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
4378
5036
  { isActive: isActive && !modal.isOpen }
4379
5037
  );
4380
5038
  if (repo.isRepo === false) {
4381
- return /* @__PURE__ */ jsx17(TitledBox6, { borderStyle: "round", titles: ["Jira"], flexShrink: 0, children: /* @__PURE__ */ jsx17(Text15, { color: "red", children: "Not a git repository" }) });
5039
+ return /* @__PURE__ */ jsx19(TitledBox6, { borderStyle: "round", titles: ["Jira"], flexShrink: 0, children: /* @__PURE__ */ jsx19(Text17, { color: "red", children: "Not a git repository" }) });
4382
5040
  }
4383
5041
  if (modal.type === "configure") {
4384
5042
  const siteUrl = repo.repoPath ? getJiraSiteUrl(repo.repoPath) : void 0;
4385
5043
  const creds = repo.repoPath ? getJiraCredentials(repo.repoPath) : { email: null, apiToken: null };
4386
5044
  const existingConfigs = getExistingJiraConfigs(repo.repoPath ?? void 0);
4387
- return /* @__PURE__ */ jsx17(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx17(
5045
+ return /* @__PURE__ */ jsx19(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx19(
4388
5046
  ConfigureJiraSiteModal,
4389
5047
  {
4390
5048
  initialSiteUrl: siteUrl ?? void 0,
@@ -4401,7 +5059,7 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
4401
5059
  ) });
4402
5060
  }
4403
5061
  if (modal.type === "link") {
4404
- return /* @__PURE__ */ jsx17(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx17(
5062
+ return /* @__PURE__ */ jsx19(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx19(
4405
5063
  LinkTicketModal,
4406
5064
  {
4407
5065
  onSubmit: handleLinkSubmit,
@@ -4415,7 +5073,7 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
4415
5073
  ) });
4416
5074
  }
4417
5075
  if (modal.type === "status" && repo.repoPath && repo.currentBranch && currentTicket) {
4418
- return /* @__PURE__ */ jsx17(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx17(
5076
+ return /* @__PURE__ */ jsx19(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx19(
4419
5077
  ChangeStatusModal,
4420
5078
  {
4421
5079
  repoPath: repo.repoPath,
@@ -4428,10 +5086,10 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
4428
5086
  }
4429
5087
  const title = "[4] Jira";
4430
5088
  const borderColor = isActive ? "yellow" : void 0;
4431
- return /* @__PURE__ */ jsx17(TitledBox6, { borderStyle: "round", titles: [title], borderColor, flexShrink: 0, children: /* @__PURE__ */ jsxs16(Box17, { flexDirection: "column", paddingX: 1, children: [
4432
- jira.jiraState === "not_configured" && /* @__PURE__ */ jsx17(Text15, { dimColor: true, children: "No Jira site configured" }),
4433
- jira.jiraState === "no_tickets" && /* @__PURE__ */ jsx17(Text15, { dimColor: true, children: "No tickets linked to this branch" }),
4434
- jira.jiraState === "has_tickets" && jira.tickets.map((ticket, idx) => /* @__PURE__ */ jsx17(
5089
+ return /* @__PURE__ */ jsx19(TitledBox6, { borderStyle: "round", titles: [title], borderColor, flexShrink: 0, children: /* @__PURE__ */ jsxs17(Box17, { flexDirection: "column", paddingX: 1, children: [
5090
+ jira.jiraState === "not_configured" && /* @__PURE__ */ jsx19(Text17, { dimColor: true, children: "No Jira site configured" }),
5091
+ jira.jiraState === "no_tickets" && /* @__PURE__ */ jsx19(Text17, { dimColor: true, children: "No tickets linked to this branch" }),
5092
+ jira.jiraState === "has_tickets" && jira.tickets.map((ticket, idx) => /* @__PURE__ */ jsx19(
4435
5093
  TicketItem,
4436
5094
  {
4437
5095
  ticketKey: ticket.key,
@@ -4445,23 +5103,22 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
4445
5103
  }
4446
5104
 
4447
5105
  // src/components/logs/LogsView.tsx
4448
- import { useEffect as useEffect16 } from "react";
5106
+ import { useEffect as useEffect17 } from "react";
4449
5107
  import { Box as Box20, useInput as useInput17 } from "ink";
4450
5108
 
4451
5109
  // src/components/logs/LogViewerBox.tsx
4452
- import { useEffect as useEffect15, useRef as useRef9, useState as useState20 } from "react";
5110
+ import { useEffect as useEffect16, useRef as useRef9, useState as useState21 } from "react";
4453
5111
  import { TitledBox as TitledBox7 } from "@mishieck/ink-titled-box";
4454
- import { Box as Box18, Text as Text16, useInput as useInput15 } from "ink";
5112
+ import { Box as Box18, Text as Text18, useInput as useInput15 } from "ink";
4455
5113
  import { ScrollView as ScrollView9 } from "ink-scroll-view";
4456
- import Spinner4 from "ink-spinner";
4457
5114
  import TextInput2 from "ink-text-input";
4458
- import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
5115
+ import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
4459
5116
  function LogViewerBox({ date, content, isActive, onRefresh, onLogCreated }) {
4460
5117
  const scrollRef = useRef9(null);
4461
- const [isInputMode, setIsInputMode] = useState20(false);
4462
- const [inputValue, setInputValue] = useState20("");
4463
- const [isGeneratingStandup, setIsGeneratingStandup] = useState20(false);
4464
- const [standupResult, setStandupResult] = useState20(null);
5118
+ const [isInputMode, setIsInputMode] = useState21(false);
5119
+ const [inputValue, setInputValue] = useState21("");
5120
+ const [isGeneratingStandup, setIsGeneratingStandup] = useState21(false);
5121
+ const [standupResult, setStandupResult] = useState21(null);
4465
5122
  const claudeProcessRef = useRef9(null);
4466
5123
  const title = "[6] Log Content";
4467
5124
  const borderColor = isActive ? "yellow" : void 0;
@@ -4513,9 +5170,9 @@ function LogViewerBox({ date, content, isActive, onRefresh, onLogCreated }) {
4513
5170
  if (input === "c" && date && content && !isGeneratingStandup) {
4514
5171
  setIsGeneratingStandup(true);
4515
5172
  setStandupResult(null);
4516
- const process2 = generateStandupNotes(content);
4517
- claudeProcessRef.current = process2;
4518
- process2.promise.then((result) => {
5173
+ const process3 = generateStandupNotes(content);
5174
+ claudeProcessRef.current = process3;
5175
+ process3.promise.then((result) => {
4519
5176
  claudeProcessRef.current = null;
4520
5177
  setIsGeneratingStandup(false);
4521
5178
  if (result.success) {
@@ -4528,7 +5185,7 @@ function LogViewerBox({ date, content, isActive, onRefresh, onLogCreated }) {
4528
5185
  },
4529
5186
  { isActive }
4530
5187
  );
4531
- useEffect15(() => {
5188
+ useEffect16(() => {
4532
5189
  return () => {
4533
5190
  var _a;
4534
5191
  (_a = claudeProcessRef.current) == null ? void 0 : _a.cancel();
@@ -4551,14 +5208,14 @@ ${value.trim()}
4551
5208
  setIsInputMode(false);
4552
5209
  onRefresh();
4553
5210
  };
4554
- return /* @__PURE__ */ jsxs17(Box18, { flexDirection: "column", flexGrow: 1, children: [
4555
- /* @__PURE__ */ jsx18(TitledBox7, { borderStyle: "round", titles: [displayTitle], borderColor, flexGrow: 1, children: /* @__PURE__ */ jsx18(Box18, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx18(ScrollView9, { ref: scrollRef, children: /* @__PURE__ */ jsxs17(Box18, { flexDirection: "column", paddingX: 1, children: [
4556
- !date && /* @__PURE__ */ jsx18(Text16, { dimColor: true, children: "Select a log file to view" }),
4557
- date && content === null && /* @__PURE__ */ jsx18(Text16, { dimColor: true, children: "Log file not found" }),
4558
- date && content !== null && content.trim() === "" && /* @__PURE__ */ jsx18(Text16, { dimColor: true, children: "Empty log file" }),
4559
- date && content && content.trim() !== "" && /* @__PURE__ */ jsx18(Markdown, { children: content })
5211
+ return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", flexGrow: 1, children: [
5212
+ /* @__PURE__ */ jsx20(TitledBox7, { borderStyle: "round", titles: [displayTitle], borderColor, flexGrow: 1, children: /* @__PURE__ */ jsx20(Box18, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx20(ScrollView9, { ref: scrollRef, children: /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", paddingX: 1, children: [
5213
+ !date && /* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Select a log file to view" }),
5214
+ date && content === null && /* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Log file not found" }),
5215
+ date && content !== null && content.trim() === "" && /* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Empty log file" }),
5216
+ date && content && content.trim() !== "" && /* @__PURE__ */ jsx20(Markdown, { children: content })
4560
5217
  ] }) }) }) }),
4561
- isInputMode && /* @__PURE__ */ jsx18(TitledBox7, { borderStyle: "round", titles: ["Add Entry"], borderColor: "yellow", children: /* @__PURE__ */ jsx18(Box18, { paddingX: 1, children: /* @__PURE__ */ jsx18(
5218
+ isInputMode && /* @__PURE__ */ jsx20(TitledBox7, { borderStyle: "round", titles: ["Add Entry"], borderColor: "yellow", children: /* @__PURE__ */ jsx20(Box18, { paddingX: 1, children: /* @__PURE__ */ jsx20(
4562
5219
  TextInput2,
4563
5220
  {
4564
5221
  value: inputValue,
@@ -4566,22 +5223,19 @@ ${value.trim()}
4566
5223
  onSubmit: handleInputSubmit
4567
5224
  }
4568
5225
  ) }) }),
4569
- isGeneratingStandup && /* @__PURE__ */ jsx18(TitledBox7, { borderStyle: "round", titles: ["Standup Notes"], borderColor: "yellow", children: /* @__PURE__ */ jsxs17(Box18, { paddingX: 1, flexDirection: "column", children: [
4570
- /* @__PURE__ */ jsxs17(Text16, { color: "yellow", children: [
4571
- /* @__PURE__ */ jsx18(Spinner4, { type: "dots" }),
4572
- " Generating standup notes..."
4573
- ] }),
4574
- /* @__PURE__ */ jsx18(Text16, { dimColor: true, children: "Press Esc to cancel" })
5226
+ isGeneratingStandup && /* @__PURE__ */ jsx20(TitledBox7, { borderStyle: "round", titles: ["Standup Notes"], borderColor: "yellow", children: /* @__PURE__ */ jsxs18(Box18, { paddingX: 1, flexDirection: "column", children: [
5227
+ /* @__PURE__ */ jsx20(AnimatedText, { name: "radar", config: { baseColor: "#CC6600" }, children: "Generating standup notes with Claude..." }),
5228
+ /* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Press Esc to cancel" })
4575
5229
  ] }) }),
4576
- standupResult && /* @__PURE__ */ jsx18(
5230
+ standupResult && /* @__PURE__ */ jsx20(
4577
5231
  TitledBox7,
4578
5232
  {
4579
5233
  borderStyle: "round",
4580
5234
  titles: ["Standup Notes"],
4581
5235
  borderColor: standupResult.type === "error" ? "red" : "green",
4582
- children: /* @__PURE__ */ jsxs17(Box18, { paddingX: 1, flexDirection: "column", children: [
4583
- standupResult.type === "error" ? /* @__PURE__ */ jsx18(Text16, { color: "red", children: standupResult.message }) : /* @__PURE__ */ jsx18(Markdown, { children: standupResult.message }),
4584
- /* @__PURE__ */ jsx18(Text16, { dimColor: true, children: "Press Esc to dismiss" })
5236
+ children: /* @__PURE__ */ jsxs18(Box18, { paddingX: 1, flexDirection: "column", children: [
5237
+ standupResult.type === "error" ? /* @__PURE__ */ jsx20(Text18, { color: "red", children: standupResult.message }) : /* @__PURE__ */ jsx20(Markdown, { children: standupResult.message }),
5238
+ /* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Press Esc to dismiss" })
4585
5239
  ] })
4586
5240
  }
4587
5241
  )
@@ -4590,9 +5244,9 @@ ${value.trim()}
4590
5244
 
4591
5245
  // src/components/logs/LogsHistoryBox.tsx
4592
5246
  import { TitledBox as TitledBox8 } from "@mishieck/ink-titled-box";
4593
- import { Box as Box19, Text as Text17, useInput as useInput16 } from "ink";
5247
+ import { Box as Box19, Text as Text19, useInput as useInput16 } from "ink";
4594
5248
  import { ScrollView as ScrollView10 } from "ink-scroll-view";
4595
- import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
5249
+ import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
4596
5250
  function LogsHistoryBox({
4597
5251
  logFiles,
4598
5252
  selectedDate,
@@ -4622,31 +5276,31 @@ function LogsHistoryBox({
4622
5276
  },
4623
5277
  { isActive }
4624
5278
  );
4625
- return /* @__PURE__ */ jsx19(TitledBox8, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs18(Box19, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
4626
- logFiles.length === 0 && /* @__PURE__ */ jsx19(Text17, { dimColor: true, children: "No logs yet" }),
4627
- logFiles.length > 0 && /* @__PURE__ */ jsx19(ScrollView10, { ref: scrollRef, children: logFiles.map((file, idx) => {
5279
+ return /* @__PURE__ */ jsx21(TitledBox8, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs19(Box19, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
5280
+ logFiles.length === 0 && /* @__PURE__ */ jsx21(Text19, { dimColor: true, children: "No logs yet" }),
5281
+ logFiles.length > 0 && /* @__PURE__ */ jsx21(ScrollView10, { ref: scrollRef, children: logFiles.map((file, idx) => {
4628
5282
  const isHighlighted = idx === highlightedIndex;
4629
5283
  const isSelected = file.date === selectedDate;
4630
5284
  const cursor = isHighlighted ? ">" : " ";
4631
5285
  const indicator = isSelected ? " *" : "";
4632
- return /* @__PURE__ */ jsxs18(Box19, { children: [
4633
- /* @__PURE__ */ jsxs18(Text17, { color: isHighlighted ? "yellow" : void 0, children: [
5286
+ return /* @__PURE__ */ jsxs19(Box19, { children: [
5287
+ /* @__PURE__ */ jsxs19(Text19, { color: isHighlighted ? "yellow" : void 0, children: [
4634
5288
  cursor,
4635
5289
  " "
4636
5290
  ] }),
4637
- /* @__PURE__ */ jsx19(Text17, { color: file.isToday ? "green" : void 0, bold: file.isToday, children: file.date }),
4638
- file.isToday && /* @__PURE__ */ jsx19(Text17, { color: "green", children: " (today)" }),
4639
- /* @__PURE__ */ jsx19(Text17, { dimColor: true, children: indicator })
5291
+ /* @__PURE__ */ jsx21(Text19, { color: file.isToday ? "green" : void 0, bold: file.isToday, children: file.date }),
5292
+ file.isToday && /* @__PURE__ */ jsx21(Text19, { color: "green", children: " (today)" }),
5293
+ /* @__PURE__ */ jsx21(Text19, { dimColor: true, children: indicator })
4640
5294
  ] }, file.date);
4641
5295
  }) })
4642
5296
  ] }) });
4643
5297
  }
4644
5298
 
4645
5299
  // src/components/logs/LogsView.tsx
4646
- import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
5300
+ import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
4647
5301
  function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
4648
5302
  const logs = useLogs();
4649
- useEffect16(() => {
5303
+ useEffect17(() => {
4650
5304
  if (refreshKey !== void 0 && refreshKey > 0) {
4651
5305
  logs.handleExternalLogUpdate();
4652
5306
  }
@@ -4658,8 +5312,8 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
4658
5312
  },
4659
5313
  { isActive }
4660
5314
  );
4661
- return /* @__PURE__ */ jsxs19(Box20, { flexDirection: "column", flexGrow: 1, children: [
4662
- /* @__PURE__ */ jsx20(
5315
+ return /* @__PURE__ */ jsxs20(Box20, { flexDirection: "column", flexGrow: 1, children: [
5316
+ /* @__PURE__ */ jsx22(
4663
5317
  LogsHistoryBox,
4664
5318
  {
4665
5319
  logFiles: logs.logFiles,
@@ -4670,7 +5324,7 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
4670
5324
  isActive: isActive && focusedBox === "history"
4671
5325
  }
4672
5326
  ),
4673
- /* @__PURE__ */ jsx20(
5327
+ /* @__PURE__ */ jsx22(
4674
5328
  LogViewerBox,
4675
5329
  {
4676
5330
  date: logs.selectedDate,
@@ -4684,8 +5338,8 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
4684
5338
  }
4685
5339
 
4686
5340
  // src/components/ui/KeybindingsBar.tsx
4687
- import { Box as Box21, Text as Text18 } from "ink";
4688
- import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
5341
+ import { Box as Box21, Text as Text20 } from "ink";
5342
+ import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
4689
5343
  var globalBindings = [
4690
5344
  { key: "1-4", label: "Focus" },
4691
5345
  { key: "Tab", label: "Switch Tab" },
@@ -4696,14 +5350,14 @@ var modalBindings = [{ key: "Esc", label: "Cancel" }];
4696
5350
  var DUCK_ASCII = "<(')___";
4697
5351
  function KeybindingsBar({ contextBindings = [], modalOpen = false, duck }) {
4698
5352
  const allBindings = modalOpen ? [...contextBindings, ...modalBindings] : [...contextBindings, ...globalBindings];
4699
- return /* @__PURE__ */ jsxs20(Box21, { flexShrink: 0, paddingX: 1, gap: 2, children: [
4700
- allBindings.map((binding) => /* @__PURE__ */ jsxs20(Box21, { gap: 1, children: [
4701
- /* @__PURE__ */ jsx21(Text18, { bold: true, color: binding.color ?? "yellow", children: binding.key }),
4702
- /* @__PURE__ */ jsx21(Text18, { dimColor: true, children: binding.label })
5353
+ return /* @__PURE__ */ jsxs21(Box21, { flexShrink: 0, paddingX: 1, gap: 2, children: [
5354
+ allBindings.map((binding) => /* @__PURE__ */ jsxs21(Box21, { gap: 1, children: [
5355
+ /* @__PURE__ */ jsx23(Text20, { bold: true, color: binding.color ?? "yellow", children: binding.key }),
5356
+ /* @__PURE__ */ jsx23(Text20, { dimColor: true, children: binding.label })
4703
5357
  ] }, binding.key)),
4704
- (duck == null ? void 0 : duck.visible) && /* @__PURE__ */ jsxs20(Box21, { flexGrow: 1, justifyContent: "flex-end", gap: 1, children: [
4705
- /* @__PURE__ */ jsx21(Text18, { children: DUCK_ASCII }),
4706
- /* @__PURE__ */ jsx21(Text18, { dimColor: true, children: duck.message })
5358
+ (duck == null ? void 0 : duck.visible) && /* @__PURE__ */ jsxs21(Box21, { flexGrow: 1, justifyContent: "flex-end", gap: 1, children: [
5359
+ /* @__PURE__ */ jsx23(Text20, { children: DUCK_ASCII }),
5360
+ /* @__PURE__ */ jsx23(Text20, { dimColor: true, children: duck.message })
4707
5361
  ] })
4708
5362
  ] });
4709
5363
  }
@@ -4731,6 +5385,23 @@ var GITHUB_KEYBINDINGS = {
4731
5385
  ]
4732
5386
  };
4733
5387
 
5388
+ // src/constants/jira.ts
5389
+ var JIRA_KEYBINDINGS = {
5390
+ not_configured: [{ key: "c", label: "Configure Jira" }],
5391
+ no_tickets: [
5392
+ { key: "l", label: "Link Ticket" },
5393
+ { key: "r", label: "Remove Config", color: "red" }
5394
+ ],
5395
+ has_tickets: [
5396
+ { key: "l", label: "Link" },
5397
+ { key: "s", label: "Status" },
5398
+ { key: "d", label: "Unlink", color: "red" },
5399
+ { key: "o", label: "Open", color: "green" },
5400
+ { key: "y", label: "Copy Link" },
5401
+ { key: "r", label: "Remove Config", color: "red" }
5402
+ ]
5403
+ };
5404
+
4734
5405
  // src/constants/jira-browser.ts
4735
5406
  var JIRA_BROWSER_KEYBINDINGS = {
4736
5407
  "saved-views": [
@@ -4752,23 +5423,6 @@ var JIRA_BROWSER_KEYBINDINGS = {
4752
5423
  ]
4753
5424
  };
4754
5425
 
4755
- // src/constants/jira.ts
4756
- var JIRA_KEYBINDINGS = {
4757
- not_configured: [{ key: "c", label: "Configure Jira" }],
4758
- no_tickets: [
4759
- { key: "l", label: "Link Ticket" },
4760
- { key: "r", label: "Remove Config", color: "red" }
4761
- ],
4762
- has_tickets: [
4763
- { key: "l", label: "Link" },
4764
- { key: "s", label: "Status" },
4765
- { key: "d", label: "Unlink", color: "red" },
4766
- { key: "o", label: "Open", color: "green" },
4767
- { key: "y", label: "Copy Link" },
4768
- { key: "r", label: "Remove Config", color: "red" }
4769
- ]
4770
- };
4771
-
4772
5426
  // src/constants/logs.ts
4773
5427
  var LOGS_KEYBINDINGS = {
4774
5428
  history: [{ key: "Space", label: "Select" }],
@@ -4800,19 +5454,19 @@ function computeKeybindings(focusedView, state) {
4800
5454
  }
4801
5455
 
4802
5456
  // src/app.tsx
4803
- import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
5457
+ import { jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
4804
5458
  function App() {
4805
5459
  const { exit } = useApp();
4806
- const [focusedView, setFocusedView] = useState21("github");
4807
- const [modalOpen, setModalOpen] = useState21(false);
4808
- const [logRefreshKey, setLogRefreshKey] = useState21(0);
4809
- const [activeTab, setActiveTab] = useState21("logs");
5460
+ const [focusedView, setFocusedView] = useState22("github");
5461
+ const [modalOpen, setModalOpen] = useState22(false);
5462
+ const [logRefreshKey, setLogRefreshKey] = useState22(0);
5463
+ const [activeTab, setActiveTab] = useState22("logs");
4810
5464
  const duck = useRubberDuck();
4811
- const [githubFocusedBox, setGithubFocusedBox] = useState21("remotes");
4812
- const [jiraState, setJiraState] = useState21("not_configured");
4813
- const [logsFocusedBox, setLogsFocusedBox] = useState21("history");
4814
- const [jiraBrowserFocusedBox, setJiraBrowserFocusedBox] = useState21("saved-views");
4815
- const [jiraBrowserModalOpen, setJiraBrowserModalOpen] = useState21(false);
5465
+ const [githubFocusedBox, setGithubFocusedBox] = useState22("remotes");
5466
+ const [jiraState, setJiraState] = useState22("not_configured");
5467
+ const [logsFocusedBox, setLogsFocusedBox] = useState22("history");
5468
+ const [jiraBrowserFocusedBox, setJiraBrowserFocusedBox] = useState22("saved-views");
5469
+ const [jiraBrowserModalOpen, setJiraBrowserModalOpen] = useState22(false);
4816
5470
  const keybindings = useMemo4(
4817
5471
  () => computeKeybindings(focusedView, {
4818
5472
  github: { focusedBox: githubFocusedBox },
@@ -4865,17 +5519,17 @@ function App() {
4865
5519
  },
4866
5520
  { isActive: !anyModalOpen }
4867
5521
  );
4868
- return /* @__PURE__ */ jsxs21(Box22, { flexGrow: 1, flexDirection: "column", overflow: "hidden", children: [
4869
- /* @__PURE__ */ jsxs21(Box22, { height: 1, flexDirection: "row", columnGap: 1, children: [
4870
- /* @__PURE__ */ jsx22(Box22, { flexGrow: 1, paddingX: 1, flexBasis: 0, children: /* @__PURE__ */ jsx22(Text19, { color: "gray", children: "Current branch" }) }),
4871
- /* @__PURE__ */ jsxs21(Box22, { flexGrow: 1, gap: 1, flexBasis: 0, children: [
4872
- /* @__PURE__ */ jsx22(Text19, { color: "gray", children: "Dashboards" }),
4873
- COLUMN2_TABS.map((tab) => /* @__PURE__ */ jsx22(Text19, { bold: true, dimColor: activeTab !== tab.id, children: tab.label }, tab.id))
5522
+ return /* @__PURE__ */ jsxs22(Box22, { flexGrow: 1, flexDirection: "column", overflow: "hidden", children: [
5523
+ /* @__PURE__ */ jsxs22(Box22, { height: 1, flexDirection: "row", columnGap: 1, children: [
5524
+ /* @__PURE__ */ jsx24(Box22, { flexGrow: 1, paddingX: 1, flexBasis: 0, children: /* @__PURE__ */ jsx24(Text21, { color: "gray", children: "Current branch" }) }),
5525
+ /* @__PURE__ */ jsxs22(Box22, { flexGrow: 1, gap: 1, flexBasis: 0, children: [
5526
+ /* @__PURE__ */ jsx24(Text21, { color: "gray", children: "Dashboards" }),
5527
+ COLUMN2_TABS.map((tab) => /* @__PURE__ */ jsx24(Text21, { bold: true, dimColor: activeTab !== tab.id, children: tab.label }, tab.id))
4874
5528
  ] })
4875
5529
  ] }),
4876
- /* @__PURE__ */ jsxs21(Box22, { flexGrow: 1, flexDirection: "row", columnGap: 1, children: [
4877
- /* @__PURE__ */ jsxs21(Box22, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: [
4878
- /* @__PURE__ */ jsx22(
5530
+ /* @__PURE__ */ jsxs22(Box22, { flexGrow: 1, flexDirection: "row", columnGap: 1, children: [
5531
+ /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: [
5532
+ /* @__PURE__ */ jsx24(
4879
5533
  GitHubView,
4880
5534
  {
4881
5535
  isActive: focusedView === "github",
@@ -4883,7 +5537,7 @@ function App() {
4883
5537
  onLogUpdated: handleLogUpdated
4884
5538
  }
4885
5539
  ),
4886
- /* @__PURE__ */ jsx22(
5540
+ /* @__PURE__ */ jsx24(
4887
5541
  JiraView,
4888
5542
  {
4889
5543
  isActive: focusedView === "jira",
@@ -4893,8 +5547,8 @@ function App() {
4893
5547
  }
4894
5548
  )
4895
5549
  ] }),
4896
- /* @__PURE__ */ jsxs21(Box22, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: [
4897
- activeTab === "logs" && /* @__PURE__ */ jsx22(
5550
+ /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: [
5551
+ activeTab === "logs" && /* @__PURE__ */ jsx24(
4898
5552
  LogsView,
4899
5553
  {
4900
5554
  isActive: focusedView === "logs",
@@ -4903,7 +5557,7 @@ function App() {
4903
5557
  onFocusedBoxChange: setLogsFocusedBox
4904
5558
  }
4905
5559
  ),
4906
- activeTab === "jira-browser" && /* @__PURE__ */ jsx22(
5560
+ activeTab === "jira-browser" && /* @__PURE__ */ jsx24(
4907
5561
  JiraBrowserView,
4908
5562
  {
4909
5563
  isActive: focusedView === "jira-browser",
@@ -4915,7 +5569,7 @@ function App() {
4915
5569
  )
4916
5570
  ] })
4917
5571
  ] }),
4918
- /* @__PURE__ */ jsx22(
5572
+ /* @__PURE__ */ jsx24(
4919
5573
  KeybindingsBar,
4920
5574
  {
4921
5575
  contextBindings: keybindings,
@@ -4930,31 +5584,31 @@ function App() {
4930
5584
  import { render as inkRender } from "ink";
4931
5585
 
4932
5586
  // src/lib/Screen.tsx
4933
- import { useCallback as useCallback12, useEffect as useEffect17, useState as useState22 } from "react";
5587
+ import { useCallback as useCallback12, useEffect as useEffect18, useState as useState23 } from "react";
4934
5588
  import { Box as Box23, useStdout as useStdout2 } from "ink";
4935
- import { jsx as jsx23 } from "react/jsx-runtime";
5589
+ import { jsx as jsx25 } from "react/jsx-runtime";
4936
5590
  function Screen({ children }) {
4937
5591
  const { stdout } = useStdout2();
4938
5592
  const getSize = useCallback12(() => ({ height: stdout.rows, width: stdout.columns }), [stdout]);
4939
- const [size, setSize] = useState22(getSize);
4940
- useEffect17(() => {
5593
+ const [size, setSize] = useState23(getSize);
5594
+ useEffect18(() => {
4941
5595
  const onResize = () => setSize(getSize());
4942
5596
  stdout.on("resize", onResize);
4943
5597
  return () => {
4944
5598
  stdout.off("resize", onResize);
4945
5599
  };
4946
5600
  }, [stdout, getSize]);
4947
- return /* @__PURE__ */ jsx23(Box23, { height: size.height, width: size.width, children });
5601
+ return /* @__PURE__ */ jsx25(Box23, { height: size.height, width: size.width, children });
4948
5602
  }
4949
5603
 
4950
5604
  // src/lib/render.tsx
4951
- import { jsx as jsx24 } from "react/jsx-runtime";
5605
+ import { jsx as jsx26 } from "react/jsx-runtime";
4952
5606
  var ENTER_ALT_BUFFER = "\x1B[?1049h";
4953
5607
  var EXIT_ALT_BUFFER = "\x1B[?1049l";
4954
5608
  var CLEAR_SCREEN = "\x1B[2J\x1B[H";
4955
5609
  function render(node, options) {
4956
5610
  process.stdout.write(ENTER_ALT_BUFFER + CLEAR_SCREEN);
4957
- const element = /* @__PURE__ */ jsx24(Screen, { children: node });
5611
+ const element = /* @__PURE__ */ jsx26(Screen, { children: node });
4958
5612
  const instance = inkRender(element, options);
4959
5613
  setImmediate(() => instance.rerender(element));
4960
5614
  const cleanup = () => process.stdout.write(EXIT_ALT_BUFFER);
@@ -4975,7 +5629,7 @@ function render(node, options) {
4975
5629
  }
4976
5630
 
4977
5631
  // src/cli.tsx
4978
- import { jsx as jsx25 } from "react/jsx-runtime";
5632
+ import { jsx as jsx27 } from "react/jsx-runtime";
4979
5633
  var cli = meow(
4980
5634
  `
4981
5635
  Usage
@@ -5008,4 +5662,4 @@ if (cli.flags.cwd) {
5008
5662
  process.exit(1);
5009
5663
  }
5010
5664
  }
5011
- render(/* @__PURE__ */ jsx25(App, {}));
5665
+ render(/* @__PURE__ */ jsx27(App, {}));