import Link from "next/link"; import { notFound } from "next/navigation"; import { createAdminClient } from "@/lib/supabase/admin"; import EventTagPicker from './EventTagPicker'; import ReviewActions from "./ReviewActions"; export const dynamic = "force-dynamic"; async function loadDetail(id: string) { const sb = createAdminClient(); const { data: art } = await sb .from("ai_rewritten_articles") .select("*") .eq("id", id) .maybeSingle(); if (!art) return null; const { data: persona } = await sb .from("ai_personas") .select("name, slug, avatar_url, beat") .eq("id", (art as any).persona_id) .maybeSingle(); const { data: original } = await sb .from("ai_original_submissions") .select("raw_title, raw_content, contributor_name, contributor_email, submitted_at, source") .eq("id", (art as any).original_submission_id) .maybeSingle(); const { data: job } = await sb .from("ai_rewrite_jobs") .select("attempt_number, ai_detector_score, banned_words_found, model, input_tokens, output_tokens, cache_read_tokens") .eq("id", (art as any).rewrite_job_id) .maybeSingle(); return { art, persona, original, job }; } export default async function ReviewDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const detail = await loadDetail(id); if (!detail) notFound(); const { art, persona, original, job } = detail as any; return (
← Back to queue
{persona?.name || "—"} · {art.category} · {art.status}

{art.title}

{art.excerpt}

Rewritten ({persona?.name})

{(art.tags || []).map((t: string) => ( {t} ))}

Original submission

{original?.contributor_name || "(no name)"} · {original?.contributor_email || "(no email)"} ·{" "} {original?.source} · {original?.submitted_at && new Date(original.submitted_at).toLocaleString()}

{original?.raw_title}

            {original?.raw_content}
          

Rewrite job

  • Attempt: {job?.attempt_number}
  • Model: {job?.model}
  • AI-detector score: {job?.ai_detector_score?.toFixed?.(3) ?? "—"}
  • Banned words found: {(job?.banned_words_found || []).join(", ") || "none"}
  • Tokens: input {job?.input_tokens ?? 0} / output {job?.output_tokens ?? 0} / cache-read{" "} {job?.cache_read_tokens ?? 0}
); }