import type { Metadata } from 'next'; import Link from 'next/link'; import { RollbackButton } from '@/components/admin/rollback-button'; import { AdminFilters, AdminTitle, Mono, Notice, StatusChip, Trunc } from '@/components/admin/ui'; import { DataTable, EmptyRow, Td, Th } from '@/components/ui/data-table'; import { LiveAgo } from '@/components/ui/live'; import { Unavailable } from '@/components/ui/unavailable'; import { adminApi, load, requireAdmin } from '@/lib/admin/admin-api'; import { fmtDateTime, fmtDuration, fmtInt, num } from '@/lib/format'; export const metadata: Metadata = { title: 'Runs', robots: { index: false, follow: false } }; export const dynamic = 'force-dynamic'; export default async function AdminRunsPage({ searchParams }: { searchParams: Promise> }) { await requireAdmin(); const sp = await searchParams; const limit = Math.min(500, Math.max(10, Number(sp.limit) || 100)); const [runs, connectors] = await Promise.all([load(adminApi.runs({ connector: sp.connector, limit })), load(adminApi.connectors())]); const names = connectors.ok ? connectors.data.items.map((c) => c.name).sort() : []; const ret = `/admin/runs${sp.connector ? `?connector=${encodeURIComponent(sp.connector)}` : ''}`; return ( <> ({ value: n, label: n })) }, { kind: 'select', name: 'limit', label: 'Rows', value: String(limit), any: '100', options: ['50', '100', '250', '500'].map((v) => ({ value: v, label: v })) }, ]} /> {!runs.ok ? ( ) : ( Connector Started Status Duration Disc. Fetched Changed Unch. Failed Ent. +/~ Claims Rel. Events Error Run id Rollback {runs.data.items.length === 0 && No runs match.} {runs.data.items.map((r) => ( {r.connector_name} {num(r.duration_ms) === null ? '—' : fmtDuration(Math.round((num(r.duration_ms) ?? 0) / 1000))} {fmtInt(r.docs_discovered)} {fmtInt(r.docs_fetched)} {fmtInt(r.docs_changed)} {fmtInt(r.docs_unchanged)} {fmtInt(r.docs_failed)} {fmtInt(r.entities_created)} / {fmtInt(r.entities_updated)} {fmtInt(r.claims_written)} {fmtInt(r.relations_written)} {fmtInt(r.events_emitted)} {r.id} ))} )} ); }