@@ -580,6 +580,7 @@ <h1>Episode<span>Guard</span><span class="version-badge" id="version-badge"></sp
580580 if ( d . message && ! d . reason ) detail += ( detail ?' - ' :'' ) + String ( d . message ) . slice ( 0 , 60 ) ;
581581 const el = document . createElement ( 'div' ) ;
582582 el . className = 'live-row' + ( animate ?' new' :'' ) ;
583+ el . dataset . ts = String ( new Date ( row . timestamp ) . getTime ( ) ) ;
583584 el . innerHTML = '<span class="live-time">' + relativeTime ( row . timestamp ) + '</span>' +
584585 '<span class="live-type">' + badgeHtml ( row . event_type ) + '</span>' +
585586 '<span class="live-show">' + esc ( row . show_title ?? '-' ) + '<span class="live-ep">' + epLabel ( row . season , row . episode ) + '</span></span>' +
@@ -601,6 +602,9 @@ <h1>Episode<span>Guard</span><span class="version-badge" id="version-badge"></sp
601602
602603 let histPage = 1 ;
603604 const HIST_LIMIT = 50 ;
605+ const LIVE_WINDOW_MS = 10 * 60 * 1000 ; // 10 minutes
606+
607+ function liveCutoff ( ) { return new Date ( Date . now ( ) - LIVE_WINDOW_MS ) . toISOString ( ) ; }
604608
605609 function applyFilters ( ) { histPage = 1 ; loadHistLog ( ) ; }
606610 function clearFilters ( ) {
@@ -618,6 +622,9 @@ <h1>Episode<span>Guard</span><span class="version-badge" id="version-badge"></sp
618622 if ( type ) params . set ( 'type' , type ) ;
619623 if ( from ) params . set ( 'from' , from + 'T00:00:00Z' ) ;
620624 if ( to ) params . set ( 'to' , to + 'T23:59:59Z' ) ;
625+ // Default: exclude last 10 mins (those are in the live feed)
626+ // Only apply if user hasn't set an explicit date range
627+ if ( ! from && ! to ) params . set ( 'before' , liveCutoff ( ) ) ;
621628 try {
622629 const res = await fetch ( '/api/logs?' + params ) ;
623630 const data = await res . json ( ) ;
@@ -639,7 +646,26 @@ <h1>Episode<span>Guard</span><span class="version-badge" id="version-badge"></sp
639646 }
640647
641648 function goPage ( p ) { histPage = p ; loadHistLog ( ) ; }
642- function initLogsView ( ) { initLiveFeed ( ) ; loadHistLog ( ) ; }
649+
650+ // Prune live feed rows older than 10 mins and refresh history to pick them up
651+ function pruneLiveFeed ( ) {
652+ const cutoff = Date . now ( ) - LIVE_WINDOW_MS ;
653+ const feed = document . getElementById ( 'live-feed' ) ;
654+ if ( ! feed ) return ;
655+ let pruned = 0 ;
656+ feed . querySelectorAll ( '.live-row' ) . forEach ( el => {
657+ const ts = el . dataset . ts ? parseInt ( el . dataset . ts , 10 ) : 0 ;
658+ if ( ts && ts < cutoff ) { el . remove ( ) ; pruned ++ ; }
659+ } ) ;
660+ if ( pruned > 0 ) loadHistLog ( ) ;
661+ }
662+
663+ let logsViewTimer = null ;
664+ function initLogsView ( ) {
665+ initLiveFeed ( ) ;
666+ loadHistLog ( ) ;
667+ if ( ! logsViewTimer ) logsViewTimer = setInterval ( pruneLiveFeed , 60000 ) ;
668+ }
643669
644670 function showSettingsTab ( name , btn ) {
645671 document . querySelectorAll ( '.settings-pane' ) . forEach ( p => p . classList . remove ( 'active' ) ) ;
0 commit comments