"use client"; import { useEffect, useState } from "react"; import { fetchGroups, fetchSignals, Group, Signal, formatRelativeTime, getSignalIcon, getSeverityColor, } from "../lib/api"; function GroupAgentCard({ group, signals, index }: { group: Group; signals: Signal[]; index: number }) { const recentSignals = signals.slice(0, 3); const latestTimestamp = signals[0]?.metadata?.timestamp; const criticalCount = signals.filter( (s) => s.metadata.severity === "critical" || s.metadata.severity === "high" ).length; const isActive = group.signal_count > 0; const statusLabel = isActive ? "ACTIVE" : "IDLE"; const statusBg = isActive ? "rgba(16, 185, 129, 0.1)" : "rgba(168, 140, 251, 0.1)"; const statusColor = isActive ? "#10b981" : "#a88cfb"; const gradients = [ ["#a88cfb", "#00daf3"], ["#432390", "#a88cfb"], ["#ee7d77", "#ffb300"], ["#00daf3", "#a88cfb"], ]; const [colorA, colorB] = gradients[index % gradients.length]; return (
{/* Top gradient bar */}
{/* Header */}

{group.group_name.toUpperCase()}

LENS: {group.lens?.toUpperCase() || "UNKNOWN"} · {group.signal_count} signals

{statusLabel}
{/* Current Task */}

Latest Signal

{recentSignals[0]?.document || "No signals yet"}

{/* Metrics */}

Total Signals

{group.signal_count}

High Priority

0 ? "#ff6f78" : "#10b981" }} > {criticalCount > 0 ? `${criticalCount} alerts` : "all clear"}

{/* Terminal Output - last 3 signals */}

Signal Stream

terminal
{recentSignals.length === 0 ? (

no signals yet_

) : ( recentSignals.map((sig, idx) => (

{sig.metadata.type}: {" "} {sig.document.slice(0, 60)} {sig.document.length > 60 ? "…" : ""}

)) )}

_

); } export default function AgentCards() { const [groups, setGroups] = useState([]); const [groupSignals, setGroupSignals] = useState>({}); const [loading, setLoading] = useState(true); useEffect(() => { async function load() { try { const grps = await fetchGroups(); setGroups(grps); const sigMap: Record = {}; await Promise.all( grps.map(async (g) => { try { const sigs = await fetchSignals(g.group_id); sigMap[g.group_id] = sigs; } catch { sigMap[g.group_id] = []; } }) ); setGroupSignals(sigMap); } catch { // ignore } finally { setLoading(false); } } load(); }, []); if (loading) { return (
autorenew Loading groups...
); } if (groups.length === 0) { return (
group_off

No monitored groups yet.

Connect Telegram groups to see agents here.

); } return (
{groups.map((group, idx) => ( ))}
); }