@bojackduy/opencode-loopd 1.8.3 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/tui.js CHANGED
@@ -543,6 +543,66 @@ function countdownLabel(targetIso, now) {
543
543
  return `${minutes}m ${diff % 60}s`;
544
544
  return `${Math.floor(minutes / 60)}h ${minutes % 60}m`;
545
545
  }
546
+ function formatTokens(n) {
547
+ if (!n)
548
+ return "0";
549
+ if (n < 1000)
550
+ return String(Math.round(n));
551
+ if (n < 1e6)
552
+ return `${(n / 1000).toFixed(1)}k`;
553
+ return `${(n / 1e6).toFixed(2)}M`;
554
+ }
555
+ function formatCost(c) {
556
+ if (!c)
557
+ return "$0.00";
558
+ if (c < 0.01)
559
+ return `$${c.toFixed(4)}`;
560
+ return `$${c.toFixed(2)}`;
561
+ }
562
+ function formatDuration(seconds) {
563
+ if (!seconds || seconds <= 0)
564
+ return "0s";
565
+ if (seconds < 60)
566
+ return `${Math.round(seconds)}s`;
567
+ const minutes = Math.floor(seconds / 60);
568
+ if (minutes < 60)
569
+ return `${minutes}m`;
570
+ return `${(seconds / 3600).toFixed(1)}h`;
571
+ }
572
+ function agentColor(color, theme) {
573
+ if (!color)
574
+ return theme.text;
575
+ const named = {
576
+ primary: theme.primary,
577
+ secondary: theme.secondary,
578
+ accent: theme.accent,
579
+ success: theme.success,
580
+ warning: theme.warning,
581
+ error: theme.error,
582
+ info: theme.info
583
+ };
584
+ if (named[color])
585
+ return named[color];
586
+ if (/^#[0-9a-fA-F]{3,8}$/.test(color))
587
+ return color;
588
+ return theme.text;
589
+ }
590
+ function indexAgents(list) {
591
+ const map = {};
592
+ for (const a of list) {
593
+ if (!a?.name)
594
+ continue;
595
+ map[a.name] = {
596
+ color: a.color,
597
+ mode: a.mode
598
+ };
599
+ map[a.name.toLowerCase()] = {
600
+ color: a.color,
601
+ mode: a.mode
602
+ };
603
+ }
604
+ return map;
605
+ }
546
606
  function LoopDashboard(props) {
547
607
  const theme = () => props.api.theme.current;
548
608
  const [mode, setMode] = createSignal("normal");
@@ -556,6 +616,7 @@ function LoopDashboard(props) {
556
616
  const [showHelp, setShowHelp] = createSignal(false);
557
617
  const [showCompleted, setShowCompleted] = createSignal(false);
558
618
  const [clock, setClock] = createSignal(Date.now());
619
+ const [agentIndex, setAgentIndex] = createSignal({});
559
620
  let inputEl;
560
621
  let focusTimer;
561
622
  const client = createControlClient(props.directory);
@@ -584,6 +645,15 @@ function LoopDashboard(props) {
584
645
  }
585
646
  }
586
647
  refresh();
648
+ async function refreshAgents() {
649
+ try {
650
+ const res = await props.api.client?.app?.agents?.();
651
+ const list = res?.data ?? res ?? [];
652
+ if (Array.isArray(list))
653
+ setAgentIndex(indexAgents(list));
654
+ } catch {}
655
+ }
656
+ refreshAgents();
587
657
  const unsubs = [props.api.event.on("session.idle", () => refresh()), props.api.event.on("session.status", () => refresh()), props.api.event.on("session.error", () => refresh()), props.api.event.on("session.compacted", () => refresh()), setInterval(refresh, 1e4), setInterval(() => setClock(Date.now()), 500)];
588
658
  onCleanup(() => {
589
659
  popMode();
@@ -1484,7 +1554,7 @@ function LoopDashboard(props) {
1484
1554
  _$setProp(_el$121, "border", true);
1485
1555
  _$setProp(_el$121, "padding", 1);
1486
1556
  _$setProp(_el$121, "flexShrink", 0);
1487
- _$setProp(_el$121, "maxHeight", 10);
1557
+ _$setProp(_el$121, "maxHeight", 13);
1488
1558
  _$insertNode(_el$122, _el$123);
1489
1559
  _$insertNode(_el$122, _el$125);
1490
1560
  _$insertNode(_el$122, _el$127);
@@ -1526,212 +1596,319 @@ function LoopDashboard(props) {
1526
1596
  return _el$133;
1527
1597
  })()];
1528
1598
  })(), _el$127);
1599
+ _$insert(_el$122, () => {
1600
+ const agentName = goal().config.agent;
1601
+ const meta = agentName ? agentIndex()[agentName] ?? agentIndex()[agentName.toLowerCase()] : undefined;
1602
+ const model = goal().config.model;
1603
+ const slash = model?.indexOf("/") ?? -1;
1604
+ return [`
1605
+ `, (() => {
1606
+ var _el$137 = _$createElement("span");
1607
+ _$insertNode(_el$137, _$createTextNode(`\uD83E\uDD16 `));
1608
+ _$effect((_$p) => _$setProp(_el$137, "style", {
1609
+ fg: theme().textMuted
1610
+ }, _$p));
1611
+ return _el$137;
1612
+ })(), agentName ? [(() => {
1613
+ var _el$149 = _$createElement("span");
1614
+ _$insert(_el$149, agentName);
1615
+ _$effect((_$p) => _$setProp(_el$149, "style", {
1616
+ fg: agentColor(meta?.color, theme()),
1617
+ bold: true
1618
+ }, _$p));
1619
+ return _el$149;
1620
+ })(), _$memo(() => _$memo(() => !!meta?.mode)() && (() => {
1621
+ var _el$150 = _$createElement("span"), _el$151 = _$createTextNode(` (`), _el$152 = _$createTextNode(`)`);
1622
+ _$insertNode(_el$150, _el$151);
1623
+ _$insertNode(_el$150, _el$152);
1624
+ _$insert(_el$150, () => meta.mode, _el$152);
1625
+ _$effect((_$p) => _$setProp(_el$150, "style", {
1626
+ fg: theme().textMuted
1627
+ }, _$p));
1628
+ return _el$150;
1629
+ })())] : (() => {
1630
+ var _el$153 = _$createElement("span");
1631
+ _$insertNode(_el$153, _$createTextNode(`parent default`));
1632
+ _$effect((_$p) => _$setProp(_el$153, "style", {
1633
+ fg: theme().textMuted
1634
+ }, _$p));
1635
+ return _el$153;
1636
+ })(), (() => {
1637
+ var _el$139 = _$createElement("span");
1638
+ _$insertNode(_el$139, _$createTextNode(` \u2502 \uD83E\uDDE0 `));
1639
+ _$effect((_$p) => _$setProp(_el$139, "style", {
1640
+ fg: theme().textMuted
1641
+ }, _$p));
1642
+ return _el$139;
1643
+ })(), model && slash > 0 ? [(() => {
1644
+ var _el$155 = _$createElement("span"), _el$156 = _$createTextNode(`/`);
1645
+ _$insertNode(_el$155, _el$156);
1646
+ _$insert(_el$155, () => model.slice(0, slash), _el$156);
1647
+ _$effect((_$p) => _$setProp(_el$155, "style", {
1648
+ fg: theme().textMuted
1649
+ }, _$p));
1650
+ return _el$155;
1651
+ })(), (() => {
1652
+ var _el$157 = _$createElement("span");
1653
+ _$insert(_el$157, () => model.slice(slash + 1));
1654
+ _$effect((_$p) => _$setProp(_el$157, "style", {
1655
+ fg: theme().info,
1656
+ bold: true
1657
+ }, _$p));
1658
+ return _el$157;
1659
+ })()] : (() => {
1660
+ var _el$158 = _$createElement("span");
1661
+ _$insertNode(_el$158, _$createTextNode(`session default`));
1662
+ _$effect((_$p) => _$setProp(_el$158, "style", {
1663
+ fg: theme().textMuted
1664
+ }, _$p));
1665
+ return _el$158;
1666
+ })(), (() => {
1667
+ var _el$141 = _$createElement("span");
1668
+ _$insertNode(_el$141, _$createTextNode(` \u2502 \uD83D\uDCB0 `));
1669
+ _$effect((_$p) => _$setProp(_el$141, "style", {
1670
+ fg: theme().textMuted
1671
+ }, _$p));
1672
+ return _el$141;
1673
+ })(), (() => {
1674
+ var _el$143 = _$createElement("span");
1675
+ _$insert(_el$143, () => formatTokens(goal().tokensUsed));
1676
+ _$effect((_$p) => _$setProp(_el$143, "style", {
1677
+ fg: theme().warning,
1678
+ bold: true
1679
+ }, _$p));
1680
+ return _el$143;
1681
+ })(), (() => {
1682
+ var _el$144 = _$createElement("span");
1683
+ _$insertNode(_el$144, _$createTextNode(` tokens \xB7 `));
1684
+ _$effect((_$p) => _$setProp(_el$144, "style", {
1685
+ fg: theme().textMuted
1686
+ }, _$p));
1687
+ return _el$144;
1688
+ })(), (() => {
1689
+ var _el$146 = _$createElement("span");
1690
+ _$insert(_el$146, () => formatCost(goal().costUsed));
1691
+ _$effect((_$p) => _$setProp(_el$146, "style", {
1692
+ fg: theme().success,
1693
+ bold: true
1694
+ }, _$p));
1695
+ return _el$146;
1696
+ })(), (() => {
1697
+ var _el$147 = _$createElement("span"), _el$148 = _$createTextNode(` \xB7 `);
1698
+ _$insertNode(_el$147, _el$148);
1699
+ _$insert(_el$147, () => formatDuration(goal().timeUsedSeconds), null);
1700
+ _$effect((_$p) => _$setProp(_el$147, "style", {
1701
+ fg: theme().textMuted
1702
+ }, _$p));
1703
+ return _el$147;
1704
+ })()];
1705
+ }, _el$127);
1529
1706
  _$insert(_el$128, () => goal().objective.slice(0, 160));
1530
1707
  _$insert(_el$122, (() => {
1531
1708
  var _c$11 = _$memo(() => !!lp());
1532
1709
  return () => _c$11() && [(() => {
1533
- var _el$137 = _$createElement("span"), _el$138 = _$createTextNode(`
1710
+ var _el$160 = _$createElement("span"), _el$161 = _$createTextNode(`
1534
1711
  \u2714 `);
1535
- _$insertNode(_el$137, _el$138);
1536
- _$effect((_$p) => _$setProp(_el$137, "style", {
1712
+ _$insertNode(_el$160, _el$161);
1713
+ _$effect((_$p) => _$setProp(_el$160, "style", {
1537
1714
  fg: theme().success
1538
1715
  }, _$p));
1539
- return _el$137;
1716
+ return _el$160;
1540
1717
  })(), (() => {
1541
- var _el$140 = _$createElement("span");
1542
- _$insert(_el$140, () => lp().summary.slice(0, 100));
1543
- _$effect((_$p) => _$setProp(_el$140, "style", {
1718
+ var _el$163 = _$createElement("span");
1719
+ _$insert(_el$163, () => lp().summary.slice(0, 100));
1720
+ _$effect((_$p) => _$setProp(_el$163, "style", {
1544
1721
  fg: theme().text
1545
1722
  }, _$p));
1546
- return _el$140;
1723
+ return _el$163;
1547
1724
  })(), (() => {
1548
- var _el$141 = _$createElement("span"), _el$142 = _$createTextNode(` \u2192 `);
1549
- _$insertNode(_el$141, _el$142);
1550
- _$insert(_el$141, () => lp().next?.slice(0, 60) || "", null);
1551
- _$effect((_$p) => _$setProp(_el$141, "style", {
1725
+ var _el$164 = _$createElement("span"), _el$165 = _$createTextNode(` \u2192 `);
1726
+ _$insertNode(_el$164, _el$165);
1727
+ _$insert(_el$164, () => lp().next?.slice(0, 60) || "", null);
1728
+ _$effect((_$p) => _$setProp(_el$164, "style", {
1552
1729
  fg: theme().textMuted
1553
1730
  }, _$p));
1554
- return _el$141;
1731
+ return _el$164;
1555
1732
  })()];
1556
1733
  })(), null);
1557
1734
  _$insert(_el$122, (() => {
1558
1735
  var _c$12 = _$memo(() => !!blk());
1559
1736
  return () => _c$12() && [(() => {
1560
- var _el$143 = _$createElement("span"), _el$144 = _$createTextNode(`
1737
+ var _el$166 = _$createElement("span"), _el$167 = _$createTextNode(`
1561
1738
  \u2716 blocked: `);
1562
- _$insertNode(_el$143, _el$144);
1563
- _$effect((_$p) => _$setProp(_el$143, "style", {
1739
+ _$insertNode(_el$166, _el$167);
1740
+ _$effect((_$p) => _$setProp(_el$166, "style", {
1564
1741
  fg: theme().error,
1565
1742
  bold: true
1566
1743
  }, _$p));
1567
- return _el$143;
1744
+ return _el$166;
1568
1745
  })(), (() => {
1569
- var _el$146 = _$createElement("span");
1570
- _$insert(_el$146, () => blk().reason.slice(0, 140));
1571
- _$effect((_$p) => _$setProp(_el$146, "style", {
1746
+ var _el$169 = _$createElement("span");
1747
+ _$insert(_el$169, () => blk().reason.slice(0, 140));
1748
+ _$effect((_$p) => _$setProp(_el$169, "style", {
1572
1749
  fg: theme().error
1573
1750
  }, _$p));
1574
- return _el$146;
1751
+ return _el$169;
1575
1752
  })(), (() => {
1576
- var _el$147 = _$createElement("span"), _el$148 = _$createTextNode(` \u2014 `);
1577
- _$insertNode(_el$147, _el$148);
1578
- _$insert(_el$147, () => blk().needed.slice(0, 60), null);
1579
- _$effect((_$p) => _$setProp(_el$147, "style", {
1753
+ var _el$170 = _$createElement("span"), _el$171 = _$createTextNode(` \u2014 `);
1754
+ _$insertNode(_el$170, _el$171);
1755
+ _$insert(_el$170, () => blk().needed.slice(0, 60), null);
1756
+ _$effect((_$p) => _$setProp(_el$170, "style", {
1580
1757
  fg: theme().textMuted
1581
1758
  }, _$p));
1582
- return _el$147;
1759
+ return _el$170;
1583
1760
  })()];
1584
1761
  })(), null);
1585
1762
  _$insert(_el$122, (() => {
1586
1763
  var _c$13 = _$memo(() => !!goal().config.artifactDir);
1587
1764
  return () => _c$13() && [(() => {
1588
- var _el$149 = _$createElement("span"), _el$150 = _$createTextNode(`
1765
+ var _el$172 = _$createElement("span"), _el$173 = _$createTextNode(`
1589
1766
  \uD83D\uDCC1 `);
1590
- _$insertNode(_el$149, _el$150);
1591
- _$effect((_$p) => _$setProp(_el$149, "style", {
1767
+ _$insertNode(_el$172, _el$173);
1768
+ _$effect((_$p) => _$setProp(_el$172, "style", {
1592
1769
  fg: theme().accent
1593
1770
  }, _$p));
1594
- return _el$149;
1771
+ return _el$172;
1595
1772
  })(), (() => {
1596
- var _el$152 = _$createElement("span");
1597
- _$insert(_el$152, () => String(goal().config.artifactDir).replace(String(props.directory), "."));
1598
- _$effect((_$p) => _$setProp(_el$152, "style", {
1773
+ var _el$175 = _$createElement("span");
1774
+ _$insert(_el$175, () => String(goal().config.artifactDir).replace(String(props.directory), "."));
1775
+ _$effect((_$p) => _$setProp(_el$175, "style", {
1599
1776
  fg: theme().textMuted
1600
1777
  }, _$p));
1601
- return _el$152;
1778
+ return _el$175;
1602
1779
  })()];
1603
1780
  })(), null);
1604
1781
  _$insert(_el$122, (() => {
1605
1782
  var _c$14 = _$memo(() => (goal().config.checks?.length ?? 0) > 0);
1606
1783
  return () => _c$14() ? [(() => {
1607
- var _el$153 = _$createElement("span"), _el$154 = _$createTextNode(`
1784
+ var _el$176 = _$createElement("span"), _el$177 = _$createTextNode(`
1608
1785
  \u25A3 checks: `);
1609
- _$insertNode(_el$153, _el$154);
1610
- _$effect((_$p) => _$setProp(_el$153, "style", {
1786
+ _$insertNode(_el$176, _el$177);
1787
+ _$effect((_$p) => _$setProp(_el$176, "style", {
1611
1788
  fg: theme().warning
1612
1789
  }, _$p));
1613
- return _el$153;
1790
+ return _el$176;
1614
1791
  })(), (() => {
1615
- var _el$156 = _$createElement("span");
1616
- _$insert(_el$156, () => goal().config.checks.join(", ").slice(0, 100));
1617
- _$effect((_$p) => _$setProp(_el$156, "style", {
1792
+ var _el$179 = _$createElement("span");
1793
+ _$insert(_el$179, () => goal().config.checks.join(", ").slice(0, 100));
1794
+ _$effect((_$p) => _$setProp(_el$179, "style", {
1618
1795
  fg: theme().textMuted
1619
1796
  }, _$p));
1620
- return _el$156;
1797
+ return _el$179;
1621
1798
  })()] : null;
1622
1799
  })(), null);
1623
1800
  _$insert(_el$122, (() => {
1624
1801
  var _c$15 = _$memo(() => rt()?.evaluatorRejectionCount > 0);
1625
1802
  return () => _c$15() && [(() => {
1626
- var _el$157 = _$createElement("span"), _el$158 = _$createTextNode(`
1803
+ var _el$180 = _$createElement("span"), _el$181 = _$createTextNode(`
1627
1804
  \u26A0 rejections: `);
1628
- _$insertNode(_el$157, _el$158);
1629
- _$effect((_$p) => _$setProp(_el$157, "style", {
1805
+ _$insertNode(_el$180, _el$181);
1806
+ _$effect((_$p) => _$setProp(_el$180, "style", {
1630
1807
  fg: theme().warning
1631
1808
  }, _$p));
1632
- return _el$157;
1809
+ return _el$180;
1633
1810
  })(), (() => {
1634
- var _el$160 = _$createElement("span"), _el$161 = _$createTextNode(` \u2014 `);
1635
- _$insertNode(_el$160, _el$161);
1636
- _$insert(_el$160, () => String(rt().evaluatorRejectionCount), _el$161);
1637
- _$insert(_el$160, () => String(rt().lastRejectionDetails || "").slice(0, 80), null);
1638
- _$effect((_$p) => _$setProp(_el$160, "style", {
1811
+ var _el$183 = _$createElement("span"), _el$184 = _$createTextNode(` \u2014 `);
1812
+ _$insertNode(_el$183, _el$184);
1813
+ _$insert(_el$183, () => String(rt().evaluatorRejectionCount), _el$184);
1814
+ _$insert(_el$183, () => String(rt().lastRejectionDetails || "").slice(0, 80), null);
1815
+ _$effect((_$p) => _$setProp(_el$183, "style", {
1639
1816
  fg: theme().warning
1640
1817
  }, _$p));
1641
- return _el$160;
1818
+ return _el$183;
1642
1819
  })()];
1643
1820
  })(), null);
1644
1821
  _$insert(_el$122, (() => {
1645
1822
  var _c$16 = _$memo(() => rt()?.unknownStatusCount > 0);
1646
1823
  return () => _c$16() && [(() => {
1647
- var _el$162 = _$createElement("span"), _el$163 = _$createTextNode(`
1824
+ var _el$185 = _$createElement("span"), _el$186 = _$createTextNode(`
1648
1825
  \u26A0\uFE0F unreachable: `);
1649
- _$insertNode(_el$162, _el$163);
1650
- _$effect((_$p) => _$setProp(_el$162, "style", {
1826
+ _$insertNode(_el$185, _el$186);
1827
+ _$effect((_$p) => _$setProp(_el$185, "style", {
1651
1828
  fg: theme().error
1652
1829
  }, _$p));
1653
- return _el$162;
1830
+ return _el$185;
1654
1831
  })(), (() => {
1655
- var _el$165 = _$createElement("span"), _el$166 = _$createTextNode(`/3`);
1656
- _$insertNode(_el$165, _el$166);
1657
- _$insert(_el$165, () => String(rt().unknownStatusCount), _el$166);
1658
- _$effect((_$p) => _$setProp(_el$165, "style", {
1832
+ var _el$188 = _$createElement("span"), _el$189 = _$createTextNode(`/3`);
1833
+ _$insertNode(_el$188, _el$189);
1834
+ _$insert(_el$188, () => String(rt().unknownStatusCount), _el$189);
1835
+ _$effect((_$p) => _$setProp(_el$188, "style", {
1659
1836
  fg: theme().error
1660
1837
  }, _$p));
1661
- return _el$165;
1838
+ return _el$188;
1662
1839
  })(), (() => {
1663
- var _el$167 = _$createElement("span");
1664
- _$insertNode(_el$167, _$createTextNode(` \u2014 nudge to recover`));
1665
- _$effect((_$p) => _$setProp(_el$167, "style", {
1840
+ var _el$190 = _$createElement("span");
1841
+ _$insertNode(_el$190, _$createTextNode(` \u2014 nudge to recover`));
1842
+ _$effect((_$p) => _$setProp(_el$190, "style", {
1666
1843
  fg: theme().textMuted
1667
1844
  }, _$p));
1668
- return _el$167;
1845
+ return _el$190;
1669
1846
  })()];
1670
1847
  })(), null);
1671
1848
  _$insert(_el$122, (() => {
1672
1849
  var _c$17 = _$memo(() => !!rt()?.retryAfter);
1673
1850
  return () => _c$17() && [(() => {
1674
- var _el$169 = _$createElement("span"), _el$170 = _$createTextNode(`
1851
+ var _el$192 = _$createElement("span"), _el$193 = _$createTextNode(`
1675
1852
  \u21BB retry in: `);
1676
- _$insertNode(_el$169, _el$170);
1677
- _$effect((_$p) => _$setProp(_el$169, "style", {
1853
+ _$insertNode(_el$192, _el$193);
1854
+ _$effect((_$p) => _$setProp(_el$192, "style", {
1678
1855
  fg: theme().accent
1679
1856
  }, _$p));
1680
- return _el$169;
1857
+ return _el$192;
1681
1858
  })(), (() => {
1682
- var _el$172 = _$createElement("span");
1683
- _$insert(_el$172, () => countdownLabel(rt().retryAfter, clock()));
1684
- _$effect((_$p) => _$setProp(_el$172, "style", {
1859
+ var _el$195 = _$createElement("span");
1860
+ _$insert(_el$195, () => countdownLabel(rt().retryAfter, clock()));
1861
+ _$effect((_$p) => _$setProp(_el$195, "style", {
1685
1862
  fg: theme().accent
1686
1863
  }, _$p));
1687
- return _el$172;
1864
+ return _el$195;
1688
1865
  })()];
1689
1866
  })(), null);
1690
1867
  _$insert(_el$122, (() => {
1691
1868
  var _c$18 = _$memo(() => !!rt()?.nextRunAt);
1692
1869
  return () => _c$18() && [(() => {
1693
- var _el$173 = _$createElement("span"), _el$174 = _$createTextNode(`
1870
+ var _el$196 = _$createElement("span"), _el$197 = _$createTextNode(`
1694
1871
  \u23F0 next run: `);
1695
- _$insertNode(_el$173, _el$174);
1696
- _$effect((_$p) => _$setProp(_el$173, "style", {
1872
+ _$insertNode(_el$196, _el$197);
1873
+ _$effect((_$p) => _$setProp(_el$196, "style", {
1697
1874
  fg: theme().accent
1698
1875
  }, _$p));
1699
- return _el$173;
1876
+ return _el$196;
1700
1877
  })(), (() => {
1701
- var _el$176 = _$createElement("span");
1702
- _$insert(_el$176, () => countdownLabel(rt().nextRunAt, clock()));
1703
- _$effect((_$p) => _$setProp(_el$176, "style", {
1878
+ var _el$199 = _$createElement("span");
1879
+ _$insert(_el$199, () => countdownLabel(rt().nextRunAt, clock()));
1880
+ _$effect((_$p) => _$setProp(_el$199, "style", {
1704
1881
  fg: theme().accent
1705
1882
  }, _$p));
1706
- return _el$176;
1883
+ return _el$199;
1707
1884
  })(), (() => {
1708
- var _el$177 = _$createElement("span"), _el$178 = _$createTextNode(` (`), _el$179 = _$createTextNode(` runs)`);
1709
- _$insertNode(_el$177, _el$178);
1710
- _$insertNode(_el$177, _el$179);
1711
- _$insert(_el$177, () => String(rt().scheduleRunCount || 0), _el$179);
1712
- _$effect((_$p) => _$setProp(_el$177, "style", {
1885
+ var _el$200 = _$createElement("span"), _el$201 = _$createTextNode(` (`), _el$202 = _$createTextNode(` runs)`);
1886
+ _$insertNode(_el$200, _el$201);
1887
+ _$insertNode(_el$200, _el$202);
1888
+ _$insert(_el$200, () => String(rt().scheduleRunCount || 0), _el$202);
1889
+ _$effect((_$p) => _$setProp(_el$200, "style", {
1713
1890
  fg: theme().textMuted
1714
1891
  }, _$p));
1715
- return _el$177;
1892
+ return _el$200;
1716
1893
  })()];
1717
1894
  })(), null);
1718
1895
  _$insert(_el$122, (() => {
1719
1896
  var _c$19 = _$memo(() => !!rt()?.lastError);
1720
1897
  return () => _c$19() && [(() => {
1721
- var _el$180 = _$createElement("span"), _el$181 = _$createTextNode(`
1898
+ var _el$203 = _$createElement("span"), _el$204 = _$createTextNode(`
1722
1899
  \u26A0 `);
1723
- _$insertNode(_el$180, _el$181);
1724
- _$effect((_$p) => _$setProp(_el$180, "style", {
1900
+ _$insertNode(_el$203, _el$204);
1901
+ _$effect((_$p) => _$setProp(_el$203, "style", {
1725
1902
  fg: theme().error
1726
1903
  }, _$p));
1727
- return _el$180;
1904
+ return _el$203;
1728
1905
  })(), (() => {
1729
- var _el$183 = _$createElement("span");
1730
- _$insert(_el$183, () => rt().lastError.slice(0, 120));
1731
- _$effect((_$p) => _$setProp(_el$183, "style", {
1906
+ var _el$206 = _$createElement("span");
1907
+ _$insert(_el$206, () => rt().lastError.slice(0, 120));
1908
+ _$effect((_$p) => _$setProp(_el$206, "style", {
1732
1909
  fg: theme().error
1733
1910
  }, _$p));
1734
- return _el$183;
1911
+ return _el$206;
1735
1912
  })()];
1736
1913
  })(), null);
1737
1914
  _$effect((_p$) => {
@@ -1781,29 +1958,29 @@ function LoopDashboard(props) {
1781
1958
  },
1782
1959
  children: (ev) => [`
1783
1960
  `, (() => {
1784
- var _el$184 = _$createElement("span");
1785
- _$insert(_el$184, () => String(ev.type));
1786
- _$effect((_$p) => _$setProp(_el$184, "style", {
1961
+ var _el$207 = _$createElement("span");
1962
+ _$insert(_el$207, () => String(ev.type));
1963
+ _$effect((_$p) => _$setProp(_el$207, "style", {
1787
1964
  fg: eventColor(String(ev.type), theme()),
1788
1965
  bold: true
1789
1966
  }, _$p));
1790
- return _el$184;
1967
+ return _el$207;
1791
1968
  })(), (() => {
1792
- var _el$185 = _$createElement("span"), _el$186 = _$createTextNode(` `);
1793
- _$insertNode(_el$185, _el$186);
1794
- _$insert(_el$185, () => ev.goalID?.slice(0, 8), null);
1795
- _$effect((_$p) => _$setProp(_el$185, "style", {
1969
+ var _el$208 = _$createElement("span"), _el$209 = _$createTextNode(` `);
1970
+ _$insertNode(_el$208, _el$209);
1971
+ _$insert(_el$208, () => ev.goalID?.slice(0, 8), null);
1972
+ _$effect((_$p) => _$setProp(_el$208, "style", {
1796
1973
  fg: theme().textMuted
1797
1974
  }, _$p));
1798
- return _el$185;
1975
+ return _el$208;
1799
1976
  })(), _$memo(() => _$memo(() => !!ev.summary)() && (() => {
1800
- var _el$187 = _$createElement("span"), _el$188 = _$createTextNode(` \u2014 `);
1801
- _$insertNode(_el$187, _el$188);
1802
- _$insert(_el$187, () => String(ev.summary).slice(0, 60), null);
1803
- _$effect((_$p) => _$setProp(_el$187, "style", {
1977
+ var _el$210 = _$createElement("span"), _el$211 = _$createTextNode(` \u2014 `);
1978
+ _$insertNode(_el$210, _el$211);
1979
+ _$insert(_el$210, () => String(ev.summary).slice(0, 60), null);
1980
+ _$effect((_$p) => _$setProp(_el$210, "style", {
1804
1981
  fg: theme().text
1805
1982
  }, _$p));
1806
- return _el$187;
1983
+ return _el$210;
1807
1984
  })())]
1808
1985
  }), null);
1809
1986
  _$effect((_p$) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@bojackduy/opencode-loopd",
4
- "version": "1.8.3",
4
+ "version": "1.9.1",
5
5
  "description": "Codex-inspired background goal engine for OpenCode — autonomous subagents, engine-driven loop, child worker sessions and modal TUI dashboard. Like Claude Code loop for OpenCode.",
6
6
  "type": "module",
7
7
  "license": "AGPL-3.0-or-later",