@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/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-SHOCSBKU.js").then((m) => m.runAgent(args.slice(1))).catch(fatal);
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=50')
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=50')
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=50')
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=50').then(function(d) { setEvents(d.events || []); }).catch(function() {}),
1552
- engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=50').then(function(d) { setToolCalls(d.toolCalls || []); }).catch(function() {}),
1553
- engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=50').then(function(d) { setJournalEntries(d.entries || []); }).catch(function() {}),
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
- title: 'Rollback Action',
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('button', { className: 'btn btn-ghost btn-sm', onClick: refreshCurrent }, I.refresh(), ' Refresh')
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
- events.length === 0
1599
- ? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No events recorded for this agent')
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
- events.map(function(ev, i) {
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
- toolCalls.length === 0
1624
- ? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No tool calls recorded for this agent')
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
- toolCalls.map(function(tc, i) {
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
- journalEntries.length === 0
1652
- ? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No journal entries for this agent')
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
- journalEntries.map(function(e) {
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
- e.reversed
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
- // ─── Activity Detail Modal ──────────────────────────────
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', null, 'Send at'),
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, replaces daily on chosen day' })
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', null, 'at'),
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticmail/enterprise",
3
- "version": "0.5.169",
3
+ "version": "0.5.170",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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=50')
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=50')
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=50')
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=50').then(function(d) { setEvents(d.events || []); }).catch(function() {}),
1552
- engineCall('/activity/tool-calls?agentId=' + agentId + '&limit=50').then(function(d) { setToolCalls(d.toolCalls || []); }).catch(function() {}),
1553
- engineCall('/journal?agentId=' + agentId + '&orgId=' + getOrgId() + '&limit=50').then(function(d) { setJournalEntries(d.entries || []); }).catch(function() {}),
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
- title: 'Rollback Action',
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('button', { className: 'btn btn-ghost btn-sm', onClick: refreshCurrent }, I.refresh(), ' Refresh')
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
- events.length === 0
1599
- ? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No events recorded for this agent')
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
- events.map(function(ev, i) {
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
- toolCalls.length === 0
1624
- ? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No tool calls recorded for this agent')
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
- toolCalls.map(function(tc, i) {
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
- journalEntries.length === 0
1652
- ? h('div', { style: { padding: 40, textAlign: 'center', color: 'var(--text-muted)' } }, 'No journal entries for this agent')
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
- journalEntries.map(function(e) {
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
- e.reversed
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
- // ─── Activity Detail Modal ──────────────────────────────
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', null, 'Send at'),
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, replaces daily on chosen day' })
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', null, 'at'),
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