@agenticmail/enterprise 0.5.169 → 0.5.170
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/agent-autonomy-M7WKBPKI.js +665 -0
- package/dist/cli-agent-4XXBLRXV.js +993 -0
- package/dist/cli.js +1 -1
- package/dist/dashboard/pages/agent-detail.js +126 -63
- package/package.json +1 -1
- package/src/dashboard/pages/agent-detail.js +126 -63
- package/src/engine/agent-autonomy.ts +33 -20
package/dist/cli.js
CHANGED
|
@@ -50,7 +50,7 @@ Skill Development:
|
|
|
50
50
|
import("./cli-serve-D5G3XNSI.js").then((m) => m.runServe(args.slice(1))).catch(fatal);
|
|
51
51
|
break;
|
|
52
52
|
case "agent":
|
|
53
|
-
import("./cli-agent-
|
|
53
|
+
import("./cli-agent-4XXBLRXV.js").then((m) => m.runAgent(args.slice(1))).catch(fatal);
|
|
54
54
|
break;
|
|
55
55
|
case "setup":
|
|
56
56
|
default:
|
|
@@ -1529,18 +1529,33 @@ function ActivitySection(props) {
|
|
|
1529
1529
|
var _selectedItem = useState(null);
|
|
1530
1530
|
var selectedItem = _selectedItem[0]; var setSelectedItem = _selectedItem[1];
|
|
1531
1531
|
|
|
1532
|
+
// Filtering
|
|
1533
|
+
var _typeFilter = useState('');
|
|
1534
|
+
var typeFilter = _typeFilter[0]; var setTypeFilter = _typeFilter[1];
|
|
1535
|
+
var _searchFilter = useState('');
|
|
1536
|
+
var searchFilter = _searchFilter[0]; var setSearchFilter = _searchFilter[1];
|
|
1537
|
+
var _dateFrom = useState('');
|
|
1538
|
+
var dateFrom = _dateFrom[0]; var setDateFrom = _dateFrom[1];
|
|
1539
|
+
var _dateTo = useState('');
|
|
1540
|
+
var dateTo = _dateTo[0]; var setDateTo = _dateTo[1];
|
|
1541
|
+
|
|
1542
|
+
// Pagination
|
|
1543
|
+
var PAGE_SIZE = 25;
|
|
1544
|
+
var _page = useState(1);
|
|
1545
|
+
var page = _page[0]; var setPage = _page[1];
|
|
1546
|
+
|
|
1532
1547
|
var loadEvents = function() {
|
|
1533
|
-
engineCall('/activity/events?agentId=' + agentId + '&limit=
|
|
1548
|
+
engineCall('/activity/events?agentId=' + agentId + '&limit=200')
|
|
1534
1549
|
.then(function(d) { setEvents(d.events || []); })
|
|
1535
1550
|
.catch(function() {});
|
|
1536
1551
|
};
|
|
1537
1552
|
var loadToolCalls = function() {
|
|
1538
|
-
engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=
|
|
1553
|
+
engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=200')
|
|
1539
1554
|
.then(function(d) { setToolCalls(d.toolCalls || []); })
|
|
1540
1555
|
.catch(function() {});
|
|
1541
1556
|
};
|
|
1542
1557
|
var loadJournal = function() {
|
|
1543
|
-
engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=
|
|
1558
|
+
engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=200')
|
|
1544
1559
|
.then(function(d) { setJournalEntries(d.entries || []); })
|
|
1545
1560
|
.catch(function() {});
|
|
1546
1561
|
};
|
|
@@ -1548,27 +1563,22 @@ function ActivitySection(props) {
|
|
|
1548
1563
|
var loadAll = function() {
|
|
1549
1564
|
setLoading(true);
|
|
1550
1565
|
Promise.all([
|
|
1551
|
-
engineCall('/activity/events?agentId=' + agentId + '&limit=
|
|
1552
|
-
engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=
|
|
1553
|
-
engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=
|
|
1566
|
+
engineCall('/activity/events?agentId=' + agentId + '&limit=200').then(function(d) { setEvents(d.events || []); }).catch(function() {}),
|
|
1567
|
+
engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=200').then(function(d) { setToolCalls(d.toolCalls || []); }).catch(function() {}),
|
|
1568
|
+
engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=200').then(function(d) { setJournalEntries(d.entries || []); }).catch(function() {}),
|
|
1554
1569
|
]).then(function() { setLoading(false); }).catch(function() { setLoading(false); });
|
|
1555
1570
|
};
|
|
1556
1571
|
|
|
1557
1572
|
useEffect(loadAll, []);
|
|
1558
1573
|
|
|
1574
|
+
// Reset page when filters change
|
|
1575
|
+
useEffect(function() { setPage(1); }, [typeFilter, searchFilter, dateFrom, dateTo, activeTab]);
|
|
1576
|
+
|
|
1559
1577
|
var rollback = function(id) {
|
|
1560
|
-
showConfirm({
|
|
1561
|
-
|
|
1562
|
-
message: 'Are you sure you want to rollback this journal entry? This will attempt to reverse the original action.',
|
|
1563
|
-
warning: true,
|
|
1564
|
-
confirmText: 'Rollback'
|
|
1565
|
-
}).then(function(confirmed) {
|
|
1566
|
-
if (!confirmed) return;
|
|
1578
|
+
showConfirm({ title: 'Rollback Action', message: 'Reverse this journal entry?', warning: true, confirmText: 'Rollback' }).then(function(ok) {
|
|
1579
|
+
if (!ok) return;
|
|
1567
1580
|
engineCall('/journal/' + id + '/rollback', { method: 'POST', body: JSON.stringify({}) })
|
|
1568
|
-
.then(function(r) {
|
|
1569
|
-
if (r.success) { toast('Action rolled back', 'success'); loadJournal(); }
|
|
1570
|
-
else { toast('Rollback failed: ' + (r.error || 'Unknown'), 'error'); }
|
|
1571
|
-
})
|
|
1581
|
+
.then(function(r) { if (r.success) { toast('Rolled back', 'success'); loadJournal(); } else toast('Failed: ' + (r.error || ''), 'error'); })
|
|
1572
1582
|
.catch(function(e) { toast(e.message, 'error'); });
|
|
1573
1583
|
});
|
|
1574
1584
|
};
|
|
@@ -1579,34 +1589,98 @@ function ActivitySection(props) {
|
|
|
1579
1589
|
else if (activeTab === 'journal') loadJournal();
|
|
1580
1590
|
};
|
|
1581
1591
|
|
|
1592
|
+
// Filter helper
|
|
1593
|
+
var filterItems = function(items) {
|
|
1594
|
+
var filtered = items;
|
|
1595
|
+
if (typeFilter) {
|
|
1596
|
+
filtered = filtered.filter(function(item) {
|
|
1597
|
+
var t = (item.type || item.eventType || item.tool || item.toolName || item.actionType || '').toLowerCase();
|
|
1598
|
+
return t.includes(typeFilter.toLowerCase());
|
|
1599
|
+
});
|
|
1600
|
+
}
|
|
1601
|
+
if (searchFilter) {
|
|
1602
|
+
var q = searchFilter.toLowerCase();
|
|
1603
|
+
filtered = filtered.filter(function(item) {
|
|
1604
|
+
var text = JSON.stringify(item).toLowerCase();
|
|
1605
|
+
return text.includes(q);
|
|
1606
|
+
});
|
|
1607
|
+
}
|
|
1608
|
+
if (dateFrom) {
|
|
1609
|
+
var fromTs = new Date(dateFrom).getTime();
|
|
1610
|
+
filtered = filtered.filter(function(item) {
|
|
1611
|
+
var ts = new Date(item.timestamp || item.createdAt).getTime();
|
|
1612
|
+
return ts >= fromTs;
|
|
1613
|
+
});
|
|
1614
|
+
}
|
|
1615
|
+
if (dateTo) {
|
|
1616
|
+
var toTs = new Date(dateTo + 'T23:59:59').getTime();
|
|
1617
|
+
filtered = filtered.filter(function(item) {
|
|
1618
|
+
var ts = new Date(item.timestamp || item.createdAt).getTime();
|
|
1619
|
+
return ts <= toTs;
|
|
1620
|
+
});
|
|
1621
|
+
}
|
|
1622
|
+
return filtered;
|
|
1623
|
+
};
|
|
1624
|
+
|
|
1625
|
+
// Get current data source
|
|
1626
|
+
var currentItems = activeTab === 'events' ? events : activeTab === 'tools' ? toolCalls : journalEntries;
|
|
1627
|
+
var filtered = filterItems(currentItems);
|
|
1628
|
+
var totalPages = Math.max(1, Math.ceil(filtered.length / PAGE_SIZE));
|
|
1629
|
+
var paged = filtered.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE);
|
|
1630
|
+
|
|
1631
|
+
// Extract unique types for filter dropdown
|
|
1632
|
+
var uniqueTypes = [];
|
|
1633
|
+
var typeSet = {};
|
|
1634
|
+
currentItems.forEach(function(item) {
|
|
1635
|
+
var t = item.type || item.eventType || item.tool || item.toolName || item.actionType || '';
|
|
1636
|
+
if (t && !typeSet[t]) { typeSet[t] = true; uniqueTypes.push(t); }
|
|
1637
|
+
});
|
|
1638
|
+
uniqueTypes.sort();
|
|
1639
|
+
|
|
1640
|
+
var filterBarStyle = { display: 'flex', gap: 8, padding: '8px 16px', borderBottom: '1px solid var(--border)', flexWrap: 'wrap', alignItems: 'center' };
|
|
1641
|
+
var filterInputStyle = { padding: '4px 8px', borderRadius: 4, border: '1px solid var(--border)', background: 'var(--bg-secondary)', color: 'var(--text-primary)', fontSize: 12 };
|
|
1642
|
+
|
|
1582
1643
|
return h('div', { className: 'card' },
|
|
1583
1644
|
h('div', { className: 'card-header', style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },
|
|
1584
1645
|
h('h3', { style: { margin: 0, fontSize: 15, fontWeight: 600 } }, 'Activity'),
|
|
1585
|
-
h('
|
|
1646
|
+
h('div', { style: { display: 'flex', gap: 8, alignItems: 'center' } },
|
|
1647
|
+
h('span', { style: { fontSize: 11, color: 'var(--text-muted)' } }, filtered.length + ' items'),
|
|
1648
|
+
h('button', { className: 'btn btn-ghost btn-sm', onClick: refreshCurrent }, I.refresh())
|
|
1649
|
+
)
|
|
1586
1650
|
),
|
|
1587
1651
|
h('div', { style: { borderBottom: '1px solid var(--border)' } },
|
|
1588
1652
|
h('div', { className: 'tabs', style: { padding: '0 16px' } },
|
|
1589
|
-
h('div', { className: 'tab' + (activeTab === 'events' ? ' active' : ''), onClick: function() { setActiveTab('events'); } }, 'Events'),
|
|
1590
|
-
h('div', { className: 'tab' + (activeTab === 'tools' ? ' active' : ''), onClick: function() { setActiveTab('tools'); } }, 'Tool Calls'),
|
|
1591
|
-
h('div', { className: 'tab' + (activeTab === 'journal' ? ' active' : ''), onClick: function() { setActiveTab('journal'); } }, 'Journal')
|
|
1653
|
+
h('div', { className: 'tab' + (activeTab === 'events' ? ' active' : ''), onClick: function() { setActiveTab('events'); } }, 'Events (' + events.length + ')'),
|
|
1654
|
+
h('div', { className: 'tab' + (activeTab === 'tools' ? ' active' : ''), onClick: function() { setActiveTab('tools'); } }, 'Tool Calls (' + toolCalls.length + ')'),
|
|
1655
|
+
h('div', { className: 'tab' + (activeTab === 'journal' ? ' active' : ''), onClick: function() { setActiveTab('journal'); } }, 'Journal (' + journalEntries.length + ')')
|
|
1592
1656
|
)
|
|
1593
1657
|
),
|
|
1658
|
+
|
|
1659
|
+
// Filter bar
|
|
1660
|
+
h('div', { style: filterBarStyle },
|
|
1661
|
+
h('select', { style: Object.assign({}, filterInputStyle, { width: 140 }), value: typeFilter, onChange: function(e) { setTypeFilter(e.target.value); } },
|
|
1662
|
+
h('option', { value: '' }, 'All types'),
|
|
1663
|
+
uniqueTypes.map(function(t) { return h('option', { key: t, value: t }, t); })
|
|
1664
|
+
),
|
|
1665
|
+
h('input', { style: Object.assign({}, filterInputStyle, { width: 180 }), type: 'text', placeholder: 'Search...', value: searchFilter, onChange: function(e) { setSearchFilter(e.target.value); } }),
|
|
1666
|
+
h('input', { style: Object.assign({}, filterInputStyle, { width: 130 }), type: 'date', value: dateFrom, onChange: function(e) { setDateFrom(e.target.value); }, title: 'From date' }),
|
|
1667
|
+
h('span', { style: { fontSize: 11, color: 'var(--text-muted)' } }, 'to'),
|
|
1668
|
+
h('input', { style: Object.assign({}, filterInputStyle, { width: 130 }), type: 'date', value: dateTo, onChange: function(e) { setDateTo(e.target.value); }, title: 'To date' }),
|
|
1669
|
+
(typeFilter || searchFilter || dateFrom || dateTo) && h('button', { className: 'btn btn-ghost btn-sm', style: { fontSize: 11 }, onClick: function() { setTypeFilter(''); setSearchFilter(''); setDateFrom(''); setDateTo(''); } }, 'Clear')
|
|
1670
|
+
),
|
|
1671
|
+
|
|
1594
1672
|
h('div', { className: 'card-body-flush' },
|
|
1595
1673
|
|
|
1596
1674
|
// Events Tab
|
|
1597
1675
|
activeTab === 'events' && (
|
|
1598
|
-
|
|
1599
|
-
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No events
|
|
1676
|
+
paged.length === 0
|
|
1677
|
+
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, filtered.length === 0 && events.length > 0 ? 'No events match filters' : 'No events recorded')
|
|
1600
1678
|
: h('table', { className: 'data-table' },
|
|
1601
1679
|
h('thead', null,
|
|
1602
|
-
h('tr', null,
|
|
1603
|
-
h('th', null, 'Time'),
|
|
1604
|
-
h('th', null, 'Type'),
|
|
1605
|
-
h('th', null, 'Details')
|
|
1606
|
-
)
|
|
1680
|
+
h('tr', null, h('th', null, 'Time'), h('th', null, 'Type'), h('th', null, 'Details'))
|
|
1607
1681
|
),
|
|
1608
1682
|
h('tbody', null,
|
|
1609
|
-
|
|
1683
|
+
paged.map(function(ev, i) {
|
|
1610
1684
|
var details = typeof ev.data === 'object' ? JSON.stringify(ev.data) : (ev.details || ev.data || '-');
|
|
1611
1685
|
return h('tr', { key: ev.id || i, onClick: function() { setSelectedItem(ev); }, style: { cursor: 'pointer' } },
|
|
1612
1686
|
h('td', { style: { fontSize: 12, color: 'var(--text-muted)', whiteSpace: 'nowrap' } }, new Date(ev.timestamp || ev.createdAt).toLocaleString()),
|
|
@@ -1620,19 +1694,14 @@ function ActivitySection(props) {
|
|
|
1620
1694
|
|
|
1621
1695
|
// Tool Calls Tab
|
|
1622
1696
|
activeTab === 'tools' && (
|
|
1623
|
-
|
|
1624
|
-
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No tool calls
|
|
1697
|
+
paged.length === 0
|
|
1698
|
+
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, filtered.length === 0 && toolCalls.length > 0 ? 'No tool calls match filters' : 'No tool calls recorded')
|
|
1625
1699
|
: h('table', { className: 'data-table' },
|
|
1626
1700
|
h('thead', null,
|
|
1627
|
-
h('tr', null,
|
|
1628
|
-
h('th', null, 'Time'),
|
|
1629
|
-
h('th', null, 'Tool'),
|
|
1630
|
-
h('th', null, 'Duration'),
|
|
1631
|
-
h('th', null, 'Status')
|
|
1632
|
-
)
|
|
1701
|
+
h('tr', null, h('th', null, 'Time'), h('th', null, 'Tool'), h('th', null, 'Duration'), h('th', null, 'Status'))
|
|
1633
1702
|
),
|
|
1634
1703
|
h('tbody', null,
|
|
1635
|
-
|
|
1704
|
+
paged.map(function(tc, i) {
|
|
1636
1705
|
var statusClass = tc.success === true ? 'badge badge-success' : tc.success === false ? 'badge badge-danger' : 'badge badge-neutral';
|
|
1637
1706
|
var statusLabel = tc.success === true ? 'OK' : tc.success === false ? 'Failed' : (tc.status || 'Pending');
|
|
1638
1707
|
return h('tr', { key: tc.id || i, onClick: function() { setSelectedItem(tc); }, style: { cursor: 'pointer' } },
|
|
@@ -1648,42 +1717,38 @@ function ActivitySection(props) {
|
|
|
1648
1717
|
|
|
1649
1718
|
// Journal Tab
|
|
1650
1719
|
activeTab === 'journal' && (
|
|
1651
|
-
|
|
1652
|
-
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No journal entries
|
|
1720
|
+
paged.length === 0
|
|
1721
|
+
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, filtered.length === 0 && journalEntries.length > 0 ? 'No journal entries match filters' : 'No journal entries')
|
|
1653
1722
|
: h('table', { className: 'data-table' },
|
|
1654
1723
|
h('thead', null,
|
|
1655
|
-
h('tr', null,
|
|
1656
|
-
h('th', null, 'Time'),
|
|
1657
|
-
h('th', null, 'Tool'),
|
|
1658
|
-
h('th', null, 'Action Type'),
|
|
1659
|
-
h('th', null, 'Reversible'),
|
|
1660
|
-
h('th', null, 'Status'),
|
|
1661
|
-
h('th', null, 'Actions')
|
|
1662
|
-
)
|
|
1724
|
+
h('tr', null, h('th', null, 'Time'), h('th', null, 'Tool'), h('th', null, 'Action Type'), h('th', null, 'Reversible'), h('th', null, 'Status'), h('th', null, 'Actions'))
|
|
1663
1725
|
),
|
|
1664
1726
|
h('tbody', null,
|
|
1665
|
-
|
|
1727
|
+
paged.map(function(e) {
|
|
1666
1728
|
return h('tr', { key: e.id, onClick: function(evt) { if (evt.target.tagName === 'BUTTON' || evt.target.closest('button')) return; setSelectedItem(e); }, style: { cursor: 'pointer' } },
|
|
1667
1729
|
h('td', { style: { fontSize: 12, color: 'var(--text-muted)', whiteSpace: 'nowrap' } }, new Date(e.createdAt).toLocaleString()),
|
|
1668
1730
|
h('td', null, e.toolName || e.toolId || '-'),
|
|
1669
1731
|
h('td', null, h('span', { className: 'badge-tag' }, e.actionType || '-')),
|
|
1670
1732
|
h('td', null, e.reversible ? '\u2705' : '\u274C'),
|
|
1671
|
-
h('td', null,
|
|
1672
|
-
|
|
1673
|
-
? h('span', { className: 'status-badge status-warning' }, 'Rolled Back')
|
|
1674
|
-
: h('span', { className: 'status-badge status-success' }, 'Active')
|
|
1675
|
-
),
|
|
1676
|
-
h('td', null,
|
|
1677
|
-
e.reversible && !e.reversed && h('button', { className: 'btn btn-ghost btn-sm', onClick: function() { rollback(e.id); } }, I.undo(), ' Rollback')
|
|
1678
|
-
)
|
|
1733
|
+
h('td', null, e.reversed ? h('span', { className: 'status-badge status-warning' }, 'Rolled Back') : h('span', { className: 'status-badge status-success' }, 'Active')),
|
|
1734
|
+
h('td', null, e.reversible && !e.reversed && h('button', { className: 'btn btn-ghost btn-sm', onClick: function() { rollback(e.id); } }, I.undo(), ' Rollback'))
|
|
1679
1735
|
);
|
|
1680
1736
|
})
|
|
1681
1737
|
)
|
|
1682
1738
|
)
|
|
1739
|
+
),
|
|
1740
|
+
|
|
1741
|
+
// Pagination
|
|
1742
|
+
totalPages > 1 && h('div', { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', gap: 6, padding: '10px 16px', borderTop: '1px solid var(--border)' } },
|
|
1743
|
+
h('button', { className: 'btn btn-ghost btn-sm', disabled: page <= 1, onClick: function() { setPage(1); }, style: { fontSize: 11 } }, '«'),
|
|
1744
|
+
h('button', { className: 'btn btn-ghost btn-sm', disabled: page <= 1, onClick: function() { setPage(page - 1); }, style: { fontSize: 11 } }, '‹'),
|
|
1745
|
+
h('span', { style: { fontSize: 12, color: 'var(--text-muted)', minWidth: 80, textAlign: 'center' } }, 'Page ' + page + ' / ' + totalPages),
|
|
1746
|
+
h('button', { className: 'btn btn-ghost btn-sm', disabled: page >= totalPages, onClick: function() { setPage(page + 1); }, style: { fontSize: 11 } }, '›'),
|
|
1747
|
+
h('button', { className: 'btn btn-ghost btn-sm', disabled: page >= totalPages, onClick: function() { setPage(totalPages); }, style: { fontSize: 11 } }, '»')
|
|
1683
1748
|
)
|
|
1684
1749
|
),
|
|
1685
1750
|
|
|
1686
|
-
//
|
|
1751
|
+
// Detail Modal
|
|
1687
1752
|
selectedItem && (function() {
|
|
1688
1753
|
var item = selectedItem;
|
|
1689
1754
|
var typeLabel = item.type || item.eventType || item.tool || item.toolName || item.actionType || 'Detail';
|
|
@@ -6553,21 +6618,19 @@ function AutonomySection(props) {
|
|
|
6553
6618
|
h(Toggle, { field: 'dailyCatchupEnabled', value: form.dailyCatchupEnabled, label: 'Daily Manager Catchup', desc: 'Email summary to manager each workday' })
|
|
6554
6619
|
),
|
|
6555
6620
|
form.dailyCatchupEnabled && h('div', { style: configRow },
|
|
6556
|
-
h('span',
|
|
6557
|
-
h(TimeSelect, { hour: form.dailyCatchupHour, minute: form.dailyCatchupMinute, hourField: 'dailyCatchupHour', minuteField: 'dailyCatchupMinute' })
|
|
6621
|
+
h('span', { style: { color: 'var(--text-muted)', fontSize: 12 } }, 'Time configured in Manager & Catch-Up tab')
|
|
6558
6622
|
)
|
|
6559
6623
|
),
|
|
6560
6624
|
|
|
6561
6625
|
// Weekly Catchup
|
|
6562
6626
|
h('div', { className: 'card', style: Object.assign({}, cardStyle, { opacity: form.enabled ? 1 : 0.5 }) },
|
|
6563
6627
|
h('div', { style: rowStyle },
|
|
6564
|
-
h(Toggle, { field: 'weeklyCatchupEnabled', value: form.weeklyCatchupEnabled, label: 'Weekly Manager Catchup', desc: 'Broader summary + goals,
|
|
6628
|
+
h(Toggle, { field: 'weeklyCatchupEnabled', value: form.weeklyCatchupEnabled, label: 'Weekly Manager Catchup', desc: 'Broader weekly summary + goals, uses same time as daily' })
|
|
6565
6629
|
),
|
|
6566
6630
|
form.weeklyCatchupEnabled && h('div', { style: configRow },
|
|
6567
6631
|
h('span', null, 'Send on'),
|
|
6568
6632
|
h(DaySelect, { value: form.weeklyCatchupDay, field: 'weeklyCatchupDay' }),
|
|
6569
|
-
h('span',
|
|
6570
|
-
h(TimeSelect, { hour: form.weeklyCatchupHour, minute: form.weeklyCatchupMinute, hourField: 'weeklyCatchupHour', minuteField: 'weeklyCatchupMinute' })
|
|
6633
|
+
h('span', { style: { color: 'var(--text-muted)', fontSize: 12 } }, '(same time as daily catchup)')
|
|
6571
6634
|
)
|
|
6572
6635
|
),
|
|
6573
6636
|
|
package/package.json
CHANGED
|
@@ -1529,18 +1529,33 @@ function ActivitySection(props) {
|
|
|
1529
1529
|
var _selectedItem = useState(null);
|
|
1530
1530
|
var selectedItem = _selectedItem[0]; var setSelectedItem = _selectedItem[1];
|
|
1531
1531
|
|
|
1532
|
+
// Filtering
|
|
1533
|
+
var _typeFilter = useState('');
|
|
1534
|
+
var typeFilter = _typeFilter[0]; var setTypeFilter = _typeFilter[1];
|
|
1535
|
+
var _searchFilter = useState('');
|
|
1536
|
+
var searchFilter = _searchFilter[0]; var setSearchFilter = _searchFilter[1];
|
|
1537
|
+
var _dateFrom = useState('');
|
|
1538
|
+
var dateFrom = _dateFrom[0]; var setDateFrom = _dateFrom[1];
|
|
1539
|
+
var _dateTo = useState('');
|
|
1540
|
+
var dateTo = _dateTo[0]; var setDateTo = _dateTo[1];
|
|
1541
|
+
|
|
1542
|
+
// Pagination
|
|
1543
|
+
var PAGE_SIZE = 25;
|
|
1544
|
+
var _page = useState(1);
|
|
1545
|
+
var page = _page[0]; var setPage = _page[1];
|
|
1546
|
+
|
|
1532
1547
|
var loadEvents = function() {
|
|
1533
|
-
engineCall('/activity/events?agentId=' + agentId + '&limit=
|
|
1548
|
+
engineCall('/activity/events?agentId=' + agentId + '&limit=200')
|
|
1534
1549
|
.then(function(d) { setEvents(d.events || []); })
|
|
1535
1550
|
.catch(function() {});
|
|
1536
1551
|
};
|
|
1537
1552
|
var loadToolCalls = function() {
|
|
1538
|
-
engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=
|
|
1553
|
+
engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=200')
|
|
1539
1554
|
.then(function(d) { setToolCalls(d.toolCalls || []); })
|
|
1540
1555
|
.catch(function() {});
|
|
1541
1556
|
};
|
|
1542
1557
|
var loadJournal = function() {
|
|
1543
|
-
engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=
|
|
1558
|
+
engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=200')
|
|
1544
1559
|
.then(function(d) { setJournalEntries(d.entries || []); })
|
|
1545
1560
|
.catch(function() {});
|
|
1546
1561
|
};
|
|
@@ -1548,27 +1563,22 @@ function ActivitySection(props) {
|
|
|
1548
1563
|
var loadAll = function() {
|
|
1549
1564
|
setLoading(true);
|
|
1550
1565
|
Promise.all([
|
|
1551
|
-
engineCall('/activity/events?agentId=' + agentId + '&limit=
|
|
1552
|
-
engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=
|
|
1553
|
-
engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=
|
|
1566
|
+
engineCall('/activity/events?agentId=' + agentId + '&limit=200').then(function(d) { setEvents(d.events || []); }).catch(function() {}),
|
|
1567
|
+
engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=200').then(function(d) { setToolCalls(d.toolCalls || []); }).catch(function() {}),
|
|
1568
|
+
engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=200').then(function(d) { setJournalEntries(d.entries || []); }).catch(function() {}),
|
|
1554
1569
|
]).then(function() { setLoading(false); }).catch(function() { setLoading(false); });
|
|
1555
1570
|
};
|
|
1556
1571
|
|
|
1557
1572
|
useEffect(loadAll, []);
|
|
1558
1573
|
|
|
1574
|
+
// Reset page when filters change
|
|
1575
|
+
useEffect(function() { setPage(1); }, [typeFilter, searchFilter, dateFrom, dateTo, activeTab]);
|
|
1576
|
+
|
|
1559
1577
|
var rollback = function(id) {
|
|
1560
|
-
showConfirm({
|
|
1561
|
-
|
|
1562
|
-
message: 'Are you sure you want to rollback this journal entry? This will attempt to reverse the original action.',
|
|
1563
|
-
warning: true,
|
|
1564
|
-
confirmText: 'Rollback'
|
|
1565
|
-
}).then(function(confirmed) {
|
|
1566
|
-
if (!confirmed) return;
|
|
1578
|
+
showConfirm({ title: 'Rollback Action', message: 'Reverse this journal entry?', warning: true, confirmText: 'Rollback' }).then(function(ok) {
|
|
1579
|
+
if (!ok) return;
|
|
1567
1580
|
engineCall('/journal/' + id + '/rollback', { method: 'POST', body: JSON.stringify({}) })
|
|
1568
|
-
.then(function(r) {
|
|
1569
|
-
if (r.success) { toast('Action rolled back', 'success'); loadJournal(); }
|
|
1570
|
-
else { toast('Rollback failed: ' + (r.error || 'Unknown'), 'error'); }
|
|
1571
|
-
})
|
|
1581
|
+
.then(function(r) { if (r.success) { toast('Rolled back', 'success'); loadJournal(); } else toast('Failed: ' + (r.error || ''), 'error'); })
|
|
1572
1582
|
.catch(function(e) { toast(e.message, 'error'); });
|
|
1573
1583
|
});
|
|
1574
1584
|
};
|
|
@@ -1579,34 +1589,98 @@ function ActivitySection(props) {
|
|
|
1579
1589
|
else if (activeTab === 'journal') loadJournal();
|
|
1580
1590
|
};
|
|
1581
1591
|
|
|
1592
|
+
// Filter helper
|
|
1593
|
+
var filterItems = function(items) {
|
|
1594
|
+
var filtered = items;
|
|
1595
|
+
if (typeFilter) {
|
|
1596
|
+
filtered = filtered.filter(function(item) {
|
|
1597
|
+
var t = (item.type || item.eventType || item.tool || item.toolName || item.actionType || '').toLowerCase();
|
|
1598
|
+
return t.includes(typeFilter.toLowerCase());
|
|
1599
|
+
});
|
|
1600
|
+
}
|
|
1601
|
+
if (searchFilter) {
|
|
1602
|
+
var q = searchFilter.toLowerCase();
|
|
1603
|
+
filtered = filtered.filter(function(item) {
|
|
1604
|
+
var text = JSON.stringify(item).toLowerCase();
|
|
1605
|
+
return text.includes(q);
|
|
1606
|
+
});
|
|
1607
|
+
}
|
|
1608
|
+
if (dateFrom) {
|
|
1609
|
+
var fromTs = new Date(dateFrom).getTime();
|
|
1610
|
+
filtered = filtered.filter(function(item) {
|
|
1611
|
+
var ts = new Date(item.timestamp || item.createdAt).getTime();
|
|
1612
|
+
return ts >= fromTs;
|
|
1613
|
+
});
|
|
1614
|
+
}
|
|
1615
|
+
if (dateTo) {
|
|
1616
|
+
var toTs = new Date(dateTo + 'T23:59:59').getTime();
|
|
1617
|
+
filtered = filtered.filter(function(item) {
|
|
1618
|
+
var ts = new Date(item.timestamp || item.createdAt).getTime();
|
|
1619
|
+
return ts <= toTs;
|
|
1620
|
+
});
|
|
1621
|
+
}
|
|
1622
|
+
return filtered;
|
|
1623
|
+
};
|
|
1624
|
+
|
|
1625
|
+
// Get current data source
|
|
1626
|
+
var currentItems = activeTab === 'events' ? events : activeTab === 'tools' ? toolCalls : journalEntries;
|
|
1627
|
+
var filtered = filterItems(currentItems);
|
|
1628
|
+
var totalPages = Math.max(1, Math.ceil(filtered.length / PAGE_SIZE));
|
|
1629
|
+
var paged = filtered.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE);
|
|
1630
|
+
|
|
1631
|
+
// Extract unique types for filter dropdown
|
|
1632
|
+
var uniqueTypes = [];
|
|
1633
|
+
var typeSet = {};
|
|
1634
|
+
currentItems.forEach(function(item) {
|
|
1635
|
+
var t = item.type || item.eventType || item.tool || item.toolName || item.actionType || '';
|
|
1636
|
+
if (t && !typeSet[t]) { typeSet[t] = true; uniqueTypes.push(t); }
|
|
1637
|
+
});
|
|
1638
|
+
uniqueTypes.sort();
|
|
1639
|
+
|
|
1640
|
+
var filterBarStyle = { display: 'flex', gap: 8, padding: '8px 16px', borderBottom: '1px solid var(--border)', flexWrap: 'wrap', alignItems: 'center' };
|
|
1641
|
+
var filterInputStyle = { padding: '4px 8px', borderRadius: 4, border: '1px solid var(--border)', background: 'var(--bg-secondary)', color: 'var(--text-primary)', fontSize: 12 };
|
|
1642
|
+
|
|
1582
1643
|
return h('div', { className: 'card' },
|
|
1583
1644
|
h('div', { className: 'card-header', style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },
|
|
1584
1645
|
h('h3', { style: { margin: 0, fontSize: 15, fontWeight: 600 } }, 'Activity'),
|
|
1585
|
-
h('
|
|
1646
|
+
h('div', { style: { display: 'flex', gap: 8, alignItems: 'center' } },
|
|
1647
|
+
h('span', { style: { fontSize: 11, color: 'var(--text-muted)' } }, filtered.length + ' items'),
|
|
1648
|
+
h('button', { className: 'btn btn-ghost btn-sm', onClick: refreshCurrent }, I.refresh())
|
|
1649
|
+
)
|
|
1586
1650
|
),
|
|
1587
1651
|
h('div', { style: { borderBottom: '1px solid var(--border)' } },
|
|
1588
1652
|
h('div', { className: 'tabs', style: { padding: '0 16px' } },
|
|
1589
|
-
h('div', { className: 'tab' + (activeTab === 'events' ? ' active' : ''), onClick: function() { setActiveTab('events'); } }, 'Events'),
|
|
1590
|
-
h('div', { className: 'tab' + (activeTab === 'tools' ? ' active' : ''), onClick: function() { setActiveTab('tools'); } }, 'Tool Calls'),
|
|
1591
|
-
h('div', { className: 'tab' + (activeTab === 'journal' ? ' active' : ''), onClick: function() { setActiveTab('journal'); } }, 'Journal')
|
|
1653
|
+
h('div', { className: 'tab' + (activeTab === 'events' ? ' active' : ''), onClick: function() { setActiveTab('events'); } }, 'Events (' + events.length + ')'),
|
|
1654
|
+
h('div', { className: 'tab' + (activeTab === 'tools' ? ' active' : ''), onClick: function() { setActiveTab('tools'); } }, 'Tool Calls (' + toolCalls.length + ')'),
|
|
1655
|
+
h('div', { className: 'tab' + (activeTab === 'journal' ? ' active' : ''), onClick: function() { setActiveTab('journal'); } }, 'Journal (' + journalEntries.length + ')')
|
|
1592
1656
|
)
|
|
1593
1657
|
),
|
|
1658
|
+
|
|
1659
|
+
// Filter bar
|
|
1660
|
+
h('div', { style: filterBarStyle },
|
|
1661
|
+
h('select', { style: Object.assign({}, filterInputStyle, { width: 140 }), value: typeFilter, onChange: function(e) { setTypeFilter(e.target.value); } },
|
|
1662
|
+
h('option', { value: '' }, 'All types'),
|
|
1663
|
+
uniqueTypes.map(function(t) { return h('option', { key: t, value: t }, t); })
|
|
1664
|
+
),
|
|
1665
|
+
h('input', { style: Object.assign({}, filterInputStyle, { width: 180 }), type: 'text', placeholder: 'Search...', value: searchFilter, onChange: function(e) { setSearchFilter(e.target.value); } }),
|
|
1666
|
+
h('input', { style: Object.assign({}, filterInputStyle, { width: 130 }), type: 'date', value: dateFrom, onChange: function(e) { setDateFrom(e.target.value); }, title: 'From date' }),
|
|
1667
|
+
h('span', { style: { fontSize: 11, color: 'var(--text-muted)' } }, 'to'),
|
|
1668
|
+
h('input', { style: Object.assign({}, filterInputStyle, { width: 130 }), type: 'date', value: dateTo, onChange: function(e) { setDateTo(e.target.value); }, title: 'To date' }),
|
|
1669
|
+
(typeFilter || searchFilter || dateFrom || dateTo) && h('button', { className: 'btn btn-ghost btn-sm', style: { fontSize: 11 }, onClick: function() { setTypeFilter(''); setSearchFilter(''); setDateFrom(''); setDateTo(''); } }, 'Clear')
|
|
1670
|
+
),
|
|
1671
|
+
|
|
1594
1672
|
h('div', { className: 'card-body-flush' },
|
|
1595
1673
|
|
|
1596
1674
|
// Events Tab
|
|
1597
1675
|
activeTab === 'events' && (
|
|
1598
|
-
|
|
1599
|
-
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No events
|
|
1676
|
+
paged.length === 0
|
|
1677
|
+
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, filtered.length === 0 && events.length > 0 ? 'No events match filters' : 'No events recorded')
|
|
1600
1678
|
: h('table', { className: 'data-table' },
|
|
1601
1679
|
h('thead', null,
|
|
1602
|
-
h('tr', null,
|
|
1603
|
-
h('th', null, 'Time'),
|
|
1604
|
-
h('th', null, 'Type'),
|
|
1605
|
-
h('th', null, 'Details')
|
|
1606
|
-
)
|
|
1680
|
+
h('tr', null, h('th', null, 'Time'), h('th', null, 'Type'), h('th', null, 'Details'))
|
|
1607
1681
|
),
|
|
1608
1682
|
h('tbody', null,
|
|
1609
|
-
|
|
1683
|
+
paged.map(function(ev, i) {
|
|
1610
1684
|
var details = typeof ev.data === 'object' ? JSON.stringify(ev.data) : (ev.details || ev.data || '-');
|
|
1611
1685
|
return h('tr', { key: ev.id || i, onClick: function() { setSelectedItem(ev); }, style: { cursor: 'pointer' } },
|
|
1612
1686
|
h('td', { style: { fontSize: 12, color: 'var(--text-muted)', whiteSpace: 'nowrap' } }, new Date(ev.timestamp || ev.createdAt).toLocaleString()),
|
|
@@ -1620,19 +1694,14 @@ function ActivitySection(props) {
|
|
|
1620
1694
|
|
|
1621
1695
|
// Tool Calls Tab
|
|
1622
1696
|
activeTab === 'tools' && (
|
|
1623
|
-
|
|
1624
|
-
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No tool calls
|
|
1697
|
+
paged.length === 0
|
|
1698
|
+
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, filtered.length === 0 && toolCalls.length > 0 ? 'No tool calls match filters' : 'No tool calls recorded')
|
|
1625
1699
|
: h('table', { className: 'data-table' },
|
|
1626
1700
|
h('thead', null,
|
|
1627
|
-
h('tr', null,
|
|
1628
|
-
h('th', null, 'Time'),
|
|
1629
|
-
h('th', null, 'Tool'),
|
|
1630
|
-
h('th', null, 'Duration'),
|
|
1631
|
-
h('th', null, 'Status')
|
|
1632
|
-
)
|
|
1701
|
+
h('tr', null, h('th', null, 'Time'), h('th', null, 'Tool'), h('th', null, 'Duration'), h('th', null, 'Status'))
|
|
1633
1702
|
),
|
|
1634
1703
|
h('tbody', null,
|
|
1635
|
-
|
|
1704
|
+
paged.map(function(tc, i) {
|
|
1636
1705
|
var statusClass = tc.success === true ? 'badge badge-success' : tc.success === false ? 'badge badge-danger' : 'badge badge-neutral';
|
|
1637
1706
|
var statusLabel = tc.success === true ? 'OK' : tc.success === false ? 'Failed' : (tc.status || 'Pending');
|
|
1638
1707
|
return h('tr', { key: tc.id || i, onClick: function() { setSelectedItem(tc); }, style: { cursor: 'pointer' } },
|
|
@@ -1648,42 +1717,38 @@ function ActivitySection(props) {
|
|
|
1648
1717
|
|
|
1649
1718
|
// Journal Tab
|
|
1650
1719
|
activeTab === 'journal' && (
|
|
1651
|
-
|
|
1652
|
-
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No journal entries
|
|
1720
|
+
paged.length === 0
|
|
1721
|
+
? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, filtered.length === 0 && journalEntries.length > 0 ? 'No journal entries match filters' : 'No journal entries')
|
|
1653
1722
|
: h('table', { className: 'data-table' },
|
|
1654
1723
|
h('thead', null,
|
|
1655
|
-
h('tr', null,
|
|
1656
|
-
h('th', null, 'Time'),
|
|
1657
|
-
h('th', null, 'Tool'),
|
|
1658
|
-
h('th', null, 'Action Type'),
|
|
1659
|
-
h('th', null, 'Reversible'),
|
|
1660
|
-
h('th', null, 'Status'),
|
|
1661
|
-
h('th', null, 'Actions')
|
|
1662
|
-
)
|
|
1724
|
+
h('tr', null, h('th', null, 'Time'), h('th', null, 'Tool'), h('th', null, 'Action Type'), h('th', null, 'Reversible'), h('th', null, 'Status'), h('th', null, 'Actions'))
|
|
1663
1725
|
),
|
|
1664
1726
|
h('tbody', null,
|
|
1665
|
-
|
|
1727
|
+
paged.map(function(e) {
|
|
1666
1728
|
return h('tr', { key: e.id, onClick: function(evt) { if (evt.target.tagName === 'BUTTON' || evt.target.closest('button')) return; setSelectedItem(e); }, style: { cursor: 'pointer' } },
|
|
1667
1729
|
h('td', { style: { fontSize: 12, color: 'var(--text-muted)', whiteSpace: 'nowrap' } }, new Date(e.createdAt).toLocaleString()),
|
|
1668
1730
|
h('td', null, e.toolName || e.toolId || '-'),
|
|
1669
1731
|
h('td', null, h('span', { className: 'badge-tag' }, e.actionType || '-')),
|
|
1670
1732
|
h('td', null, e.reversible ? '\u2705' : '\u274C'),
|
|
1671
|
-
h('td', null,
|
|
1672
|
-
|
|
1673
|
-
? h('span', { className: 'status-badge status-warning' }, 'Rolled Back')
|
|
1674
|
-
: h('span', { className: 'status-badge status-success' }, 'Active')
|
|
1675
|
-
),
|
|
1676
|
-
h('td', null,
|
|
1677
|
-
e.reversible && !e.reversed && h('button', { className: 'btn btn-ghost btn-sm', onClick: function() { rollback(e.id); } }, I.undo(), ' Rollback')
|
|
1678
|
-
)
|
|
1733
|
+
h('td', null, e.reversed ? h('span', { className: 'status-badge status-warning' }, 'Rolled Back') : h('span', { className: 'status-badge status-success' }, 'Active')),
|
|
1734
|
+
h('td', null, e.reversible && !e.reversed && h('button', { className: 'btn btn-ghost btn-sm', onClick: function() { rollback(e.id); } }, I.undo(), ' Rollback'))
|
|
1679
1735
|
);
|
|
1680
1736
|
})
|
|
1681
1737
|
)
|
|
1682
1738
|
)
|
|
1739
|
+
),
|
|
1740
|
+
|
|
1741
|
+
// Pagination
|
|
1742
|
+
totalPages > 1 && h('div', { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', gap: 6, padding: '10px 16px', borderTop: '1px solid var(--border)' } },
|
|
1743
|
+
h('button', { className: 'btn btn-ghost btn-sm', disabled: page <= 1, onClick: function() { setPage(1); }, style: { fontSize: 11 } }, '«'),
|
|
1744
|
+
h('button', { className: 'btn btn-ghost btn-sm', disabled: page <= 1, onClick: function() { setPage(page - 1); }, style: { fontSize: 11 } }, '‹'),
|
|
1745
|
+
h('span', { style: { fontSize: 12, color: 'var(--text-muted)', minWidth: 80, textAlign: 'center' } }, 'Page ' + page + ' / ' + totalPages),
|
|
1746
|
+
h('button', { className: 'btn btn-ghost btn-sm', disabled: page >= totalPages, onClick: function() { setPage(page + 1); }, style: { fontSize: 11 } }, '›'),
|
|
1747
|
+
h('button', { className: 'btn btn-ghost btn-sm', disabled: page >= totalPages, onClick: function() { setPage(totalPages); }, style: { fontSize: 11 } }, '»')
|
|
1683
1748
|
)
|
|
1684
1749
|
),
|
|
1685
1750
|
|
|
1686
|
-
//
|
|
1751
|
+
// Detail Modal
|
|
1687
1752
|
selectedItem && (function() {
|
|
1688
1753
|
var item = selectedItem;
|
|
1689
1754
|
var typeLabel = item.type || item.eventType || item.tool || item.toolName || item.actionType || 'Detail';
|
|
@@ -6553,21 +6618,19 @@ function AutonomySection(props) {
|
|
|
6553
6618
|
h(Toggle, { field: 'dailyCatchupEnabled', value: form.dailyCatchupEnabled, label: 'Daily Manager Catchup', desc: 'Email summary to manager each workday' })
|
|
6554
6619
|
),
|
|
6555
6620
|
form.dailyCatchupEnabled && h('div', { style: configRow },
|
|
6556
|
-
h('span',
|
|
6557
|
-
h(TimeSelect, { hour: form.dailyCatchupHour, minute: form.dailyCatchupMinute, hourField: 'dailyCatchupHour', minuteField: 'dailyCatchupMinute' })
|
|
6621
|
+
h('span', { style: { color: 'var(--text-muted)', fontSize: 12 } }, 'Time configured in Manager & Catch-Up tab')
|
|
6558
6622
|
)
|
|
6559
6623
|
),
|
|
6560
6624
|
|
|
6561
6625
|
// Weekly Catchup
|
|
6562
6626
|
h('div', { className: 'card', style: Object.assign({}, cardStyle, { opacity: form.enabled ? 1 : 0.5 }) },
|
|
6563
6627
|
h('div', { style: rowStyle },
|
|
6564
|
-
h(Toggle, { field: 'weeklyCatchupEnabled', value: form.weeklyCatchupEnabled, label: 'Weekly Manager Catchup', desc: 'Broader summary + goals,
|
|
6628
|
+
h(Toggle, { field: 'weeklyCatchupEnabled', value: form.weeklyCatchupEnabled, label: 'Weekly Manager Catchup', desc: 'Broader weekly summary + goals, uses same time as daily' })
|
|
6565
6629
|
),
|
|
6566
6630
|
form.weeklyCatchupEnabled && h('div', { style: configRow },
|
|
6567
6631
|
h('span', null, 'Send on'),
|
|
6568
6632
|
h(DaySelect, { value: form.weeklyCatchupDay, field: 'weeklyCatchupDay' }),
|
|
6569
|
-
h('span',
|
|
6570
|
-
h(TimeSelect, { hour: form.weeklyCatchupHour, minute: form.weeklyCatchupMinute, hourField: 'weeklyCatchupHour', minuteField: 'weeklyCatchupMinute' })
|
|
6633
|
+
h('span', { style: { color: 'var(--text-muted)', fontSize: 12 } }, '(same time as daily catchup)')
|
|
6571
6634
|
)
|
|
6572
6635
|
),
|
|
6573
6636
|
|