dded cutoff = utcnow() - timedelta(minutes=15)
This commit is contained in:
parent
c71b96421f
commit
ea62e387a4
|
|
@ -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)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue