import { useQuery } from '@tanstack/react-query'; import { Link } from 'react-router-dom'; import type { AttentionItem } from '../../../../../packages/api-contracts/src/index.js'; import { AccountOwnerBadge } from '../../components/account-owner-badge.js'; import { formatExactTime, formatShortRelativeTime } from '../conversations/relative-time.js'; import { attentionApi } from './attention-api.js'; import './attention.css'; function relativeTime(timestamp: number, now: number) { return ( ); } function actionHint(kind: AttentionItem['kind']): string { switch (kind) { case 'account-login-required': return 'No linked conversation — check Settings.'; case 'account-unestablished': return 'No linked conversation — check Accounts.'; case 'runtime-failed': case 'invitation-cooldown': default: return 'No linked conversation — check Operations.'; } } function itemAction(item: AttentionItem) { if (!item.conversationId) return {actionHint(item.kind)}; return Open conversation; } export function AttentionPage() { const query = useQuery({ queryKey: ['attention'], queryFn: attentionApi.getAttention, refetchInterval: 30_000 }); if (query.isPending) return
Loading attention inbox…
; if (query.isError) return
Attention inbox unavailable{query.error.message}
; const now = Date.now(); const critical = query.data.items.filter((item) => item.severity === 'critical').length; return (
Operator queue

Needs attention

Boundaries, human handoffs, delivery failures, account problems, and Reddit cooldowns in one actionable inbox.

Auto-refreshes every 30s
0 ? 'pill danger' : 'pill success'}>{critical} critical Updated {relativeTime(query.data.generatedAt, now)}
{query.data.items.length === 0 ?
Nothing needs attention.Automation and account health have no outstanding operator items.
: (
    {query.data.items.map((item) => (
  1. {item.kind.replaceAll('-', ' ')}

    {item.title}

    {relativeTime(item.occurredAt, now)}

    {item.detail}

    {item.owner ? : null} {itemAction(item)}
  2. ))}
)}
); }