dded cutoff = utcnow() - timedelta(minutes=15)

This commit is contained in:
null 2026-05-25 12:27:02 -05:00
parent c71b96421f
commit ea62e387a4
3 changed files with 16 additions and 3 deletions

View File

@ -5,7 +5,7 @@ from __future__ import annotations
import asyncio import asyncio
import json import json
from collections import deque from collections import deque
from datetime import UTC, datetime from datetime import UTC, datetime, timedelta
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
from uuid import UUID from uuid import UUID
@ -257,12 +257,14 @@ async def get_activity_ticker(
) -> list[ActivityTickerItem]: ) -> list[ActivityTickerItem]:
"""Return recent activity items shaped for the navbar ticker.""" """Return recent activity items shaped for the navbar ticker."""
board_ids = await list_accessible_board_ids(session, member=ctx.member, write=False) board_ids = await list_accessible_board_ids(session, member=ctx.member, write=False)
cutoff = utcnow() - timedelta(minutes=15)
statement = ( statement = (
select(ActivityEvent, Agent) select(ActivityEvent, Agent)
.outerjoin(Agent, col(ActivityEvent.agent_id) == col(Agent.id)) .outerjoin(Agent, col(ActivityEvent.agent_id) == col(Agent.id))
.outerjoin(Task, col(ActivityEvent.task_id) == col(Task.id)) .outerjoin(Task, col(ActivityEvent.task_id) == col(Task.id))
.where(func.length(func.trim(col(ActivityEvent.message))) > 0) .where(func.length(func.trim(col(ActivityEvent.message))) > 0)
.where(col(ActivityEvent.created_at) >= cutoff)
.order_by(desc(col(ActivityEvent.created_at))) .order_by(desc(col(ActivityEvent.created_at)))
.limit(limit) .limit(limit)
) )

View File

@ -215,6 +215,11 @@ textarea::placeholder {
100% { transform: translateX(-50%); } 100% { transform: translateX(-50%); }
} }
@keyframes live-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.2; }
}
@keyframes progress-shimmer { @keyframes progress-shimmer {
0% { 0% {
transform: translateX(-100%); transform: translateX(-100%);
@ -272,6 +277,9 @@ textarea::placeholder {
.animate-ticker:hover { .animate-ticker:hover {
animation-play-state: paused; animation-play-state: paused;
} }
.animate-live-pulse {
animation: live-pulse 1.4s ease-in-out infinite;
}
.shadow-lush { .shadow-lush {
box-shadow: var(--shadow-panel); box-shadow: var(--shadow-panel);
} }

View File

@ -62,8 +62,11 @@ export function AgentActivityTicker() {
return ( return (
<div className="border-t border-[color:var(--border)] bg-[color:var(--surface-muted)] overflow-hidden h-8 flex items-center"> <div className="border-t border-[color:var(--border)] bg-[color:var(--surface-muted)] overflow-hidden h-8 flex items-center">
<span className="shrink-0 px-3 text-[11px] font-semibold uppercase tracking-widest text-[color:var(--text-quiet)] select-none border-r border-[color:var(--border)] h-full flex items-center"> <span className="shrink-0 px-3 select-none border-r border-[color:var(--border)] h-full flex items-center">
Live <span className="inline-flex items-center gap-1.5 bg-red-600 text-white text-[10px] font-black tracking-[0.2em] uppercase px-2 py-0.5 rounded-sm shadow-sm shadow-red-900/40">
<span className="animate-live-pulse w-1.5 h-1.5 rounded-full bg-white" />
Live
</span>
</span> </span>
<div className="flex-1 overflow-hidden h-full flex items-center"> <div className="flex-1 overflow-hidden h-full flex items-center">
<div className="flex whitespace-nowrap animate-ticker"> <div className="flex whitespace-nowrap animate-ticker">