import type { Metadata } from 'next'; import Link from 'next/link'; import { ActionButton, AdminTitle, Bool, Mono, Notice, StatusChip, Trunc } from '@/components/admin/ui'; import { TierBadge } from '@/components/ui/badges'; import { DataTable, EmptyRow, Td, Th } from '@/components/ui/data-table'; import { LiveAgo } from '@/components/ui/live'; import { Unavailable } from '@/components/ui/unavailable'; import { runConnectorAction, toggleConnectorAction } from '@/lib/admin/actions'; import { adminApi, load, requireAdmin } from '@/lib/admin/admin-api'; import { fmtDateTime, fmtDuration, fmtInt, num } from '@/lib/format'; export const metadata: Metadata = { title: 'Connectors', robots: { index: false, follow: false } }; export const dynamic = 'force-dynamic'; const RETURN = '/admin/connectors'; export default async function AdminConnectorsPage({ searchParams }: { searchParams: Promise> }) { await requireAdmin(); const sp = await searchParams; const res = await load(adminApi.connectors()); if (!res.ok) { return ( <> ); } const items = [...res.data.items].sort((a, b) => (num(a.priority) ?? 9) - (num(b.priority) ?? 9) || a.name.localeCompare(b.name)); const counts = items.reduce>((acc, c) => ((acc[c.health] = (acc[c.health] ?? 0) + 1), acc), {}); return ( <> `${k} ${n}`).join(' · ')} /> Connector Source Health Enabled Prio Interval Last attempt Last success Next run Last run Docs / snaps Fails Circuit Actions {items.length === 0 && No connectors registered.} {items.map((c) => { const lr = c.last_run; return (
{c.name} {c.run_now_pending && queued} {c.in_code === false && no code}
{c.label} {c.source_name ?? c.source_key ?? '—'} {c.source_tier !== undefined && c.source_tier !== null && } {fmtInt(c.priority)} {fmtDuration(c.interval_seconds)} {c.next_run_at ? fmtDateTime(c.next_run_at).replace(/ UTC$/, '') : '—'} {lr ? ( {num(lr.duration_ms) === null ? '' : fmtDuration(Math.round((num(lr.duration_ms) ?? 0) / 1000))} {fmtInt(lr.docs_changed)}/{fmtInt(lr.docs_fetched)} {lr.error && } ) : ( — )} {c.documents === undefined && c.snapshots === undefined ? '—' : `${fmtInt(c.documents)} / ${fmtInt(c.snapshots)}`} {fmtInt(c.consecutive_failures)} {c.circuit_open_until ? open · : closed}
Run now
{c.enabled ? 'Disable' : 'Enable'}
); })}
{res.data.unregistered_in_db && res.data.unregistered_in_db.length > 0 && (

In code but not in the database ({res.data.unregistered_in_db.length}): {res.data.unregistered_in_db.map((n) => {n})} — run aia seed to register them.

)} ); }