fix(#2650,#2649): drop reminders tab + pending_reminders chip

hive-c0re's broker reminder store and /api/reminders endpoint were
removed in PR #2644 (reminders migrated to in-container sqlite store).
The dashboard had a QU3U3D R3M1ND3RS section on the schedules tab backed
by that endpoint, and a per-agent badge driven by pending_reminders
(always 0 after the migration).

Remove both. Per-agent reminders now surface through get_loose_ends /
the todos pill on the agent page, consistent with the todos migration.

- frontend/packages/dashboard/src/schedules.js: drop refreshReminders,
  renderReminders, applyRemindersChanged; drop appendLinkified import
  (no longer used); update module comment.
- frontend/packages/dashboard/src/tabs.js: drop applyRemindersChanged
  and refreshReminders imports; remove reminders-section from managed
  list; remove refreshReminders call site; drop reminders_changed from
  SSE dispatch; simplify countdown ticker (reminder-due gone).
- frontend/packages/dashboard/src/dashboard.html: remove QU3U3D
  R3M1ND3RS section.
- frontend/packages/dashboard/src/dashboard.css: remove reminder list +
  row CSS.
- frontend/packages/dashboard/src/common.css: remove .badge-reminder.
- frontend/packages/dashboard/src/swarm.js: remove pending_reminders
  from fingerprint key and badge render.
This commit is contained in:
iris 2026-07-23 00:17:41 +02:00
commit fab2fdcc0a
6 changed files with 21 additions and 180 deletions

View file

@ -28,8 +28,8 @@ import {
initPermissions,
} from './permissions.js';
import {
applySchedulesChanged, applyRemindersChanged,
refreshSchedules, refreshReminders, activeScheduleCount,
applySchedulesChanged,
refreshSchedules, activeScheduleCount,
} from './schedules.js';
import {
initCall,
@ -105,11 +105,10 @@ window.marked = marked;
// a request pending for an hour could still show "0s ago" without
// this ticker. Also flips `.stale` (amber highlight) at exactly 1h
// rather than only at the next re-render.
// Live countdown for reminder due-at labels and schedule next-fire
// cells. Both renderers stamp `data-due-at` on the element so this
// single ticker keeps them fresh without triggering a full re-render.
// `.reminder-due` -> "overdue X ago" / "in Y"
// `.sched-due` -> same pattern
// Live countdown for schedule next-fire cells. Renderers stamp
// `data-due-at` on `.sched-due` elements so this single ticker keeps
// them fresh without triggering a full re-render. Also keeps
// `.approval-ts` stale-highlight fresh at the 1h boundary.
setInterval(() => {
const now = Math.floor(Date.now() / 1000);
document.querySelectorAll('.approval-ts[data-requested-at]').forEach((node) => {
@ -119,13 +118,13 @@ window.marked = marked;
node.textContent = 'requested ' + fmtAgo(requestedAt);
node.classList.toggle('stale', ageSec >= 3600);
});
document.querySelectorAll('.reminder-due[data-due-at], .sched-due[data-due-at]').forEach((node) => {
document.querySelectorAll('.sched-due[data-due-at]').forEach((node) => {
const dueAt = Number(node.getAttribute('data-due-at'));
if (!Number.isFinite(dueAt)) return;
const dueIn = dueAt - now;
node.textContent = dueIn <= 0
? 'overdue ' + fmtAgo(dueAt)
: (node.classList.contains('reminder-due') ? 'in ' : '') + fmtDuration(dueIn);
: fmtDuration(dueIn);
});
}, 1000);
@ -139,7 +138,6 @@ window.marked = marked;
'questions-section',
'inbox-section',
'approvals-section',
'reminders-section',
'schedules-section',
'capabilities-section',
'tool-groups-section',
@ -248,7 +246,6 @@ window.marked = marked;
// #inbox-section element to render into.)
syncApprovalsFromSnapshot(s);
renderApprovals();
refreshReminders();
refreshSchedules();
restoreOpenDetails(openDetails);
notifyDeltas(s);
@ -310,7 +307,6 @@ window.marked = marked;
// rebuild_queue_changed stays: it refreshes the SW4RM badges.
rebuild_queue_changed: applyRebuildQueueChanged,
schedules_changed: applySchedulesChanged,
reminders_changed: applyRemindersChanged,
capabilities_changed: applyCapabilitiesChanged,
tool_groups_changed: applyToolGroupsChanged,
};
@ -370,8 +366,8 @@ window.marked = marked;
renderSelectionBar(Array.from(containersState.values()));
// Re-fetch on activation as a safety net: SSE covers live mutations,
// re-sync covers disconnect windows / approval-path inserts that
// don't yet emit. SCH3DUL3S also re-fetches reminders (same tab).
if (target === 'schedules') { refreshSchedules(); refreshReminders(); }
// don't yet emit.
if (target === 'schedules') { refreshSchedules(); }
// Permissions tables: SSE covers worker-applied changes
// (capabilities_changed / tool_groups_changed); re-fetch on
// activation as a safety net for any gap between SSE events and