From 820df909bfbc97cc0d835ff1db344fd05957f204 Mon Sep 17 00:00:00 2001 From: Waters Church Date: Sun, 13 Sep 2026 13:12:04 -0400 Subject: [PATCH] pco-plan: timers say when a service began and when the live item is stale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A running service with no live item (not following ProPresenter, nothing matched yet) now reports "Started 9:00 AM" instead of an empty status, and the current-item timer is muted and flagged "ProPresenter unreachable" while the feed or ProPresenter is down — it keeps counting the last item we knew of, but the wall can tell it is stale. Co-Authored-By: Claude Fable 5.1 --- modules/pco-plan/server.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/pco-plan/server.js b/modules/pco-plan/server.js index 41d98d0..77f4852 100644 --- a/modules/pco-plan/server.js +++ b/modules/pco-plan/server.js @@ -822,8 +822,11 @@ module.exports = { service.state = 'running'; service.startedAt = svc.startedAt; service.elapsedMs = elapsed; + // The live item is the headline; without one (not following + // ProPresenter, nothing matched yet) say how far behind, else when + // the service began. service.status = { - text: itemTitle || (behind >= BEHIND_WARN_MS ? `Behind ${fmtDur(behind)}` : ''), + text: itemTitle || (behind >= BEHIND_WARN_MS ? `Behind ${fmtDur(behind)}` : `Started ${fmtTime(svc.startedAt)}`), tone: serviceTone(elapsed, plannedMs, behind), }; service.detail = [label, itemDetail].filter(Boolean).join(' · '); @@ -851,11 +854,14 @@ module.exports = { currentItem.startedAt = hist.startedAt; currentItem.elapsedMs = elapsed; currentItem.targetMs = planned || null; + // With ProPresenter (or its module) unreachable this is the last item + // we knew of — still counting, but muted so the wall says "stale". + const stale = !live.available || !live.ppReachable; currentItem.status = { text: itemTitle, - tone: over > planned * 0.25 + 30000 ? 'danger' : over > 0 ? 'warn' : 'ok', + tone: stale ? 'muted' : over > planned * 0.25 + 30000 ? 'danger' : over > 0 ? 'warn' : 'ok', }; - currentItem.detail = itemDetail; + currentItem.detail = stale ? `${itemDetail} · ProPresenter unreachable` : itemDetail; } else { currentItem.status = { text: !live.following ? 'Not following ProPresenter' : !live.available ? 'ProPresenter feed unavailable' : 'Nothing live',