'use client' import { useEffect, useState } from 'react' import Link from 'next/link' import { Card, CardContent } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' import { FileText, Plus, Loader2, ChevronRight } from 'lucide-react' import { toast } from 'sonner' import { useData } from '@/components/data-provider' interface ReportSummary { id: string title: string generatedAt: string sessionCount: number } export default function ReportsPage() { const { data } = useData() const [reports, setReports] = useState([]) const [loading, setLoading] = useState(true) const [generating, setGenerating] = useState(false) async function fetchReports() { try { const res = await fetch('/api/reports') setReports(await res.json()) } catch { // ignore } finally { setLoading(false) } } useEffect(() => { fetchReports() }, []) const currentSessionCount = data?.overview.totalSessions || 0 const lastReportSessionCount = reports[0]?.sessionCount || 0 const hasNewData = reports.length === 0 || currentSessionCount !== lastReportSessionCount async function handleGenerate() { setGenerating(true) try { const res = await fetch('/api/reports', { method: 'POST' }) const report = await res.json() if (res.status === 409) { toast.info('No new data', { description: report.error }) return } if (!res.ok) throw new Error(report.error || 'Failed to generate report') toast.success('Report generated', { description: report.title }) await fetchReports() } catch (e) { toast.error('Failed to generate report', { description: (e as Error).message }) } finally { setGenerating(false) } } const buttonDisabled = generating || !hasNewData return (

Insights Reports

Generate point-in-time snapshots of your coding agent fitness

} > {!hasNewData && ( No new sessions since last report. Sync new data first. )}
{loading ? (
Loading reports...
) : reports.length === 0 ? (

No reports yet. Click "Generate Report" to create your first fitness snapshot.

) : (
{reports.map(report => (
{report.title}
{new Date(report.generatedAt).toLocaleString()}
{report.sessionCount} sessions
))}
)}
) }