import type { Metadata } from 'next'; import Link from 'next/link'; import { AdminFilters, AdminTitle, KindChip, Mono, 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, fmtInt } from '@/lib/format'; export const metadata: Metadata = { title: 'Errors', robots: { index: false, follow: false } }; export const dynamic = 'force-dynamic'; export default async function AdminErrorsPage({ searchParams }: { searchParams: Promise> }) { await requireAdmin(); const sp = await searchParams; const limit = Math.min(500, Math.max(10, Number(sp.limit) || 100)); const [errs, connectors] = await Promise.all([load(adminApi.errors({ connector: sp.connector, limit })), load(adminApi.connectors())]); const names = connectors.ok ? connectors.data.items.map((c) => c.name).sort() : []; 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 })) }, ]} /> {!errs.ok ? ( ) : ( Time Connector Type Message URL Run {errs.data.items.length === 0 && No errors recorded.} {errs.data.items.map((e) => ( {e.connector_name ? {e.connector_name} : —} {e.error_type ? : —} {e.url ? ( {e.url.replace(/^https?:\/\/(www\.)?/, '').slice(0, 60)} ) : ( — )} {e.run_id ? {e.run_id} : —} ))} )} ); }