@bojackduy/opencode-loopd 1.8.2 → 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/commands/goal.md +3 -2
- package/dist/server.js +648 -274
- package/dist/tui.js +294 -117
- package/package.json +1 -1
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);
|
|
@@ -574,16 +635,25 @@ function LoopDashboard(props) {
|
|
|
574
635
|
try {
|
|
575
636
|
const s = await client.getState();
|
|
576
637
|
setState(s);
|
|
577
|
-
const
|
|
578
|
-
if (
|
|
579
|
-
setSelected(
|
|
580
|
-
setSelectedGoal(
|
|
638
|
+
const goals = s.goals.filter((g) => showCompleted() || g.status !== "complete");
|
|
639
|
+
if (goals.length > 0 && selected() >= goals.length)
|
|
640
|
+
setSelected(goals.length - 1);
|
|
641
|
+
setSelectedGoal(goals[selected()] || null);
|
|
581
642
|
setEvents(await client.getEvents(20));
|
|
582
643
|
} catch (e) {
|
|
583
644
|
setStatusText(`Error: ${e instanceof Error ? e.message : String(e)}`);
|
|
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();
|
|
@@ -1077,7 +1147,7 @@ function LoopDashboard(props) {
|
|
|
1077
1147
|
children: (seg, idx) => {
|
|
1078
1148
|
const hasArrow = seg.includes("\u2192");
|
|
1079
1149
|
if (hasArrow) {
|
|
1080
|
-
const [
|
|
1150
|
+
const [k, d] = seg.split("\u2192").map((s) => s.trim());
|
|
1081
1151
|
return [_$memo(() => _$memo(() => idx() > 0)() && (() => {
|
|
1082
1152
|
var _el$54 = _$createElement("span");
|
|
1083
1153
|
_$insertNode(_el$54, _$createTextNode(` | `));
|
|
@@ -1087,7 +1157,7 @@ function LoopDashboard(props) {
|
|
|
1087
1157
|
return _el$54;
|
|
1088
1158
|
})()), (() => {
|
|
1089
1159
|
var _el$50 = _$createElement("span");
|
|
1090
|
-
_$insert(_el$50,
|
|
1160
|
+
_$insert(_el$50, k);
|
|
1091
1161
|
_$effect((_$p) => _$setProp(_el$50, "style", {
|
|
1092
1162
|
fg: theme().warning,
|
|
1093
1163
|
bold: true
|
|
@@ -1102,7 +1172,7 @@ function LoopDashboard(props) {
|
|
|
1102
1172
|
return _el$51;
|
|
1103
1173
|
})(), (() => {
|
|
1104
1174
|
var _el$53 = _$createElement("span");
|
|
1105
|
-
_$insert(_el$53,
|
|
1175
|
+
_$insert(_el$53, d);
|
|
1106
1176
|
_$effect((_$p) => _$setProp(_el$53, "style", {
|
|
1107
1177
|
fg: theme().text
|
|
1108
1178
|
}, _$p));
|
|
@@ -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",
|
|
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$
|
|
1710
|
+
var _el$160 = _$createElement("span"), _el$161 = _$createTextNode(`
|
|
1534
1711
|
\u2714 `);
|
|
1535
|
-
_$insertNode(_el$
|
|
1536
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1712
|
+
_$insertNode(_el$160, _el$161);
|
|
1713
|
+
_$effect((_$p) => _$setProp(_el$160, "style", {
|
|
1537
1714
|
fg: theme().success
|
|
1538
1715
|
}, _$p));
|
|
1539
|
-
return _el$
|
|
1716
|
+
return _el$160;
|
|
1540
1717
|
})(), (() => {
|
|
1541
|
-
var _el$
|
|
1542
|
-
_$insert(_el$
|
|
1543
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
1723
|
+
return _el$163;
|
|
1547
1724
|
})(), (() => {
|
|
1548
|
-
var _el$
|
|
1549
|
-
_$insertNode(_el$
|
|
1550
|
-
_$insert(_el$
|
|
1551
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1737
|
+
var _el$166 = _$createElement("span"), _el$167 = _$createTextNode(`
|
|
1561
1738
|
\u2716 blocked: `);
|
|
1562
|
-
_$insertNode(_el$
|
|
1563
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
1744
|
+
return _el$166;
|
|
1568
1745
|
})(), (() => {
|
|
1569
|
-
var _el$
|
|
1570
|
-
_$insert(_el$
|
|
1571
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
1751
|
+
return _el$169;
|
|
1575
1752
|
})(), (() => {
|
|
1576
|
-
var _el$
|
|
1577
|
-
_$insertNode(_el$
|
|
1578
|
-
_$insert(_el$
|
|
1579
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1765
|
+
var _el$172 = _$createElement("span"), _el$173 = _$createTextNode(`
|
|
1589
1766
|
\uD83D\uDCC1 `);
|
|
1590
|
-
_$insertNode(_el$
|
|
1591
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1767
|
+
_$insertNode(_el$172, _el$173);
|
|
1768
|
+
_$effect((_$p) => _$setProp(_el$172, "style", {
|
|
1592
1769
|
fg: theme().accent
|
|
1593
1770
|
}, _$p));
|
|
1594
|
-
return _el$
|
|
1771
|
+
return _el$172;
|
|
1595
1772
|
})(), (() => {
|
|
1596
|
-
var _el$
|
|
1597
|
-
_$insert(_el$
|
|
1598
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1784
|
+
var _el$176 = _$createElement("span"), _el$177 = _$createTextNode(`
|
|
1608
1785
|
\u25A3 checks: `);
|
|
1609
|
-
_$insertNode(_el$
|
|
1610
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1786
|
+
_$insertNode(_el$176, _el$177);
|
|
1787
|
+
_$effect((_$p) => _$setProp(_el$176, "style", {
|
|
1611
1788
|
fg: theme().warning
|
|
1612
1789
|
}, _$p));
|
|
1613
|
-
return _el$
|
|
1790
|
+
return _el$176;
|
|
1614
1791
|
})(), (() => {
|
|
1615
|
-
var _el$
|
|
1616
|
-
_$insert(_el$
|
|
1617
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1803
|
+
var _el$180 = _$createElement("span"), _el$181 = _$createTextNode(`
|
|
1627
1804
|
\u26A0 rejections: `);
|
|
1628
|
-
_$insertNode(_el$
|
|
1629
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1805
|
+
_$insertNode(_el$180, _el$181);
|
|
1806
|
+
_$effect((_$p) => _$setProp(_el$180, "style", {
|
|
1630
1807
|
fg: theme().warning
|
|
1631
1808
|
}, _$p));
|
|
1632
|
-
return _el$
|
|
1809
|
+
return _el$180;
|
|
1633
1810
|
})(), (() => {
|
|
1634
|
-
var _el$
|
|
1635
|
-
_$insertNode(_el$
|
|
1636
|
-
_$insert(_el$
|
|
1637
|
-
_$insert(_el$
|
|
1638
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1824
|
+
var _el$185 = _$createElement("span"), _el$186 = _$createTextNode(`
|
|
1648
1825
|
\u26A0\uFE0F unreachable: `);
|
|
1649
|
-
_$insertNode(_el$
|
|
1650
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1826
|
+
_$insertNode(_el$185, _el$186);
|
|
1827
|
+
_$effect((_$p) => _$setProp(_el$185, "style", {
|
|
1651
1828
|
fg: theme().error
|
|
1652
1829
|
}, _$p));
|
|
1653
|
-
return _el$
|
|
1830
|
+
return _el$185;
|
|
1654
1831
|
})(), (() => {
|
|
1655
|
-
var _el$
|
|
1656
|
-
_$insertNode(_el$
|
|
1657
|
-
_$insert(_el$
|
|
1658
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
1838
|
+
return _el$188;
|
|
1662
1839
|
})(), (() => {
|
|
1663
|
-
var _el$
|
|
1664
|
-
_$insertNode(_el$
|
|
1665
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1851
|
+
var _el$192 = _$createElement("span"), _el$193 = _$createTextNode(`
|
|
1675
1852
|
\u21BB retry in: `);
|
|
1676
|
-
_$insertNode(_el$
|
|
1677
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1853
|
+
_$insertNode(_el$192, _el$193);
|
|
1854
|
+
_$effect((_$p) => _$setProp(_el$192, "style", {
|
|
1678
1855
|
fg: theme().accent
|
|
1679
1856
|
}, _$p));
|
|
1680
|
-
return _el$
|
|
1857
|
+
return _el$192;
|
|
1681
1858
|
})(), (() => {
|
|
1682
|
-
var _el$
|
|
1683
|
-
_$insert(_el$
|
|
1684
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1870
|
+
var _el$196 = _$createElement("span"), _el$197 = _$createTextNode(`
|
|
1694
1871
|
\u23F0 next run: `);
|
|
1695
|
-
_$insertNode(_el$
|
|
1696
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1872
|
+
_$insertNode(_el$196, _el$197);
|
|
1873
|
+
_$effect((_$p) => _$setProp(_el$196, "style", {
|
|
1697
1874
|
fg: theme().accent
|
|
1698
1875
|
}, _$p));
|
|
1699
|
-
return _el$
|
|
1876
|
+
return _el$196;
|
|
1700
1877
|
})(), (() => {
|
|
1701
|
-
var _el$
|
|
1702
|
-
_$insert(_el$
|
|
1703
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
1883
|
+
return _el$199;
|
|
1707
1884
|
})(), (() => {
|
|
1708
|
-
var _el$
|
|
1709
|
-
_$insertNode(_el$
|
|
1710
|
-
_$insertNode(_el$
|
|
1711
|
-
_$insert(_el$
|
|
1712
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1898
|
+
var _el$203 = _$createElement("span"), _el$204 = _$createTextNode(`
|
|
1722
1899
|
\u26A0 `);
|
|
1723
|
-
_$insertNode(_el$
|
|
1724
|
-
_$effect((_$p) => _$setProp(_el$
|
|
1900
|
+
_$insertNode(_el$203, _el$204);
|
|
1901
|
+
_$effect((_$p) => _$setProp(_el$203, "style", {
|
|
1725
1902
|
fg: theme().error
|
|
1726
1903
|
}, _$p));
|
|
1727
|
-
return _el$
|
|
1904
|
+
return _el$203;
|
|
1728
1905
|
})(), (() => {
|
|
1729
|
-
var _el$
|
|
1730
|
-
_$insert(_el$
|
|
1731
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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$
|
|
1785
|
-
_$insert(_el$
|
|
1786
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
1967
|
+
return _el$207;
|
|
1791
1968
|
})(), (() => {
|
|
1792
|
-
var _el$
|
|
1793
|
-
_$insertNode(_el$
|
|
1794
|
-
_$insert(_el$
|
|
1795
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
1975
|
+
return _el$208;
|
|
1799
1976
|
})(), _$memo(() => _$memo(() => !!ev.summary)() && (() => {
|
|
1800
|
-
var _el$
|
|
1801
|
-
_$insertNode(_el$
|
|
1802
|
-
_$insert(_el$
|
|
1803
|
-
_$effect((_$p) => _$setProp(_el$
|
|
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$
|
|
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.
|
|
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",
|