+ {/* Kopf-Boxen über den Tabs */}
+ {results.business_profile && (
+
+
Erkanntes Geschaeftsmodell
+
+ Typ: {results.business_profile.business_type?.toUpperCase()}
+ Branche: {results.business_profile.industry}
+ {results.business_profile.has_online_shop && Online-Shop}
+ {results.business_profile.is_regulated_profession && Regulierter Beruf ({results.business_profile.regulated_profession_type})}
+
+
+ )}
+
+ {results.extracted_profile?.company_profile && Object.keys(results.extracted_profile.company_profile).length > 0 && (
+
+
+ Aus Dokumenten extrahiert
+
+
+
+ {results.extracted_profile.company_profile.companyName && (
+ Firma: {results.extracted_profile.company_profile.companyName}
+ )}
+ {results.extracted_profile.company_profile.legalForm && (
+ Rechtsform: {results.extracted_profile.company_profile.legalForm.toUpperCase()}
+ )}
+ {results.extracted_profile.company_profile.headquartersCity && (
+ Sitz: {results.extracted_profile.company_profile.headquartersZip} {results.extracted_profile.company_profile.headquartersCity}
+ )}
+ {results.extracted_profile.company_profile.dpoEmail && (
+ DSB: {results.extracted_profile.company_profile.dpoEmail}
+ )}
+ {results.extracted_profile.company_profile.ustIdNr && (
+ USt-IdNr: {results.extracted_profile.company_profile.ustIdNr}
+ )}
+
+ {results.extracted_profile.compliance_scope_hints?.length > 0 && (
+
+ Scope-Hinweise:
+ {results.extracted_profile.compliance_scope_hints.map((h: any, i: number) => (
+
+ {h.source}
+
+ ))}
+
+ )}
+
+ )}
+
+ {results.banner_result && (
+
0
+ ? 'bg-amber-50 border-amber-200'
+ : results.banner_result.detected
+ ? 'bg-green-50 border-green-200'
+ : 'bg-gray-50 border-gray-200'
+ }`}>
+
+ 0 ? 'bg-amber-500'
+ : results.banner_result.detected ? 'bg-green-500' : 'bg-gray-400'
+ }`} />
+
+ Cookie-Banner-Check (automatisch)
+
+
+
+ {results.banner_result.detected ? (
+ <>
+ Banner erkannt{results.banner_result.provider ? ` (${results.banner_result.provider})` : ''}.
+ {results.banner_result.violations > 0
+ ? ` ${results.banner_result.violations} Auffaelligkeit${results.banner_result.violations !== 1 ? 'en' : ''} gefunden.`
+ : ' Keine Auffaelligkeiten.'}
+ >
+ ) : (
+ 'Kein Cookie-Banner erkannt oder Banner-Check nicht moeglich.'
+ )}
+
+
+ )}
+
+ {/* Tab-Leiste — Themen-Agenten + Roh-Checkliste */}
+
+ {tabs.map(t => {
+ const count = t !== 'raw' ? (agentOutputs[t]?.findings?.length ?? 0) : 0
+ return (
+
+ )
+ })}
+
+
+ {/* Tab-Inhalt */}
+ {active === 'raw' ? (
+
+ ) : agentOutputs[active] ? (
+
+ ) : null}
+
+ {/* Check-Footer (themenübergreifend) */}
+ {results.email_status && (
+
+
+ E-Mail: {results.email_status === 'sent' ? 'Gesendet' : results.email_status}
+
+ )}
+ {results.check_id &&
}
+
+ )
+}
diff --git a/admin-compliance/app/sdk/agent/_components/__tests__/AgentResultTab.test.tsx b/admin-compliance/app/sdk/agent/_components/__tests__/AgentResultTab.test.tsx
new file mode 100644
index 00000000..5e522d46
--- /dev/null
+++ b/admin-compliance/app/sdk/agent/_components/__tests__/AgentResultTab.test.tsx
@@ -0,0 +1,95 @@
+import { describe, it, expect } from 'vitest'
+import { render, screen, fireEvent } from '@testing-library/react'
+
+import { AgentResultTab } from '../AgentResultTab'
+import { ComplianceResultTabs } from '../ComplianceResultTabs'
+import type { SlotOutput } from '../_agentTypes'
+
+const IMPRESSUM_OUTPUT: SlotOutput = {
+ agent: 'impressum',
+ agent_version: '3.0',
+ duration_ms: 42,
+ confidence: 0.9,
+ notes: '12 §5-TMG-MCs geprüft · 2 Pflichtangabe(n) offen',
+ findings: [
+ {
+ check_id: 'IMP-kontakt_email', agent: 'impressum', agent_version: '3.0',
+ field_id: 'kontakt_email', severity: 'HIGH',
+ severity_reason: 'pflichtangabe_missing',
+ title: 'Pflichtangabe fehlt: Email-Adresse',
+ norm: '§ 5 Abs. 1 Nr. 2 TMG', evidence: '',
+ action: 'Pflichtangabe ergänzen: Email-Adresse.', confidence: 0.9,
+ sources: [{ source_type: 'regex', source_id: 'IMP-MC-002', confidence: 0.9 }],
+ },
+ {
+ check_id: 'IMP-kontakt_telefon', agent: 'impressum', agent_version: '3.0',
+ field_id: 'kontakt_telefon', severity: 'MEDIUM',
+ severity_reason: 'pflichtangabe_missing',
+ title: 'Pflichtangabe fehlt: Telefon',
+ norm: '§ 5 Abs. 1 Nr. 2 TMG', evidence: '',
+ action: 'Pflichtangabe ergänzen: Telefon.', confidence: 0.9,
+ sources: [{ source_type: 'regex', source_id: 'IMP-MC-003', confidence: 0.9 }],
+ },
+ ],
+ recommendations: [
+ {
+ recommendation_id: 'rec1', title: 'Pflichtangaben ergänzen',
+ body: 'Email und Telefon im Impressum ergänzen.', severity: 'HIGH',
+ related_finding_ids: ['IMP-kontakt_email', 'IMP-kontakt_telefon'],
+ estimated_effort_hours: 0.5,
+ },
+ ],
+ mc_coverage: [
+ { mc_id: 'IMP-MC-002', status: 'high', reason: 'kein Pattern-Treffer' },
+ { mc_id: 'IMP-MC-003', status: 'medium', reason: 'kein Pattern-Treffer' },
+ { mc_id: 'IMP-MC-001', status: 'ok', reason: 'Pattern-Treffer' },
+ ],
+ escalation_log: [],
+ mc_total: 3, mc_ok: 1, mc_na: 0, mc_high: 1, mc_medium: 1, mc_low: 0,
+}
+
+describe('AgentResultTab', () => {
+ it('rendert Findings nach Severity + Maßnahmen + Coverage', () => {
+ render(