import { Fragment } from 'react' import Link from 'next/link' import { type UseCaseRow, type CorpusOverview, type LegalCorpus, licenseTierBadgeClass, commercialBadgeClass, groupUseCases, groupCorpusDocs, } from './_helpers' const BACKEND_URL = process.env.COMPLIANCE_BACKEND_URL || 'http://backend-compliance:8002' // The legal-corpus structure comes from the Go SDK (it owns the vector store). const SDK_URL = process.env.SDK_URL || 'http://ai-compliance-sdk:8090' export const dynamic = 'force-dynamic' // Fetched from the SDK and isolated in its own try/catch so a vector-store // hiccup degrades to "no structure shown" instead of blanking the whole page. async function fetchLegalCorpus(): Promise { try { const res = await fetch(`${SDK_URL}/sdk/v1/rag/legal-corpus`, { cache: 'no-store', }) return res.ok ? await res.json() : null } catch { return null } } async function getData(): Promise<{ useCases: UseCaseRow[] corpus: CorpusOverview | null legalCorpus: LegalCorpus | null }> { try { const [ucRes, corpusRes, legalCorpus] = await Promise.all([ fetch(`${BACKEND_URL}/api/compliance/v1/controls/use-cases`, { cache: 'no-store', }), fetch(`${BACKEND_URL}/api/compliance/v1/controls/corpus`, { cache: 'no-store', }), fetchLegalCorpus(), ]) return { useCases: ucRes.ok ? await ucRes.json() : [], corpus: corpusRes.ok ? await corpusRes.json() : null, legalCorpus, } } catch { return { useCases: [], corpus: null, legalCorpus: null } } } function Stat({ label, value }: { label: string; value: string | number }) { return (
{value}
{label}
) } export default async function CoveragePage() { const { useCases, corpus, legalCorpus } = await getData() const groups = groupUseCases(useCases) const totalRelevant = useCases.reduce((s, u) => s + u.atom_relevant, 0) const totalAtoms = useCases.reduce((s, u) => s + u.atom_total, 0) const totalReview = totalAtoms - totalRelevant return (

Compliance-Abdeckung

Alle ableitbaren Use Cases und alle Quell-Dokumente im Korpus inkl. Lizenz — damit kein Thema und keine Quelle vergessen wird.

{corpus?.license_summary?.length ? (

Lizenz-Verteilung

{corpus.license_summary.map((l) => (
Tier {l.license_rule ?? '?'} {l.label} {l.atom_count.toLocaleString('de-DE')}
))}
) : null}

Use Cases

{groups.map((g) => (

{g.label} ({g.rows.length})

{g.rows.map((u) => ( ))}
Use Case Key Kern zur Prüfung gesamt Quellen
{u.label} {u.key} {u.atom_relevant.toLocaleString('de-DE')} {(u.atom_total - u.atom_relevant).toLocaleString('de-DE')} {u.atom_total.toLocaleString('de-DE')} {u.regulations.slice(0, 4).join(', ')}
))}

Korpus-Dokumente ({corpus?.documents.length ?? 0})

Quell-Regulierung × Lizenz-Tier × Anzahl Pflichten × gemappter Use Case.

{groupCorpusDocs(corpus?.documents ?? []).map((cat) => ( {cat.families.map((fam) => ( {fam.docs.map((d) => ( ))} ))} ))}
Dokument / Quelle Lizenz Pflichten Use Case
{cat.label}{' '} ({cat.families.reduce((s, f) => s + f.docs.length, 0)} Quellen ·{' '} {cat.total.toLocaleString('de-DE')} Pflichten)
{fam.family}
{d.source_regulation} Tier {d.license_rule ?? '?'} {d.atom_count.toLocaleString('de-DE')} {d.use_case ?? ( — ungemappt )}
{legalCorpus?.regulations?.length ? (

Ingestierter Rechtskorpus – Struktur ({legalCorpus.totals.regulations}{' '} Rechtsakte)

Woraus jeder ingestierte eur-lex-Rechtsakt tatsächlich besteht: Artikel (§), Anhänge, Erwägungsgründe und retrievbare Chunks — direkt aus dem Vektorspeicher, damit kein Black-Box-Korpus entsteht.

{legalCorpus.regulations.map((r) => ( ))}
Rechtsakt Artikel (§) Anhänge Erwägungsgründe Chunks
{r.regulation_short} {r.regulation_name !== r.regulation_short ? ( {r.regulation_name} ) : null} {r.articles.toLocaleString('de-DE')} {r.annexes > 0 ? ( r.annexes.toLocaleString('de-DE') ) : ( )} {r.recitals > 0 ? ( r.recitals.toLocaleString('de-DE') ) : ( )} {r.chunks.toLocaleString('de-DE')}
) : null} {corpus?.license_catalog?.length ? (

Lizenz-Katalog ({corpus.license_catalog.length} kuratierte Quellen)

Detaillierte Nutzungsrechte je kuratierter Quelle (kommerzielle Nutzung, Auslieferung im Produkt).

{corpus.license_catalog.map((c) => ( ))}
Quelle Herausgeber Lizenz kommerziell im Produkt
{c.terms_url ? ( {c.title} ) : ( c.title )} {c.publisher ?? '—'} {c.license_name ?? c.license_id ?? '—'} {c.commercial_use ?? 'unbekannt'} {c.ship_in_product ? 'ja' : 'nein'}
) : null}
) }