diff --git a/.claude/rules/loc-exceptions.txt b/.claude/rules/loc-exceptions.txt index c00fe9f..76b4aa7 100644 --- a/.claude/rules/loc-exceptions.txt +++ b/.claude/rules/loc-exceptions.txt @@ -17,6 +17,8 @@ # Pure Data Registries (keine Logik, nur Daten-Definitionen) **/dsfa_sources_registry.py | owner=klausur | reason=Pure data registry (license + source definitions, no logic) | review=2027-01-01 +**/backlog/backlog-items.ts | owner=admin-lehrer | reason=Pure data array (506 LOC, no logic, only BacklogItem[] literals) | review=2027-01-01 +**/lib/module-registry-data.ts | owner=admin-lehrer | reason=Pure data array (510 LOC, no logic, only BackendModule[] literals) | review=2027-01-01 # Algorithmic monolith — detect_column_geometry() allein 411 LOC, nicht weiter teilbar **/cv_layout_columns.py | owner=klausur | reason=detect_column_geometry ist eine einzelne 411-LOC Funktion (Whitespace-Gap-Analyse) | review=2026-10-01 @@ -24,6 +26,18 @@ # Two indivisible route handlers (~230 LOC each) that cannot be split further **/vocab_worksheet_compare_api.py | owner=klausur | reason=compare_ocr_methods (234 LOC) + analyze_grid (255 LOC), each a single cohesive handler | review=2026-10-01 +# TypeScript Data Catalogs (admin-lehrer/lib/sdk/) +# Pure exported const arrays/objects with type definitions, no business logic. +# DSGVO/GDPR compliance catalogs: risk scenarios, mitigations, legal bases, checklists, etc. +**/lib/sdk/vendor-compliance/catalog/*.ts | owner=admin-lehrer | reason=Pure data catalogs (processing-activities 813, vendor-templates 564, legal-basis 562 LOC) | review=2027-01-01 +**/lib/sdk/vendor-compliance/contract-review/findings.ts | owner=admin-lehrer | reason=Pure data catalog (573 LOC, FindingTemplate[] literals) | review=2027-01-01 +**/lib/sdk/vendor-compliance/contract-review/checklists.ts | owner=admin-lehrer | reason=Pure data catalog (508 LOC, ChecklistItem[] literals) | review=2027-01-01 +**/lib/sdk/dsfa/mitigation-library.ts | owner=admin-lehrer | reason=Pure data catalog (694 LOC, CatalogMitigation[] literals) | review=2027-01-01 +**/lib/sdk/dsfa/eu-legal-frameworks.ts | owner=admin-lehrer | reason=Pure data catalog (622 LOC, legal framework definitions) | review=2027-01-01 +**/lib/sdk/dsfa/risk-catalog.ts | owner=admin-lehrer | reason=Pure data catalog (615 LOC, CatalogRisk[] literals) | review=2027-01-01 +**/lib/sdk/vvt-baseline-catalog.ts | owner=admin-lehrer | reason=Pure data catalog (630 LOC, BaselineTemplate[] literals) | review=2027-01-01 +**/lib/sdk/loeschfristen-baseline-catalog.ts | owner=admin-lehrer | reason=Pure data catalog (578 LOC, retention period templates) | review=2027-01-01 + # Legacy — TEMPORAER bis Refactoring abgeschlossen # Dateien hier werden Phase fuer Phase abgearbeitet und entfernt. # KEINE neuen Ausnahmen ohne [guardrail-change] Commit-Marker! diff --git a/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/AgentHeader.tsx b/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/AgentHeader.tsx new file mode 100644 index 0000000..b314d07 --- /dev/null +++ b/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/AgentHeader.tsx @@ -0,0 +1,58 @@ +import Link from 'next/link' +import { Brain, ArrowLeft, Play, Pause, CheckCircle, XCircle } from 'lucide-react' +import type { AgentDetail } from './types' + +interface AgentHeaderProps { + agent: AgentDetail +} + +export function AgentHeader({ agent }: AgentHeaderProps) { + return ( +
+
+ + + +
+ +
+
+

{agent.name}

+

{agent.description}

+
+
+ +
+
+ {agent.status === 'running' ? : + agent.status === 'paused' ? : + } + {agent.status} +
+ +
+
+ ) +} diff --git a/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/AgentStatsBar.tsx b/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/AgentStatsBar.tsx new file mode 100644 index 0000000..af89f20 --- /dev/null +++ b/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/AgentStatsBar.tsx @@ -0,0 +1,32 @@ +import type { AgentDetail } from './types' + +interface AgentStatsBarProps { + agent: AgentDetail +} + +export function AgentStatsBar({ agent }: AgentStatsBarProps) { + return ( +
+
+
Aktive Sessions
+
{agent.activeSessions}
+
+
+
Verarbeitet (24h)
+
{agent.totalProcessed.toLocaleString()}
+
+
+
Avg. Antwortzeit
+
{agent.avgResponseTime}ms
+
+
+
Fehlerrate
+
{agent.errorRate}%
+
+
+
Version
+
{agent.version}
+
+
+ ) +} diff --git a/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/HistoryTabContent.tsx b/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/HistoryTabContent.tsx new file mode 100644 index 0000000..7d2ae7a --- /dev/null +++ b/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/HistoryTabContent.tsx @@ -0,0 +1,32 @@ +import { History } from 'lucide-react' +import type { ChangeLog } from './types' + +interface HistoryTabContentProps { + changeLogs: ChangeLog[] +} + +export function HistoryTabContent({ changeLogs }: HistoryTabContentProps) { + return ( +
+
+ {changeLogs.map((log) => ( +
+
+ +
+
+
+ {log.action} + + {new Date(log.timestamp).toLocaleString('de-DE')} + +
+

{log.description}

+

von {log.user}

+
+
+ ))} +
+
+ ) +} diff --git a/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/SoulTabContent.tsx b/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/SoulTabContent.tsx new file mode 100644 index 0000000..f3897dc --- /dev/null +++ b/admin-lehrer/app/(admin)/ai/agents/[agentId]/_components/SoulTabContent.tsx @@ -0,0 +1,102 @@ +import { FileText, Clock, RotateCcw, Save, Edit3, AlertTriangle } from 'lucide-react' +import type { AgentDetail } from './types' + +interface SoulTabContentProps { + agent: AgentDetail + editedContent: string + isEditing: boolean + hasChanges: boolean + saving: boolean + onContentChange: (content: string) => void + onSave: () => void + onReset: () => void + onStartEditing: () => void +} + +export function SoulTabContent({ + agent, + editedContent, + isEditing, + hasChanges, + saving, + onContentChange, + onSave, + onReset, + onStartEditing, +}: SoulTabContentProps) { + return ( +
+
+
+ + {agent.soulFile} + | + + Zuletzt geaendert: {new Date(agent.updatedAt).toLocaleString('de-DE')} +
+
+ {isEditing ? ( + <> + + + + ) : ( + + )} +
+
+ + {hasChanges && ( +
+ + Ungespeicherte Aenderungen vorhanden +
+ )} + +
+ {isEditing ? ( +