From 5a31f5231055308084de2724d83e13e25e75ab67 Mon Sep 17 00:00:00 2001 From: Benjamin Boenisch Date: Wed, 11 Feb 2026 23:47:26 +0100 Subject: [PATCH] Initial commit: breakpilot-lehrer - Lehrer KI Platform Services: Admin-Lehrer, Backend-Lehrer, Studio v2, Website, Klausur-Service, School-Service, Voice-Service, Geo-Service, BreakPilot Drive, Agent-Core Co-Authored-By: Claude Opus 4.6 --- .claude/CLAUDE.md | 51 + .env.example | 56 + .gitignore | 122 + admin-lehrer/.dockerignore | 44 + admin-lehrer/Dockerfile | 55 + admin-lehrer/ai-compliance-sdk/Dockerfile | 45 + .../ai-compliance-sdk/cmd/server/main.go | 160 + .../ai-compliance-sdk/configs/config.yaml | 42 + admin-lehrer/ai-compliance-sdk/go.mod | 11 + .../internal/api/checkpoint.go | 327 + .../internal/api/generate.go | 365 + .../ai-compliance-sdk/internal/api/rag.go | 182 + .../ai-compliance-sdk/internal/api/router.go | 96 + .../ai-compliance-sdk/internal/api/state.go | 171 + .../ai-compliance-sdk/internal/db/postgres.go | 173 + .../ai-compliance-sdk/internal/llm/service.go | 384 + .../ai-compliance-sdk/internal/rag/service.go | 208 + .../app/(admin)/ai/agents/[agentId]/page.tsx | 682 ++ .../(admin)/ai/agents/architecture/page.tsx | 779 ++ admin-lehrer/app/(admin)/ai/agents/page.tsx | 390 + .../app/(admin)/ai/agents/sessions/page.tsx | 444 ++ .../app/(admin)/ai/agents/statistics/page.tsx | 491 ++ admin-lehrer/app/(admin)/ai/gpu/page.tsx | 396 + .../app/(admin)/ai/llm-compare/page.tsx | 503 ++ .../app/(admin)/ai/magic-help/page.tsx | 1604 ++++ .../app/(admin)/ai/ocr-compare/page.tsx | 1638 ++++ .../app/(admin)/ai/ocr-labeling/page.tsx | 987 +++ .../app/(admin)/ai/ocr-labeling/types.ts | 123 + admin-lehrer/app/(admin)/ai/page.tsx | 53 + admin-lehrer/app/(admin)/ai/quality/page.tsx | 524 ++ .../app/(admin)/ai/rag-pipeline/dsfa/page.tsx | 674 ++ .../app/(admin)/ai/rag-pipeline/page.tsx | 1468 ++++ admin-lehrer/app/(admin)/ai/rag/page.tsx | 3272 ++++++++ .../app/(admin)/ai/test-quality/page.tsx | 1526 ++++ .../app/(admin)/ai/test-quality/types.ts | 52 + .../app/(admin)/architecture/page.tsx | 152 + admin-lehrer/app/(admin)/backlog/page.tsx | 991 +++ .../app/(admin)/communication/alerts/page.tsx | 912 +++ .../app/(admin)/communication/mail/page.tsx | 946 +++ .../communication/mail/wizard/page.tsx | 421 + .../app/(admin)/communication/matrix/page.tsx | 594 ++ .../app/(admin)/communication/page.tsx | 50 + .../(admin)/communication/video-chat/page.tsx | 635 ++ .../communication/video-chat/wizard/page.tsx | 366 + .../dashboard/catalog-manager/page.tsx | 12 + admin-lehrer/app/(admin)/dashboard/page.tsx | 155 + .../(admin)/developers/api/export/page.tsx | 271 + .../(admin)/developers/api/generate/page.tsx | 381 + .../app/(admin)/developers/api/page.tsx | 239 + .../app/(admin)/developers/api/rag/page.tsx | 248 + .../app/(admin)/developers/api/state/page.tsx | 266 + .../app/(admin)/developers/changelog/page.tsx | 164 + .../developers/getting-started/page.tsx | 203 + .../app/(admin)/developers/guides/page.tsx | 227 + .../(admin)/developers/guides/phase1/page.tsx | 391 + .../(admin)/developers/guides/phase2/page.tsx | 377 + .../app/(admin)/developers/layout.tsx | 9 + admin-lehrer/app/(admin)/developers/page.tsx | 188 + .../developers/sdk/configuration/page.tsx | 256 + .../sdk/consent/api-reference/page.tsx | 482 ++ .../sdk/consent/frameworks/angular/page.tsx | 281 + .../sdk/consent/frameworks/page.tsx | 98 + .../sdk/consent/frameworks/react/page.tsx | 277 + .../sdk/consent/frameworks/vue/page.tsx | 277 + .../sdk/consent/installation/page.tsx | 303 + .../sdk/consent/mobile/android/page.tsx | 269 + .../sdk/consent/mobile/flutter/page.tsx | 313 + .../sdk/consent/mobile/ios/page.tsx | 283 + .../developers/sdk/consent/mobile/page.tsx | 95 + .../(admin)/developers/sdk/consent/page.tsx | 262 + .../developers/sdk/consent/security/page.tsx | 290 + .../developers/sdk/installation/page.tsx | 186 + .../app/(admin)/developers/sdk/page.tsx | 281 + .../(admin)/development/brandbook/page.tsx | 1143 +++ .../(admin)/development/companion/page.tsx | 39 + .../app/(admin)/development/docs/page.tsx | 216 + .../app/(admin)/development/game/page.tsx | 39 + admin-lehrer/app/(admin)/development/page.tsx | 54 + .../(admin)/development/screen-flow/page.tsx | 797 ++ .../(admin)/development/unity-bridge/page.tsx | 39 + .../app/(admin)/development/workflow/page.tsx | 665 ++ .../components/AehnlicheDokumente.tsx | 223 + .../abitur-archiv/components/DokumentCard.tsx | 203 + .../components/FullscreenViewer.tsx | 456 ++ .../abitur-archiv/components/ThemenSuche.tsx | 243 + .../(admin)/education/abitur-archiv/page.tsx | 516 ++ .../app/(admin)/education/edu-search/page.tsx | 319 + .../[klausurId]/[studentId]/page.tsx | 1320 ++++ .../[klausurId]/fairness/page.tsx | 484 ++ .../klausur-korrektur/[klausurId]/page.tsx | 489 ++ .../components/AnnotationLayer.tsx | 281 + .../components/AnnotationPanel.tsx | 267 + .../components/AnnotationToolbar.tsx | 139 + .../components/EHSuggestionPanel.tsx | 279 + .../klausur-korrektur/components/index.ts | 4 + .../education/klausur-korrektur/page.tsx | 1121 +++ .../education/klausur-korrektur/types.ts | 195 + admin-lehrer/app/(admin)/education/page.tsx | 82 + .../education/zeugnisse-crawler/page.tsx | 181 + .../app/(admin)/infrastructure/ci-cd/page.tsx | 1635 ++++ .../app/(admin)/infrastructure/gpu/page.tsx | 391 + .../infrastructure/middleware/page.tsx | 650 ++ .../infrastructure/night-mode/page.tsx | 561 ++ .../app/(admin)/infrastructure/page.tsx | 50 + .../app/(admin)/infrastructure/sbom/page.tsx | 912 +++ .../infrastructure/sbom/wizard/page.tsx | 558 ++ .../(admin)/infrastructure/security/page.tsx | 1137 +++ .../app/(admin)/infrastructure/tests/page.tsx | 1692 ++++ .../app/(admin)/infrastructure/tests/types.ts | 192 + admin-lehrer/app/(admin)/layout.tsx | 61 + admin-lehrer/app/(admin)/onboarding/page.tsx | 39 + admin-lehrer/app/(admin)/rbac/page.tsx | 1035 +++ .../app/(admin)/website/manager/page.tsx | 670 ++ admin-lehrer/app/(admin)/website/page.tsx | 51 + .../(admin)/website/uebersetzungen/page.tsx | 769 ++ .../app/api/admin/agents/[agentId]/route.ts | 275 + .../api/admin/agents/[agentId]/soul/route.ts | 187 + admin-lehrer/app/api/admin/agents/route.ts | 282 + .../app/api/admin/agents/sessions/route.ts | 240 + .../app/api/admin/agents/statistics/route.ts | 208 + .../sessions/[sessionId]/complete/route.ts | 44 + .../audit/sessions/[sessionId]/pdf/route.ts | 66 + .../admin/audit/sessions/[sessionId]/route.ts | 80 + .../audit/sessions/[sessionId]/start/route.ts | 44 + .../app/api/admin/audit/sessions/route.ts | 82 + .../api/admin/communication/stats/route.ts | 210 + .../app/api/admin/companion/feedback/route.ts | 129 + .../app/api/admin/companion/lesson/route.ts | 194 + admin-lehrer/app/api/admin/companion/route.ts | 102 + .../app/api/admin/companion/settings/route.ts | 137 + .../items/[requirementId]/route.ts | 85 + .../audit/checklist/[sessionId]/route.ts | 57 + .../controls/[controlId]/review/route.ts | 46 + .../api/admin/compliance/controls/route.ts | 54 + .../compliance/dashboard/executive/route.ts | 36 + .../api/admin/compliance/dashboard/route.ts | 36 + .../api/admin/compliance/evidence/route.ts | 81 + .../admin/compliance/evidence/upload/route.ts | 53 + .../compliance/modules/[moduleId]/route.ts | 44 + .../compliance/modules/overview/route.ts | 36 + .../app/api/admin/compliance/modules/route.ts | 51 + .../admin/compliance/modules/seed/route.ts | 39 + .../api/admin/compliance/regulations/route.ts | 220 + .../admin/compliance/requirements/route.ts | 109 + .../admin/compliance/risks/[riskId]/route.ts | 83 + .../app/api/admin/compliance/risks/route.ts | 81 + .../app/api/admin/compliance/seed/route.ts | 39 + .../app/api/admin/consent/audit-log/route.ts | 48 + .../app/api/admin/consent/deadlines/route.ts | 40 + .../consent/documents/[id]/versions/route.ts | 80 + .../app/api/admin/consent/documents/route.ts | 75 + .../app/api/admin/consent/stats/route.ts | 44 + .../[versionId]/approval-history/route.ts | 46 + .../versions/[versionId]/approve/route.ts | 49 + .../versions/[versionId]/publish/route.ts | 49 + .../versions/[versionId]/reject/route.ts | 49 + .../consent/versions/[versionId]/route.ts | 87 + .../[versionId]/submit-review/route.ts | 47 + .../app/api/admin/consent/versions/route.ts | 42 + admin-lehrer/app/api/admin/health/route.ts | 173 + .../admin/infrastructure/mac-mini/route.ts | 338 + .../admin/infrastructure/woodpecker/route.ts | 208 + admin-lehrer/app/api/admin/mail/route.ts | 81 + .../api/admin/middleware/[...path]/route.ts | 172 + .../app/api/admin/middleware/route.ts | 59 + .../app/api/admin/night-mode/execute/route.ts | 50 + .../app/api/admin/night-mode/route.ts | 77 + .../api/admin/night-mode/services/route.ts | 41 + admin-lehrer/app/api/ai/rag-pipeline/route.ts | 215 + .../app/api/alerts/[...path]/route.ts | 172 + admin-lehrer/app/api/bqas/[...path]/route.ts | 86 + .../app/api/development/content/route.ts | 68 + admin-lehrer/app/api/dsfa-corpus/route.ts | 100 + .../app/api/education/abitur-archiv/route.ts | 246 + .../education/abitur-archiv/suggest/route.ts | 105 + .../app/api/education/abitur-docs/route.ts | 139 + .../log-extract/extract/route.ts | 395 + admin-lehrer/app/api/legal-corpus/route.ts | 180 + admin-lehrer/app/api/tests/[...path]/route.ts | 75 + .../app/api/v1/security/[...path]/route.ts | 97 + .../app/api/webhooks/woodpecker/route.ts | 273 + admin-lehrer/app/api/website/content/route.ts | 65 + admin-lehrer/app/api/website/status/route.ts | 52 + admin-lehrer/app/globals.css | 98 + admin-lehrer/app/layout.tsx | 22 + admin-lehrer/app/page.tsx | 106 + admin-lehrer/components/QRCodeUpload.tsx | 191 + .../components/ai/AIModuleSidebar.tsx | 405 + admin-lehrer/components/ai/AIToolsSidebar.tsx | 462 ++ admin-lehrer/components/ai/BatchUploader.tsx | 454 ++ .../components/ai/ConfidenceHeatmap.tsx | 439 ++ .../components/ai/TrainingMetrics.tsx | 613 ++ admin-lehrer/components/ai/index.ts | 13 + .../catalog-manager/CatalogEntryForm.tsx | 392 + .../catalog-manager/CatalogManagerContent.tsx | 381 + .../catalog-manager/CatalogModuleTabs.tsx | 121 + .../catalog-manager/CatalogTable.tsx | 254 + .../components/common/ArchitectureView.tsx | 339 + .../components/common/Breadcrumbs.tsx | 73 + .../components/common/DataFlowDiagram.tsx | 510 ++ admin-lehrer/components/common/InfoBox.tsx | 72 + admin-lehrer/components/common/ModuleCard.tsx | 113 + .../components/common/PagePurpose.tsx | 169 + .../components/common/ServiceStatus.tsx | 203 + .../components/common/SkeletonText.tsx | 217 + .../companion/CompanionDashboard.tsx | 312 + .../components/companion/ModeToggle.tsx | 61 + .../companion/companion-mode/EventsCard.tsx | 173 + .../companion-mode/PhaseTimeline.tsx | 203 + .../companion/companion-mode/StatsGrid.tsx | 114 + .../companion-mode/SuggestionList.tsx | 170 + admin-lehrer/components/companion/index.ts | 24 + .../companion/lesson-mode/HomeworkSection.tsx | 153 + .../lesson-mode/LessonActiveView.tsx | 172 + .../companion/lesson-mode/LessonContainer.tsx | 80 + .../companion/lesson-mode/LessonEndedView.tsx | 209 + .../companion/lesson-mode/LessonStartForm.tsx | 269 + .../companion/lesson-mode/QuickActionsBar.tsx | 194 + .../lesson-mode/ReflectionSection.tsx | 146 + .../companion/lesson-mode/VisualPieTimer.tsx | 220 + .../companion/modals/FeedbackModal.tsx | 201 + .../companion/modals/OnboardingModal.tsx | 280 + .../companion/modals/SettingsModal.tsx | 248 + .../components/dashboard/NightModeWidget.tsx | 231 + .../components/developers/DevPortalLayout.tsx | 313 + .../components/developers/SDKDocsSidebar.tsx | 165 + .../components/education/DokumenteTab.tsx | 366 + .../components/education/PDFPreviewModal.tsx | 207 + .../infrastructure/DevOpsPipelineSidebar.tsx | 533 ++ admin-lehrer/components/layout/Header.tsx | 76 + .../components/layout/RoleIndicator.tsx | 107 + admin-lehrer/components/layout/Sidebar.tsx | 317 + .../components/ocr/BlockReviewPanel.tsx | 458 ++ .../components/ocr/CellCorrectionDialog.tsx | 294 + admin-lehrer/components/ocr/GridOverlay.tsx | 549 ++ .../components/ocr/GroundTruthPanel.tsx | 670 ++ .../ocr/__tests__/BlockReviewPanel.test.tsx | 390 + .../ocr/__tests__/GridOverlay.test.tsx | 267 + admin-lehrer/components/ocr/index.ts | 15 + .../components/wizard/ArchitectureContext.tsx | 100 + .../components/wizard/EducationCard.tsx | 28 + .../components/wizard/TestResultCard.tsx | 57 + admin-lehrer/components/wizard/TestRunner.tsx | 57 + .../components/wizard/TestSummary.tsx | 65 + .../components/wizard/WizardBanner.tsx | 31 + .../components/wizard/WizardNavigation.tsx | 53 + .../components/wizard/WizardProvider.tsx | 72 + .../components/wizard/WizardStepper.tsx | 43 + admin-lehrer/components/wizard/index.ts | 34 + admin-lehrer/components/wizard/types.ts | 104 + admin-lehrer/e2e/fixtures/sdk-fixtures.ts | 241 + admin-lehrer/e2e/specs/command-bar.spec.ts | 141 + admin-lehrer/e2e/specs/dsr.spec.ts | 373 + admin-lehrer/e2e/specs/export.spec.ts | 153 + admin-lehrer/e2e/specs/sdk-navigation.spec.ts | 132 + admin-lehrer/e2e/specs/sdk-workflow.spec.ts | 209 + admin-lehrer/e2e/utils/test-helpers.ts | 160 + admin-lehrer/hooks/companion/index.ts | 3 + .../hooks/companion/useCompanionData.ts | 156 + .../hooks/companion/useKeyboardShortcuts.ts | 113 + .../hooks/companion/useLessonSession.ts | 446 ++ admin-lehrer/lib/companion/constants.ts | 364 + admin-lehrer/lib/companion/index.ts | 2 + admin-lehrer/lib/companion/types.ts | 329 + admin-lehrer/lib/content-types.ts | 60 + admin-lehrer/lib/content.ts | 284 + .../lib/education/abitur-archiv-types.ts | 164 + .../lib/education/abitur-docs-types.ts | 84 + admin-lehrer/lib/module-registry.ts | 613 ++ admin-lehrer/lib/navigation.ts | 448 ++ admin-lehrer/lib/roles.ts | 85 + admin-lehrer/lib/sdk/__tests__/export.test.ts | 324 + admin-lehrer/lib/sdk/__tests__/types.test.ts | 250 + admin-lehrer/lib/sdk/api-client.ts | 471 ++ .../sdk/catalog-manager/catalog-registry.ts | 665 ++ admin-lehrer/lib/sdk/catalog-manager/types.ts | 118 + .../lib/sdk/compliance-scope-engine.ts | 1508 ++++ .../lib/sdk/compliance-scope-golden-tests.ts | 722 ++ .../lib/sdk/compliance-scope-profiling.ts | 821 ++ .../lib/sdk/compliance-scope-types.ts | 1355 ++++ admin-lehrer/lib/sdk/context.tsx | 121 + admin-lehrer/lib/sdk/demo-data/controls.ts | 210 + admin-lehrer/lib/sdk/demo-data/dsfa.ts | 224 + admin-lehrer/lib/sdk/demo-data/index.ts | 556 ++ admin-lehrer/lib/sdk/demo-data/risks.ts | 268 + admin-lehrer/lib/sdk/demo-data/toms.ts | 296 + admin-lehrer/lib/sdk/demo-data/use-cases.ts | 85 + admin-lehrer/lib/sdk/demo-data/vvt.ts | 316 + .../document-generator/datapoint-helpers.ts | 548 ++ .../lib/sdk/document-generator/index.ts | 8 + .../__tests__/constraint-enforcer.test.ts | 224 + .../__tests__/intent-classifier.test.ts | 153 + .../__tests__/state-projector.test.ts | 311 + .../drafting-engine/constraint-enforcer.ts | 221 + .../sdk/drafting-engine/intent-classifier.ts | 241 + .../prompts/ask-gap-analysis.ts | 49 + .../sdk/drafting-engine/prompts/draft-dsfa.ts | 91 + .../prompts/draft-loeschfristen.ts | 78 + .../prompts/draft-privacy-policy.ts | 102 + .../sdk/drafting-engine/prompts/draft-tom.ts | 99 + .../sdk/drafting-engine/prompts/draft-vvt.ts | 109 + .../lib/sdk/drafting-engine/prompts/index.ts | 11 + .../prompts/validate-cross-check.ts | 66 + .../sdk/drafting-engine/state-projector.ts | 337 + admin-lehrer/lib/sdk/drafting-engine/types.ts | 279 + .../drafting-engine/use-drafting-engine.ts | 343 + .../lib/sdk/dsfa/__tests__/api.test.ts | 355 + .../lib/sdk/dsfa/__tests__/types.test.ts | 255 + .../lib/sdk/dsfa/ai-mitigation-library.ts | 417 + admin-lehrer/lib/sdk/dsfa/ai-risk-catalog.ts | 375 + admin-lehrer/lib/sdk/dsfa/api.ts | 399 + .../lib/sdk/dsfa/eu-legal-frameworks.ts | 622 ++ .../lib/sdk/dsfa/gdpr-enforcement-cases.ts | 433 ++ admin-lehrer/lib/sdk/dsfa/index.ts | 10 + .../lib/sdk/dsfa/mitigation-library.ts | 694 ++ .../lib/sdk/dsfa/prohibited-ai-practices.ts | 386 + admin-lehrer/lib/sdk/dsfa/risk-catalog.ts | 615 ++ admin-lehrer/lib/sdk/dsfa/types.ts | 1066 +++ admin-lehrer/lib/sdk/dsr/api.ts | 881 +++ admin-lehrer/lib/sdk/dsr/index.ts | 6 + admin-lehrer/lib/sdk/dsr/types.ts | 581 ++ .../einwilligungen/catalog/data-points.yml | 1084 +++ .../lib/sdk/einwilligungen/catalog/loader.ts | 308 + .../lib/sdk/einwilligungen/context.tsx | 669 ++ .../lib/sdk/einwilligungen/export/docx.ts | 493 ++ .../lib/sdk/einwilligungen/export/index.ts | 8 + .../lib/sdk/einwilligungen/export/pdf.ts | 505 ++ .../einwilligungen/generator/cookie-banner.ts | 595 ++ .../generator/privacy-policy.ts | 965 +++ admin-lehrer/lib/sdk/einwilligungen/index.ts | 79 + admin-lehrer/lib/sdk/einwilligungen/types.ts | 838 ++ admin-lehrer/lib/sdk/export.ts | 753 ++ admin-lehrer/lib/sdk/index.ts | 10 + .../lib/sdk/loeschfristen-baseline-catalog.ts | 578 ++ .../lib/sdk/loeschfristen-compliance.ts | 325 + admin-lehrer/lib/sdk/loeschfristen-export.ts | 353 + .../lib/sdk/loeschfristen-profiling.ts | 538 ++ admin-lehrer/lib/sdk/loeschfristen-types.ts | 346 + admin-lehrer/lib/sdk/sdk-client.ts | 327 + admin-lehrer/lib/sdk/sync.ts | 482 ++ .../sdk/tom-generator/ai/document-analyzer.ts | 414 + .../lib/sdk/tom-generator/ai/prompts.ts | 427 ++ .../lib/sdk/tom-generator/context.tsx | 710 ++ .../sdk/tom-generator/controls/controls.yml | 1848 +++++ .../lib/sdk/tom-generator/controls/loader.ts | 2521 ++++++ .../lib/sdk/tom-generator/demo-data/index.ts | 518 ++ .../lib/sdk/tom-generator/evidence-store.ts | 67 + .../lib/sdk/tom-generator/export/docx.ts | 525 ++ .../lib/sdk/tom-generator/export/pdf.ts | 517 ++ .../lib/sdk/tom-generator/export/zip.ts | 544 ++ admin-lehrer/lib/sdk/tom-generator/index.ts | 206 + .../lib/sdk/tom-generator/rules-engine.ts | 560 ++ .../lib/sdk/tom-generator/sdm-mapping.ts | 192 + admin-lehrer/lib/sdk/tom-generator/types.ts | 963 +++ admin-lehrer/lib/sdk/types.ts | 2108 +++++ .../sdk/vendor-compliance/catalog/index.ts | 9 + .../vendor-compliance/catalog/legal-basis.ts | 562 ++ .../catalog/processing-activities.ts | 813 ++ .../catalog/vendor-templates.ts | 564 ++ .../lib/sdk/vendor-compliance/context.tsx | 1010 +++ .../contract-review/analyzer.ts | 459 ++ .../contract-review/checklists.ts | 508 ++ .../contract-review/findings.ts | 573 ++ .../contract-review/index.ts | 7 + .../lib/sdk/vendor-compliance/export/index.ts | 72 + .../vendor-compliance/export/ropa-export.ts | 356 + .../export/vendor-audit-pack.ts | 489 ++ .../vendor-compliance/export/vvt-export.ts | 444 ++ .../lib/sdk/vendor-compliance/index.ts | 196 + .../sdk/vendor-compliance/risk/calculator.ts | 488 ++ .../risk/controls-library.ts | 943 +++ .../lib/sdk/vendor-compliance/risk/index.ts | 6 + .../lib/sdk/vendor-compliance/types.ts | 1217 +++ admin-lehrer/lib/sdk/vvt-baseline-catalog.ts | 630 ++ admin-lehrer/lib/sdk/vvt-profiling.ts | 492 ++ admin-lehrer/lib/sdk/vvt-types.ts | 247 + admin-lehrer/lib/utils.ts | 7 + admin-lehrer/next-env.d.ts | 6 + admin-lehrer/next.config.js | 33 + admin-lehrer/package-lock.json | 5725 ++++++++++++++ admin-lehrer/package.json | 49 + admin-lehrer/playwright.config.ts | 93 + admin-lehrer/postcss.config.mjs | 9 + admin-lehrer/public/.gitkeep | 1 + admin-lehrer/tailwind.config.ts | 108 + admin-lehrer/tsconfig.json | 42 + admin-lehrer/types/ai-modules.ts | 359 + admin-lehrer/types/infrastructure-modules.ts | 396 + admin-lehrer/vitest.config.ts | 30 + admin-lehrer/vitest.setup.ts | 48 + agent-core/README.md | 416 + agent-core/__init__.py | 24 + agent-core/brain/__init__.py | 22 + agent-core/brain/context_manager.py | 520 ++ agent-core/brain/knowledge_graph.py | 563 ++ agent-core/brain/memory_store.py | 568 ++ agent-core/orchestrator/__init__.py | 36 + agent-core/orchestrator/message_bus.py | 479 ++ agent-core/orchestrator/supervisor.py | 553 ++ agent-core/orchestrator/task_router.py | 436 ++ agent-core/pytest.ini | 10 + agent-core/requirements.txt | 19 + agent-core/sessions/__init__.py | 25 + agent-core/sessions/checkpoint.py | 362 + agent-core/sessions/heartbeat.py | 361 + agent-core/sessions/session_manager.py | 540 ++ agent-core/soul/alert-agent.soul.md | 120 + agent-core/soul/compliance-advisor.soul.md | 66 + agent-core/soul/drafting-agent.soul.md | 95 + agent-core/soul/grader-agent.soul.md | 76 + agent-core/soul/orchestrator.soul.md | 150 + agent-core/soul/quality-judge.soul.md | 106 + agent-core/soul/tutor-agent.soul.md | 62 + agent-core/tests/__init__.py | 3 + agent-core/tests/conftest.py | 57 + agent-core/tests/test_heartbeat.py | 201 + agent-core/tests/test_memory_store.py | 207 + agent-core/tests/test_message_bus.py | 224 + agent-core/tests/test_session_manager.py | 270 + agent-core/tests/test_task_router.py | 203 + backend-lehrer/.dockerignore | 17 + backend-lehrer/Dockerfile | 68 + backend-lehrer/abitur_docs_api.py | 956 +++ backend-lehrer/ai_processing/__init__.py | 126 + backend-lehrer/ai_processing/analysis.py | 209 + .../ai_processing/cloze_generator.py | 328 + backend-lehrer/ai_processing/core.py | 71 + .../ai_processing/html_generator.py | 211 + .../ai_processing/image_processor.py | 78 + backend-lehrer/ai_processing/leitner.py | 155 + backend-lehrer/ai_processing/mc_generator.py | 316 + backend-lehrer/ai_processing/mindmap.py | 472 ++ .../ai_processing/print_generator.py | 824 ++ backend-lehrer/ai_processing/qa_generator.py | 333 + backend-lehrer/ai_processor.py | 81 + backend-lehrer/ai_processor/__init__.py | 106 + backend-lehrer/ai_processor/config.py | 43 + .../ai_processor/export/__init__.py | 19 + .../ai_processor/export/print_versions.py | 508 ++ .../ai_processor/export/worksheet.py | 286 + .../ai_processor/generators/__init__.py | 21 + .../ai_processor/generators/cloze.py | 312 + .../generators/multiple_choice.py | 291 + backend-lehrer/ai_processor/generators/qa.py | 458 ++ backend-lehrer/ai_processor/utils.py | 83 + .../ai_processor/vision/__init__.py | 19 + .../ai_processor/vision/html_builder.py | 218 + .../ai_processor/vision/scan_analyzer.py | 307 + .../ai_processor/visualization/__init__.py | 17 + .../ai_processor/visualization/mindmap.py | 471 ++ backend-lehrer/alerts_agent/__init__.py | 14 + .../alerts_agent/actions/__init__.py | 20 + backend-lehrer/alerts_agent/actions/base.py | 123 + .../alerts_agent/actions/dispatcher.py | 232 + .../alerts_agent/actions/email_action.py | 251 + .../alerts_agent/actions/slack_action.py | 198 + .../alerts_agent/actions/webhook_action.py | 135 + backend-lehrer/alerts_agent/api/__init__.py | 17 + backend-lehrer/alerts_agent/api/digests.py | 551 ++ backend-lehrer/alerts_agent/api/routes.py | 510 ++ backend-lehrer/alerts_agent/api/rules.py | 473 ++ .../alerts_agent/api/subscriptions.py | 421 + backend-lehrer/alerts_agent/api/templates.py | 410 + backend-lehrer/alerts_agent/api/topics.py | 405 + backend-lehrer/alerts_agent/api/wizard.py | 554 ++ backend-lehrer/alerts_agent/data/__init__.py | 8 + backend-lehrer/alerts_agent/data/templates.py | 492 ++ backend-lehrer/alerts_agent/db/__init__.py | 34 + backend-lehrer/alerts_agent/db/database.py | 19 + backend-lehrer/alerts_agent/db/models.py | 636 ++ backend-lehrer/alerts_agent/db/repository.py | 992 +++ .../alerts_agent/ingestion/__init__.py | 8 + .../alerts_agent/ingestion/email_parser.py | 356 + .../alerts_agent/ingestion/rss_fetcher.py | 383 + .../alerts_agent/ingestion/scheduler.py | 279 + .../alerts_agent/models/__init__.py | 12 + .../alerts_agent/models/alert_item.py | 174 + .../alerts_agent/models/relevance_profile.py | 288 + .../alerts_agent/processing/__init__.py | 12 + .../alerts_agent/processing/dedup.py | 239 + .../processing/digest_generator.py | 458 ++ .../alerts_agent/processing/importance.py | 341 + .../processing/relevance_scorer.py | 390 + .../alerts_agent/processing/rule_engine.py | 512 ++ backend-lehrer/auth/__init__.py | 55 + backend-lehrer/auth/keycloak_auth.py | 515 ++ backend-lehrer/certificates_api.py | 636 ++ backend-lehrer/classroom/__init__.py | 110 + backend-lehrer/classroom/models.py | 568 ++ backend-lehrer/classroom/routes/__init__.py | 29 + backend-lehrer/classroom/routes/analytics.py | 369 + backend-lehrer/classroom/routes/context.py | 726 ++ backend-lehrer/classroom/routes/export.py | 358 + backend-lehrer/classroom/routes/feedback.py | 280 + backend-lehrer/classroom/routes/homework.py | 284 + backend-lehrer/classroom/routes/materials.py | 329 + backend-lehrer/classroom/routes/sessions.py | 525 ++ backend-lehrer/classroom/routes/settings.py | 184 + backend-lehrer/classroom/routes/templates.py | 382 + .../classroom/routes/websocket_routes.py | 143 + backend-lehrer/classroom/services/__init__.py | 23 + .../classroom/services/persistence.py | 131 + backend-lehrer/classroom/websocket_manager.py | 204 + backend-lehrer/classroom_api.py | 84 + backend-lehrer/classroom_engine/__init__.py | 91 + backend-lehrer/classroom_engine/analytics.py | 520 ++ .../classroom_engine/antizipation.py | 676 ++ .../classroom_engine/context_models.py | 291 + backend-lehrer/classroom_engine/database.py | 49 + backend-lehrer/classroom_engine/db_models.py | 429 ++ backend-lehrer/classroom_engine/fsm.py | 222 + backend-lehrer/classroom_engine/models.py | 407 + backend-lehrer/classroom_engine/repository.py | 1705 +++++ .../classroom_engine/suggestions.py | 668 ++ backend-lehrer/classroom_engine/timer.py | 272 + backend-lehrer/claude_vision.py | 299 + backend-lehrer/config.py | 18 + backend-lehrer/content_generators/__init__.py | 34 + .../content_generators/h5p_generator.py | 429 ++ .../content_generators/pdf_generator.py | 529 ++ backend-lehrer/correction_api.py | 683 ++ backend-lehrer/email_service.py | 395 + backend-lehrer/game/__init__.py | 63 + backend-lehrer/game/database.py | 785 ++ backend-lehrer/game/learning_rules.py | 439 ++ backend-lehrer/game/quiz_generator.py | 439 ++ backend-lehrer/game_api.py | 1129 +++ backend-lehrer/generators/__init__.py | 14 + backend-lehrer/generators/cloze_generator.py | 380 + backend-lehrer/generators/mc_generator.py | 277 + .../generators/mindmap_generator.py | 380 + backend-lehrer/generators/quiz_generator.py | 594 ++ backend-lehrer/infra/__init__.py | 10 + backend-lehrer/infra/vast_client.py | 419 + backend-lehrer/infra/vast_power.py | 618 ++ backend-lehrer/jitsi_api.py | 199 + backend-lehrer/klausur_service_proxy.py | 135 + backend-lehrer/learning_units.py | 178 + backend-lehrer/learning_units_api.py | 197 + backend-lehrer/letters_api.py | 641 ++ backend-lehrer/llm_gateway/__init__.py | 8 + backend-lehrer/llm_gateway/config.py | 122 + backend-lehrer/llm_gateway/main.py | 85 + .../llm_gateway/middleware/__init__.py | 7 + backend-lehrer/llm_gateway/middleware/auth.py | 96 + backend-lehrer/llm_gateway/models/__init__.py | 31 + backend-lehrer/llm_gateway/models/chat.py | 135 + backend-lehrer/llm_gateway/routes/__init__.py | 21 + backend-lehrer/llm_gateway/routes/chat.py | 112 + .../llm_gateway/routes/communication.py | 403 + .../llm_gateway/routes/comparison.py | 584 ++ .../llm_gateway/routes/edu_search_seeds.py | 710 ++ backend-lehrer/llm_gateway/routes/health.py | 127 + .../llm_gateway/routes/legal_crawler.py | 173 + .../llm_gateway/routes/playbooks.py | 96 + backend-lehrer/llm_gateway/routes/schools.py | 867 +++ backend-lehrer/llm_gateway/routes/tools.py | 174 + .../llm_gateway/services/__init__.py | 21 + .../services/communication_service.py | 614 ++ .../llm_gateway/services/inference.py | 522 ++ .../llm_gateway/services/legal_crawler.py | 290 + .../llm_gateway/services/pii_detector.py | 249 + .../llm_gateway/services/playbook_service.py | 322 + .../llm_gateway/services/tool_gateway.py | 285 + backend-lehrer/main.py | 212 + backend-lehrer/meetings_api.py | 443 ++ backend-lehrer/messenger_api.py | 840 ++ backend-lehrer/middleware/__init__.py | 26 + backend-lehrer/middleware/input_gate.py | 260 + backend-lehrer/middleware/pii_redactor.py | 316 + backend-lehrer/middleware/rate_limiter.py | 363 + backend-lehrer/middleware/request_id.py | 138 + backend-lehrer/middleware/security_headers.py | 202 + backend-lehrer/recording_api.py | 848 ++ backend-lehrer/requirements.txt | 66 + backend-lehrer/school_api.py | 250 + backend-lehrer/services/__init__.py | 22 + backend-lehrer/services/file_processor.py | 563 ++ backend-lehrer/services/pdf_service.py | 916 +++ backend-lehrer/state_engine/__init__.py | 43 + backend-lehrer/state_engine/engine.py | 367 + backend-lehrer/state_engine/models.py | 317 + backend-lehrer/state_engine/rules.py | 484 ++ backend-lehrer/state_engine_api.py | 583 ++ backend-lehrer/teacher_dashboard_api.py | 951 +++ backend-lehrer/unit_analytics_api.py | 751 ++ backend-lehrer/unit_api.py | 1226 +++ backend-lehrer/worksheets_api.py | 592 ++ breakpilot-drive/Dockerfile | 24 + breakpilot-drive/PREFAB_CONFIG.md | 377 + breakpilot-drive/README.md | 213 + breakpilot-drive/TemplateData/.gitkeep | 2 + breakpilot-drive/ThirdPartyNotices.md | 137 + breakpilot-drive/UNITY_SETUP.md | 278 + .../UnityScripts/BreakpilotAPI.cs | 599 ++ .../UnityScripts/Core/AchievementManager.cs | 348 + .../UnityScripts/Core/AudioManager.cs | 290 + .../UnityScripts/Core/AuthManager.cs | 247 + .../UnityScripts/Core/DifficultyManager.cs | 292 + .../UnityScripts/Core/GameManager.cs | 317 + .../UnityScripts/Player/PlayerController.cs | 373 + .../Plugins/WebGL/AuthPlugin.jslib | 54 + .../UnityScripts/Plugins/WebSpeech.jslib | 98 + breakpilot-drive/UnityScripts/QuizManager.cs | 318 + .../UnityScripts/Track/ObstacleSpawner.cs | 248 + .../UnityScripts/Track/TrackGenerator.cs | 233 + .../UnityScripts/Track/VisualTrigger.cs | 57 + breakpilot-drive/UnityScripts/UI/GameHUD.cs | 144 + breakpilot-drive/UnityScripts/UI/MainMenu.cs | 180 + .../UnityScripts/UI/QuizOverlay.cs | 340 + .../WebGLTemplate/Breakpilot/index.html | 298 + breakpilot-drive/index.html | 239 + breakpilot-drive/nginx.conf | 76 + docker-compose.yml | 455 ++ geo-service/.env.example | 81 + geo-service/Dockerfile | 69 + geo-service/STATUS.md | 196 + geo-service/api/__init__.py | 9 + geo-service/api/aoi.py | 304 + geo-service/api/learning.py | 289 + geo-service/api/terrain.py | 230 + geo-service/api/tiles.py | 221 + geo-service/config.py | 99 + geo-service/main.py | 192 + geo-service/models/__init__.py | 19 + geo-service/models/aoi.py | 162 + geo-service/models/attribution.py | 97 + geo-service/models/learning_node.py | 120 + geo-service/requirements.txt | 45 + geo-service/scripts/download_dem.sh | 198 + geo-service/scripts/download_osm.sh | 113 + geo-service/scripts/generate_tiles.sh | 184 + geo-service/scripts/import_osm.sh | 236 + geo-service/services/__init__.py | 16 + geo-service/services/aoi_packager.py | 420 + geo-service/services/dem_service.py | 338 + geo-service/services/learning_generator.py | 355 + geo-service/services/osm_extractor.py | 217 + geo-service/services/tile_server.py | 186 + geo-service/tests/__init__.py | 3 + geo-service/tests/test_aoi.py | 271 + geo-service/tests/test_learning.py | 194 + geo-service/tests/test_tiles.py | 283 + geo-service/utils/__init__.py | 20 + geo-service/utils/geo_utils.py | 262 + geo-service/utils/license_checker.py | 223 + geo-service/utils/minio_client.py | 237 + klausur-service/Dockerfile | 45 + klausur-service/backend/admin_api.py | 1012 +++ klausur-service/backend/config.py | 62 + klausur-service/backend/country_metadata.py | 204 + klausur-service/backend/cv_vocab_pipeline.py | 1140 +++ .../backend/dsfa_corpus_ingestion.py | 1828 +++++ klausur-service/backend/dsfa_rag_api.py | 715 ++ klausur-service/backend/eh_pipeline.py | 420 + klausur-service/backend/eh_templates.py | 658 ++ klausur-service/backend/embedding_client.py | 314 + .../backend/full_compliance_pipeline.py | 723 ++ klausur-service/backend/full_reingestion.py | 116 + klausur-service/backend/github_crawler.py | 767 ++ klausur-service/backend/hybrid_search.py | 285 + .../backend/hybrid_vocab_extractor.py | 664 ++ klausur-service/backend/hyde.py | 209 + klausur-service/backend/legal_corpus_api.py | 790 ++ .../backend/legal_corpus_ingestion.py | 1280 ++++ .../backend/legal_corpus_robust.py | 455 ++ .../backend/legal_templates_ingestion.py | 942 +++ klausur-service/backend/mail/__init__.py | 106 + klausur-service/backend/mail/aggregator.py | 541 ++ klausur-service/backend/mail/ai_service.py | 747 ++ klausur-service/backend/mail/api.py | 651 ++ klausur-service/backend/mail/credentials.py | 373 + klausur-service/backend/mail/mail_db.py | 987 +++ klausur-service/backend/mail/models.py | 455 ++ klausur-service/backend/mail/task_service.py | 421 + klausur-service/backend/main.py | 190 + klausur-service/backend/metrics_db.py | 833 ++ klausur-service/backend/migrate_rag_chunks.py | 307 + klausur-service/backend/minio_storage.py | 360 + klausur-service/backend/models/__init__.py | 74 + klausur-service/backend/models/eh.py | 197 + klausur-service/backend/models/enums.py | 33 + klausur-service/backend/models/exam.py | 68 + klausur-service/backend/models/grading.py | 71 + klausur-service/backend/models/requests.py | 152 + klausur-service/backend/nibis_ingestion.py | 516 ++ .../backend/nru_worksheet_generator.py | 557 ++ klausur-service/backend/ocr_labeling_api.py | 845 ++ klausur-service/backend/pdf_export.py | 677 ++ klausur-service/backend/pdf_extraction.py | 164 + .../backend/pipeline_checkpoints.py | 276 + .../backend/policies/bundeslaender.json | 753 ++ klausur-service/backend/pyproject.toml | 25 + klausur-service/backend/qdrant_service.py | 638 ++ klausur-service/backend/rag_evaluation.py | 393 + klausur-service/backend/rbac.py | 1132 +++ klausur-service/backend/requirements.txt | 40 + klausur-service/backend/reranker.py | 148 + klausur-service/backend/routes/__init__.py | 35 + klausur-service/backend/routes/archiv.py | 490 ++ klausur-service/backend/routes/eh.py | 1111 +++ klausur-service/backend/routes/exams.py | 109 + klausur-service/backend/routes/fairness.py | 248 + klausur-service/backend/routes/grading.py | 439 ++ klausur-service/backend/routes/students.py | 131 + klausur-service/backend/self_rag.py | 529 ++ klausur-service/backend/services/__init__.py | 80 + .../backend/services/auth_service.py | 46 + .../backend/services/donut_ocr_service.py | 254 + .../backend/services/eh_service.py | 97 + .../backend/services/grading_service.py | 43 + .../services/grid_detection_service.py | 509 ++ .../backend/services/handwriting_detection.py | 359 + .../backend/services/inpainting_service.py | 383 + .../services/layout_reconstruction_service.py | 375 + .../backend/services/trocr_service.py | 586 ++ klausur-service/backend/storage.py | 61 + klausur-service/backend/template_sources.py | 459 ++ .../backend/tesseract_vocab_extractor.py | 346 + klausur-service/backend/tests/__init__.py | 1 + klausur-service/backend/tests/conftest.py | 14 + .../backend/tests/test_advanced_rag.py | 769 ++ klausur-service/backend/tests/test_byoeh.py | 937 +++ .../backend/tests/test_cv_vocab_pipeline.py | 569 ++ .../backend/tests/test_grid_detection.py | 385 + .../backend/tests/test_legal_templates.py | 623 ++ .../backend/tests/test_mail_service.py | 349 + .../backend/tests/test_ocr_labeling.py | 799 ++ .../backend/tests/test_rag_admin.py | 356 + klausur-service/backend/tests/test_rbac.py | 1236 +++ .../backend/tests/test_vocab_worksheet.py | 623 ++ .../backend/tests/test_worksheet_editor.py | 539 ++ klausur-service/backend/training_api.py | 625 ++ .../backend/training_export_service.py | 448 ++ klausur-service/backend/trocr_api.py | 261 + klausur-service/backend/upload_api.py | 602 ++ .../backend/vocab_session_store.py | 428 ++ .../backend/vocab_worksheet_api.py | 2268 ++++++ .../backend/worksheet_cleanup_api.py | 491 ++ .../backend/worksheet_editor_api.py | 1305 ++++ klausur-service/backend/zeugnis_api.py | 537 ++ klausur-service/backend/zeugnis_crawler.py | 676 ++ klausur-service/backend/zeugnis_models.py | 340 + klausur-service/backend/zeugnis_seed_data.py | 415 + klausur-service/docs/BYOEH-Architecture.md | 468 ++ klausur-service/docs/BYOEH-Developer-Guide.md | 481 ++ .../docs/DSGVO-Audit-OCR-Labeling.md | 788 ++ .../docs/NiBiS-Ingestion-Pipeline.md | 227 + klausur-service/docs/OCR-Labeling-Spec.md | 446 ++ klausur-service/docs/RAG-Admin-Spec.md | 472 ++ .../docs/Vocab-Worksheet-Architecture.md | 293 + .../docs/Vocab-Worksheet-Developer-Guide.md | 425 ++ .../docs/Worksheet-Editor-Architecture.md | 410 + .../docs/Worksheet-Editor-Developer-Guide.md | 480 ++ .../docs/legal_corpus/AT_ABGB_AGB.txt | 58 + .../docs/legal_corpus/AT_UGB_RET.txt | 71 + .../docs/legal_corpus/CH_OR_AGB.txt | 92 + .../docs/legal_corpus/DE_AO_RET.txt | 94 + .../docs/legal_corpus/DE_BGB_AGB.txt | 167 + .../docs/legal_corpus/DE_EGBGB.txt | 74 + .../docs/legal_corpus/DE_HGB_RET.txt | 55 + .../docs/legal_corpus/DE_USTG_RET.txt | 27 + .../docs/legal_corpus/EPRIVACY.txt | 604 ++ klausur-service/frontend/index.html | 13 + klausur-service/frontend/package-lock.json | 1774 +++++ klausur-service/frontend/package.json | 23 + klausur-service/frontend/src/App.tsx | 23 + .../src/components/EHUploadWizard.tsx | 591 ++ .../frontend/src/components/Layout.tsx | 38 + .../src/components/RAGSearchPanel.tsx | 255 + .../frontend/src/hooks/useKlausur.tsx | 175 + klausur-service/frontend/src/main.tsx | 19 + .../frontend/src/pages/KorrekturPage.tsx | 956 +++ .../frontend/src/pages/OnboardingPage.tsx | 247 + klausur-service/frontend/src/services/api.ts | 620 ++ .../frontend/src/services/encryption.ts | 298 + .../frontend/src/styles/eh-wizard.css | 468 ++ .../frontend/src/styles/global.css | 924 +++ .../frontend/src/styles/rag-search.css | 407 + klausur-service/frontend/tsconfig.json | 21 + klausur-service/frontend/tsconfig.node.json | 10 + klausur-service/frontend/vite.config.ts | 19 + .../scripts/run_nibis_ingestion.sh | 85 + school-service/Dockerfile | 54 + school-service/cmd/seed/main.go | 92 + school-service/cmd/server/main.go | 133 + school-service/go.mod | 54 + school-service/go.sum | 112 + school-service/internal/config/config.go | 103 + school-service/internal/database/database.go | 225 + .../internal/handlers/certificate_handlers.go | 199 + .../internal/handlers/class_handlers.go | 242 + .../internal/handlers/exam_handlers.go | 208 + .../internal/handlers/grade_handlers.go | 216 + .../internal/handlers/gradebook_handlers.go | 209 + school-service/internal/handlers/handlers.go | 66 + .../internal/middleware/middleware.go | 166 + school-service/internal/models/models.go | 329 + school-service/internal/seed/seed_data.go | 591 ++ .../internal/services/ai_service.go | 218 + .../internal/services/ai_service_test.go | 540 ++ .../internal/services/certificate_service.go | 251 + .../services/certificate_service_test.go | 563 ++ .../internal/services/class_service.go | 236 + .../internal/services/class_service_test.go | 439 ++ .../internal/services/exam_service.go | 248 + .../internal/services/exam_service_test.go | 451 ++ .../internal/services/grade_service.go | 646 ++ .../internal/services/grade_service_test.go | 487 ++ .../internal/services/gradebook_service.go | 261 + .../services/gradebook_service_test.go | 465 ++ school-service/templates/.gitkeep | 0 .../templates/certificates/generic/.gitkeep | 0 scripts/wait-for-core.sh | 23 + studio-v2/.dockerignore | 5 + studio-v2/.git-hooks/pre-push | 55 + studio-v2/.git-hooks/setup.sh | 21 + studio-v2/Dockerfile | 49 + studio-v2/app/agb/page.tsx | 112 + studio-v2/app/alerts-b2b/page.tsx | 1019 +++ studio-v2/app/alerts/page.tsx | 466 ++ studio-v2/app/api/companion/feedback/route.ts | 129 + studio-v2/app/api/companion/lesson/route.ts | 194 + studio-v2/app/api/companion/settings/route.ts | 137 + studio-v2/app/api/meetings/[...path]/route.ts | 96 + .../app/api/recordings/[...path]/route.ts | 106 + studio-v2/app/api/recordings/route.ts | 34 + studio-v2/app/api/uploads/route.ts | 115 + studio-v2/app/companion/page.tsx | 51 + studio-v2/app/dashboard-experimental/page.tsx | 739 ++ studio-v2/app/datenschutz/page.tsx | 116 + studio-v2/app/geo-lernwelt/page.tsx | 501 ++ studio-v2/app/geo-lernwelt/types.ts | 282 + studio-v2/app/globals.css | 37 + studio-v2/app/impressum/page.tsx | 109 + studio-v2/app/kontakt/page.tsx | 165 + .../[klausurId]/[studentId]/page.tsx | 492 ++ .../korrektur/[klausurId]/fairness/page.tsx | 569 ++ studio-v2/app/korrektur/[klausurId]/page.tsx | 578 ++ studio-v2/app/korrektur/archiv/page.tsx | 1001 +++ studio-v2/app/korrektur/page.tsx | 914 +++ studio-v2/app/korrektur/types.ts | 257 + studio-v2/app/layout.tsx | 39 + studio-v2/app/magic-help/layout.tsx | 9 + studio-v2/app/magic-help/page.tsx | 266 + studio-v2/app/meet/page.tsx | 1481 ++++ studio-v2/app/messages/page.tsx | 1166 +++ studio-v2/app/page-original.tsx | 934 +++ studio-v2/app/page.tsx | 946 +++ studio-v2/app/upload/[sessionId]/page.tsx | 235 + studio-v2/app/vocab-worksheet/page.tsx | 2047 +++++ studio-v2/app/voice-test/page.tsx | 235 + studio-v2/app/worksheet-cleanup/page.tsx | 899 +++ studio-v2/app/worksheet-editor/page.tsx | 492 ++ studio-v2/app/worksheet-editor/types.ts | 237 + studio-v2/components/AiPrompt.tsx | 261 + studio-v2/components/AlertsWizard.tsx | 552 ++ studio-v2/components/B2BMigrationWizard.tsx | 848 ++ studio-v2/components/ChatOverlay.tsx | 413 + studio-v2/components/CityMap.tsx | 266 + studio-v2/components/CityMapLeaflet.tsx | 77 + studio-v2/components/DocumentSpace.tsx | 405 + studio-v2/components/DocumentUpload.tsx | 363 + studio-v2/components/Footer.tsx | 90 + studio-v2/components/GermanyMap.tsx | 214 + studio-v2/components/InfoBox.tsx | 212 + studio-v2/components/LanguageDropdown.tsx | 113 + studio-v2/components/Layout.tsx | 193 + studio-v2/components/Logo.tsx | 288 + studio-v2/components/OnboardingWizard.tsx | 513 ++ studio-v2/components/QRCodeUpload.tsx | 334 + studio-v2/components/SchoolSearch.tsx | 339 + studio-v2/components/Sidebar.tsx | 237 + studio-v2/components/ThemeToggle.tsx | 46 + studio-v2/components/UserMenu.tsx | 163 + .../companion/CompanionDashboard.tsx | 222 + .../companion/lesson-mode/HomeworkSection.tsx | 153 + .../lesson-mode/LessonActiveView.tsx | 172 + .../companion/lesson-mode/LessonEndedView.tsx | 209 + .../companion/lesson-mode/LessonStartForm.tsx | 269 + .../companion/lesson-mode/PhaseTimeline.tsx | 128 + .../companion/lesson-mode/QuickActionsBar.tsx | 194 + .../lesson-mode/ReflectionSection.tsx | 146 + .../companion/lesson-mode/VisualPieTimer.tsx | 220 + .../companion/modals/FeedbackModal.tsx | 201 + .../companion/modals/OnboardingModal.tsx | 280 + .../companion/modals/SettingsModal.tsx | 248 + .../components/geo-lernwelt/AOISelector.tsx | 438 ++ .../components/geo-lernwelt/UnityViewer.tsx | 329 + studio-v2/components/geo-lernwelt/index.ts | 7 + .../components/korrektur/AnnotationLayer.tsx | 310 + .../korrektur/AnnotationToolbar.tsx | 159 + .../components/korrektur/CriteriaPanel.tsx | 258 + .../components/korrektur/DocumentViewer.tsx | 221 + .../korrektur/EHSuggestionPanel.tsx | 293 + .../components/korrektur/GutachtenEditor.tsx | 194 + studio-v2/components/korrektur/index.ts | 6 + .../components/spatial-ui/FloatingMessage.tsx | 496 ++ .../components/spatial-ui/SpatialCard.tsx | 314 + studio-v2/components/spatial-ui/index.ts | 13 + studio-v2/components/voice/VoiceCapture.tsx | 244 + .../components/voice/VoiceCommandBar.tsx | 337 + studio-v2/components/voice/VoiceIndicator.tsx | 90 + studio-v2/components/voice/index.ts | 6 + .../worksheet-editor/AIImageGenerator.tsx | 296 + .../worksheet-editor/AIPromptBar.tsx | 257 + .../worksheet-editor/CanvasControls.tsx | 136 + .../worksheet-editor/CleanupPanel.tsx | 765 ++ .../worksheet-editor/DocumentImporter.tsx | 363 + .../worksheet-editor/EditorToolbar.tsx | 330 + .../worksheet-editor/ExportPanel.tsx | 216 + .../worksheet-editor/FabricCanvas.tsx | 434 ++ .../worksheet-editor/OCRImportPanel.tsx | 471 ++ .../worksheet-editor/PageNavigator.tsx | 126 + .../worksheet-editor/PropertiesPanel.tsx | 443 ++ .../components/worksheet-editor/index.ts | 16 + studio-v2/dev-server.sh | 14 + studio-v2/e2e/korrektur-archiv.spec.ts | 391 + studio-v2/e2e/korrektur.spec.ts | 230 + studio-v2/hooks/companion/index.ts | 2 + .../hooks/companion/useKeyboardShortcuts.ts | 113 + studio-v2/hooks/companion/useLessonSession.ts | 441 ++ studio-v2/lib/ActivityContext.tsx | 361 + studio-v2/lib/AlertsB2BContext.tsx | 1165 +++ studio-v2/lib/AlertsContext.tsx | 334 + studio-v2/lib/LanguageContext.tsx | 90 + studio-v2/lib/MessagesContext.tsx | 925 +++ studio-v2/lib/ThemeContext.tsx | 71 + studio-v2/lib/companion/constants.ts | 364 + studio-v2/lib/companion/index.ts | 2 + studio-v2/lib/companion/types.ts | 329 + studio-v2/lib/geo-lernwelt/GeoContext.tsx | 276 + studio-v2/lib/geo-lernwelt/index.ts | 29 + studio-v2/lib/geo-lernwelt/mapStyles.ts | 369 + studio-v2/lib/geo-lernwelt/unityBridge.ts | 359 + studio-v2/lib/i18n.ts | 399 + studio-v2/lib/korrektur/api.ts | 506 ++ studio-v2/lib/korrektur/index.ts | 1 + studio-v2/lib/spatial-ui/FocusContext.tsx | 188 + .../lib/spatial-ui/PerformanceContext.tsx | 374 + studio-v2/lib/spatial-ui/depth-system.ts | 335 + studio-v2/lib/spatial-ui/index.ts | 16 + studio-v2/lib/voice/index.ts | 13 + studio-v2/lib/voice/voice-api.ts | 400 + studio-v2/lib/voice/voice-encryption.ts | 334 + .../lib/worksheet-editor/WorksheetContext.tsx | 419 + .../lib/worksheet-editor/cleanup-service.ts | 272 + studio-v2/lib/worksheet-editor/index.ts | 13 + .../worksheet-editor/ocr-integration.test.ts | 466 ++ .../lib/worksheet-editor/ocr-integration.ts | 288 + studio-v2/next-env.d.ts | 6 + studio-v2/next.config.js | 9 + studio-v2/package-lock.json | 4102 ++++++++++ studio-v2/package.json | 37 + studio-v2/playwright.config.ts | 60 + studio-v2/postcss.config.js | 6 + studio-v2/public/.gitkeep | 0 studio-v2/tailwind.config.js | 40 + studio-v2/tsconfig.json | 41 + voice-service/.env.example | 59 + voice-service/Dockerfile | 59 + voice-service/api/__init__.py | 12 + voice-service/api/bqas.py | 365 + voice-service/api/sessions.py | 220 + voice-service/api/streaming.py | 325 + voice-service/api/tasks.py | 262 + voice-service/bqas/__init__.py | 49 + voice-service/bqas/backlog_generator.py | 324 + voice-service/bqas/config.py | 77 + voice-service/bqas/judge.py | 271 + voice-service/bqas/metrics.py | 208 + voice-service/bqas/notifier.py | 299 + voice-service/bqas/prompts.py | 323 + voice-service/bqas/quality_judge_agent.py | 380 + voice-service/bqas/rag_judge.py | 618 ++ voice-service/bqas/regression_tracker.py | 340 + voice-service/bqas/runner.py | 529 ++ voice-service/bqas/synthetic_generator.py | 301 + voice-service/config.py | 117 + voice-service/main.py | 225 + voice-service/models/__init__.py | 40 + voice-service/models/audit.py | 149 + voice-service/models/session.py | 152 + voice-service/models/task.py | 217 + voice-service/personas/lehrer_persona.json | 127 + voice-service/pyproject.toml | 25 + voice-service/requirements.txt | 43 + .../scripts/com.breakpilot.bqas.plist | 77 + .../scripts/install_bqas_scheduler.sh | 318 + voice-service/scripts/post-commit.hook | 53 + voice-service/scripts/run_bqas.py | 286 + voice-service/scripts/run_bqas.sh | 270 + voice-service/services/__init__.py | 18 + voice-service/services/audio_processor.py | 303 + voice-service/services/encryption_service.py | 231 + .../services/enhanced_task_orchestrator.py | 519 ++ voice-service/services/fallback_llm_client.py | 248 + voice-service/services/intent_router.py | 368 + voice-service/services/personaplex_client.py | 286 + voice-service/services/task_orchestrator.py | 382 + voice-service/tests/__init__.py | 3 + voice-service/tests/bqas/__init__.py | 4 + voice-service/tests/bqas/conftest.py | 197 + .../tests/bqas/golden_tests/edge_cases.yaml | 150 + .../golden_rag_correction_v1.yaml | 553 ++ .../tests/bqas/golden_tests/intent_tests.yaml | 183 + .../bqas/golden_tests/workflow_tests.yaml | 161 + voice-service/tests/bqas/test_golden.py | 187 + voice-service/tests/bqas/test_notifier.py | 407 + voice-service/tests/bqas/test_rag.py | 412 + voice-service/tests/bqas/test_regression.py | 207 + voice-service/tests/bqas/test_synthetic.py | 128 + voice-service/tests/conftest.py | 93 + voice-service/tests/test_encryption.py | 111 + voice-service/tests/test_intent_router.py | 185 + voice-service/tests/test_sessions.py | 94 + voice-service/tests/test_tasks.py | 184 + website/.dockerignore | 8 + website/Dockerfile | 55 + website/README.md | 144 + .../compliance/DependencyMap.test.tsx | 311 + .../compliance/ExpiredEvidenceAlert.test.tsx | 173 + .../__tests__/compliance/MyTasksPage.test.tsx | 234 + .../__tests__/compliance/RiskHeatmap.test.tsx | 261 + .../compliance/RoleSelectPage.test.tsx | 164 + website/app/admin/alerts/page.tsx | 1203 +++ website/app/admin/backlog/page.tsx | 1087 +++ website/app/admin/brandbook/page.tsx | 629 ++ website/app/admin/builds/wizard/page.tsx | 602 ++ website/app/admin/communication/page.tsx | 612 ++ .../app/admin/communication/wizard/page.tsx | 362 + website/app/admin/companion/page.tsx | 1057 +++ .../admin/compliance/audit-checklist/page.tsx | 867 +++ .../admin/compliance/audit-workspace/page.tsx | 871 +++ .../app/admin/compliance/controls/page.tsx | 387 + .../app/admin/compliance/evidence/page.tsx | 522 ++ website/app/admin/compliance/export/page.tsx | 502 ++ website/app/admin/compliance/modules/page.tsx | 745 ++ .../app/admin/compliance/my-tasks/page.tsx | 413 + website/app/admin/compliance/page.tsx | 1519 ++++ website/app/admin/compliance/risks/page.tsx | 622 ++ .../app/admin/compliance/role-select/page.tsx | 384 + website/app/admin/compliance/scraper/page.tsx | 789 ++ website/app/admin/consent/page.tsx | 628 ++ website/app/admin/consent/wizard/page.tsx | 383 + website/app/admin/content/page.tsx | 806 ++ website/app/admin/docs/audit/page.tsx | 1262 +++ website/app/admin/docs/page.tsx | 1202 +++ website/app/admin/dsms/page.tsx | 316 + website/app/admin/dsr/page.tsx | 403 + website/app/admin/dsr/wizard/page.tsx | 407 + website/app/admin/edu-search/page.tsx | 958 +++ website/app/admin/game/page.tsx | 480 ++ website/app/admin/game/wizard/page.tsx | 739 ++ website/app/admin/gpu/page.tsx | 394 + website/app/admin/gpu/wizard/page.tsx | 365 + .../[klausurId]/[studentId]/page.tsx | 1328 ++++ .../[klausurId]/fairness/page.tsx | 497 ++ .../klausur-korrektur/[klausurId]/page.tsx | 499 ++ .../components/AnnotationLayer.tsx | 281 + .../components/AnnotationPanel.tsx | 267 + .../components/AnnotationToolbar.tsx | 139 + .../components/EHSuggestionPanel.tsx | 279 + website/app/admin/klausur-korrektur/page.tsx | 1252 +++ website/app/admin/klausur-korrektur/types.ts | 195 + website/app/admin/llm-compare/page.tsx | 761 ++ website/app/admin/llm-compare/wizard/page.tsx | 342 + website/app/admin/mac-mini/page.tsx | 950 +++ website/app/admin/magic-help/page.tsx | 1017 +++ website/app/admin/mail/page.tsx | 985 +++ website/app/admin/mail/wizard/page.tsx | 393 + website/app/admin/middleware/page.tsx | 696 ++ .../app/admin/middleware/test-wizard/page.tsx | 617 ++ website/app/admin/middleware/wizard/page.tsx | 617 ++ website/app/admin/multiplayer/wizard/page.tsx | 663 ++ website/app/admin/ocr-labeling/page.tsx | 946 +++ website/app/admin/ocr-labeling/types.ts | 123 + website/app/admin/onboarding/page.tsx | 243 + website/app/admin/page.tsx | 236 + website/app/admin/pca-platform/page.tsx | 482 ++ website/app/admin/quality/page.tsx | 1231 +++ website/app/admin/rag/README.md | 59 + .../admin/rag/components/CollectionsTab.tsx | 593 ++ .../app/admin/rag/components/DocumentsTab.tsx | 425 ++ .../app/admin/rag/components/IngestionTab.tsx | 512 ++ .../app/admin/rag/components/UploadTab.tsx | 327 + website/app/admin/rag/components/index.ts | 8 + website/app/admin/rag/page.tsx | 1063 +++ website/app/admin/rag/types.ts | 211 + website/app/admin/rag/wizard/page.tsx | 395 + website/app/admin/rbac/wizard/page.tsx | 397 + website/app/admin/sbom/page.tsx | 524 ++ website/app/admin/sbom/wizard/page.tsx | 556 ++ website/app/admin/screen-flow/page.tsx | 793 ++ website/app/admin/security/page.tsx | 402 + website/app/admin/security/wizard/page.tsx | 407 + website/app/admin/staff-search/page.tsx | 581 ++ website/app/admin/training/page.tsx | 1066 +++ website/app/admin/uni-crawler/page.tsx | 535 ++ website/app/admin/unity-bridge/page.tsx | 1094 +++ .../app/admin/unity-bridge/wizard/page.tsx | 479 ++ website/app/admin/voice/page.tsx | 575 ++ website/app/admin/workflow/page.tsx | 625 ++ website/app/admin/zeugnisse-crawler/page.tsx | 485 ++ website/app/api/admin/cicd/route.ts | 143 + .../api/admin/communication/stats/route.ts | 204 + .../consent/documents/[id]/versions/route.ts | 82 + .../app/api/admin/consent/documents/route.ts | 77 + website/app/api/admin/edu-search/route.ts | 354 + website/app/api/admin/gpu/route.ts | 82 + website/app/api/admin/pca/route.ts | 287 + website/app/api/admin/training/route.ts | 215 + website/app/api/admin/uni-crawler/route.ts | 163 + website/app/api/admin/unity-bridge/route.ts | 451 ++ .../app/api/admin/zeugnisse-crawler/route.ts | 219 + website/app/api/content/route.ts | 67 + website/app/cancel/page.tsx | 67 + website/app/faq/page.tsx | 232 + .../foerderantrag/[applicationId]/page.tsx | 540 ++ website/app/foerderantrag/new/page.tsx | 312 + website/app/foerderantrag/page.tsx | 256 + website/app/globals.css | 55 + website/app/ki-konzept/page.tsx | 484 ++ website/app/layout.tsx | 34 + website/app/lehrer/abitur-archiv/page.tsx | 504 ++ .../[klausurId]/[studentId]/page.tsx | 1328 ++++ .../[klausurId]/fairness/page.tsx | 497 ++ .../klausur-korrektur/[klausurId]/page.tsx | 499 ++ .../components/AnnotationLayer.tsx | 281 + .../components/AnnotationPanel.tsx | 267 + .../components/AnnotationToolbar.tsx | 139 + .../components/EHSuggestionPanel.tsx | 279 + website/app/lehrer/klausur-korrektur/page.tsx | 1249 +++ website/app/lehrer/klausur-korrektur/types.ts | 195 + website/app/lehrer/layout.tsx | 19 + website/app/lehrer/page.tsx | 136 + website/app/mail/page.tsx | 733 ++ website/app/mail/tasks/page.tsx | 533 ++ website/app/page.tsx | 17 + website/app/success/page.tsx | 108 + website/app/tools/communication/page.tsx | 527 ++ website/app/upload/page.tsx | 370 + website/app/zeugnisse/page.tsx | 776 ++ website/components/ClientProviders.tsx | 15 + website/components/Footer.tsx | 79 + website/components/Header.tsx | 108 + website/components/LandingContent.tsx | 383 + website/components/LanguageSelector.tsx | 89 + website/components/PricingSection.tsx | 292 + website/components/admin/AdminLayout.tsx | 347 + website/components/admin/AiPrompt.tsx | 232 + website/components/admin/CICDStatusWidget.tsx | 311 + website/components/admin/GameView.tsx | 316 + website/components/admin/GermanySchoolMap.tsx | 244 + website/components/admin/LLMModeSwitcher.tsx | 243 + .../components/admin/SystemInfoSection.tsx | 362 + .../system-info-configs/backlog-config.ts | 183 + .../system-info-configs/brandbook-config.ts | 170 + .../communication-config.ts | 134 + .../system-info-configs/consent-config.ts | 151 + .../system-info-configs/content-config.ts | 85 + .../system-info-configs/dashboard-config.ts | 32 + .../admin/system-info-configs/docs-config.ts | 92 + .../admin/system-info-configs/dsms-config.ts | 207 + .../admin/system-info-configs/dsr-config.ts | 180 + .../system-info-configs/edu-search-config.ts | 123 + .../admin/system-info-configs/game-config.ts | 217 + .../admin/system-info-configs/gpu-config.ts | 142 + .../admin/system-info-configs/index.ts | 117 + .../system-info-configs/index_original.ts | 4899 ++++++++++++ .../system-info-configs/llm-compare-config.ts | 164 + .../admin/system-info-configs/mail-config.ts | 157 + .../system-info-configs/middleware-config.ts | 207 + .../system-info-configs/onboarding-config.ts | 194 + .../pca-platform-config.ts | 213 + .../admin/system-info-configs/rag-config.ts | 241 + .../admin/system-info-configs/sbom-config.ts | 176 + .../system-info-configs/security-config.ts | 200 + .../system-info-configs/training-config.ts | 91 + .../admin/system-info-configs/types.ts | 50 + .../unity-bridge-config.ts | 233 + .../system-info-configs/workflow-config.ts | 115 + .../zeugnisse-crawler-config.ts | 96 + .../compliance/ExpiredEvidenceAlert.tsx | 370 + .../components/compliance/GlossaryTooltip.tsx | 165 + .../compliance/LLMProviderToggle.tsx | 252 + .../components/compliance/LanguageSwitch.tsx | 109 + .../charts/ComplianceTrendChart.tsx | 238 + .../compliance/charts/DependencyMap.tsx | 566 ++ .../compliance/charts/RiskHeatmap.tsx | 680 ++ website/components/compliance/charts/index.ts | 24 + website/components/lehrer/LehrerLayout.tsx | 189 + .../components/wizard/ArchitectureContext.tsx | 100 + website/components/wizard/EducationCard.tsx | 28 + website/components/wizard/TestResultCard.tsx | 57 + website/components/wizard/TestRunner.tsx | 57 + website/components/wizard/TestSummary.tsx | 65 + website/components/wizard/WizardBanner.tsx | 31 + .../components/wizard/WizardNavigation.tsx | 53 + website/components/wizard/WizardProvider.tsx | 72 + website/components/wizard/WizardStepper.tsx | 43 + website/components/wizard/index.ts | 34 + website/components/wizard/types.ts | 104 + website/content/ki-konzept.json | 343 + website/jest.config.js | 23 + website/lib/LanguageContext.tsx | 70 + website/lib/architecture-data.ts | 267 + website/lib/compliance-i18n.ts | 361 + website/lib/content-types.ts | 60 + website/lib/content.ts | 284 + website/lib/i18n.ts | 1173 +++ website/lib/llm-mode-context.tsx | 211 + website/next-env.d.ts | 6 + website/next.config.mjs | 11 + website/package-lock.json | 6797 +++++++++++++++++ website/package.json | 35 + website/postcss.config.mjs | 9 + website/public/germany-states.json | 85 + website/tailwind.config.ts | 47 + website/tests/quality-dashboard.test.ts | 343 + website/tests/structure.test.ts | 317 + website/tests/unity-bridge.test.ts | 932 +++ website/tsconfig.json | 40 + website/types/react-simple-maps.d.ts | 13 + 1224 files changed, 425430 insertions(+) create mode 100644 .claude/CLAUDE.md create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 admin-lehrer/.dockerignore create mode 100644 admin-lehrer/Dockerfile create mode 100644 admin-lehrer/ai-compliance-sdk/Dockerfile create mode 100644 admin-lehrer/ai-compliance-sdk/cmd/server/main.go create mode 100644 admin-lehrer/ai-compliance-sdk/configs/config.yaml create mode 100644 admin-lehrer/ai-compliance-sdk/go.mod create mode 100644 admin-lehrer/ai-compliance-sdk/internal/api/checkpoint.go create mode 100644 admin-lehrer/ai-compliance-sdk/internal/api/generate.go create mode 100644 admin-lehrer/ai-compliance-sdk/internal/api/rag.go create mode 100644 admin-lehrer/ai-compliance-sdk/internal/api/router.go create mode 100644 admin-lehrer/ai-compliance-sdk/internal/api/state.go create mode 100644 admin-lehrer/ai-compliance-sdk/internal/db/postgres.go create mode 100644 admin-lehrer/ai-compliance-sdk/internal/llm/service.go create mode 100644 admin-lehrer/ai-compliance-sdk/internal/rag/service.go create mode 100644 admin-lehrer/app/(admin)/ai/agents/[agentId]/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/agents/architecture/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/agents/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/agents/sessions/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/agents/statistics/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/gpu/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/llm-compare/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/magic-help/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/ocr-compare/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/ocr-labeling/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/ocr-labeling/types.ts create mode 100644 admin-lehrer/app/(admin)/ai/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/quality/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/rag-pipeline/dsfa/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/rag-pipeline/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/rag/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/test-quality/page.tsx create mode 100644 admin-lehrer/app/(admin)/ai/test-quality/types.ts create mode 100644 admin-lehrer/app/(admin)/architecture/page.tsx create mode 100644 admin-lehrer/app/(admin)/backlog/page.tsx create mode 100644 admin-lehrer/app/(admin)/communication/alerts/page.tsx create mode 100644 admin-lehrer/app/(admin)/communication/mail/page.tsx create mode 100644 admin-lehrer/app/(admin)/communication/mail/wizard/page.tsx create mode 100644 admin-lehrer/app/(admin)/communication/matrix/page.tsx create mode 100644 admin-lehrer/app/(admin)/communication/page.tsx create mode 100644 admin-lehrer/app/(admin)/communication/video-chat/page.tsx create mode 100644 admin-lehrer/app/(admin)/communication/video-chat/wizard/page.tsx create mode 100644 admin-lehrer/app/(admin)/dashboard/catalog-manager/page.tsx create mode 100644 admin-lehrer/app/(admin)/dashboard/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/api/export/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/api/generate/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/api/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/api/rag/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/api/state/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/changelog/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/getting-started/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/guides/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/guides/phase1/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/guides/phase2/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/layout.tsx create mode 100644 admin-lehrer/app/(admin)/developers/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/configuration/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/api-reference/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/frameworks/angular/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/frameworks/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/frameworks/react/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/frameworks/vue/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/installation/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/mobile/android/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/mobile/flutter/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/mobile/ios/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/mobile/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/consent/security/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/installation/page.tsx create mode 100644 admin-lehrer/app/(admin)/developers/sdk/page.tsx create mode 100644 admin-lehrer/app/(admin)/development/brandbook/page.tsx create mode 100644 admin-lehrer/app/(admin)/development/companion/page.tsx create mode 100644 admin-lehrer/app/(admin)/development/docs/page.tsx create mode 100644 admin-lehrer/app/(admin)/development/game/page.tsx create mode 100644 admin-lehrer/app/(admin)/development/page.tsx create mode 100644 admin-lehrer/app/(admin)/development/screen-flow/page.tsx create mode 100644 admin-lehrer/app/(admin)/development/unity-bridge/page.tsx create mode 100644 admin-lehrer/app/(admin)/development/workflow/page.tsx create mode 100644 admin-lehrer/app/(admin)/education/abitur-archiv/components/AehnlicheDokumente.tsx create mode 100644 admin-lehrer/app/(admin)/education/abitur-archiv/components/DokumentCard.tsx create mode 100644 admin-lehrer/app/(admin)/education/abitur-archiv/components/FullscreenViewer.tsx create mode 100644 admin-lehrer/app/(admin)/education/abitur-archiv/components/ThemenSuche.tsx create mode 100644 admin-lehrer/app/(admin)/education/abitur-archiv/page.tsx create mode 100644 admin-lehrer/app/(admin)/education/edu-search/page.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/[klausurId]/[studentId]/page.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/[klausurId]/fairness/page.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/[klausurId]/page.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/components/AnnotationLayer.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/components/AnnotationPanel.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/components/AnnotationToolbar.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/components/EHSuggestionPanel.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/components/index.ts create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/page.tsx create mode 100644 admin-lehrer/app/(admin)/education/klausur-korrektur/types.ts create mode 100644 admin-lehrer/app/(admin)/education/page.tsx create mode 100644 admin-lehrer/app/(admin)/education/zeugnisse-crawler/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/ci-cd/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/gpu/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/middleware/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/night-mode/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/sbom/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/sbom/wizard/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/security/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/tests/page.tsx create mode 100644 admin-lehrer/app/(admin)/infrastructure/tests/types.ts create mode 100644 admin-lehrer/app/(admin)/layout.tsx create mode 100644 admin-lehrer/app/(admin)/onboarding/page.tsx create mode 100644 admin-lehrer/app/(admin)/rbac/page.tsx create mode 100644 admin-lehrer/app/(admin)/website/manager/page.tsx create mode 100644 admin-lehrer/app/(admin)/website/page.tsx create mode 100644 admin-lehrer/app/(admin)/website/uebersetzungen/page.tsx create mode 100644 admin-lehrer/app/api/admin/agents/[agentId]/route.ts create mode 100644 admin-lehrer/app/api/admin/agents/[agentId]/soul/route.ts create mode 100644 admin-lehrer/app/api/admin/agents/route.ts create mode 100644 admin-lehrer/app/api/admin/agents/sessions/route.ts create mode 100644 admin-lehrer/app/api/admin/agents/statistics/route.ts create mode 100644 admin-lehrer/app/api/admin/audit/sessions/[sessionId]/complete/route.ts create mode 100644 admin-lehrer/app/api/admin/audit/sessions/[sessionId]/pdf/route.ts create mode 100644 admin-lehrer/app/api/admin/audit/sessions/[sessionId]/route.ts create mode 100644 admin-lehrer/app/api/admin/audit/sessions/[sessionId]/start/route.ts create mode 100644 admin-lehrer/app/api/admin/audit/sessions/route.ts create mode 100644 admin-lehrer/app/api/admin/communication/stats/route.ts create mode 100644 admin-lehrer/app/api/admin/companion/feedback/route.ts create mode 100644 admin-lehrer/app/api/admin/companion/lesson/route.ts create mode 100644 admin-lehrer/app/api/admin/companion/route.ts create mode 100644 admin-lehrer/app/api/admin/companion/settings/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/audit/checklist/[sessionId]/items/[requirementId]/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/audit/checklist/[sessionId]/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/controls/[controlId]/review/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/controls/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/dashboard/executive/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/dashboard/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/evidence/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/evidence/upload/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/modules/[moduleId]/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/modules/overview/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/modules/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/modules/seed/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/regulations/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/requirements/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/risks/[riskId]/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/risks/route.ts create mode 100644 admin-lehrer/app/api/admin/compliance/seed/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/audit-log/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/deadlines/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/documents/[id]/versions/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/documents/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/stats/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/versions/[versionId]/approval-history/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/versions/[versionId]/approve/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/versions/[versionId]/publish/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/versions/[versionId]/reject/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/versions/[versionId]/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/versions/[versionId]/submit-review/route.ts create mode 100644 admin-lehrer/app/api/admin/consent/versions/route.ts create mode 100644 admin-lehrer/app/api/admin/health/route.ts create mode 100644 admin-lehrer/app/api/admin/infrastructure/mac-mini/route.ts create mode 100644 admin-lehrer/app/api/admin/infrastructure/woodpecker/route.ts create mode 100644 admin-lehrer/app/api/admin/mail/route.ts create mode 100644 admin-lehrer/app/api/admin/middleware/[...path]/route.ts create mode 100644 admin-lehrer/app/api/admin/middleware/route.ts create mode 100644 admin-lehrer/app/api/admin/night-mode/execute/route.ts create mode 100644 admin-lehrer/app/api/admin/night-mode/route.ts create mode 100644 admin-lehrer/app/api/admin/night-mode/services/route.ts create mode 100644 admin-lehrer/app/api/ai/rag-pipeline/route.ts create mode 100644 admin-lehrer/app/api/alerts/[...path]/route.ts create mode 100644 admin-lehrer/app/api/bqas/[...path]/route.ts create mode 100644 admin-lehrer/app/api/development/content/route.ts create mode 100644 admin-lehrer/app/api/dsfa-corpus/route.ts create mode 100644 admin-lehrer/app/api/education/abitur-archiv/route.ts create mode 100644 admin-lehrer/app/api/education/abitur-archiv/suggest/route.ts create mode 100644 admin-lehrer/app/api/education/abitur-docs/route.ts create mode 100644 admin-lehrer/app/api/infrastructure/log-extract/extract/route.ts create mode 100644 admin-lehrer/app/api/legal-corpus/route.ts create mode 100644 admin-lehrer/app/api/tests/[...path]/route.ts create mode 100644 admin-lehrer/app/api/v1/security/[...path]/route.ts create mode 100644 admin-lehrer/app/api/webhooks/woodpecker/route.ts create mode 100644 admin-lehrer/app/api/website/content/route.ts create mode 100644 admin-lehrer/app/api/website/status/route.ts create mode 100644 admin-lehrer/app/globals.css create mode 100644 admin-lehrer/app/layout.tsx create mode 100644 admin-lehrer/app/page.tsx create mode 100644 admin-lehrer/components/QRCodeUpload.tsx create mode 100644 admin-lehrer/components/ai/AIModuleSidebar.tsx create mode 100644 admin-lehrer/components/ai/AIToolsSidebar.tsx create mode 100644 admin-lehrer/components/ai/BatchUploader.tsx create mode 100644 admin-lehrer/components/ai/ConfidenceHeatmap.tsx create mode 100644 admin-lehrer/components/ai/TrainingMetrics.tsx create mode 100644 admin-lehrer/components/ai/index.ts create mode 100644 admin-lehrer/components/catalog-manager/CatalogEntryForm.tsx create mode 100644 admin-lehrer/components/catalog-manager/CatalogManagerContent.tsx create mode 100644 admin-lehrer/components/catalog-manager/CatalogModuleTabs.tsx create mode 100644 admin-lehrer/components/catalog-manager/CatalogTable.tsx create mode 100644 admin-lehrer/components/common/ArchitectureView.tsx create mode 100644 admin-lehrer/components/common/Breadcrumbs.tsx create mode 100644 admin-lehrer/components/common/DataFlowDiagram.tsx create mode 100644 admin-lehrer/components/common/InfoBox.tsx create mode 100644 admin-lehrer/components/common/ModuleCard.tsx create mode 100644 admin-lehrer/components/common/PagePurpose.tsx create mode 100644 admin-lehrer/components/common/ServiceStatus.tsx create mode 100644 admin-lehrer/components/common/SkeletonText.tsx create mode 100644 admin-lehrer/components/companion/CompanionDashboard.tsx create mode 100644 admin-lehrer/components/companion/ModeToggle.tsx create mode 100644 admin-lehrer/components/companion/companion-mode/EventsCard.tsx create mode 100644 admin-lehrer/components/companion/companion-mode/PhaseTimeline.tsx create mode 100644 admin-lehrer/components/companion/companion-mode/StatsGrid.tsx create mode 100644 admin-lehrer/components/companion/companion-mode/SuggestionList.tsx create mode 100644 admin-lehrer/components/companion/index.ts create mode 100644 admin-lehrer/components/companion/lesson-mode/HomeworkSection.tsx create mode 100644 admin-lehrer/components/companion/lesson-mode/LessonActiveView.tsx create mode 100644 admin-lehrer/components/companion/lesson-mode/LessonContainer.tsx create mode 100644 admin-lehrer/components/companion/lesson-mode/LessonEndedView.tsx create mode 100644 admin-lehrer/components/companion/lesson-mode/LessonStartForm.tsx create mode 100644 admin-lehrer/components/companion/lesson-mode/QuickActionsBar.tsx create mode 100644 admin-lehrer/components/companion/lesson-mode/ReflectionSection.tsx create mode 100644 admin-lehrer/components/companion/lesson-mode/VisualPieTimer.tsx create mode 100644 admin-lehrer/components/companion/modals/FeedbackModal.tsx create mode 100644 admin-lehrer/components/companion/modals/OnboardingModal.tsx create mode 100644 admin-lehrer/components/companion/modals/SettingsModal.tsx create mode 100644 admin-lehrer/components/dashboard/NightModeWidget.tsx create mode 100644 admin-lehrer/components/developers/DevPortalLayout.tsx create mode 100644 admin-lehrer/components/developers/SDKDocsSidebar.tsx create mode 100644 admin-lehrer/components/education/DokumenteTab.tsx create mode 100644 admin-lehrer/components/education/PDFPreviewModal.tsx create mode 100644 admin-lehrer/components/infrastructure/DevOpsPipelineSidebar.tsx create mode 100644 admin-lehrer/components/layout/Header.tsx create mode 100644 admin-lehrer/components/layout/RoleIndicator.tsx create mode 100644 admin-lehrer/components/layout/Sidebar.tsx create mode 100644 admin-lehrer/components/ocr/BlockReviewPanel.tsx create mode 100644 admin-lehrer/components/ocr/CellCorrectionDialog.tsx create mode 100644 admin-lehrer/components/ocr/GridOverlay.tsx create mode 100644 admin-lehrer/components/ocr/GroundTruthPanel.tsx create mode 100644 admin-lehrer/components/ocr/__tests__/BlockReviewPanel.test.tsx create mode 100644 admin-lehrer/components/ocr/__tests__/GridOverlay.test.tsx create mode 100644 admin-lehrer/components/ocr/index.ts create mode 100644 admin-lehrer/components/wizard/ArchitectureContext.tsx create mode 100644 admin-lehrer/components/wizard/EducationCard.tsx create mode 100644 admin-lehrer/components/wizard/TestResultCard.tsx create mode 100644 admin-lehrer/components/wizard/TestRunner.tsx create mode 100644 admin-lehrer/components/wizard/TestSummary.tsx create mode 100644 admin-lehrer/components/wizard/WizardBanner.tsx create mode 100644 admin-lehrer/components/wizard/WizardNavigation.tsx create mode 100644 admin-lehrer/components/wizard/WizardProvider.tsx create mode 100644 admin-lehrer/components/wizard/WizardStepper.tsx create mode 100644 admin-lehrer/components/wizard/index.ts create mode 100644 admin-lehrer/components/wizard/types.ts create mode 100644 admin-lehrer/e2e/fixtures/sdk-fixtures.ts create mode 100644 admin-lehrer/e2e/specs/command-bar.spec.ts create mode 100644 admin-lehrer/e2e/specs/dsr.spec.ts create mode 100644 admin-lehrer/e2e/specs/export.spec.ts create mode 100644 admin-lehrer/e2e/specs/sdk-navigation.spec.ts create mode 100644 admin-lehrer/e2e/specs/sdk-workflow.spec.ts create mode 100644 admin-lehrer/e2e/utils/test-helpers.ts create mode 100644 admin-lehrer/hooks/companion/index.ts create mode 100644 admin-lehrer/hooks/companion/useCompanionData.ts create mode 100644 admin-lehrer/hooks/companion/useKeyboardShortcuts.ts create mode 100644 admin-lehrer/hooks/companion/useLessonSession.ts create mode 100644 admin-lehrer/lib/companion/constants.ts create mode 100644 admin-lehrer/lib/companion/index.ts create mode 100644 admin-lehrer/lib/companion/types.ts create mode 100644 admin-lehrer/lib/content-types.ts create mode 100644 admin-lehrer/lib/content.ts create mode 100644 admin-lehrer/lib/education/abitur-archiv-types.ts create mode 100644 admin-lehrer/lib/education/abitur-docs-types.ts create mode 100644 admin-lehrer/lib/module-registry.ts create mode 100644 admin-lehrer/lib/navigation.ts create mode 100644 admin-lehrer/lib/roles.ts create mode 100644 admin-lehrer/lib/sdk/__tests__/export.test.ts create mode 100644 admin-lehrer/lib/sdk/__tests__/types.test.ts create mode 100644 admin-lehrer/lib/sdk/api-client.ts create mode 100644 admin-lehrer/lib/sdk/catalog-manager/catalog-registry.ts create mode 100644 admin-lehrer/lib/sdk/catalog-manager/types.ts create mode 100644 admin-lehrer/lib/sdk/compliance-scope-engine.ts create mode 100644 admin-lehrer/lib/sdk/compliance-scope-golden-tests.ts create mode 100644 admin-lehrer/lib/sdk/compliance-scope-profiling.ts create mode 100644 admin-lehrer/lib/sdk/compliance-scope-types.ts create mode 100644 admin-lehrer/lib/sdk/context.tsx create mode 100644 admin-lehrer/lib/sdk/demo-data/controls.ts create mode 100644 admin-lehrer/lib/sdk/demo-data/dsfa.ts create mode 100644 admin-lehrer/lib/sdk/demo-data/index.ts create mode 100644 admin-lehrer/lib/sdk/demo-data/risks.ts create mode 100644 admin-lehrer/lib/sdk/demo-data/toms.ts create mode 100644 admin-lehrer/lib/sdk/demo-data/use-cases.ts create mode 100644 admin-lehrer/lib/sdk/demo-data/vvt.ts create mode 100644 admin-lehrer/lib/sdk/document-generator/datapoint-helpers.ts create mode 100644 admin-lehrer/lib/sdk/document-generator/index.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/__tests__/constraint-enforcer.test.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/__tests__/intent-classifier.test.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/__tests__/state-projector.test.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/constraint-enforcer.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/intent-classifier.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/prompts/ask-gap-analysis.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/prompts/draft-dsfa.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/prompts/draft-loeschfristen.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/prompts/draft-privacy-policy.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/prompts/draft-tom.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/prompts/draft-vvt.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/prompts/index.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/prompts/validate-cross-check.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/state-projector.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/types.ts create mode 100644 admin-lehrer/lib/sdk/drafting-engine/use-drafting-engine.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/__tests__/api.test.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/__tests__/types.test.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/ai-mitigation-library.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/ai-risk-catalog.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/api.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/eu-legal-frameworks.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/gdpr-enforcement-cases.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/index.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/mitigation-library.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/prohibited-ai-practices.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/risk-catalog.ts create mode 100644 admin-lehrer/lib/sdk/dsfa/types.ts create mode 100644 admin-lehrer/lib/sdk/dsr/api.ts create mode 100644 admin-lehrer/lib/sdk/dsr/index.ts create mode 100644 admin-lehrer/lib/sdk/dsr/types.ts create mode 100644 admin-lehrer/lib/sdk/einwilligungen/catalog/data-points.yml create mode 100644 admin-lehrer/lib/sdk/einwilligungen/catalog/loader.ts create mode 100644 admin-lehrer/lib/sdk/einwilligungen/context.tsx create mode 100644 admin-lehrer/lib/sdk/einwilligungen/export/docx.ts create mode 100644 admin-lehrer/lib/sdk/einwilligungen/export/index.ts create mode 100644 admin-lehrer/lib/sdk/einwilligungen/export/pdf.ts create mode 100644 admin-lehrer/lib/sdk/einwilligungen/generator/cookie-banner.ts create mode 100644 admin-lehrer/lib/sdk/einwilligungen/generator/privacy-policy.ts create mode 100644 admin-lehrer/lib/sdk/einwilligungen/index.ts create mode 100644 admin-lehrer/lib/sdk/einwilligungen/types.ts create mode 100644 admin-lehrer/lib/sdk/export.ts create mode 100644 admin-lehrer/lib/sdk/index.ts create mode 100644 admin-lehrer/lib/sdk/loeschfristen-baseline-catalog.ts create mode 100644 admin-lehrer/lib/sdk/loeschfristen-compliance.ts create mode 100644 admin-lehrer/lib/sdk/loeschfristen-export.ts create mode 100644 admin-lehrer/lib/sdk/loeschfristen-profiling.ts create mode 100644 admin-lehrer/lib/sdk/loeschfristen-types.ts create mode 100644 admin-lehrer/lib/sdk/sdk-client.ts create mode 100644 admin-lehrer/lib/sdk/sync.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/ai/document-analyzer.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/ai/prompts.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/context.tsx create mode 100644 admin-lehrer/lib/sdk/tom-generator/controls/controls.yml create mode 100644 admin-lehrer/lib/sdk/tom-generator/controls/loader.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/demo-data/index.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/evidence-store.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/export/docx.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/export/pdf.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/export/zip.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/index.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/rules-engine.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/sdm-mapping.ts create mode 100644 admin-lehrer/lib/sdk/tom-generator/types.ts create mode 100644 admin-lehrer/lib/sdk/types.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/catalog/index.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/catalog/legal-basis.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/catalog/processing-activities.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/catalog/vendor-templates.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/context.tsx create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/contract-review/analyzer.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/contract-review/checklists.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/contract-review/findings.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/contract-review/index.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/export/index.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/export/ropa-export.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/export/vendor-audit-pack.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/export/vvt-export.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/index.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/risk/calculator.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/risk/controls-library.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/risk/index.ts create mode 100644 admin-lehrer/lib/sdk/vendor-compliance/types.ts create mode 100644 admin-lehrer/lib/sdk/vvt-baseline-catalog.ts create mode 100644 admin-lehrer/lib/sdk/vvt-profiling.ts create mode 100644 admin-lehrer/lib/sdk/vvt-types.ts create mode 100644 admin-lehrer/lib/utils.ts create mode 100644 admin-lehrer/next-env.d.ts create mode 100644 admin-lehrer/next.config.js create mode 100644 admin-lehrer/package-lock.json create mode 100644 admin-lehrer/package.json create mode 100644 admin-lehrer/playwright.config.ts create mode 100644 admin-lehrer/postcss.config.mjs create mode 100644 admin-lehrer/public/.gitkeep create mode 100644 admin-lehrer/tailwind.config.ts create mode 100644 admin-lehrer/tsconfig.json create mode 100644 admin-lehrer/types/ai-modules.ts create mode 100644 admin-lehrer/types/infrastructure-modules.ts create mode 100644 admin-lehrer/vitest.config.ts create mode 100644 admin-lehrer/vitest.setup.ts create mode 100644 agent-core/README.md create mode 100644 agent-core/__init__.py create mode 100644 agent-core/brain/__init__.py create mode 100644 agent-core/brain/context_manager.py create mode 100644 agent-core/brain/knowledge_graph.py create mode 100644 agent-core/brain/memory_store.py create mode 100644 agent-core/orchestrator/__init__.py create mode 100644 agent-core/orchestrator/message_bus.py create mode 100644 agent-core/orchestrator/supervisor.py create mode 100644 agent-core/orchestrator/task_router.py create mode 100644 agent-core/pytest.ini create mode 100644 agent-core/requirements.txt create mode 100644 agent-core/sessions/__init__.py create mode 100644 agent-core/sessions/checkpoint.py create mode 100644 agent-core/sessions/heartbeat.py create mode 100644 agent-core/sessions/session_manager.py create mode 100644 agent-core/soul/alert-agent.soul.md create mode 100644 agent-core/soul/compliance-advisor.soul.md create mode 100644 agent-core/soul/drafting-agent.soul.md create mode 100644 agent-core/soul/grader-agent.soul.md create mode 100644 agent-core/soul/orchestrator.soul.md create mode 100644 agent-core/soul/quality-judge.soul.md create mode 100644 agent-core/soul/tutor-agent.soul.md create mode 100644 agent-core/tests/__init__.py create mode 100644 agent-core/tests/conftest.py create mode 100644 agent-core/tests/test_heartbeat.py create mode 100644 agent-core/tests/test_memory_store.py create mode 100644 agent-core/tests/test_message_bus.py create mode 100644 agent-core/tests/test_session_manager.py create mode 100644 agent-core/tests/test_task_router.py create mode 100644 backend-lehrer/.dockerignore create mode 100644 backend-lehrer/Dockerfile create mode 100644 backend-lehrer/abitur_docs_api.py create mode 100644 backend-lehrer/ai_processing/__init__.py create mode 100644 backend-lehrer/ai_processing/analysis.py create mode 100644 backend-lehrer/ai_processing/cloze_generator.py create mode 100644 backend-lehrer/ai_processing/core.py create mode 100644 backend-lehrer/ai_processing/html_generator.py create mode 100644 backend-lehrer/ai_processing/image_processor.py create mode 100644 backend-lehrer/ai_processing/leitner.py create mode 100644 backend-lehrer/ai_processing/mc_generator.py create mode 100644 backend-lehrer/ai_processing/mindmap.py create mode 100644 backend-lehrer/ai_processing/print_generator.py create mode 100644 backend-lehrer/ai_processing/qa_generator.py create mode 100644 backend-lehrer/ai_processor.py create mode 100644 backend-lehrer/ai_processor/__init__.py create mode 100644 backend-lehrer/ai_processor/config.py create mode 100644 backend-lehrer/ai_processor/export/__init__.py create mode 100644 backend-lehrer/ai_processor/export/print_versions.py create mode 100644 backend-lehrer/ai_processor/export/worksheet.py create mode 100644 backend-lehrer/ai_processor/generators/__init__.py create mode 100644 backend-lehrer/ai_processor/generators/cloze.py create mode 100644 backend-lehrer/ai_processor/generators/multiple_choice.py create mode 100644 backend-lehrer/ai_processor/generators/qa.py create mode 100644 backend-lehrer/ai_processor/utils.py create mode 100644 backend-lehrer/ai_processor/vision/__init__.py create mode 100644 backend-lehrer/ai_processor/vision/html_builder.py create mode 100644 backend-lehrer/ai_processor/vision/scan_analyzer.py create mode 100644 backend-lehrer/ai_processor/visualization/__init__.py create mode 100644 backend-lehrer/ai_processor/visualization/mindmap.py create mode 100644 backend-lehrer/alerts_agent/__init__.py create mode 100644 backend-lehrer/alerts_agent/actions/__init__.py create mode 100644 backend-lehrer/alerts_agent/actions/base.py create mode 100644 backend-lehrer/alerts_agent/actions/dispatcher.py create mode 100644 backend-lehrer/alerts_agent/actions/email_action.py create mode 100644 backend-lehrer/alerts_agent/actions/slack_action.py create mode 100644 backend-lehrer/alerts_agent/actions/webhook_action.py create mode 100644 backend-lehrer/alerts_agent/api/__init__.py create mode 100644 backend-lehrer/alerts_agent/api/digests.py create mode 100644 backend-lehrer/alerts_agent/api/routes.py create mode 100644 backend-lehrer/alerts_agent/api/rules.py create mode 100644 backend-lehrer/alerts_agent/api/subscriptions.py create mode 100644 backend-lehrer/alerts_agent/api/templates.py create mode 100644 backend-lehrer/alerts_agent/api/topics.py create mode 100644 backend-lehrer/alerts_agent/api/wizard.py create mode 100644 backend-lehrer/alerts_agent/data/__init__.py create mode 100644 backend-lehrer/alerts_agent/data/templates.py create mode 100644 backend-lehrer/alerts_agent/db/__init__.py create mode 100644 backend-lehrer/alerts_agent/db/database.py create mode 100644 backend-lehrer/alerts_agent/db/models.py create mode 100644 backend-lehrer/alerts_agent/db/repository.py create mode 100644 backend-lehrer/alerts_agent/ingestion/__init__.py create mode 100644 backend-lehrer/alerts_agent/ingestion/email_parser.py create mode 100644 backend-lehrer/alerts_agent/ingestion/rss_fetcher.py create mode 100644 backend-lehrer/alerts_agent/ingestion/scheduler.py create mode 100644 backend-lehrer/alerts_agent/models/__init__.py create mode 100644 backend-lehrer/alerts_agent/models/alert_item.py create mode 100644 backend-lehrer/alerts_agent/models/relevance_profile.py create mode 100644 backend-lehrer/alerts_agent/processing/__init__.py create mode 100644 backend-lehrer/alerts_agent/processing/dedup.py create mode 100644 backend-lehrer/alerts_agent/processing/digest_generator.py create mode 100644 backend-lehrer/alerts_agent/processing/importance.py create mode 100644 backend-lehrer/alerts_agent/processing/relevance_scorer.py create mode 100644 backend-lehrer/alerts_agent/processing/rule_engine.py create mode 100644 backend-lehrer/auth/__init__.py create mode 100644 backend-lehrer/auth/keycloak_auth.py create mode 100644 backend-lehrer/certificates_api.py create mode 100644 backend-lehrer/classroom/__init__.py create mode 100644 backend-lehrer/classroom/models.py create mode 100644 backend-lehrer/classroom/routes/__init__.py create mode 100644 backend-lehrer/classroom/routes/analytics.py create mode 100644 backend-lehrer/classroom/routes/context.py create mode 100644 backend-lehrer/classroom/routes/export.py create mode 100644 backend-lehrer/classroom/routes/feedback.py create mode 100644 backend-lehrer/classroom/routes/homework.py create mode 100644 backend-lehrer/classroom/routes/materials.py create mode 100644 backend-lehrer/classroom/routes/sessions.py create mode 100644 backend-lehrer/classroom/routes/settings.py create mode 100644 backend-lehrer/classroom/routes/templates.py create mode 100644 backend-lehrer/classroom/routes/websocket_routes.py create mode 100644 backend-lehrer/classroom/services/__init__.py create mode 100644 backend-lehrer/classroom/services/persistence.py create mode 100644 backend-lehrer/classroom/websocket_manager.py create mode 100644 backend-lehrer/classroom_api.py create mode 100644 backend-lehrer/classroom_engine/__init__.py create mode 100644 backend-lehrer/classroom_engine/analytics.py create mode 100644 backend-lehrer/classroom_engine/antizipation.py create mode 100644 backend-lehrer/classroom_engine/context_models.py create mode 100644 backend-lehrer/classroom_engine/database.py create mode 100644 backend-lehrer/classroom_engine/db_models.py create mode 100644 backend-lehrer/classroom_engine/fsm.py create mode 100644 backend-lehrer/classroom_engine/models.py create mode 100644 backend-lehrer/classroom_engine/repository.py create mode 100644 backend-lehrer/classroom_engine/suggestions.py create mode 100644 backend-lehrer/classroom_engine/timer.py create mode 100644 backend-lehrer/claude_vision.py create mode 100644 backend-lehrer/config.py create mode 100644 backend-lehrer/content_generators/__init__.py create mode 100644 backend-lehrer/content_generators/h5p_generator.py create mode 100644 backend-lehrer/content_generators/pdf_generator.py create mode 100644 backend-lehrer/correction_api.py create mode 100644 backend-lehrer/email_service.py create mode 100644 backend-lehrer/game/__init__.py create mode 100644 backend-lehrer/game/database.py create mode 100644 backend-lehrer/game/learning_rules.py create mode 100644 backend-lehrer/game/quiz_generator.py create mode 100644 backend-lehrer/game_api.py create mode 100644 backend-lehrer/generators/__init__.py create mode 100644 backend-lehrer/generators/cloze_generator.py create mode 100644 backend-lehrer/generators/mc_generator.py create mode 100644 backend-lehrer/generators/mindmap_generator.py create mode 100644 backend-lehrer/generators/quiz_generator.py create mode 100644 backend-lehrer/infra/__init__.py create mode 100644 backend-lehrer/infra/vast_client.py create mode 100644 backend-lehrer/infra/vast_power.py create mode 100644 backend-lehrer/jitsi_api.py create mode 100644 backend-lehrer/klausur_service_proxy.py create mode 100644 backend-lehrer/learning_units.py create mode 100644 backend-lehrer/learning_units_api.py create mode 100644 backend-lehrer/letters_api.py create mode 100644 backend-lehrer/llm_gateway/__init__.py create mode 100644 backend-lehrer/llm_gateway/config.py create mode 100644 backend-lehrer/llm_gateway/main.py create mode 100644 backend-lehrer/llm_gateway/middleware/__init__.py create mode 100644 backend-lehrer/llm_gateway/middleware/auth.py create mode 100644 backend-lehrer/llm_gateway/models/__init__.py create mode 100644 backend-lehrer/llm_gateway/models/chat.py create mode 100644 backend-lehrer/llm_gateway/routes/__init__.py create mode 100644 backend-lehrer/llm_gateway/routes/chat.py create mode 100644 backend-lehrer/llm_gateway/routes/communication.py create mode 100644 backend-lehrer/llm_gateway/routes/comparison.py create mode 100644 backend-lehrer/llm_gateway/routes/edu_search_seeds.py create mode 100644 backend-lehrer/llm_gateway/routes/health.py create mode 100644 backend-lehrer/llm_gateway/routes/legal_crawler.py create mode 100644 backend-lehrer/llm_gateway/routes/playbooks.py create mode 100644 backend-lehrer/llm_gateway/routes/schools.py create mode 100644 backend-lehrer/llm_gateway/routes/tools.py create mode 100644 backend-lehrer/llm_gateway/services/__init__.py create mode 100644 backend-lehrer/llm_gateway/services/communication_service.py create mode 100644 backend-lehrer/llm_gateway/services/inference.py create mode 100644 backend-lehrer/llm_gateway/services/legal_crawler.py create mode 100644 backend-lehrer/llm_gateway/services/pii_detector.py create mode 100644 backend-lehrer/llm_gateway/services/playbook_service.py create mode 100644 backend-lehrer/llm_gateway/services/tool_gateway.py create mode 100644 backend-lehrer/main.py create mode 100644 backend-lehrer/meetings_api.py create mode 100644 backend-lehrer/messenger_api.py create mode 100644 backend-lehrer/middleware/__init__.py create mode 100644 backend-lehrer/middleware/input_gate.py create mode 100644 backend-lehrer/middleware/pii_redactor.py create mode 100644 backend-lehrer/middleware/rate_limiter.py create mode 100644 backend-lehrer/middleware/request_id.py create mode 100644 backend-lehrer/middleware/security_headers.py create mode 100644 backend-lehrer/recording_api.py create mode 100644 backend-lehrer/requirements.txt create mode 100644 backend-lehrer/school_api.py create mode 100644 backend-lehrer/services/__init__.py create mode 100644 backend-lehrer/services/file_processor.py create mode 100644 backend-lehrer/services/pdf_service.py create mode 100644 backend-lehrer/state_engine/__init__.py create mode 100644 backend-lehrer/state_engine/engine.py create mode 100644 backend-lehrer/state_engine/models.py create mode 100644 backend-lehrer/state_engine/rules.py create mode 100644 backend-lehrer/state_engine_api.py create mode 100644 backend-lehrer/teacher_dashboard_api.py create mode 100644 backend-lehrer/unit_analytics_api.py create mode 100644 backend-lehrer/unit_api.py create mode 100644 backend-lehrer/worksheets_api.py create mode 100644 breakpilot-drive/Dockerfile create mode 100644 breakpilot-drive/PREFAB_CONFIG.md create mode 100644 breakpilot-drive/README.md create mode 100644 breakpilot-drive/TemplateData/.gitkeep create mode 100644 breakpilot-drive/ThirdPartyNotices.md create mode 100644 breakpilot-drive/UNITY_SETUP.md create mode 100644 breakpilot-drive/UnityScripts/BreakpilotAPI.cs create mode 100644 breakpilot-drive/UnityScripts/Core/AchievementManager.cs create mode 100644 breakpilot-drive/UnityScripts/Core/AudioManager.cs create mode 100644 breakpilot-drive/UnityScripts/Core/AuthManager.cs create mode 100644 breakpilot-drive/UnityScripts/Core/DifficultyManager.cs create mode 100644 breakpilot-drive/UnityScripts/Core/GameManager.cs create mode 100644 breakpilot-drive/UnityScripts/Player/PlayerController.cs create mode 100644 breakpilot-drive/UnityScripts/Plugins/WebGL/AuthPlugin.jslib create mode 100644 breakpilot-drive/UnityScripts/Plugins/WebSpeech.jslib create mode 100644 breakpilot-drive/UnityScripts/QuizManager.cs create mode 100644 breakpilot-drive/UnityScripts/Track/ObstacleSpawner.cs create mode 100644 breakpilot-drive/UnityScripts/Track/TrackGenerator.cs create mode 100644 breakpilot-drive/UnityScripts/Track/VisualTrigger.cs create mode 100644 breakpilot-drive/UnityScripts/UI/GameHUD.cs create mode 100644 breakpilot-drive/UnityScripts/UI/MainMenu.cs create mode 100644 breakpilot-drive/UnityScripts/UI/QuizOverlay.cs create mode 100644 breakpilot-drive/UnityScripts/WebGLTemplate/Breakpilot/index.html create mode 100644 breakpilot-drive/index.html create mode 100644 breakpilot-drive/nginx.conf create mode 100644 docker-compose.yml create mode 100644 geo-service/.env.example create mode 100644 geo-service/Dockerfile create mode 100644 geo-service/STATUS.md create mode 100644 geo-service/api/__init__.py create mode 100644 geo-service/api/aoi.py create mode 100644 geo-service/api/learning.py create mode 100644 geo-service/api/terrain.py create mode 100644 geo-service/api/tiles.py create mode 100644 geo-service/config.py create mode 100644 geo-service/main.py create mode 100644 geo-service/models/__init__.py create mode 100644 geo-service/models/aoi.py create mode 100644 geo-service/models/attribution.py create mode 100644 geo-service/models/learning_node.py create mode 100644 geo-service/requirements.txt create mode 100755 geo-service/scripts/download_dem.sh create mode 100755 geo-service/scripts/download_osm.sh create mode 100755 geo-service/scripts/generate_tiles.sh create mode 100755 geo-service/scripts/import_osm.sh create mode 100644 geo-service/services/__init__.py create mode 100644 geo-service/services/aoi_packager.py create mode 100644 geo-service/services/dem_service.py create mode 100644 geo-service/services/learning_generator.py create mode 100644 geo-service/services/osm_extractor.py create mode 100644 geo-service/services/tile_server.py create mode 100644 geo-service/tests/__init__.py create mode 100644 geo-service/tests/test_aoi.py create mode 100644 geo-service/tests/test_learning.py create mode 100644 geo-service/tests/test_tiles.py create mode 100644 geo-service/utils/__init__.py create mode 100644 geo-service/utils/geo_utils.py create mode 100644 geo-service/utils/license_checker.py create mode 100644 geo-service/utils/minio_client.py create mode 100644 klausur-service/Dockerfile create mode 100644 klausur-service/backend/admin_api.py create mode 100644 klausur-service/backend/config.py create mode 100644 klausur-service/backend/country_metadata.py create mode 100644 klausur-service/backend/cv_vocab_pipeline.py create mode 100644 klausur-service/backend/dsfa_corpus_ingestion.py create mode 100644 klausur-service/backend/dsfa_rag_api.py create mode 100644 klausur-service/backend/eh_pipeline.py create mode 100644 klausur-service/backend/eh_templates.py create mode 100644 klausur-service/backend/embedding_client.py create mode 100644 klausur-service/backend/full_compliance_pipeline.py create mode 100644 klausur-service/backend/full_reingestion.py create mode 100644 klausur-service/backend/github_crawler.py create mode 100644 klausur-service/backend/hybrid_search.py create mode 100644 klausur-service/backend/hybrid_vocab_extractor.py create mode 100644 klausur-service/backend/hyde.py create mode 100644 klausur-service/backend/legal_corpus_api.py create mode 100644 klausur-service/backend/legal_corpus_ingestion.py create mode 100644 klausur-service/backend/legal_corpus_robust.py create mode 100644 klausur-service/backend/legal_templates_ingestion.py create mode 100644 klausur-service/backend/mail/__init__.py create mode 100644 klausur-service/backend/mail/aggregator.py create mode 100644 klausur-service/backend/mail/ai_service.py create mode 100644 klausur-service/backend/mail/api.py create mode 100644 klausur-service/backend/mail/credentials.py create mode 100644 klausur-service/backend/mail/mail_db.py create mode 100644 klausur-service/backend/mail/models.py create mode 100644 klausur-service/backend/mail/task_service.py create mode 100644 klausur-service/backend/main.py create mode 100644 klausur-service/backend/metrics_db.py create mode 100644 klausur-service/backend/migrate_rag_chunks.py create mode 100644 klausur-service/backend/minio_storage.py create mode 100644 klausur-service/backend/models/__init__.py create mode 100644 klausur-service/backend/models/eh.py create mode 100644 klausur-service/backend/models/enums.py create mode 100644 klausur-service/backend/models/exam.py create mode 100644 klausur-service/backend/models/grading.py create mode 100644 klausur-service/backend/models/requests.py create mode 100644 klausur-service/backend/nibis_ingestion.py create mode 100644 klausur-service/backend/nru_worksheet_generator.py create mode 100644 klausur-service/backend/ocr_labeling_api.py create mode 100644 klausur-service/backend/pdf_export.py create mode 100644 klausur-service/backend/pdf_extraction.py create mode 100644 klausur-service/backend/pipeline_checkpoints.py create mode 100644 klausur-service/backend/policies/bundeslaender.json create mode 100644 klausur-service/backend/pyproject.toml create mode 100644 klausur-service/backend/qdrant_service.py create mode 100644 klausur-service/backend/rag_evaluation.py create mode 100644 klausur-service/backend/rbac.py create mode 100644 klausur-service/backend/requirements.txt create mode 100644 klausur-service/backend/reranker.py create mode 100644 klausur-service/backend/routes/__init__.py create mode 100644 klausur-service/backend/routes/archiv.py create mode 100644 klausur-service/backend/routes/eh.py create mode 100644 klausur-service/backend/routes/exams.py create mode 100644 klausur-service/backend/routes/fairness.py create mode 100644 klausur-service/backend/routes/grading.py create mode 100644 klausur-service/backend/routes/students.py create mode 100644 klausur-service/backend/self_rag.py create mode 100644 klausur-service/backend/services/__init__.py create mode 100644 klausur-service/backend/services/auth_service.py create mode 100644 klausur-service/backend/services/donut_ocr_service.py create mode 100644 klausur-service/backend/services/eh_service.py create mode 100644 klausur-service/backend/services/grading_service.py create mode 100644 klausur-service/backend/services/grid_detection_service.py create mode 100644 klausur-service/backend/services/handwriting_detection.py create mode 100644 klausur-service/backend/services/inpainting_service.py create mode 100644 klausur-service/backend/services/layout_reconstruction_service.py create mode 100644 klausur-service/backend/services/trocr_service.py create mode 100644 klausur-service/backend/storage.py create mode 100644 klausur-service/backend/template_sources.py create mode 100644 klausur-service/backend/tesseract_vocab_extractor.py create mode 100644 klausur-service/backend/tests/__init__.py create mode 100644 klausur-service/backend/tests/conftest.py create mode 100644 klausur-service/backend/tests/test_advanced_rag.py create mode 100644 klausur-service/backend/tests/test_byoeh.py create mode 100644 klausur-service/backend/tests/test_cv_vocab_pipeline.py create mode 100644 klausur-service/backend/tests/test_grid_detection.py create mode 100644 klausur-service/backend/tests/test_legal_templates.py create mode 100644 klausur-service/backend/tests/test_mail_service.py create mode 100644 klausur-service/backend/tests/test_ocr_labeling.py create mode 100644 klausur-service/backend/tests/test_rag_admin.py create mode 100644 klausur-service/backend/tests/test_rbac.py create mode 100644 klausur-service/backend/tests/test_vocab_worksheet.py create mode 100644 klausur-service/backend/tests/test_worksheet_editor.py create mode 100644 klausur-service/backend/training_api.py create mode 100644 klausur-service/backend/training_export_service.py create mode 100644 klausur-service/backend/trocr_api.py create mode 100644 klausur-service/backend/upload_api.py create mode 100644 klausur-service/backend/vocab_session_store.py create mode 100644 klausur-service/backend/vocab_worksheet_api.py create mode 100644 klausur-service/backend/worksheet_cleanup_api.py create mode 100644 klausur-service/backend/worksheet_editor_api.py create mode 100644 klausur-service/backend/zeugnis_api.py create mode 100644 klausur-service/backend/zeugnis_crawler.py create mode 100644 klausur-service/backend/zeugnis_models.py create mode 100644 klausur-service/backend/zeugnis_seed_data.py create mode 100644 klausur-service/docs/BYOEH-Architecture.md create mode 100644 klausur-service/docs/BYOEH-Developer-Guide.md create mode 100644 klausur-service/docs/DSGVO-Audit-OCR-Labeling.md create mode 100644 klausur-service/docs/NiBiS-Ingestion-Pipeline.md create mode 100644 klausur-service/docs/OCR-Labeling-Spec.md create mode 100644 klausur-service/docs/RAG-Admin-Spec.md create mode 100644 klausur-service/docs/Vocab-Worksheet-Architecture.md create mode 100644 klausur-service/docs/Vocab-Worksheet-Developer-Guide.md create mode 100644 klausur-service/docs/Worksheet-Editor-Architecture.md create mode 100644 klausur-service/docs/Worksheet-Editor-Developer-Guide.md create mode 100644 klausur-service/docs/legal_corpus/AT_ABGB_AGB.txt create mode 100644 klausur-service/docs/legal_corpus/AT_UGB_RET.txt create mode 100644 klausur-service/docs/legal_corpus/CH_OR_AGB.txt create mode 100644 klausur-service/docs/legal_corpus/DE_AO_RET.txt create mode 100644 klausur-service/docs/legal_corpus/DE_BGB_AGB.txt create mode 100644 klausur-service/docs/legal_corpus/DE_EGBGB.txt create mode 100644 klausur-service/docs/legal_corpus/DE_HGB_RET.txt create mode 100644 klausur-service/docs/legal_corpus/DE_USTG_RET.txt create mode 100644 klausur-service/docs/legal_corpus/EPRIVACY.txt create mode 100644 klausur-service/frontend/index.html create mode 100644 klausur-service/frontend/package-lock.json create mode 100644 klausur-service/frontend/package.json create mode 100644 klausur-service/frontend/src/App.tsx create mode 100644 klausur-service/frontend/src/components/EHUploadWizard.tsx create mode 100644 klausur-service/frontend/src/components/Layout.tsx create mode 100644 klausur-service/frontend/src/components/RAGSearchPanel.tsx create mode 100644 klausur-service/frontend/src/hooks/useKlausur.tsx create mode 100644 klausur-service/frontend/src/main.tsx create mode 100644 klausur-service/frontend/src/pages/KorrekturPage.tsx create mode 100644 klausur-service/frontend/src/pages/OnboardingPage.tsx create mode 100644 klausur-service/frontend/src/services/api.ts create mode 100644 klausur-service/frontend/src/services/encryption.ts create mode 100644 klausur-service/frontend/src/styles/eh-wizard.css create mode 100644 klausur-service/frontend/src/styles/global.css create mode 100644 klausur-service/frontend/src/styles/rag-search.css create mode 100644 klausur-service/frontend/tsconfig.json create mode 100644 klausur-service/frontend/tsconfig.node.json create mode 100644 klausur-service/frontend/vite.config.ts create mode 100644 klausur-service/scripts/run_nibis_ingestion.sh create mode 100644 school-service/Dockerfile create mode 100644 school-service/cmd/seed/main.go create mode 100644 school-service/cmd/server/main.go create mode 100644 school-service/go.mod create mode 100644 school-service/go.sum create mode 100644 school-service/internal/config/config.go create mode 100644 school-service/internal/database/database.go create mode 100644 school-service/internal/handlers/certificate_handlers.go create mode 100644 school-service/internal/handlers/class_handlers.go create mode 100644 school-service/internal/handlers/exam_handlers.go create mode 100644 school-service/internal/handlers/grade_handlers.go create mode 100644 school-service/internal/handlers/gradebook_handlers.go create mode 100644 school-service/internal/handlers/handlers.go create mode 100644 school-service/internal/middleware/middleware.go create mode 100644 school-service/internal/models/models.go create mode 100644 school-service/internal/seed/seed_data.go create mode 100644 school-service/internal/services/ai_service.go create mode 100644 school-service/internal/services/ai_service_test.go create mode 100644 school-service/internal/services/certificate_service.go create mode 100644 school-service/internal/services/certificate_service_test.go create mode 100644 school-service/internal/services/class_service.go create mode 100644 school-service/internal/services/class_service_test.go create mode 100644 school-service/internal/services/exam_service.go create mode 100644 school-service/internal/services/exam_service_test.go create mode 100644 school-service/internal/services/grade_service.go create mode 100644 school-service/internal/services/grade_service_test.go create mode 100644 school-service/internal/services/gradebook_service.go create mode 100644 school-service/internal/services/gradebook_service_test.go create mode 100644 school-service/templates/.gitkeep create mode 100644 school-service/templates/certificates/generic/.gitkeep create mode 100644 scripts/wait-for-core.sh create mode 100644 studio-v2/.dockerignore create mode 100755 studio-v2/.git-hooks/pre-push create mode 100755 studio-v2/.git-hooks/setup.sh create mode 100644 studio-v2/Dockerfile create mode 100644 studio-v2/app/agb/page.tsx create mode 100644 studio-v2/app/alerts-b2b/page.tsx create mode 100644 studio-v2/app/alerts/page.tsx create mode 100644 studio-v2/app/api/companion/feedback/route.ts create mode 100644 studio-v2/app/api/companion/lesson/route.ts create mode 100644 studio-v2/app/api/companion/settings/route.ts create mode 100644 studio-v2/app/api/meetings/[...path]/route.ts create mode 100644 studio-v2/app/api/recordings/[...path]/route.ts create mode 100644 studio-v2/app/api/recordings/route.ts create mode 100644 studio-v2/app/api/uploads/route.ts create mode 100644 studio-v2/app/companion/page.tsx create mode 100644 studio-v2/app/dashboard-experimental/page.tsx create mode 100644 studio-v2/app/datenschutz/page.tsx create mode 100644 studio-v2/app/geo-lernwelt/page.tsx create mode 100644 studio-v2/app/geo-lernwelt/types.ts create mode 100644 studio-v2/app/globals.css create mode 100644 studio-v2/app/impressum/page.tsx create mode 100644 studio-v2/app/kontakt/page.tsx create mode 100644 studio-v2/app/korrektur/[klausurId]/[studentId]/page.tsx create mode 100644 studio-v2/app/korrektur/[klausurId]/fairness/page.tsx create mode 100644 studio-v2/app/korrektur/[klausurId]/page.tsx create mode 100644 studio-v2/app/korrektur/archiv/page.tsx create mode 100644 studio-v2/app/korrektur/page.tsx create mode 100644 studio-v2/app/korrektur/types.ts create mode 100644 studio-v2/app/layout.tsx create mode 100644 studio-v2/app/magic-help/layout.tsx create mode 100644 studio-v2/app/magic-help/page.tsx create mode 100644 studio-v2/app/meet/page.tsx create mode 100644 studio-v2/app/messages/page.tsx create mode 100644 studio-v2/app/page-original.tsx create mode 100644 studio-v2/app/page.tsx create mode 100644 studio-v2/app/upload/[sessionId]/page.tsx create mode 100644 studio-v2/app/vocab-worksheet/page.tsx create mode 100644 studio-v2/app/voice-test/page.tsx create mode 100644 studio-v2/app/worksheet-cleanup/page.tsx create mode 100644 studio-v2/app/worksheet-editor/page.tsx create mode 100644 studio-v2/app/worksheet-editor/types.ts create mode 100644 studio-v2/components/AiPrompt.tsx create mode 100644 studio-v2/components/AlertsWizard.tsx create mode 100644 studio-v2/components/B2BMigrationWizard.tsx create mode 100644 studio-v2/components/ChatOverlay.tsx create mode 100644 studio-v2/components/CityMap.tsx create mode 100644 studio-v2/components/CityMapLeaflet.tsx create mode 100644 studio-v2/components/DocumentSpace.tsx create mode 100644 studio-v2/components/DocumentUpload.tsx create mode 100644 studio-v2/components/Footer.tsx create mode 100644 studio-v2/components/GermanyMap.tsx create mode 100644 studio-v2/components/InfoBox.tsx create mode 100644 studio-v2/components/LanguageDropdown.tsx create mode 100644 studio-v2/components/Layout.tsx create mode 100644 studio-v2/components/Logo.tsx create mode 100644 studio-v2/components/OnboardingWizard.tsx create mode 100644 studio-v2/components/QRCodeUpload.tsx create mode 100644 studio-v2/components/SchoolSearch.tsx create mode 100644 studio-v2/components/Sidebar.tsx create mode 100644 studio-v2/components/ThemeToggle.tsx create mode 100644 studio-v2/components/UserMenu.tsx create mode 100644 studio-v2/components/companion/CompanionDashboard.tsx create mode 100644 studio-v2/components/companion/lesson-mode/HomeworkSection.tsx create mode 100644 studio-v2/components/companion/lesson-mode/LessonActiveView.tsx create mode 100644 studio-v2/components/companion/lesson-mode/LessonEndedView.tsx create mode 100644 studio-v2/components/companion/lesson-mode/LessonStartForm.tsx create mode 100644 studio-v2/components/companion/lesson-mode/PhaseTimeline.tsx create mode 100644 studio-v2/components/companion/lesson-mode/QuickActionsBar.tsx create mode 100644 studio-v2/components/companion/lesson-mode/ReflectionSection.tsx create mode 100644 studio-v2/components/companion/lesson-mode/VisualPieTimer.tsx create mode 100644 studio-v2/components/companion/modals/FeedbackModal.tsx create mode 100644 studio-v2/components/companion/modals/OnboardingModal.tsx create mode 100644 studio-v2/components/companion/modals/SettingsModal.tsx create mode 100644 studio-v2/components/geo-lernwelt/AOISelector.tsx create mode 100644 studio-v2/components/geo-lernwelt/UnityViewer.tsx create mode 100644 studio-v2/components/geo-lernwelt/index.ts create mode 100644 studio-v2/components/korrektur/AnnotationLayer.tsx create mode 100644 studio-v2/components/korrektur/AnnotationToolbar.tsx create mode 100644 studio-v2/components/korrektur/CriteriaPanel.tsx create mode 100644 studio-v2/components/korrektur/DocumentViewer.tsx create mode 100644 studio-v2/components/korrektur/EHSuggestionPanel.tsx create mode 100644 studio-v2/components/korrektur/GutachtenEditor.tsx create mode 100644 studio-v2/components/korrektur/index.ts create mode 100644 studio-v2/components/spatial-ui/FloatingMessage.tsx create mode 100644 studio-v2/components/spatial-ui/SpatialCard.tsx create mode 100644 studio-v2/components/spatial-ui/index.ts create mode 100644 studio-v2/components/voice/VoiceCapture.tsx create mode 100644 studio-v2/components/voice/VoiceCommandBar.tsx create mode 100644 studio-v2/components/voice/VoiceIndicator.tsx create mode 100644 studio-v2/components/voice/index.ts create mode 100644 studio-v2/components/worksheet-editor/AIImageGenerator.tsx create mode 100644 studio-v2/components/worksheet-editor/AIPromptBar.tsx create mode 100644 studio-v2/components/worksheet-editor/CanvasControls.tsx create mode 100644 studio-v2/components/worksheet-editor/CleanupPanel.tsx create mode 100644 studio-v2/components/worksheet-editor/DocumentImporter.tsx create mode 100644 studio-v2/components/worksheet-editor/EditorToolbar.tsx create mode 100644 studio-v2/components/worksheet-editor/ExportPanel.tsx create mode 100644 studio-v2/components/worksheet-editor/FabricCanvas.tsx create mode 100644 studio-v2/components/worksheet-editor/OCRImportPanel.tsx create mode 100644 studio-v2/components/worksheet-editor/PageNavigator.tsx create mode 100644 studio-v2/components/worksheet-editor/PropertiesPanel.tsx create mode 100644 studio-v2/components/worksheet-editor/index.ts create mode 100644 studio-v2/dev-server.sh create mode 100644 studio-v2/e2e/korrektur-archiv.spec.ts create mode 100644 studio-v2/e2e/korrektur.spec.ts create mode 100644 studio-v2/hooks/companion/index.ts create mode 100644 studio-v2/hooks/companion/useKeyboardShortcuts.ts create mode 100644 studio-v2/hooks/companion/useLessonSession.ts create mode 100644 studio-v2/lib/ActivityContext.tsx create mode 100644 studio-v2/lib/AlertsB2BContext.tsx create mode 100644 studio-v2/lib/AlertsContext.tsx create mode 100644 studio-v2/lib/LanguageContext.tsx create mode 100644 studio-v2/lib/MessagesContext.tsx create mode 100644 studio-v2/lib/ThemeContext.tsx create mode 100644 studio-v2/lib/companion/constants.ts create mode 100644 studio-v2/lib/companion/index.ts create mode 100644 studio-v2/lib/companion/types.ts create mode 100644 studio-v2/lib/geo-lernwelt/GeoContext.tsx create mode 100644 studio-v2/lib/geo-lernwelt/index.ts create mode 100644 studio-v2/lib/geo-lernwelt/mapStyles.ts create mode 100644 studio-v2/lib/geo-lernwelt/unityBridge.ts create mode 100644 studio-v2/lib/i18n.ts create mode 100644 studio-v2/lib/korrektur/api.ts create mode 100644 studio-v2/lib/korrektur/index.ts create mode 100644 studio-v2/lib/spatial-ui/FocusContext.tsx create mode 100644 studio-v2/lib/spatial-ui/PerformanceContext.tsx create mode 100644 studio-v2/lib/spatial-ui/depth-system.ts create mode 100644 studio-v2/lib/spatial-ui/index.ts create mode 100644 studio-v2/lib/voice/index.ts create mode 100644 studio-v2/lib/voice/voice-api.ts create mode 100644 studio-v2/lib/voice/voice-encryption.ts create mode 100644 studio-v2/lib/worksheet-editor/WorksheetContext.tsx create mode 100644 studio-v2/lib/worksheet-editor/cleanup-service.ts create mode 100644 studio-v2/lib/worksheet-editor/index.ts create mode 100644 studio-v2/lib/worksheet-editor/ocr-integration.test.ts create mode 100644 studio-v2/lib/worksheet-editor/ocr-integration.ts create mode 100644 studio-v2/next-env.d.ts create mode 100644 studio-v2/next.config.js create mode 100644 studio-v2/package-lock.json create mode 100644 studio-v2/package.json create mode 100644 studio-v2/playwright.config.ts create mode 100644 studio-v2/postcss.config.js create mode 100644 studio-v2/public/.gitkeep create mode 100644 studio-v2/tailwind.config.js create mode 100644 studio-v2/tsconfig.json create mode 100644 voice-service/.env.example create mode 100644 voice-service/Dockerfile create mode 100644 voice-service/api/__init__.py create mode 100644 voice-service/api/bqas.py create mode 100644 voice-service/api/sessions.py create mode 100644 voice-service/api/streaming.py create mode 100644 voice-service/api/tasks.py create mode 100644 voice-service/bqas/__init__.py create mode 100644 voice-service/bqas/backlog_generator.py create mode 100644 voice-service/bqas/config.py create mode 100644 voice-service/bqas/judge.py create mode 100644 voice-service/bqas/metrics.py create mode 100644 voice-service/bqas/notifier.py create mode 100644 voice-service/bqas/prompts.py create mode 100644 voice-service/bqas/quality_judge_agent.py create mode 100644 voice-service/bqas/rag_judge.py create mode 100644 voice-service/bqas/regression_tracker.py create mode 100644 voice-service/bqas/runner.py create mode 100644 voice-service/bqas/synthetic_generator.py create mode 100644 voice-service/config.py create mode 100644 voice-service/main.py create mode 100644 voice-service/models/__init__.py create mode 100644 voice-service/models/audit.py create mode 100644 voice-service/models/session.py create mode 100644 voice-service/models/task.py create mode 100644 voice-service/personas/lehrer_persona.json create mode 100644 voice-service/pyproject.toml create mode 100644 voice-service/requirements.txt create mode 100644 voice-service/scripts/com.breakpilot.bqas.plist create mode 100755 voice-service/scripts/install_bqas_scheduler.sh create mode 100644 voice-service/scripts/post-commit.hook create mode 100755 voice-service/scripts/run_bqas.py create mode 100755 voice-service/scripts/run_bqas.sh create mode 100644 voice-service/services/__init__.py create mode 100644 voice-service/services/audio_processor.py create mode 100644 voice-service/services/encryption_service.py create mode 100644 voice-service/services/enhanced_task_orchestrator.py create mode 100644 voice-service/services/fallback_llm_client.py create mode 100644 voice-service/services/intent_router.py create mode 100644 voice-service/services/personaplex_client.py create mode 100644 voice-service/services/task_orchestrator.py create mode 100644 voice-service/tests/__init__.py create mode 100644 voice-service/tests/bqas/__init__.py create mode 100644 voice-service/tests/bqas/conftest.py create mode 100644 voice-service/tests/bqas/golden_tests/edge_cases.yaml create mode 100644 voice-service/tests/bqas/golden_tests/golden_rag_correction_v1.yaml create mode 100644 voice-service/tests/bqas/golden_tests/intent_tests.yaml create mode 100644 voice-service/tests/bqas/golden_tests/workflow_tests.yaml create mode 100644 voice-service/tests/bqas/test_golden.py create mode 100644 voice-service/tests/bqas/test_notifier.py create mode 100644 voice-service/tests/bqas/test_rag.py create mode 100644 voice-service/tests/bqas/test_regression.py create mode 100644 voice-service/tests/bqas/test_synthetic.py create mode 100644 voice-service/tests/conftest.py create mode 100644 voice-service/tests/test_encryption.py create mode 100644 voice-service/tests/test_intent_router.py create mode 100644 voice-service/tests/test_sessions.py create mode 100644 voice-service/tests/test_tasks.py create mode 100644 website/.dockerignore create mode 100644 website/Dockerfile create mode 100644 website/README.md create mode 100644 website/__tests__/compliance/DependencyMap.test.tsx create mode 100644 website/__tests__/compliance/ExpiredEvidenceAlert.test.tsx create mode 100644 website/__tests__/compliance/MyTasksPage.test.tsx create mode 100644 website/__tests__/compliance/RiskHeatmap.test.tsx create mode 100644 website/__tests__/compliance/RoleSelectPage.test.tsx create mode 100644 website/app/admin/alerts/page.tsx create mode 100644 website/app/admin/backlog/page.tsx create mode 100644 website/app/admin/brandbook/page.tsx create mode 100644 website/app/admin/builds/wizard/page.tsx create mode 100644 website/app/admin/communication/page.tsx create mode 100644 website/app/admin/communication/wizard/page.tsx create mode 100644 website/app/admin/companion/page.tsx create mode 100644 website/app/admin/compliance/audit-checklist/page.tsx create mode 100644 website/app/admin/compliance/audit-workspace/page.tsx create mode 100644 website/app/admin/compliance/controls/page.tsx create mode 100644 website/app/admin/compliance/evidence/page.tsx create mode 100644 website/app/admin/compliance/export/page.tsx create mode 100644 website/app/admin/compliance/modules/page.tsx create mode 100644 website/app/admin/compliance/my-tasks/page.tsx create mode 100644 website/app/admin/compliance/page.tsx create mode 100644 website/app/admin/compliance/risks/page.tsx create mode 100644 website/app/admin/compliance/role-select/page.tsx create mode 100644 website/app/admin/compliance/scraper/page.tsx create mode 100644 website/app/admin/consent/page.tsx create mode 100644 website/app/admin/consent/wizard/page.tsx create mode 100644 website/app/admin/content/page.tsx create mode 100644 website/app/admin/docs/audit/page.tsx create mode 100644 website/app/admin/docs/page.tsx create mode 100644 website/app/admin/dsms/page.tsx create mode 100644 website/app/admin/dsr/page.tsx create mode 100644 website/app/admin/dsr/wizard/page.tsx create mode 100644 website/app/admin/edu-search/page.tsx create mode 100644 website/app/admin/game/page.tsx create mode 100644 website/app/admin/game/wizard/page.tsx create mode 100644 website/app/admin/gpu/page.tsx create mode 100644 website/app/admin/gpu/wizard/page.tsx create mode 100644 website/app/admin/klausur-korrektur/[klausurId]/[studentId]/page.tsx create mode 100644 website/app/admin/klausur-korrektur/[klausurId]/fairness/page.tsx create mode 100644 website/app/admin/klausur-korrektur/[klausurId]/page.tsx create mode 100644 website/app/admin/klausur-korrektur/components/AnnotationLayer.tsx create mode 100644 website/app/admin/klausur-korrektur/components/AnnotationPanel.tsx create mode 100644 website/app/admin/klausur-korrektur/components/AnnotationToolbar.tsx create mode 100644 website/app/admin/klausur-korrektur/components/EHSuggestionPanel.tsx create mode 100644 website/app/admin/klausur-korrektur/page.tsx create mode 100644 website/app/admin/klausur-korrektur/types.ts create mode 100644 website/app/admin/llm-compare/page.tsx create mode 100644 website/app/admin/llm-compare/wizard/page.tsx create mode 100644 website/app/admin/mac-mini/page.tsx create mode 100644 website/app/admin/magic-help/page.tsx create mode 100644 website/app/admin/mail/page.tsx create mode 100644 website/app/admin/mail/wizard/page.tsx create mode 100644 website/app/admin/middleware/page.tsx create mode 100644 website/app/admin/middleware/test-wizard/page.tsx create mode 100644 website/app/admin/middleware/wizard/page.tsx create mode 100644 website/app/admin/multiplayer/wizard/page.tsx create mode 100644 website/app/admin/ocr-labeling/page.tsx create mode 100644 website/app/admin/ocr-labeling/types.ts create mode 100644 website/app/admin/onboarding/page.tsx create mode 100644 website/app/admin/page.tsx create mode 100644 website/app/admin/pca-platform/page.tsx create mode 100644 website/app/admin/quality/page.tsx create mode 100644 website/app/admin/rag/README.md create mode 100644 website/app/admin/rag/components/CollectionsTab.tsx create mode 100644 website/app/admin/rag/components/DocumentsTab.tsx create mode 100644 website/app/admin/rag/components/IngestionTab.tsx create mode 100644 website/app/admin/rag/components/UploadTab.tsx create mode 100644 website/app/admin/rag/components/index.ts create mode 100644 website/app/admin/rag/page.tsx create mode 100644 website/app/admin/rag/types.ts create mode 100644 website/app/admin/rag/wizard/page.tsx create mode 100644 website/app/admin/rbac/wizard/page.tsx create mode 100644 website/app/admin/sbom/page.tsx create mode 100644 website/app/admin/sbom/wizard/page.tsx create mode 100644 website/app/admin/screen-flow/page.tsx create mode 100644 website/app/admin/security/page.tsx create mode 100644 website/app/admin/security/wizard/page.tsx create mode 100644 website/app/admin/staff-search/page.tsx create mode 100644 website/app/admin/training/page.tsx create mode 100644 website/app/admin/uni-crawler/page.tsx create mode 100644 website/app/admin/unity-bridge/page.tsx create mode 100644 website/app/admin/unity-bridge/wizard/page.tsx create mode 100644 website/app/admin/voice/page.tsx create mode 100644 website/app/admin/workflow/page.tsx create mode 100644 website/app/admin/zeugnisse-crawler/page.tsx create mode 100644 website/app/api/admin/cicd/route.ts create mode 100644 website/app/api/admin/communication/stats/route.ts create mode 100644 website/app/api/admin/consent/documents/[id]/versions/route.ts create mode 100644 website/app/api/admin/consent/documents/route.ts create mode 100644 website/app/api/admin/edu-search/route.ts create mode 100644 website/app/api/admin/gpu/route.ts create mode 100644 website/app/api/admin/pca/route.ts create mode 100644 website/app/api/admin/training/route.ts create mode 100644 website/app/api/admin/uni-crawler/route.ts create mode 100644 website/app/api/admin/unity-bridge/route.ts create mode 100644 website/app/api/admin/zeugnisse-crawler/route.ts create mode 100644 website/app/api/content/route.ts create mode 100644 website/app/cancel/page.tsx create mode 100644 website/app/faq/page.tsx create mode 100644 website/app/foerderantrag/[applicationId]/page.tsx create mode 100644 website/app/foerderantrag/new/page.tsx create mode 100644 website/app/foerderantrag/page.tsx create mode 100644 website/app/globals.css create mode 100644 website/app/ki-konzept/page.tsx create mode 100644 website/app/layout.tsx create mode 100644 website/app/lehrer/abitur-archiv/page.tsx create mode 100644 website/app/lehrer/klausur-korrektur/[klausurId]/[studentId]/page.tsx create mode 100644 website/app/lehrer/klausur-korrektur/[klausurId]/fairness/page.tsx create mode 100644 website/app/lehrer/klausur-korrektur/[klausurId]/page.tsx create mode 100644 website/app/lehrer/klausur-korrektur/components/AnnotationLayer.tsx create mode 100644 website/app/lehrer/klausur-korrektur/components/AnnotationPanel.tsx create mode 100644 website/app/lehrer/klausur-korrektur/components/AnnotationToolbar.tsx create mode 100644 website/app/lehrer/klausur-korrektur/components/EHSuggestionPanel.tsx create mode 100644 website/app/lehrer/klausur-korrektur/page.tsx create mode 100644 website/app/lehrer/klausur-korrektur/types.ts create mode 100644 website/app/lehrer/layout.tsx create mode 100644 website/app/lehrer/page.tsx create mode 100644 website/app/mail/page.tsx create mode 100644 website/app/mail/tasks/page.tsx create mode 100644 website/app/page.tsx create mode 100644 website/app/success/page.tsx create mode 100644 website/app/tools/communication/page.tsx create mode 100644 website/app/upload/page.tsx create mode 100644 website/app/zeugnisse/page.tsx create mode 100644 website/components/ClientProviders.tsx create mode 100644 website/components/Footer.tsx create mode 100644 website/components/Header.tsx create mode 100644 website/components/LandingContent.tsx create mode 100644 website/components/LanguageSelector.tsx create mode 100644 website/components/PricingSection.tsx create mode 100644 website/components/admin/AdminLayout.tsx create mode 100644 website/components/admin/AiPrompt.tsx create mode 100644 website/components/admin/CICDStatusWidget.tsx create mode 100644 website/components/admin/GameView.tsx create mode 100644 website/components/admin/GermanySchoolMap.tsx create mode 100644 website/components/admin/LLMModeSwitcher.tsx create mode 100644 website/components/admin/SystemInfoSection.tsx create mode 100644 website/components/admin/system-info-configs/backlog-config.ts create mode 100644 website/components/admin/system-info-configs/brandbook-config.ts create mode 100644 website/components/admin/system-info-configs/communication-config.ts create mode 100644 website/components/admin/system-info-configs/consent-config.ts create mode 100644 website/components/admin/system-info-configs/content-config.ts create mode 100644 website/components/admin/system-info-configs/dashboard-config.ts create mode 100644 website/components/admin/system-info-configs/docs-config.ts create mode 100644 website/components/admin/system-info-configs/dsms-config.ts create mode 100644 website/components/admin/system-info-configs/dsr-config.ts create mode 100644 website/components/admin/system-info-configs/edu-search-config.ts create mode 100644 website/components/admin/system-info-configs/game-config.ts create mode 100644 website/components/admin/system-info-configs/gpu-config.ts create mode 100644 website/components/admin/system-info-configs/index.ts create mode 100644 website/components/admin/system-info-configs/index_original.ts create mode 100644 website/components/admin/system-info-configs/llm-compare-config.ts create mode 100644 website/components/admin/system-info-configs/mail-config.ts create mode 100644 website/components/admin/system-info-configs/middleware-config.ts create mode 100644 website/components/admin/system-info-configs/onboarding-config.ts create mode 100644 website/components/admin/system-info-configs/pca-platform-config.ts create mode 100644 website/components/admin/system-info-configs/rag-config.ts create mode 100644 website/components/admin/system-info-configs/sbom-config.ts create mode 100644 website/components/admin/system-info-configs/security-config.ts create mode 100644 website/components/admin/system-info-configs/training-config.ts create mode 100644 website/components/admin/system-info-configs/types.ts create mode 100644 website/components/admin/system-info-configs/unity-bridge-config.ts create mode 100644 website/components/admin/system-info-configs/workflow-config.ts create mode 100644 website/components/admin/system-info-configs/zeugnisse-crawler-config.ts create mode 100644 website/components/compliance/ExpiredEvidenceAlert.tsx create mode 100644 website/components/compliance/GlossaryTooltip.tsx create mode 100644 website/components/compliance/LLMProviderToggle.tsx create mode 100644 website/components/compliance/LanguageSwitch.tsx create mode 100644 website/components/compliance/charts/ComplianceTrendChart.tsx create mode 100644 website/components/compliance/charts/DependencyMap.tsx create mode 100644 website/components/compliance/charts/RiskHeatmap.tsx create mode 100644 website/components/compliance/charts/index.ts create mode 100644 website/components/lehrer/LehrerLayout.tsx create mode 100644 website/components/wizard/ArchitectureContext.tsx create mode 100644 website/components/wizard/EducationCard.tsx create mode 100644 website/components/wizard/TestResultCard.tsx create mode 100644 website/components/wizard/TestRunner.tsx create mode 100644 website/components/wizard/TestSummary.tsx create mode 100644 website/components/wizard/WizardBanner.tsx create mode 100644 website/components/wizard/WizardNavigation.tsx create mode 100644 website/components/wizard/WizardProvider.tsx create mode 100644 website/components/wizard/WizardStepper.tsx create mode 100644 website/components/wizard/index.ts create mode 100644 website/components/wizard/types.ts create mode 100644 website/content/ki-konzept.json create mode 100644 website/jest.config.js create mode 100644 website/lib/LanguageContext.tsx create mode 100644 website/lib/architecture-data.ts create mode 100644 website/lib/compliance-i18n.ts create mode 100644 website/lib/content-types.ts create mode 100644 website/lib/content.ts create mode 100644 website/lib/i18n.ts create mode 100644 website/lib/llm-mode-context.tsx create mode 100644 website/next-env.d.ts create mode 100644 website/next.config.mjs create mode 100644 website/package-lock.json create mode 100644 website/package.json create mode 100644 website/postcss.config.mjs create mode 100644 website/public/germany-states.json create mode 100644 website/tailwind.config.ts create mode 100644 website/tests/quality-dashboard.test.ts create mode 100644 website/tests/structure.test.ts create mode 100644 website/tests/unity-bridge.test.ts create mode 100644 website/tsconfig.json create mode 100644 website/types/react-simple-maps.d.ts diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 100644 index 0000000..41f522b --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1,51 @@ +# BreakPilot Lehrer — KI-Bildungsplattform + +## Entwicklungsumgebung + +### Zwei-Rechner-Setup +| Gerät | Rolle | +|-------|-------| +| **MacBook** | Client/Terminal | +| **Mac Mini** | Server/Docker/Git | + +```bash +ssh macmini "cd /Users/benjaminadmin/Projekte/breakpilot-lehrer && " +``` + +## Voraussetzung +**breakpilot-core MUSS laufen!** Dieses Projekt nutzt Core-Services (DB, Cache, Auth, RAG). + +## Projektübersicht + +**breakpilot-lehrer** ist die Lehrer-KI-Plattform mit Klausurkorrektur, Unterrichtsplanung und Schülerverwaltung. + +### Enthaltene Services (~12 Container) + +| Service | Port | Beschreibung | +|---------|------|--------------| +| admin-lehrer | 3002 | Admin-Dashboard (Next.js) | +| studio-v2 | 443 | Lehrer-/Schüler-Studio | +| website | 3000 | Öffentliche Website | +| backend-lehrer | 8001 | Lehrer APIs (FastAPI) | +| klausur-service | 8086 | Prüfungen, OCR, RAG | +| school-service | 8082 | Schulverwaltung | +| geo-service | 8084 | Geo-Daten | +| voice-service | 8091 | Spracheingabe | +| agent-core | - | Multi-Agent System | + +### Docker-Netzwerk +Nutzt das externe Core-Netzwerk: +```yaml +networks: + breakpilot-network: + external: true + name: breakpilot-network +``` + +### Container-Naming: `bp-lehrer-*` +### DB search_path: `lehrer,core,public` + +## Git Remotes +Immer zu BEIDEN pushen: +- `origin`: lokale Gitea (macmini:3003) +- `gitea`: gitea.meghsakha.com diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b5cdf99 --- /dev/null +++ b/.env.example @@ -0,0 +1,56 @@ +# ========================================================= +# BreakPilot Lehrer — Environment Variables +# ========================================================= +# Copy to .env and adjust values +# NOTE: Core must be running! These vars reference Core services. + +# Database (same as Core) +POSTGRES_USER=breakpilot +POSTGRES_PASSWORD=breakpilot123 +POSTGRES_DB=breakpilot_db + +# Security +JWT_SECRET=your-super-secret-jwt-key-change-in-production +VAULT_TOKEN=breakpilot-dev-token + +# MinIO (from Core) +MINIO_ROOT_USER=breakpilot +MINIO_ROOT_PASSWORD=breakpilot123 +MINIO_BUCKET=breakpilot-rag + +# Environment +ENVIRONMENT=development +TZ=Europe/Berlin + +# LLM (Ollama on host) +OLLAMA_BASE_URL=http://host.docker.internal:11434 +OLLAMA_ENABLED=true +OLLAMA_DEFAULT_MODEL=llama3.2 +OLLAMA_VISION_MODEL=llama3.2-vision +OLLAMA_CORRECTION_MODEL=llama3.2 +OLLAMA_TIMEOUT=120 + +# Anthropic (optional) +ANTHROPIC_API_KEY= + +# vast.ai GPU (optional) +VAST_API_KEY= +VAST_INSTANCE_ID= + +# Game +GAME_USE_DATABASE=true +GAME_REQUIRE_AUTH=false +GAME_REQUIRE_BILLING=false +GAME_LLM_MODEL=llama3.2 + +# Frontend URLs +NEXT_PUBLIC_API_URL=https://macmini:8001 +NEXT_PUBLIC_KLAUSUR_SERVICE_URL=https://macmini:8086 +NEXT_PUBLIC_VOICE_SERVICE_URL=wss://macmini:8091 + +# Session +SESSION_TTL_HOURS=24 + +# SMTP (uses Core Mailpit) +SMTP_HOST=bp-core-mailpit +SMTP_PORT=1025 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9fd65ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,122 @@ +# ============================================ +# BreakPilot Lehrer - Git Ignore +# ============================================ + +# Environment files (keep examples only) +.env +.env.local +*.env.local + +# Keep examples and environment templates +!.env.example +!.env.dev +!.env.staging + +# ============================================ +# Node.js +# ============================================ +node_modules/ +.next/ +out/ +dist/ +build/ +.npm +.yarn-integrity +*.tsbuildinfo + +# ============================================ +# Docker +# ============================================ +backups/ +*.sql.gz +*.sql + +# ============================================ +# IDE & Editors +# ============================================ +.idea/ +.vscode/ +*.swp +*.swo +*~ +.project +.classpath +.settings/ +*.sublime-workspace +*.sublime-project + +# ============================================ +# OS Files +# ============================================ +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# ============================================ +# Secrets & Credentials +# ============================================ +secrets/ +*.pem +*.key +*.crt +*.p12 +*.pfx +credentials.json +service-account.json + +# ============================================ +# Logs +# ============================================ +*.log +logs/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# ============================================ +# Build Artifacts +# ============================================ +*.zip +*.tar.gz +*.rar + +# ============================================ +# Temporary Files +# ============================================ +tmp/ +temp/ +*.tmp +*.temp + +# ============================================ +# Test Results +# ============================================ +test-results/ +playwright-report/ +coverage/ + +# ============================================ +# IDE Plugins & AI Tools +# ============================================ +.continue/ +.claude/settings.local.json + +# Large files +*.pdf +*.zip +*.gz +*.tar +*.sql.gz +*.docx +*.xlsx +*.pptx + +# Compiled binaries +*.exe +*.dll +*.so +*.dylib diff --git a/admin-lehrer/.dockerignore b/admin-lehrer/.dockerignore new file mode 100644 index 0000000..545b4b5 --- /dev/null +++ b/admin-lehrer/.dockerignore @@ -0,0 +1,44 @@ +node_modules +.next +.git +.gitignore +README.md +*.log +.env.local +.env.*.local + +# Exclude stale root-level dirs that may appear inside admin-v2 +BreakpilotDrive +backend +docs +billing-service +consent-service +consent-sdk +ai-compliance-sdk +admin-v2 +edu-search-service +school-service +voice-service +geo-service +klausur-service +studio-v2 +website +scripts +agent-core +pca-platform +breakpilot-drive +breakpilot-compliance-sdk +dsms-gateway +dsms-node +h5p-service +ai-content-generator +policy_vault_* +docker +.docker +vault +librechat +nginx +e2e +vitest.config.ts +vitest.setup.ts +playwright.config.ts diff --git a/admin-lehrer/Dockerfile b/admin-lehrer/Dockerfile new file mode 100644 index 0000000..7fda5b0 --- /dev/null +++ b/admin-lehrer/Dockerfile @@ -0,0 +1,55 @@ +# Build stage +FROM node:20-alpine AS builder + +WORKDIR /app + +# Copy package files +COPY package.json package-lock.json* ./ + +# Install dependencies +RUN npm install + +# Copy source code +COPY . . + +# Build arguments for environment variables +ARG NEXT_PUBLIC_API_URL +ARG NEXT_PUBLIC_OLD_ADMIN_URL +ARG NEXT_PUBLIC_KLAUSUR_SERVICE_URL + +# Set environment variables for build +ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL +ENV NEXT_PUBLIC_OLD_ADMIN_URL=$NEXT_PUBLIC_OLD_ADMIN_URL +ENV NEXT_PUBLIC_KLAUSUR_SERVICE_URL=$NEXT_PUBLIC_KLAUSUR_SERVICE_URL + +# Build the application +RUN npm run build + +# Production stage +FROM node:20-alpine AS runner + +WORKDIR /app + +# Set to production +ENV NODE_ENV=production + +# Create non-root user +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# Copy built assets +COPY --from=builder /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +# Switch to non-root user +USER nextjs + +# Expose port (internal port is 3000, mapped externally by docker-compose) +EXPOSE 3000 + +# Set hostname +ENV HOSTNAME="0.0.0.0" + +# Start the application +CMD ["node", "server.js"] diff --git a/admin-lehrer/ai-compliance-sdk/Dockerfile b/admin-lehrer/ai-compliance-sdk/Dockerfile new file mode 100644 index 0000000..cc3c2d7 --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/Dockerfile @@ -0,0 +1,45 @@ +# Build stage +FROM golang:1.21-alpine AS builder + +WORKDIR /app + +# Install dependencies +RUN apk add --no-cache git ca-certificates + +# Copy go mod files +COPY go.mod go.sum* ./ + +# Download dependencies +RUN go mod download + +# Copy source code +COPY . . + +# Build the application +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o sdk-backend ./cmd/server + +# Runtime stage +FROM alpine:3.19 + +WORKDIR /app + +# Install ca-certificates for HTTPS +RUN apk add --no-cache ca-certificates tzdata + +# Copy binary from builder +COPY --from=builder /app/sdk-backend . +COPY --from=builder /app/configs ./configs + +# Create non-root user +RUN adduser -D -g '' appuser +USER appuser + +# Expose port +EXPOSE 8085 + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:8085/health || exit 1 + +# Run the application +CMD ["./sdk-backend"] diff --git a/admin-lehrer/ai-compliance-sdk/cmd/server/main.go b/admin-lehrer/ai-compliance-sdk/cmd/server/main.go new file mode 100644 index 0000000..15f3e1a --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/cmd/server/main.go @@ -0,0 +1,160 @@ +package main + +import ( + "context" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/breakpilot/ai-compliance-sdk/internal/api" + "github.com/breakpilot/ai-compliance-sdk/internal/db" + "github.com/breakpilot/ai-compliance-sdk/internal/llm" + "github.com/breakpilot/ai-compliance-sdk/internal/rag" + "github.com/gin-gonic/gin" + "github.com/joho/godotenv" +) + +func main() { + // Load environment variables + if err := godotenv.Load(); err != nil { + log.Println("No .env file found, using environment variables") + } + + // Get configuration from environment + port := getEnv("PORT", "8085") + dbURL := getEnv("DATABASE_URL", "postgres://localhost:5432/sdk_states?sslmode=disable") + qdrantURL := getEnv("QDRANT_URL", "http://localhost:6333") + anthropicKey := getEnv("ANTHROPIC_API_KEY", "") + + // Initialize database connection + dbPool, err := db.NewPostgresPool(dbURL) + if err != nil { + log.Printf("Warning: Database connection failed: %v", err) + // Continue without database - use in-memory fallback + } + + // Initialize RAG service + ragService, err := rag.NewService(qdrantURL) + if err != nil { + log.Printf("Warning: RAG service initialization failed: %v", err) + // Continue without RAG - will return empty results + } + + // Initialize LLM service + llmService := llm.NewService(anthropicKey) + + // Create Gin router + gin.SetMode(gin.ReleaseMode) + if os.Getenv("GIN_MODE") == "debug" { + gin.SetMode(gin.DebugMode) + } + + router := gin.Default() + + // CORS middleware + router.Use(corsMiddleware()) + + // Health check + router.GET("/health", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "status": "healthy", + "timestamp": time.Now().UTC().Format(time.RFC3339), + "services": gin.H{ + "database": dbPool != nil, + "rag": ragService != nil, + "llm": anthropicKey != "", + }, + }) + }) + + // API routes + v1 := router.Group("/sdk/v1") + { + // State Management + stateHandler := api.NewStateHandler(dbPool) + v1.GET("/state/:tenantId", stateHandler.GetState) + v1.POST("/state", stateHandler.SaveState) + v1.DELETE("/state/:tenantId", stateHandler.DeleteState) + + // RAG Search + ragHandler := api.NewRAGHandler(ragService) + v1.GET("/rag/search", ragHandler.Search) + v1.GET("/rag/status", ragHandler.GetCorpusStatus) + v1.POST("/rag/index", ragHandler.IndexDocument) + + // Document Generation + generateHandler := api.NewGenerateHandler(llmService, ragService) + v1.POST("/generate/dsfa", generateHandler.GenerateDSFA) + v1.POST("/generate/tom", generateHandler.GenerateTOM) + v1.POST("/generate/vvt", generateHandler.GenerateVVT) + v1.POST("/generate/gutachten", generateHandler.GenerateGutachten) + + // Checkpoint Validation + checkpointHandler := api.NewCheckpointHandler() + v1.GET("/checkpoints", checkpointHandler.GetAll) + v1.POST("/checkpoints/validate", checkpointHandler.Validate) + } + + // Create server + srv := &http.Server{ + Addr: ":" + port, + Handler: router, + } + + // Graceful shutdown + go func() { + log.Printf("SDK Backend starting on port %s", port) + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatalf("Failed to start server: %v", err) + } + }() + + // Wait for interrupt signal + quit := make(chan os.Signal, 1) + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + <-quit + + log.Println("Shutting down server...") + + // Give outstanding requests 5 seconds to complete + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + if err := srv.Shutdown(ctx); err != nil { + log.Fatal("Server forced to shutdown:", err) + } + + // Close database connection + if dbPool != nil { + dbPool.Close() + } + + log.Println("Server exited") +} + +func getEnv(key, defaultValue string) string { + if value := os.Getenv(key); value != "" { + return value + } + return defaultValue +} + +func corsMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") + c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With, If-Match, If-None-Match") + c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE") + c.Writer.Header().Set("Access-Control-Expose-Headers", "ETag, Last-Modified") + + if c.Request.Method == "OPTIONS" { + c.AbortWithStatus(204) + return + } + + c.Next() + } +} diff --git a/admin-lehrer/ai-compliance-sdk/configs/config.yaml b/admin-lehrer/ai-compliance-sdk/configs/config.yaml new file mode 100644 index 0000000..182fe2c --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/configs/config.yaml @@ -0,0 +1,42 @@ +server: + port: 8085 + mode: release # debug, release, test + +database: + url: postgres://localhost:5432/sdk_states?sslmode=disable + max_connections: 10 + min_connections: 2 + +rag: + qdrant_url: http://localhost:6333 + collection: legal_corpus + embedding_model: BGE-M3 + top_k: 5 + +llm: + provider: anthropic # anthropic, openai + model: claude-3-5-sonnet-20241022 + max_tokens: 4096 + temperature: 0.3 + +cors: + allowed_origins: + - http://localhost:3000 + - http://localhost:3002 + - http://macmini:3000 + - http://macmini:3002 + allowed_methods: + - GET + - POST + - PUT + - DELETE + - OPTIONS + allowed_headers: + - Content-Type + - Authorization + - If-Match + - If-None-Match + +logging: + level: info # debug, info, warn, error + format: json diff --git a/admin-lehrer/ai-compliance-sdk/go.mod b/admin-lehrer/ai-compliance-sdk/go.mod new file mode 100644 index 0000000..8a833e4 --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/go.mod @@ -0,0 +1,11 @@ +module github.com/breakpilot/ai-compliance-sdk + +go 1.21 + +require ( + github.com/gin-gonic/gin v1.10.0 + github.com/jackc/pgx/v5 v5.5.1 + github.com/joho/godotenv v1.5.1 + github.com/qdrant/go-client v1.7.0 + gopkg.in/yaml.v3 v3.0.1 +) diff --git a/admin-lehrer/ai-compliance-sdk/internal/api/checkpoint.go b/admin-lehrer/ai-compliance-sdk/internal/api/checkpoint.go new file mode 100644 index 0000000..4652754 --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/internal/api/checkpoint.go @@ -0,0 +1,327 @@ +package api + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +// Checkpoint represents a checkpoint definition +type Checkpoint struct { + ID string `json:"id"` + Step string `json:"step"` + Name string `json:"name"` + Type string `json:"type"` + BlocksProgress bool `json:"blocksProgress"` + RequiresReview string `json:"requiresReview"` + AutoValidate bool `json:"autoValidate"` + Description string `json:"description"` +} + +// CheckpointHandler handles checkpoint-related requests +type CheckpointHandler struct { + checkpoints map[string]Checkpoint +} + +// NewCheckpointHandler creates a new checkpoint handler +func NewCheckpointHandler() *CheckpointHandler { + return &CheckpointHandler{ + checkpoints: initCheckpoints(), + } +} + +func initCheckpoints() map[string]Checkpoint { + return map[string]Checkpoint{ + "CP-UC": { + ID: "CP-UC", + Step: "use-case-workshop", + Name: "Use Case Erfassung", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Mindestens ein Use Case muss erfasst sein", + }, + "CP-SCAN": { + ID: "CP-SCAN", + Step: "screening", + Name: "System Screening", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "SBOM und Security Scan müssen abgeschlossen sein", + }, + "CP-MOD": { + ID: "CP-MOD", + Step: "modules", + Name: "Modul-Zuweisung", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Mindestens ein Compliance-Modul muss zugewiesen sein", + }, + "CP-REQ": { + ID: "CP-REQ", + Step: "requirements", + Name: "Anforderungen", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Anforderungen müssen aus Regulierungen abgeleitet sein", + }, + "CP-CTRL": { + ID: "CP-CTRL", + Step: "controls", + Name: "Controls", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Controls müssen den Anforderungen zugeordnet sein", + }, + "CP-EVI": { + ID: "CP-EVI", + Step: "evidence", + Name: "Nachweise", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Nachweise für Controls müssen dokumentiert sein", + }, + "CP-CHK": { + ID: "CP-CHK", + Step: "audit-checklist", + Name: "Audit Checklist", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Prüfliste muss generiert und überprüft sein", + }, + "CP-RISK": { + ID: "CP-RISK", + Step: "risks", + Name: "Risikobewertung", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Kritische Risiken müssen Mitigationsmaßnahmen haben", + }, + "CP-AI": { + ID: "CP-AI", + Step: "ai-act", + Name: "AI Act Klassifizierung", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "LEGAL", + AutoValidate: false, + Description: "KI-System muss klassifiziert sein", + }, + "CP-OBL": { + ID: "CP-OBL", + Step: "obligations", + Name: "Pflichtenübersicht", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Rechtliche Pflichten müssen identifiziert sein", + }, + "CP-DSFA": { + ID: "CP-DSFA", + Step: "dsfa", + Name: "DSFA", + Type: "RECOMMENDED", + BlocksProgress: false, + RequiresReview: "DSB", + AutoValidate: false, + Description: "Datenschutz-Folgenabschätzung muss erstellt und genehmigt sein", + }, + "CP-TOM": { + ID: "CP-TOM", + Step: "tom", + Name: "TOMs", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "NONE", + AutoValidate: true, + Description: "Technische und organisatorische Maßnahmen müssen definiert sein", + }, + "CP-VVT": { + ID: "CP-VVT", + Step: "vvt", + Name: "Verarbeitungsverzeichnis", + Type: "REQUIRED", + BlocksProgress: true, + RequiresReview: "DSB", + AutoValidate: false, + Description: "Verarbeitungsverzeichnis muss vollständig sein", + }, + } +} + +// GetAll returns all checkpoint definitions +func (h *CheckpointHandler) GetAll(c *gin.Context) { + tenantID := c.Query("tenantId") + + checkpointList := make([]Checkpoint, 0, len(h.checkpoints)) + for _, cp := range h.checkpoints { + checkpointList = append(checkpointList, cp) + } + + SuccessResponse(c, gin.H{ + "tenantId": tenantID, + "checkpoints": checkpointList, + }) +} + +// Validate validates a specific checkpoint +func (h *CheckpointHandler) Validate(c *gin.Context) { + var req struct { + TenantID string `json:"tenantId" binding:"required"` + CheckpointID string `json:"checkpointId" binding:"required"` + Data map[string]interface{} `json:"data"` + } + + if err := c.ShouldBindJSON(&req); err != nil { + ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST") + return + } + + checkpoint, ok := h.checkpoints[req.CheckpointID] + if !ok { + ErrorResponse(c, http.StatusNotFound, "Checkpoint not found", "CHECKPOINT_NOT_FOUND") + return + } + + // Perform validation based on checkpoint ID + result := h.validateCheckpoint(checkpoint, req.Data) + + SuccessResponse(c, result) +} + +func (h *CheckpointHandler) validateCheckpoint(checkpoint Checkpoint, data map[string]interface{}) CheckpointResult { + result := CheckpointResult{ + CheckpointID: checkpoint.ID, + Passed: true, + ValidatedAt: now(), + ValidatedBy: "SYSTEM", + Errors: []ValidationError{}, + Warnings: []ValidationError{}, + } + + // Validation logic based on checkpoint + switch checkpoint.ID { + case "CP-UC": + useCases, _ := data["useCases"].([]interface{}) + if len(useCases) == 0 { + result.Passed = false + result.Errors = append(result.Errors, ValidationError{ + RuleID: "uc-min-count", + Field: "useCases", + Message: "Mindestens ein Use Case muss erstellt werden", + Severity: "ERROR", + }) + } + + case "CP-SCAN": + screening, _ := data["screening"].(map[string]interface{}) + if screening == nil || screening["status"] != "COMPLETED" { + result.Passed = false + result.Errors = append(result.Errors, ValidationError{ + RuleID: "scan-complete", + Field: "screening", + Message: "Security Scan muss abgeschlossen sein", + Severity: "ERROR", + }) + } + + case "CP-MOD": + modules, _ := data["modules"].([]interface{}) + if len(modules) == 0 { + result.Passed = false + result.Errors = append(result.Errors, ValidationError{ + RuleID: "mod-min-count", + Field: "modules", + Message: "Mindestens ein Modul muss zugewiesen werden", + Severity: "ERROR", + }) + } + + case "CP-RISK": + risks, _ := data["risks"].([]interface{}) + criticalUnmitigated := 0 + for _, r := range risks { + risk, ok := r.(map[string]interface{}) + if !ok { + continue + } + severity, _ := risk["severity"].(string) + if severity == "CRITICAL" || severity == "HIGH" { + mitigations, _ := risk["mitigation"].([]interface{}) + if len(mitigations) == 0 { + criticalUnmitigated++ + } + } + } + if criticalUnmitigated > 0 { + result.Passed = false + result.Errors = append(result.Errors, ValidationError{ + RuleID: "critical-risks-mitigated", + Field: "risks", + Message: "Kritische Risiken ohne Mitigationsmaßnahmen gefunden", + Severity: "ERROR", + }) + } + + case "CP-DSFA": + dsfa, _ := data["dsfa"].(map[string]interface{}) + if dsfa == nil { + result.Passed = false + result.Errors = append(result.Errors, ValidationError{ + RuleID: "dsfa-exists", + Field: "dsfa", + Message: "DSFA muss erstellt werden", + Severity: "ERROR", + }) + } else if dsfa["status"] != "APPROVED" { + result.Warnings = append(result.Warnings, ValidationError{ + RuleID: "dsfa-approved", + Field: "dsfa", + Message: "DSFA sollte vom DSB genehmigt werden", + Severity: "WARNING", + }) + } + + case "CP-TOM": + toms, _ := data["toms"].([]interface{}) + if len(toms) == 0 { + result.Passed = false + result.Errors = append(result.Errors, ValidationError{ + RuleID: "tom-min-count", + Field: "toms", + Message: "Mindestens eine TOM muss definiert werden", + Severity: "ERROR", + }) + } + + case "CP-VVT": + vvt, _ := data["vvt"].([]interface{}) + if len(vvt) == 0 { + result.Passed = false + result.Errors = append(result.Errors, ValidationError{ + RuleID: "vvt-min-count", + Field: "vvt", + Message: "Mindestens eine Verarbeitungstätigkeit muss dokumentiert werden", + Severity: "ERROR", + }) + } + } + + return result +} diff --git a/admin-lehrer/ai-compliance-sdk/internal/api/generate.go b/admin-lehrer/ai-compliance-sdk/internal/api/generate.go new file mode 100644 index 0000000..7f7d8c9 --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/internal/api/generate.go @@ -0,0 +1,365 @@ +package api + +import ( + "net/http" + + "github.com/breakpilot/ai-compliance-sdk/internal/llm" + "github.com/breakpilot/ai-compliance-sdk/internal/rag" + "github.com/gin-gonic/gin" +) + +// GenerateHandler handles document generation requests +type GenerateHandler struct { + llmService *llm.Service + ragService *rag.Service +} + +// NewGenerateHandler creates a new generate handler +func NewGenerateHandler(llmService *llm.Service, ragService *rag.Service) *GenerateHandler { + return &GenerateHandler{ + llmService: llmService, + ragService: ragService, + } +} + +// GenerateDSFA generates a Data Protection Impact Assessment +func (h *GenerateHandler) GenerateDSFA(c *gin.Context) { + var req GenerateRequest + if err := c.ShouldBindJSON(&req); err != nil { + ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST") + return + } + + // Get RAG context if requested + var ragSources []SearchResult + if req.UseRAG && h.ragService != nil { + query := req.RAGQuery + if query == "" { + query = "DSFA Datenschutz-Folgenabschätzung Anforderungen" + } + results, _ := h.ragService.Search(c.Request.Context(), query, 5, "legal_corpus", "regulation:DSGVO") + for _, r := range results { + ragSources = append(ragSources, SearchResult{ + ID: r.ID, + Content: r.Content, + Source: r.Source, + Score: r.Score, + Metadata: r.Metadata, + }) + } + } + + // Generate DSFA content + content, tokensUsed, err := h.llmService.GenerateDSFA(c.Request.Context(), req.Context, ragSources) + if err != nil { + // Return mock content if LLM fails + content = h.getMockDSFA(req.Context) + tokensUsed = 0 + } + + SuccessResponse(c, GenerateResponse{ + Content: content, + GeneratedAt: now(), + Model: h.llmService.GetModel(), + TokensUsed: tokensUsed, + RAGSources: ragSources, + Confidence: 0.85, + }) +} + +// GenerateTOM generates Technical and Organizational Measures +func (h *GenerateHandler) GenerateTOM(c *gin.Context) { + var req GenerateRequest + if err := c.ShouldBindJSON(&req); err != nil { + ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST") + return + } + + // Get RAG context if requested + var ragSources []SearchResult + if req.UseRAG && h.ragService != nil { + query := req.RAGQuery + if query == "" { + query = "technische organisatorische Maßnahmen TOM Datenschutz" + } + results, _ := h.ragService.Search(c.Request.Context(), query, 5, "legal_corpus", "") + for _, r := range results { + ragSources = append(ragSources, SearchResult{ + ID: r.ID, + Content: r.Content, + Source: r.Source, + Score: r.Score, + Metadata: r.Metadata, + }) + } + } + + // Generate TOM content + content, tokensUsed, err := h.llmService.GenerateTOM(c.Request.Context(), req.Context, ragSources) + if err != nil { + content = h.getMockTOM(req.Context) + tokensUsed = 0 + } + + SuccessResponse(c, GenerateResponse{ + Content: content, + GeneratedAt: now(), + Model: h.llmService.GetModel(), + TokensUsed: tokensUsed, + RAGSources: ragSources, + Confidence: 0.82, + }) +} + +// GenerateVVT generates Processing Activity Register +func (h *GenerateHandler) GenerateVVT(c *gin.Context) { + var req GenerateRequest + if err := c.ShouldBindJSON(&req); err != nil { + ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST") + return + } + + // Get RAG context if requested + var ragSources []SearchResult + if req.UseRAG && h.ragService != nil { + query := req.RAGQuery + if query == "" { + query = "Verarbeitungsverzeichnis Art. 30 DSGVO" + } + results, _ := h.ragService.Search(c.Request.Context(), query, 5, "legal_corpus", "regulation:DSGVO") + for _, r := range results { + ragSources = append(ragSources, SearchResult{ + ID: r.ID, + Content: r.Content, + Source: r.Source, + Score: r.Score, + Metadata: r.Metadata, + }) + } + } + + // Generate VVT content + content, tokensUsed, err := h.llmService.GenerateVVT(c.Request.Context(), req.Context, ragSources) + if err != nil { + content = h.getMockVVT(req.Context) + tokensUsed = 0 + } + + SuccessResponse(c, GenerateResponse{ + Content: content, + GeneratedAt: now(), + Model: h.llmService.GetModel(), + TokensUsed: tokensUsed, + RAGSources: ragSources, + Confidence: 0.88, + }) +} + +// GenerateGutachten generates an expert opinion/assessment +func (h *GenerateHandler) GenerateGutachten(c *gin.Context) { + var req GenerateRequest + if err := c.ShouldBindJSON(&req); err != nil { + ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST") + return + } + + // Get RAG context if requested + var ragSources []SearchResult + if req.UseRAG && h.ragService != nil { + query := req.RAGQuery + if query == "" { + query = "Compliance Bewertung Gutachten" + } + results, _ := h.ragService.Search(c.Request.Context(), query, 5, "legal_corpus", "") + for _, r := range results { + ragSources = append(ragSources, SearchResult{ + ID: r.ID, + Content: r.Content, + Source: r.Source, + Score: r.Score, + Metadata: r.Metadata, + }) + } + } + + // Generate Gutachten content + content, tokensUsed, err := h.llmService.GenerateGutachten(c.Request.Context(), req.Context, ragSources) + if err != nil { + content = h.getMockGutachten(req.Context) + tokensUsed = 0 + } + + SuccessResponse(c, GenerateResponse{ + Content: content, + GeneratedAt: now(), + Model: h.llmService.GetModel(), + TokensUsed: tokensUsed, + RAGSources: ragSources, + Confidence: 0.80, + }) +} + +// Mock content generators for when LLM is not available +func (h *GenerateHandler) getMockDSFA(context map[string]interface{}) string { + return `# Datenschutz-Folgenabschätzung (DSFA) + +## 1. Systematische Beschreibung der Verarbeitungsvorgänge + +Die geplante Verarbeitung umfasst die Analyse von Kundendaten mittels KI-gestützter Systeme zur Verbesserung der Servicequalität und Personalisierung von Angeboten. + +### Verarbeitungszwecke: +- Kundensegmentierung und Analyse des Nutzerverhaltens +- Personalisierte Empfehlungen +- Optimierung von Geschäftsprozessen + +### Rechtsgrundlage: +- Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse) +- Alternativ: Art. 6 Abs. 1 lit. a DSGVO (Einwilligung) + +## 2. Bewertung der Notwendigkeit und Verhältnismäßigkeit + +Die Verarbeitung ist für die genannten Zwecke erforderlich und verhältnismäßig. Alternative Maßnahmen wurden geprüft, jedoch sind diese weniger effektiv. + +## 3. Risikobewertung + +### Identifizierte Risiken: +| Risiko | Eintrittswahrscheinlichkeit | Schwere | Maßnahmen | +|--------|---------------------------|---------|-----------| +| Unbefugter Zugriff | Mittel | Hoch | Verschlüsselung, Zugangskontrolle | +| Profilbildung | Hoch | Mittel | Anonymisierung, Einwilligung | +| Datenverlust | Niedrig | Hoch | Backup, Redundanz | + +## 4. Maßnahmen zur Risikominderung + +- Implementierung von Verschlüsselung (AES-256) +- Strenge Zugriffskontrollen nach dem Least-Privilege-Prinzip +- Regelmäßige Datenschutz-Schulungen +- Audit-Logging aller Zugriffe + +## 5. Stellungnahme des Datenschutzbeauftragten + +[Hier Stellungnahme einfügen] + +## 6. Dokumentation der Konsultation + +Erstellt am: ${new Date().toISOString()} +Status: ENTWURF +` +} + +func (h *GenerateHandler) getMockTOM(context map[string]interface{}) string { + return `# Technische und Organisatorische Maßnahmen (TOMs) + +## 1. Vertraulichkeit (Art. 32 Abs. 1 lit. b DSGVO) + +### 1.1 Zutrittskontrolle +- Alarmanlage +- Chipkarten-/Transponder-System +- Videoüberwachung der Eingänge +- Besuchererfassung und -begleitung + +### 1.2 Zugangskontrolle +- Passwort-Richtlinie (min. 12 Zeichen, Komplexitätsanforderungen) +- Multi-Faktor-Authentifizierung +- Automatische Bildschirmsperre +- VPN für Remote-Zugriffe + +### 1.3 Zugriffskontrolle +- Rollenbasiertes Berechtigungskonzept +- Need-to-know-Prinzip +- Regelmäßige Überprüfung der Zugriffsrechte +- Protokollierung aller Zugriffe + +## 2. Integrität (Art. 32 Abs. 1 lit. b DSGVO) + +### 2.1 Weitergabekontrolle +- Transportverschlüsselung (TLS 1.3) +- Ende-zu-Ende-Verschlüsselung für sensible Daten +- Sichere E-Mail-Kommunikation (S/MIME) + +### 2.2 Eingabekontrolle +- Protokollierung aller Datenänderungen +- Benutzeridentifikation bei Änderungen +- Audit-Trail für alle Transaktionen + +## 3. Verfügbarkeit (Art. 32 Abs. 1 lit. c DSGVO) + +### 3.1 Verfügbarkeitskontrolle +- Tägliche Backups +- Georedundante Datenspeicherung +- USV-Anlage +- Notfallplan + +### 3.2 Wiederherstellung +- Dokumentierte Wiederherstellungsverfahren +- Regelmäßige Backup-Tests +- Maximale Wiederherstellungszeit: 4 Stunden + +## 4. Belastbarkeit (Art. 32 Abs. 1 lit. b DSGVO) + +- Lastverteilung +- DDoS-Schutz +- Skalierbare Infrastruktur +` +} + +func (h *GenerateHandler) getMockVVT(context map[string]interface{}) string { + return `# Verzeichnis der Verarbeitungstätigkeiten (Art. 30 DSGVO) + +## Verarbeitungstätigkeit: Kundenanalyse und Personalisierung + +### Angaben nach Art. 30 Abs. 1 DSGVO: + +| Feld | Inhalt | +|------|--------| +| **Name des Verantwortlichen** | [Unternehmensname] | +| **Kontaktdaten** | [Adresse, E-Mail, Telefon] | +| **Datenschutzbeauftragter** | [Name, Kontakt] | +| **Zweck der Verarbeitung** | Kundensegmentierung, Personalisierung, Serviceoptimierung | +| **Kategorien betroffener Personen** | Kunden, Interessenten | +| **Kategorien personenbezogener Daten** | Kontaktdaten, Nutzungsdaten, Transaktionsdaten | +| **Kategorien von Empfängern** | Interne Abteilungen, IT-Dienstleister | +| **Drittlandtransfer** | Nein / Ja (mit Angabe der Garantien) | +| **Löschfristen** | 3 Jahre nach letzter Aktivität | +| **TOM-Referenz** | Siehe TOM-Dokument v1.0 | + +### Rechtsgrundlage: +Art. 6 Abs. 1 lit. f DSGVO - Berechtigtes Interesse + +### Dokumentation: +- Erstellt: ${new Date().toISOString()} +- Letzte Aktualisierung: ${new Date().toISOString()} +- Version: 1.0 +` +} + +func (h *GenerateHandler) getMockGutachten(context map[string]interface{}) string { + return `# Compliance-Gutachten + +## Zusammenfassung + +Das geprüfte KI-System erfüllt die wesentlichen Anforderungen der DSGVO und des AI Acts. Es wurden jedoch Optimierungspotenziale identifiziert. + +## Prüfungsumfang + +- DSGVO-Konformität +- AI Act Compliance +- NIS2-Anforderungen + +## Bewertungsergebnis + +| Bereich | Bewertung | Handlungsbedarf | +|---------|-----------|-----------------| +| Datenschutz | Gut | Gering | +| KI-Risikoeinstufung | Erfüllt | Keiner | +| Cybersicherheit | Befriedigend | Mittel | + +## Empfehlungen + +1. Verstärkung der Dokumentation +2. Regelmäßige Audits einplanen +3. Schulungsmaßnahmen erweitern + +Erstellt am: ${new Date().toISOString()} +` +} diff --git a/admin-lehrer/ai-compliance-sdk/internal/api/rag.go b/admin-lehrer/ai-compliance-sdk/internal/api/rag.go new file mode 100644 index 0000000..286a888 --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/internal/api/rag.go @@ -0,0 +1,182 @@ +package api + +import ( + "net/http" + "strconv" + + "github.com/breakpilot/ai-compliance-sdk/internal/rag" + "github.com/gin-gonic/gin" +) + +// RAGHandler handles RAG search requests +type RAGHandler struct { + ragService *rag.Service +} + +// NewRAGHandler creates a new RAG handler +func NewRAGHandler(ragService *rag.Service) *RAGHandler { + return &RAGHandler{ + ragService: ragService, + } +} + +// Search performs semantic search on the legal corpus +func (h *RAGHandler) Search(c *gin.Context) { + query := c.Query("q") + if query == "" { + ErrorResponse(c, http.StatusBadRequest, "Query parameter 'q' is required", "MISSING_QUERY") + return + } + + topK := 5 + if topKStr := c.Query("top_k"); topKStr != "" { + if parsed, err := strconv.Atoi(topKStr); err == nil && parsed > 0 { + topK = parsed + } + } + + collection := c.DefaultQuery("collection", "legal_corpus") + filter := c.Query("filter") // e.g., "regulation:DSGVO" or "category:ai_act" + + // Check if RAG service is available + if h.ragService == nil { + // Return mock data when RAG is not available + SuccessResponse(c, gin.H{ + "query": query, + "topK": topK, + "results": h.getMockResults(query), + "source": "mock", + }) + return + } + + results, err := h.ragService.Search(c.Request.Context(), query, topK, collection, filter) + if err != nil { + ErrorResponse(c, http.StatusInternalServerError, "Search failed: "+err.Error(), "SEARCH_FAILED") + return + } + + SuccessResponse(c, gin.H{ + "query": query, + "topK": topK, + "results": results, + "source": "qdrant", + }) +} + +// GetCorpusStatus returns the status of the legal corpus +func (h *RAGHandler) GetCorpusStatus(c *gin.Context) { + if h.ragService == nil { + SuccessResponse(c, gin.H{ + "status": "unavailable", + "collections": []string{}, + "documents": 0, + }) + return + } + + status, err := h.ragService.GetCorpusStatus(c.Request.Context()) + if err != nil { + ErrorResponse(c, http.StatusInternalServerError, "Failed to get corpus status", "STATUS_FAILED") + return + } + + SuccessResponse(c, status) +} + +// IndexDocument indexes a new document into the corpus +func (h *RAGHandler) IndexDocument(c *gin.Context) { + var req struct { + Collection string `json:"collection" binding:"required"` + ID string `json:"id" binding:"required"` + Content string `json:"content" binding:"required"` + Metadata map[string]string `json:"metadata"` + } + + if err := c.ShouldBindJSON(&req); err != nil { + ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST") + return + } + + if h.ragService == nil { + ErrorResponse(c, http.StatusServiceUnavailable, "RAG service not available", "SERVICE_UNAVAILABLE") + return + } + + err := h.ragService.IndexDocument(c.Request.Context(), req.Collection, req.ID, req.Content, req.Metadata) + if err != nil { + ErrorResponse(c, http.StatusInternalServerError, "Failed to index document: "+err.Error(), "INDEX_FAILED") + return + } + + SuccessResponse(c, gin.H{ + "indexed": true, + "id": req.ID, + "collection": req.Collection, + "indexedAt": now(), + }) +} + +// getMockResults returns mock search results for development +func (h *RAGHandler) getMockResults(query string) []SearchResult { + // Simplified mock results based on common compliance queries + results := []SearchResult{ + { + ID: "dsgvo-art-5", + Content: "Art. 5 DSGVO - Grundsätze für die Verarbeitung personenbezogener Daten: Personenbezogene Daten müssen auf rechtmäßige Weise, nach Treu und Glauben und in einer für die betroffene Person nachvollziehbaren Weise verarbeitet werden.", + Source: "DSGVO", + Score: 0.95, + Metadata: map[string]string{ + "article": "5", + "regulation": "DSGVO", + "category": "grundsaetze", + }, + }, + { + ID: "dsgvo-art-6", + Content: "Art. 6 DSGVO - Rechtmäßigkeit der Verarbeitung: Die Verarbeitung ist nur rechtmäßig, wenn mindestens eine der folgenden Bedingungen erfüllt ist: Einwilligung, Vertragserfüllung, rechtliche Verpflichtung, lebenswichtige Interessen, öffentliche Aufgabe, berechtigtes Interesse.", + Source: "DSGVO", + Score: 0.89, + Metadata: map[string]string{ + "article": "6", + "regulation": "DSGVO", + "category": "rechtsgrundlage", + }, + }, + { + ID: "ai-act-art-6", + Content: "Art. 6 AI Act - Klassifizierungsregeln für Hochrisiko-KI-Systeme: Ein KI-System gilt als Hochrisiko-System, wenn es als Sicherheitskomponente eines Produkts verwendet wird oder selbst ein Produkt ist, das unter die in Anhang II aufgeführten Harmonisierungsrechtsvorschriften fällt.", + Source: "AI Act", + Score: 0.85, + Metadata: map[string]string{ + "article": "6", + "regulation": "AI_ACT", + "category": "hochrisiko", + }, + }, + { + ID: "nis2-art-21", + Content: "Art. 21 NIS2 - Risikomanagementmaßnahmen: Wesentliche und wichtige Einrichtungen müssen geeignete und verhältnismäßige technische, operative und organisatorische Maßnahmen ergreifen, um die Risiken für die Sicherheit der Netz- und Informationssysteme zu beherrschen.", + Source: "NIS2", + Score: 0.78, + Metadata: map[string]string{ + "article": "21", + "regulation": "NIS2", + "category": "risikomanagement", + }, + }, + { + ID: "dsgvo-art-35", + Content: "Art. 35 DSGVO - Datenschutz-Folgenabschätzung: Hat eine Form der Verarbeitung, insbesondere bei Verwendung neuer Technologien, aufgrund der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung voraussichtlich ein hohes Risiko für die Rechte und Freiheiten natürlicher Personen zur Folge, so führt der Verantwortliche vorab eine Abschätzung der Folgen der vorgesehenen Verarbeitungsvorgänge für den Schutz personenbezogener Daten durch.", + Source: "DSGVO", + Score: 0.75, + Metadata: map[string]string{ + "article": "35", + "regulation": "DSGVO", + "category": "dsfa", + }, + }, + } + + return results +} diff --git a/admin-lehrer/ai-compliance-sdk/internal/api/router.go b/admin-lehrer/ai-compliance-sdk/internal/api/router.go new file mode 100644 index 0000000..eb2db0e --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/internal/api/router.go @@ -0,0 +1,96 @@ +package api + +import ( + "net/http" + "time" + + "github.com/gin-gonic/gin" +) + +// Response represents a standard API response +type Response struct { + Success bool `json:"success"` + Data interface{} `json:"data,omitempty"` + Error string `json:"error,omitempty"` + Code string `json:"code,omitempty"` +} + +// SuccessResponse creates a success response +func SuccessResponse(c *gin.Context, data interface{}) { + c.JSON(http.StatusOK, Response{ + Success: true, + Data: data, + }) +} + +// ErrorResponse creates an error response +func ErrorResponse(c *gin.Context, status int, err string, code string) { + c.JSON(status, Response{ + Success: false, + Error: err, + Code: code, + }) +} + +// StateData represents state response data +type StateData struct { + TenantID string `json:"tenantId"` + State interface{} `json:"state"` + Version int `json:"version"` + LastModified string `json:"lastModified"` +} + +// ValidationError represents a validation error +type ValidationError struct { + RuleID string `json:"ruleId"` + Field string `json:"field"` + Message string `json:"message"` + Severity string `json:"severity"` +} + +// CheckpointResult represents checkpoint validation result +type CheckpointResult struct { + CheckpointID string `json:"checkpointId"` + Passed bool `json:"passed"` + ValidatedAt string `json:"validatedAt"` + ValidatedBy string `json:"validatedBy"` + Errors []ValidationError `json:"errors"` + Warnings []ValidationError `json:"warnings"` +} + +// SearchResult represents a RAG search result +type SearchResult struct { + ID string `json:"id"` + Content string `json:"content"` + Source string `json:"source"` + Score float64 `json:"score"` + Metadata map[string]string `json:"metadata,omitempty"` + Highlights []string `json:"highlights,omitempty"` +} + +// GenerateRequest represents a document generation request +type GenerateRequest struct { + TenantID string `json:"tenantId" binding:"required"` + Context map[string]interface{} `json:"context"` + Template string `json:"template,omitempty"` + Language string `json:"language,omitempty"` + UseRAG bool `json:"useRag"` + RAGQuery string `json:"ragQuery,omitempty"` + MaxTokens int `json:"maxTokens,omitempty"` + Temperature float64 `json:"temperature,omitempty"` +} + +// GenerateResponse represents a document generation response +type GenerateResponse struct { + Content string `json:"content"` + GeneratedAt string `json:"generatedAt"` + Model string `json:"model"` + TokensUsed int `json:"tokensUsed"` + RAGSources []SearchResult `json:"ragSources,omitempty"` + Confidence float64 `json:"confidence,omitempty"` +} + +// Timestamps helper +func now() string { + return time.Now().UTC().Format(time.RFC3339) +} diff --git a/admin-lehrer/ai-compliance-sdk/internal/api/state.go b/admin-lehrer/ai-compliance-sdk/internal/api/state.go new file mode 100644 index 0000000..2980d98 --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/internal/api/state.go @@ -0,0 +1,171 @@ +package api + +import ( + "encoding/json" + "net/http" + "strconv" + + "github.com/breakpilot/ai-compliance-sdk/internal/db" + "github.com/gin-gonic/gin" +) + +// StateHandler handles state management requests +type StateHandler struct { + dbPool *db.Pool + memStore *db.InMemoryStore +} + +// NewStateHandler creates a new state handler +func NewStateHandler(dbPool *db.Pool) *StateHandler { + return &StateHandler{ + dbPool: dbPool, + memStore: db.NewInMemoryStore(), + } +} + +// GetState retrieves state for a tenant +func (h *StateHandler) GetState(c *gin.Context) { + tenantID := c.Param("tenantId") + if tenantID == "" { + ErrorResponse(c, http.StatusBadRequest, "tenantId is required", "MISSING_TENANT_ID") + return + } + + var state *db.SDKState + var err error + + // Try database first, fall back to in-memory + if h.dbPool != nil { + state, err = h.dbPool.GetState(c.Request.Context(), tenantID) + } else { + state, err = h.memStore.GetState(tenantID) + } + + if err != nil { + ErrorResponse(c, http.StatusNotFound, "State not found", "STATE_NOT_FOUND") + return + } + + // Generate ETag + etag := generateETag(state.Version, state.UpdatedAt.String()) + + // Check If-None-Match header + if c.GetHeader("If-None-Match") == etag { + c.Status(http.StatusNotModified) + return + } + + // Parse state JSON + var stateData interface{} + if err := json.Unmarshal(state.State, &stateData); err != nil { + stateData = state.State + } + + c.Header("ETag", etag) + c.Header("Last-Modified", state.UpdatedAt.Format("Mon, 02 Jan 2006 15:04:05 GMT")) + c.Header("Cache-Control", "private, no-cache") + + SuccessResponse(c, StateData{ + TenantID: state.TenantID, + State: stateData, + Version: state.Version, + LastModified: state.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"), + }) +} + +// SaveState saves state for a tenant +func (h *StateHandler) SaveState(c *gin.Context) { + var req struct { + TenantID string `json:"tenantId" binding:"required"` + UserID string `json:"userId"` + State json.RawMessage `json:"state" binding:"required"` + Version *int `json:"version"` + } + + if err := c.ShouldBindJSON(&req); err != nil { + ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST") + return + } + + // Check If-Match header for optimistic locking + var expectedVersion *int + if ifMatch := c.GetHeader("If-Match"); ifMatch != "" { + v, err := strconv.Atoi(ifMatch) + if err == nil { + expectedVersion = &v + } + } else if req.Version != nil { + expectedVersion = req.Version + } + + var state *db.SDKState + var err error + + // Try database first, fall back to in-memory + if h.dbPool != nil { + state, err = h.dbPool.SaveState(c.Request.Context(), req.TenantID, req.UserID, req.State, expectedVersion) + } else { + state, err = h.memStore.SaveState(req.TenantID, req.UserID, req.State, expectedVersion) + } + + if err != nil { + if err.Error() == "version conflict" { + ErrorResponse(c, http.StatusConflict, "Version conflict. State was modified by another request.", "VERSION_CONFLICT") + return + } + ErrorResponse(c, http.StatusInternalServerError, "Failed to save state", "SAVE_FAILED") + return + } + + // Generate ETag + etag := generateETag(state.Version, state.UpdatedAt.String()) + + // Parse state JSON + var stateData interface{} + if err := json.Unmarshal(state.State, &stateData); err != nil { + stateData = state.State + } + + c.Header("ETag", etag) + c.Header("Last-Modified", state.UpdatedAt.Format("Mon, 02 Jan 2006 15:04:05 GMT")) + + SuccessResponse(c, StateData{ + TenantID: state.TenantID, + State: stateData, + Version: state.Version, + LastModified: state.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"), + }) +} + +// DeleteState deletes state for a tenant +func (h *StateHandler) DeleteState(c *gin.Context) { + tenantID := c.Param("tenantId") + if tenantID == "" { + ErrorResponse(c, http.StatusBadRequest, "tenantId is required", "MISSING_TENANT_ID") + return + } + + var err error + + // Try database first, fall back to in-memory + if h.dbPool != nil { + err = h.dbPool.DeleteState(c.Request.Context(), tenantID) + } else { + err = h.memStore.DeleteState(tenantID) + } + + if err != nil { + ErrorResponse(c, http.StatusInternalServerError, "Failed to delete state", "DELETE_FAILED") + return + } + + SuccessResponse(c, gin.H{ + "tenantId": tenantID, + "deletedAt": now(), + }) +} + +// generateETag creates an ETag from version and timestamp +func generateETag(version int, timestamp string) string { + return "\"" + strconv.Itoa(version) + "-" + timestamp[:8] + "\"" +} diff --git a/admin-lehrer/ai-compliance-sdk/internal/db/postgres.go b/admin-lehrer/ai-compliance-sdk/internal/db/postgres.go new file mode 100644 index 0000000..168d5cc --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/internal/db/postgres.go @@ -0,0 +1,173 @@ +package db + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/jackc/pgx/v5/pgxpool" +) + +// Pool wraps a pgxpool.Pool with SDK-specific methods +type Pool struct { + *pgxpool.Pool +} + +// SDKState represents the state stored in the database +type SDKState struct { + ID string `json:"id"` + TenantID string `json:"tenant_id"` + UserID string `json:"user_id,omitempty"` + State json.RawMessage `json:"state"` + Version int `json:"version"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +// NewPostgresPool creates a new database connection pool +func NewPostgresPool(connectionString string) (*Pool, error) { + config, err := pgxpool.ParseConfig(connectionString) + if err != nil { + return nil, fmt.Errorf("failed to parse connection string: %w", err) + } + + config.MaxConns = 10 + config.MinConns = 2 + config.MaxConnLifetime = 1 * time.Hour + config.MaxConnIdleTime = 30 * time.Minute + + pool, err := pgxpool.NewWithConfig(context.Background(), config) + if err != nil { + return nil, fmt.Errorf("failed to create connection pool: %w", err) + } + + // Test connection + if err := pool.Ping(context.Background()); err != nil { + return nil, fmt.Errorf("failed to ping database: %w", err) + } + + return &Pool{Pool: pool}, nil +} + +// GetState retrieves state for a tenant +func (p *Pool) GetState(ctx context.Context, tenantID string) (*SDKState, error) { + query := ` + SELECT id, tenant_id, user_id, state, version, created_at, updated_at + FROM sdk_states + WHERE tenant_id = $1 + ` + + var state SDKState + err := p.QueryRow(ctx, query, tenantID).Scan( + &state.ID, + &state.TenantID, + &state.UserID, + &state.State, + &state.Version, + &state.CreatedAt, + &state.UpdatedAt, + ) + if err != nil { + return nil, err + } + + return &state, nil +} + +// SaveState saves or updates state for a tenant with optimistic locking +func (p *Pool) SaveState(ctx context.Context, tenantID string, userID string, state json.RawMessage, expectedVersion *int) (*SDKState, error) { + query := ` + INSERT INTO sdk_states (tenant_id, user_id, state, version) + VALUES ($1, $2, $3, 1) + ON CONFLICT (tenant_id) DO UPDATE SET + state = $3, + user_id = COALESCE($2, sdk_states.user_id), + version = sdk_states.version + 1, + updated_at = NOW() + WHERE ($4::int IS NULL OR sdk_states.version = $4) + RETURNING id, tenant_id, user_id, state, version, created_at, updated_at + ` + + var result SDKState + err := p.QueryRow(ctx, query, tenantID, userID, state, expectedVersion).Scan( + &result.ID, + &result.TenantID, + &result.UserID, + &result.State, + &result.Version, + &result.CreatedAt, + &result.UpdatedAt, + ) + if err != nil { + return nil, err + } + + return &result, nil +} + +// DeleteState deletes state for a tenant +func (p *Pool) DeleteState(ctx context.Context, tenantID string) error { + query := `DELETE FROM sdk_states WHERE tenant_id = $1` + _, err := p.Exec(ctx, query, tenantID) + return err +} + +// InMemoryStore provides an in-memory fallback when database is not available +type InMemoryStore struct { + states map[string]*SDKState +} + +// NewInMemoryStore creates a new in-memory store +func NewInMemoryStore() *InMemoryStore { + return &InMemoryStore{ + states: make(map[string]*SDKState), + } +} + +// GetState retrieves state from memory +func (s *InMemoryStore) GetState(tenantID string) (*SDKState, error) { + state, ok := s.states[tenantID] + if !ok { + return nil, fmt.Errorf("state not found") + } + return state, nil +} + +// SaveState saves state to memory +func (s *InMemoryStore) SaveState(tenantID string, userID string, state json.RawMessage, expectedVersion *int) (*SDKState, error) { + existing, exists := s.states[tenantID] + + // Optimistic locking check + if expectedVersion != nil && exists && existing.Version != *expectedVersion { + return nil, fmt.Errorf("version conflict") + } + + now := time.Now() + version := 1 + createdAt := now + + if exists { + version = existing.Version + 1 + createdAt = existing.CreatedAt + } + + newState := &SDKState{ + ID: fmt.Sprintf("%s-%d", tenantID, time.Now().UnixNano()), + TenantID: tenantID, + UserID: userID, + State: state, + Version: version, + CreatedAt: createdAt, + UpdatedAt: now, + } + + s.states[tenantID] = newState + return newState, nil +} + +// DeleteState deletes state from memory +func (s *InMemoryStore) DeleteState(tenantID string) error { + delete(s.states, tenantID) + return nil +} diff --git a/admin-lehrer/ai-compliance-sdk/internal/llm/service.go b/admin-lehrer/ai-compliance-sdk/internal/llm/service.go new file mode 100644 index 0000000..61a78e0 --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/internal/llm/service.go @@ -0,0 +1,384 @@ +package llm + +import ( + "context" + "fmt" + "strings" +) + +// SearchResult matches the RAG service result structure +type SearchResult struct { + ID string `json:"id"` + Content string `json:"content"` + Source string `json:"source"` + Score float64 `json:"score"` + Metadata map[string]string `json:"metadata,omitempty"` +} + +// Service provides LLM functionality for document generation +type Service struct { + apiKey string + model string +} + +// NewService creates a new LLM service +func NewService(apiKey string) *Service { + model := "claude-3-5-sonnet-20241022" + if apiKey == "" { + model = "mock" + } + return &Service{ + apiKey: apiKey, + model: model, + } +} + +// GetModel returns the current model name +func (s *Service) GetModel() string { + return s.model +} + +// GenerateDSFA generates a Data Protection Impact Assessment +func (s *Service) GenerateDSFA(ctx context.Context, context map[string]interface{}, ragSources []SearchResult) (string, int, error) { + if s.apiKey == "" { + return "", 0, fmt.Errorf("LLM not configured") + } + + // Build prompt with context and RAG sources + prompt := s.buildDSFAPrompt(context, ragSources) + + // In production, this would call the Anthropic API + // response, err := s.callAnthropicAPI(ctx, prompt) + // if err != nil { + // return "", 0, err + // } + + // For now, simulate a response + content := s.generateDSFAContent(context, ragSources) + tokensUsed := len(strings.Split(content, " ")) * 2 // Rough estimate + + return content, tokensUsed, nil +} + +// GenerateTOM generates Technical and Organizational Measures +func (s *Service) GenerateTOM(ctx context.Context, context map[string]interface{}, ragSources []SearchResult) (string, int, error) { + if s.apiKey == "" { + return "", 0, fmt.Errorf("LLM not configured") + } + + content := s.generateTOMContent(context, ragSources) + tokensUsed := len(strings.Split(content, " ")) * 2 + + return content, tokensUsed, nil +} + +// GenerateVVT generates a Processing Activity Register +func (s *Service) GenerateVVT(ctx context.Context, context map[string]interface{}, ragSources []SearchResult) (string, int, error) { + if s.apiKey == "" { + return "", 0, fmt.Errorf("LLM not configured") + } + + content := s.generateVVTContent(context, ragSources) + tokensUsed := len(strings.Split(content, " ")) * 2 + + return content, tokensUsed, nil +} + +// GenerateGutachten generates an expert opinion/assessment +func (s *Service) GenerateGutachten(ctx context.Context, context map[string]interface{}, ragSources []SearchResult) (string, int, error) { + if s.apiKey == "" { + return "", 0, fmt.Errorf("LLM not configured") + } + + content := s.generateGutachtenContent(context, ragSources) + tokensUsed := len(strings.Split(content, " ")) * 2 + + return content, tokensUsed, nil +} + +// buildDSFAPrompt builds the prompt for DSFA generation +func (s *Service) buildDSFAPrompt(context map[string]interface{}, ragSources []SearchResult) string { + var sb strings.Builder + + sb.WriteString("Du bist ein Datenschutz-Experte und erstellst eine Datenschutz-Folgenabschätzung (DSFA) gemäß Art. 35 DSGVO.\n\n") + + // Add context + if useCaseName, ok := context["useCaseName"].(string); ok { + sb.WriteString(fmt.Sprintf("Use Case: %s\n", useCaseName)) + } + if description, ok := context["description"].(string); ok { + sb.WriteString(fmt.Sprintf("Beschreibung: %s\n", description)) + } + + // Add RAG context + if len(ragSources) > 0 { + sb.WriteString("\nRelevante rechtliche Grundlagen:\n") + for _, source := range ragSources { + sb.WriteString(fmt.Sprintf("- %s (%s)\n", source.Content[:min(200, len(source.Content))], source.Source)) + } + } + + sb.WriteString("\nErstelle eine vollständige DSFA mit allen erforderlichen Abschnitten.") + + return sb.String() +} + +// Content generation functions (would be replaced by actual LLM calls in production) +func (s *Service) generateDSFAContent(context map[string]interface{}, ragSources []SearchResult) string { + useCaseName := "KI-gestützte Datenverarbeitung" + if name, ok := context["useCaseName"].(string); ok { + useCaseName = name + } + + return fmt.Sprintf(`# Datenschutz-Folgenabschätzung (DSFA) + +## Use Case: %s + +## 1. Systematische Beschreibung der Verarbeitungsvorgänge + +Die geplante Verarbeitung umfasst die Analyse von Daten mittels KI-gestützter Systeme. + +### 1.1 Verarbeitungszwecke +- Automatisierte Analyse und Verarbeitung +- Optimierung von Geschäftsprozessen +- Qualitätssicherung + +### 1.2 Rechtsgrundlage +Gemäß Art. 6 Abs. 1 lit. f DSGVO basiert die Verarbeitung auf dem berechtigten Interesse des Verantwortlichen. + +### 1.3 Kategorien verarbeiteter Daten +- Nutzungsdaten +- Metadaten +- Aggregierte Analysedaten + +## 2. Bewertung der Notwendigkeit und Verhältnismäßigkeit + +### 2.1 Notwendigkeit +Die Verarbeitung ist erforderlich, um die definierten Geschäftsziele zu erreichen. + +### 2.2 Verhältnismäßigkeit +Alternative Methoden wurden geprüft. Die gewählte Verarbeitungsmethode stellt den geringsten Eingriff bei gleichem Nutzen dar. + +## 3. Risikobewertung + +### 3.1 Identifizierte Risiken + +| Risiko | Wahrscheinlichkeit | Schwere | Gesamtbewertung | +|--------|-------------------|---------|-----------------| +| Unbefugter Zugriff | Mittel | Hoch | HOCH | +| Datenverlust | Niedrig | Hoch | MITTEL | +| Fehlinterpretation | Mittel | Mittel | MITTEL | + +### 3.2 Maßnahmen zur Risikominderung + +1. **Technische Maßnahmen** + - Verschlüsselung (AES-256) + - Zugriffskontrollen + - Audit-Logging + +2. **Organisatorische Maßnahmen** + - Schulungen + - Dokumentation + - Regelmäßige Überprüfungen + +## 4. Genehmigungsstatus + +| Rolle | Status | Datum | +|-------|--------|-------| +| Projektleiter | AUSSTEHEND | - | +| DSB | AUSSTEHEND | - | +| Geschäftsführung | AUSSTEHEND | - | + +--- +*Generiert mit KI-Unterstützung. Manuelle Überprüfung erforderlich.* +`, useCaseName) +} + +func (s *Service) generateTOMContent(context map[string]interface{}, ragSources []SearchResult) string { + return `# Technische und Organisatorische Maßnahmen (TOMs) + +## 1. Vertraulichkeit (Art. 32 Abs. 1 lit. b DSGVO) + +### 1.1 Zutrittskontrolle +- [ ] Alarmanlage installiert +- [ ] Chipkarten-System aktiv +- [ ] Besucherprotokoll geführt + +### 1.2 Zugangskontrolle +- [ ] Starke Passwort-Policy (12+ Zeichen) +- [ ] MFA aktiviert +- [ ] Automatische Bildschirmsperre + +### 1.3 Zugriffskontrolle +- [ ] Rollenbasierte Berechtigungen +- [ ] Need-to-know Prinzip +- [ ] Quartalsweise Berechtigungsüberprüfung + +## 2. Integrität (Art. 32 Abs. 1 lit. b DSGVO) + +### 2.1 Weitergabekontrolle +- [ ] TLS 1.3 für alle Übertragungen +- [ ] E-Mail-Verschlüsselung +- [ ] Sichere File-Transfer-Protokolle + +### 2.2 Eingabekontrolle +- [ ] Vollständiges Audit-Logging +- [ ] Benutzeridentifikation bei Änderungen +- [ ] Unveränderliche Protokolle + +## 3. Verfügbarkeit (Art. 32 Abs. 1 lit. c DSGVO) + +### 3.1 Verfügbarkeitskontrolle +- [ ] Tägliche Backups +- [ ] Georedundante Speicherung +- [ ] USV-System +- [ ] Dokumentierter Notfallplan + +### 3.2 Wiederherstellung +- [ ] RPO: 1 Stunde +- [ ] RTO: 4 Stunden +- [ ] Jährliche Wiederherstellungstests + +## 4. Belastbarkeit + +- [ ] DDoS-Schutz implementiert +- [ ] Lastverteilung aktiv +- [ ] Skalierbare Infrastruktur + +--- +*Generiert mit KI-Unterstützung. Manuelle Überprüfung erforderlich.* +` +} + +func (s *Service) generateVVTContent(context map[string]interface{}, ragSources []SearchResult) string { + return `# Verzeichnis der Verarbeitungstätigkeiten (Art. 30 DSGVO) + +## Verarbeitungstätigkeit Nr. 1 + +### Stammdaten + +| Feld | Wert | +|------|------| +| **Bezeichnung** | KI-gestützte Datenanalyse | +| **Verantwortlicher** | [Unternehmen] | +| **DSB** | [Name, Kontakt] | +| **Abteilung** | IT / Data Science | + +### Verarbeitungsdetails + +| Feld | Wert | +|------|------| +| **Zweck** | Optimierung von Geschäftsprozessen durch KI-Analyse | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. f DSGVO | +| **Betroffene Kategorien** | Kunden, Mitarbeiter, Geschäftspartner | +| **Datenkategorien** | Nutzungsdaten, Metadaten, Analyseergebnisse | + +### Empfänger + +| Kategorie | Beispiele | +|-----------|-----------| +| Intern | IT-Abteilung, Management | +| Auftragsverarbeiter | Cloud-Provider (mit AVV) | +| Dritte | Keine | + +### Drittlandtransfer + +| Frage | Antwort | +|-------|---------| +| Übermittlung in Drittländer? | Nein / Ja | +| Falls ja, Garantien | [Standardvertragsklauseln / Angemessenheitsbeschluss] | + +### Löschfristen + +| Datenkategorie | Frist | Grundlage | +|----------------|-------|-----------| +| Nutzungsdaten | 12 Monate | Betriebliche Notwendigkeit | +| Analyseergebnisse | 36 Monate | Geschäftszweck | +| Audit-Logs | 10 Jahre | Handelsrechtlich | + +### Technisch-Organisatorische Maßnahmen + +Verweis auf TOM-Dokument Version 1.0 + +--- +*Generiert mit KI-Unterstützung. Manuelle Überprüfung erforderlich.* +` +} + +func (s *Service) generateGutachtenContent(context map[string]interface{}, ragSources []SearchResult) string { + return `# Compliance-Gutachten + +## Management Summary + +Das geprüfte System erfüllt die wesentlichen Anforderungen der anwendbaren Regulierungen. Es bestehen Optimierungspotenziale, die priorisiert adressiert werden sollten. + +## 1. Prüfungsumfang + +### 1.1 Geprüfte Regulierungen +- DSGVO (EU 2016/679) +- AI Act (EU 2024/...) +- NIS2 (EU 2022/2555) + +### 1.2 Prüfungsmethodik +- Dokumentenprüfung +- Technische Analyse +- Interviews mit Stakeholdern + +## 2. Ergebnisse + +### 2.1 DSGVO-Konformität + +| Bereich | Bewertung | Handlungsbedarf | +|---------|-----------|-----------------| +| Rechtmäßigkeit | ✓ Erfüllt | Gering | +| Transparenz | ◐ Teilweise | Mittel | +| Datensicherheit | ✓ Erfüllt | Gering | +| Betroffenenrechte | ◐ Teilweise | Mittel | + +### 2.2 AI Act-Konformität + +| Bereich | Bewertung | Handlungsbedarf | +|---------|-----------|-----------------| +| Risikoklassifizierung | ✓ Erfüllt | Keiner | +| Dokumentation | ◐ Teilweise | Mittel | +| Human Oversight | ✓ Erfüllt | Gering | + +### 2.3 NIS2-Konformität + +| Bereich | Bewertung | Handlungsbedarf | +|---------|-----------|-----------------| +| Risikomanagement | ✓ Erfüllt | Gering | +| Incident Reporting | ◐ Teilweise | Hoch | +| Supply Chain | ○ Nicht erfüllt | Kritisch | + +## 3. Empfehlungen + +### Kritisch (sofort) +1. Supply-Chain-Risikomanagement implementieren +2. Incident-Reporting-Prozess etablieren + +### Hoch (< 3 Monate) +3. Transparenzdokumentation vervollständigen +4. Betroffenenrechte-Portal optimieren + +### Mittel (< 6 Monate) +5. AI Act Dokumentation erweitern +6. Schulungsmaßnahmen durchführen + +## 4. Fazit + +Das System zeigt einen guten Compliance-Stand mit klar definierten Verbesserungsbereichen. Bei Umsetzung der Empfehlungen ist eine vollständige Konformität erreichbar. + +--- +*Erstellt: [Datum]* +*Gutachter: [Name]* +*Version: 1.0* +` +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/admin-lehrer/ai-compliance-sdk/internal/rag/service.go b/admin-lehrer/ai-compliance-sdk/internal/rag/service.go new file mode 100644 index 0000000..1366094 --- /dev/null +++ b/admin-lehrer/ai-compliance-sdk/internal/rag/service.go @@ -0,0 +1,208 @@ +package rag + +import ( + "context" + "fmt" +) + +// SearchResult represents a search result from the RAG system +type SearchResult struct { + ID string `json:"id"` + Content string `json:"content"` + Source string `json:"source"` + Score float64 `json:"score"` + Metadata map[string]string `json:"metadata,omitempty"` +} + +// CorpusStatus represents the status of the legal corpus +type CorpusStatus struct { + Status string `json:"status"` + Collections []string `json:"collections"` + Documents int `json:"documents"` + LastUpdated string `json:"lastUpdated,omitempty"` +} + +// Service provides RAG functionality +type Service struct { + qdrantURL string + // client *qdrant.Client // Would be actual Qdrant client in production +} + +// NewService creates a new RAG service +func NewService(qdrantURL string) (*Service, error) { + if qdrantURL == "" { + return nil, fmt.Errorf("qdrant URL is required") + } + + // In production, this would initialize the Qdrant client + // client, err := qdrant.NewClient(qdrantURL) + // if err != nil { + // return nil, err + // } + + return &Service{ + qdrantURL: qdrantURL, + }, nil +} + +// Search performs semantic search on the legal corpus +func (s *Service) Search(ctx context.Context, query string, topK int, collection string, filter string) ([]SearchResult, error) { + // In production, this would: + // 1. Generate embedding for the query using an embedding model (e.g., BGE-M3) + // 2. Search Qdrant for similar vectors + // 3. Return the results + + // For now, return mock results that simulate a real RAG response + results := s.getMockSearchResults(query, topK) + return results, nil +} + +// GetCorpusStatus returns the status of the legal corpus +func (s *Service) GetCorpusStatus(ctx context.Context) (*CorpusStatus, error) { + // In production, this would query Qdrant for collection info + return &CorpusStatus{ + Status: "ready", + Collections: []string{ + "legal_corpus", + "dsgvo_articles", + "ai_act_articles", + "nis2_articles", + }, + Documents: 1500, + LastUpdated: "2026-02-01T00:00:00Z", + }, nil +} + +// IndexDocument indexes a new document into the corpus +func (s *Service) IndexDocument(ctx context.Context, collection string, id string, content string, metadata map[string]string) error { + // In production, this would: + // 1. Generate embedding for the content + // 2. Store in Qdrant with the embedding and metadata + return nil +} + +// getMockSearchResults returns mock search results for development +func (s *Service) getMockSearchResults(query string, topK int) []SearchResult { + // Comprehensive mock data for legal searches + allResults := []SearchResult{ + // DSGVO Articles + { + ID: "dsgvo-art-5", + Content: "Art. 5 DSGVO - Grundsätze für die Verarbeitung personenbezogener Daten\n\n(1) Personenbezogene Daten müssen:\na) auf rechtmäßige Weise, nach Treu und Glauben und in einer für die betroffene Person nachvollziehbaren Weise verarbeitet werden („Rechtmäßigkeit, Verarbeitung nach Treu und Glauben, Transparenz");\nb) für festgelegte, eindeutige und legitime Zwecke erhoben werden und dürfen nicht in einer mit diesen Zwecken nicht zu vereinbarenden Weise weiterverarbeitet werden („Zweckbindung");\nc) dem Zweck angemessen und erheblich sowie auf das für die Zwecke der Verarbeitung notwendige Maß beschränkt sein („Datenminimierung");", + Source: "DSGVO", + Score: 0.95, + Metadata: map[string]string{ + "article": "5", + "regulation": "DSGVO", + "category": "grundsaetze", + }, + }, + { + ID: "dsgvo-art-6", + Content: "Art. 6 DSGVO - Rechtmäßigkeit der Verarbeitung\n\n(1) Die Verarbeitung ist nur rechtmäßig, wenn mindestens eine der nachstehenden Bedingungen erfüllt ist:\na) Die betroffene Person hat ihre Einwilligung zu der Verarbeitung der sie betreffenden personenbezogenen Daten für einen oder mehrere bestimmte Zwecke gegeben;\nb) die Verarbeitung ist für die Erfüllung eines Vertrags erforderlich;\nc) die Verarbeitung ist zur Erfüllung einer rechtlichen Verpflichtung erforderlich;", + Source: "DSGVO", + Score: 0.92, + Metadata: map[string]string{ + "article": "6", + "regulation": "DSGVO", + "category": "rechtsgrundlage", + }, + }, + { + ID: "dsgvo-art-30", + Content: "Art. 30 DSGVO - Verzeichnis von Verarbeitungstätigkeiten\n\n(1) Jeder Verantwortliche und gegebenenfalls sein Vertreter führen ein Verzeichnis aller Verarbeitungstätigkeiten, die ihrer Zuständigkeit unterliegen. Dieses Verzeichnis enthält sämtliche folgenden Angaben:\na) den Namen und die Kontaktdaten des Verantwortlichen;\nb) die Zwecke der Verarbeitung;\nc) eine Beschreibung der Kategorien betroffener Personen und der Kategorien personenbezogener Daten;", + Source: "DSGVO", + Score: 0.89, + Metadata: map[string]string{ + "article": "30", + "regulation": "DSGVO", + "category": "dokumentation", + }, + }, + { + ID: "dsgvo-art-32", + Content: "Art. 32 DSGVO - Sicherheit der Verarbeitung\n\n(1) Unter Berücksichtigung des Stands der Technik, der Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeit und Schwere des Risikos für die Rechte und Freiheiten natürlicher Personen treffen der Verantwortliche und der Auftragsverarbeiter geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes Schutzniveau zu gewährleisten.", + Source: "DSGVO", + Score: 0.88, + Metadata: map[string]string{ + "article": "32", + "regulation": "DSGVO", + "category": "sicherheit", + }, + }, + { + ID: "dsgvo-art-35", + Content: "Art. 35 DSGVO - Datenschutz-Folgenabschätzung\n\n(1) Hat eine Form der Verarbeitung, insbesondere bei Verwendung neuer Technologien, aufgrund der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung voraussichtlich ein hohes Risiko für die Rechte und Freiheiten natürlicher Personen zur Folge, so führt der Verantwortliche vorab eine Abschätzung der Folgen der vorgesehenen Verarbeitungsvorgänge für den Schutz personenbezogener Daten durch.", + Source: "DSGVO", + Score: 0.87, + Metadata: map[string]string{ + "article": "35", + "regulation": "DSGVO", + "category": "dsfa", + }, + }, + // AI Act Articles + { + ID: "ai-act-art-6", + Content: "Art. 6 AI Act - Klassifizierungsregeln für Hochrisiko-KI-Systeme\n\n(1) Unbeschadet des Absatzes 2 gilt ein KI-System als Hochrisiko-KI-System, wenn es beide der folgenden Bedingungen erfüllt:\na) das KI-System soll als Sicherheitskomponente eines unter die in Anhang II aufgeführten Harmonisierungsrechtsvorschriften der Union fallenden Produkts verwendet werden oder ist selbst ein solches Produkt;\nb) das Produkt, dessen Sicherheitskomponente das KI-System ist, oder das KI-System selbst muss einer Konformitätsbewertung durch Dritte unterzogen werden.", + Source: "AI Act", + Score: 0.91, + Metadata: map[string]string{ + "article": "6", + "regulation": "AI_ACT", + "category": "klassifizierung", + }, + }, + { + ID: "ai-act-art-9", + Content: "Art. 9 AI Act - Risikomanagement\n\n(1) Für Hochrisiko-KI-Systeme wird ein Risikomanagementsystem eingerichtet, umgesetzt, dokumentiert und aufrechterhalten. Das Risikomanagementsystem ist ein kontinuierlicher iterativer Prozess, der während des gesamten Lebenszyklus eines Hochrisiko-KI-Systems geplant und durchgeführt wird und einer regelmäßigen systematischen Aktualisierung bedarf.", + Source: "AI Act", + Score: 0.85, + Metadata: map[string]string{ + "article": "9", + "regulation": "AI_ACT", + "category": "risikomanagement", + }, + }, + { + ID: "ai-act-art-52", + Content: "Art. 52 AI Act - Transparenzpflichten für bestimmte KI-Systeme\n\n(1) Die Anbieter stellen sicher, dass KI-Systeme, die für die Interaktion mit natürlichen Personen bestimmt sind, so konzipiert und entwickelt werden, dass die betreffenden natürlichen Personen darüber informiert werden, dass sie mit einem KI-System interagieren, es sei denn, dies ist aus den Umständen und dem Nutzungskontext offensichtlich.", + Source: "AI Act", + Score: 0.83, + Metadata: map[string]string{ + "article": "52", + "regulation": "AI_ACT", + "category": "transparenz", + }, + }, + // NIS2 Articles + { + ID: "nis2-art-21", + Content: "Art. 21 NIS2 - Risikomanagementmaßnahmen im Bereich der Cybersicherheit\n\n(1) Die Mitgliedstaaten stellen sicher, dass wesentliche und wichtige Einrichtungen geeignete und verhältnismäßige technische, operative und organisatorische Maßnahmen ergreifen, um die Risiken für die Sicherheit der Netz- und Informationssysteme, die diese Einrichtungen für ihren Betrieb oder die Erbringung ihrer Dienste nutzen, zu beherrschen und die Auswirkungen von Sicherheitsvorfällen auf die Empfänger ihrer Dienste und auf andere Dienste zu verhindern oder möglichst gering zu halten.", + Source: "NIS2", + Score: 0.86, + Metadata: map[string]string{ + "article": "21", + "regulation": "NIS2", + "category": "risikomanagement", + }, + }, + { + ID: "nis2-art-23", + Content: "Art. 23 NIS2 - Meldepflichten\n\n(1) Jeder Mitgliedstaat stellt sicher, dass wesentliche und wichtige Einrichtungen jeden Sicherheitsvorfall, der erhebliche Auswirkungen auf die Erbringung ihrer Dienste hat, unverzüglich dem zuständigen CSIRT oder gegebenenfalls der zuständigen Behörde melden.", + Source: "NIS2", + Score: 0.81, + Metadata: map[string]string{ + "article": "23", + "regulation": "NIS2", + "category": "meldepflicht", + }, + }, + } + + // Return top K results + if topK > len(allResults) { + topK = len(allResults) + } + return allResults[:topK] +} diff --git a/admin-lehrer/app/(admin)/ai/agents/[agentId]/page.tsx b/admin-lehrer/app/(admin)/ai/agents/[agentId]/page.tsx new file mode 100644 index 0000000..cc65ef6 --- /dev/null +++ b/admin-lehrer/app/(admin)/ai/agents/[agentId]/page.tsx @@ -0,0 +1,682 @@ +'use client' + +import { useState, useEffect } from 'react' +import { useParams, useRouter } from 'next/navigation' +import Link from 'next/link' +import { Bot, Brain, ArrowLeft, Save, RotateCcw, Play, Pause, AlertTriangle, FileText, Settings, Activity, Clock, CheckCircle, XCircle, History, Eye, Edit3 } from 'lucide-react' + +// Types +interface AgentDetail { + id: string + name: string + description: string + soulFile: string + soulContent: string + color: string + status: 'running' | 'paused' | 'stopped' | 'error' + activeSessions: number + totalProcessed: number + avgResponseTime: number + errorRate: number + lastRestart: string + version: string + createdAt: string + updatedAt: string +} + +interface ChangeLog { + id: string + timestamp: string + user: string + action: string + description: string +} + +// Mock data +const mockAgentDetails: Record = { + 'tutor-agent': { + id: 'tutor-agent', + name: 'TutorAgent', + description: 'Geduldiger, ermutigender Lernbegleiter fuer Schueler', + soulFile: 'tutor-agent.soul.md', + soulContent: `# TutorAgent SOUL + +## Identitaet +Du bist ein geduldiger, ermutigender Lernbegleiter fuer Schueler. +Dein Ziel ist es, Verstaendnis zu foerdern, nicht Antworten vorzugeben. + +## Kernprinzipien +- **Sokratische Methode**: Stelle Fragen, die zum Nachdenken anregen +- **Positives Reinforcement**: Erkenne und feiere Lernfortschritte +- **Adaptive Kommunikation**: Passe Sprache und Komplexitaet an das Niveau an +- **Geduld**: Wiederhole Erklaerungen ohne Frustration zu zeigen + +## Kommunikationsstil +- Verwende einfache, klare Sprache +- Stelle Rueckfragen, um Verstaendnis zu pruefen +- Gib Hinweise statt direkter Loesungen +- Feiere kleine Erfolge +- Nutze Analogien und Beispiele aus dem Alltag +- Strukturiere komplexe Themen in verdauliche Schritte + +## Fachgebiete +- Mathematik (Grundschule bis Abitur) +- Naturwissenschaften (Physik, Chemie, Biologie) +- Sprachen (Deutsch, Englisch) +- Gesellschaftswissenschaften (Geschichte, Politik) + +## Lernstrategien +1. **Konzeptbasiertes Lernen**: Erklaere das "Warum" hinter Regeln +2. **Visualisierung**: Nutze Diagramme und Skizzen wenn moeglich +3. **Verbindungen herstellen**: Verknuepfe neues Wissen mit Bekanntem +4. **Wiederholung**: Baue systematische Wiederholung ein +5. **Selbsttest**: Ermutige zur Selbstueberpruefung + +## Einschraenkungen +- Gib NIEMALS vollstaendige Loesungen fuer Hausaufgaben +- Verweise bei komplexen Themen auf Lehrkraefte +- Erkenne Frustration und biete Pausen an +- Keine Unterstuetzung bei Pruefungsbetrug +- Keine medizinischen oder rechtlichen Ratschlaege + +## Eskalation +- Bei wiederholtem Unverstaendnis: Schlage alternatives Erklaerformat vor +- Bei emotionaler Belastung: Empfehle Gespraech mit Vertrauensperson +- Bei technischen Problemen: Eskaliere an Support +- Bei Verdacht auf Lernschwierigkeiten: Empfehle professionelle Diagnostik + +## Metrik-Ziele +- Verstaendnis-Score > 80% bei Nachfragen +- Engagement-Zeit > 5 Minuten pro Session +- Wiederbesuchs-Rate > 60% +- Frustrations-Indikatoren < 10%`, + color: '#3b82f6', + status: 'running', + activeSessions: 12, + totalProcessed: 1847, + avgResponseTime: 234, + errorRate: 0.5, + lastRestart: '2025-01-14T08:30:00Z', + version: '1.2.0', + createdAt: '2024-11-01T00:00:00Z', + updatedAt: '2025-01-14T10:15:00Z' + }, + 'grader-agent': { + id: 'grader-agent', + name: 'GraderAgent', + description: 'Objektiver, fairer Pruefer von Schuelerarbeiten', + soulFile: 'grader-agent.soul.md', + soulContent: `# GraderAgent SOUL + +## Identitaet +Du bist ein objektiver, fairer Pruefer von Schuelerarbeiten. +Dein Ziel ist konstruktives Feedback, das zum Lernen motiviert. + +## Kernprinzipien +- **Objektivitaet**: Bewerte nach festgelegten Kriterien, nicht nach Sympathie +- **Fairness**: Gleiche Massstaebe fuer alle Schueler +- **Konstruktivitaet**: Feedback soll zum Lernen anregen +- **Transparenz**: Begruende jede Bewertung nachvollziehbar + +## Bewertungsprinzipien +- Bewerte nach festgelegten Kriterien (Erwartungshorizont) +- Beruecksichtige Teilleistungen +- Unterscheide zwischen Fluechtigkeitsfehlern und Verstaendnisluecken +- Formuliere Feedback lernfoerdernd +- Nutze das 15-Punkte-System korrekt (0-15 Punkte, 5 = ausreichend) + +## Workflow +1. Lies die Aufgabenstellung und den Erwartungshorizont +2. Analysiere die Schuelerantwort systematisch +3. Identifiziere korrekte Elemente +4. Identifiziere Fehler mit Kategorisierung +5. Vergebe Punkte nach Kriterienkatalog +6. Formuliere konstruktives Feedback + +## Fehlerkategorien +- **Rechtschreibung (R)**: Orthografische Fehler +- **Grammatik (Gr)**: Grammatikalische Fehler +- **Ausdruck (A)**: Stilistische Schwaechen +- **Inhalt (I)**: Fachliche Fehler oder Luecken +- **Struktur (St)**: Aufbau- und Gliederungsprobleme +- **Logik (L)**: Argumentationsfehler + +## Qualitaetssicherung +- Bei Unsicherheit: Markiere zur manuellen Ueberpruefung +- Bei Grenzfaellen: Dokumentiere Entscheidungsgrundlage +- Konsistenz: Vergleiche mit aehnlichen Bewertungen +- Kalibrierung: Orientiere an Vergleichsarbeiten + +## Eskalation +- Unleserliche Antworten: Markiere fuer manuelles Review +- Verdacht auf Plagiat: Eskaliere an Lehrkraft +- Technische Fehler: Pausiere und melde +- Unklare Aufgabenstellung: Frage nach Klarstellung`, + color: '#10b981', + status: 'running', + activeSessions: 3, + totalProcessed: 456, + avgResponseTime: 1205, + errorRate: 1.2, + lastRestart: '2025-01-13T14:00:00Z', + version: '1.1.0', + createdAt: '2024-11-01T00:00:00Z', + updatedAt: '2025-01-13T16:30:00Z' + }, + 'quality-judge': { + id: 'quality-judge', + name: 'QualityJudge', + description: 'Kritischer Qualitaetspruefer fuer KI-generierte Inhalte', + soulFile: 'quality-judge.soul.md', + soulContent: `# QualityJudge SOUL + +## Identitaet +Du bist ein kritischer Qualitaetspruefer fuer KI-generierte Inhalte. +Dein Ziel ist die Sicherstellung hoher Qualitaetsstandards. + +## Bewertungsdimensionen + +### 1. Intent Accuracy (0-100) +- Wurde die Benutzerabsicht korrekt erkannt? +- Stimmt die Kategorie der Antwort? + +### 2. Faithfulness (1-5) +- **5**: Vollstaendig faktisch korrekt +- **4**: Minor Ungenauigkeiten ohne Auswirkung +- **3**: Einige Ungenauigkeiten, Kernaussage korrekt +- **2**: Signifikante Fehler +- **1**: Grundlegend falsch + +### 3. Relevance (1-5) +- **5**: Direkt und vollstaendig relevant +- **4**: Weitgehend relevant +- **3**: Teilweise relevant +- **2**: Geringe Relevanz +- **1**: Voellig irrelevant + +### 4. Coherence (1-5) +- **5**: Perfekt strukturiert und logisch +- **4**: Gut strukturiert, kleine Luecken +- **3**: Verstaendlich, aber verbesserungsfaehig +- **2**: Schwer zu folgen +- **1**: Unverstaendlich/chaotisch + +### 5. Safety ("pass"/"fail") +- Keine DSGVO-Verstoesse (keine PII) +- Keine schaedlichen Inhalte +- Keine Desinformation +- Keine Diskriminierung +- Altersgerechte Sprache + +## Schwellenwerte +- **Production Ready**: composite >= 80 +- **Needs Review**: 60 <= composite < 80 +- **Failed**: composite < 60`, + color: '#f59e0b', + status: 'running', + activeSessions: 8, + totalProcessed: 3291, + avgResponseTime: 89, + errorRate: 0.3, + lastRestart: '2025-01-14T06:00:00Z', + version: '2.0.0', + createdAt: '2024-10-15T00:00:00Z', + updatedAt: '2025-01-14T08:00:00Z' + }, + 'alert-agent': { + id: 'alert-agent', + name: 'AlertAgent', + description: 'Aufmerksamer Waechter fuer das Breakpilot-System', + soulFile: 'alert-agent.soul.md', + soulContent: `# AlertAgent SOUL + +## Identitaet +Du bist ein aufmerksamer Waechter fuer das Breakpilot-System. +Dein Ziel ist die rechtzeitige Erkennung und Kommunikation relevanter Ereignisse. + +## Importance Levels + +### KRITISCH (5) +- Systemausfaelle +- Sicherheitsvorfaelle +- DSGVO-Verstoesse +**Aktion**: Sofortige Benachrichtigung aller Admins + +### DRINGEND (4) +- Performance-Probleme +- API-Ausfaelle +- Hohe Fehlerraten +**Aktion**: Benachrichtigung innerhalb 5 Minuten + +### WICHTIG (3) +- Neue kritische Nachrichten +- Relevante Bildungspolitik +- Technische Warnungen +**Aktion**: Taeglicher Digest + +### PRUEFEN (2) +- Interessante Entwicklungen +- Konkurrenznachrichten +**Aktion**: Woechentlicher Digest + +### INFO (1) +- Allgemeine Updates +**Aktion**: Archivieren`, + color: '#ef4444', + status: 'running', + activeSessions: 1, + totalProcessed: 892, + avgResponseTime: 45, + errorRate: 0.1, + lastRestart: '2025-01-12T00:00:00Z', + version: '1.0.0', + createdAt: '2024-12-01T00:00:00Z', + updatedAt: '2025-01-12T02:00:00Z' + }, + 'compliance-advisor': { + id: 'compliance-advisor', + name: 'Compliance Advisor', + description: 'DSGVO/Compliance-Berater fuer SDK-Nutzer', + soulFile: 'compliance-advisor.soul.md', + soulContent: `# Compliance Advisor Agent + +## Identitaet +Du bist der BreakPilot Compliance-Berater. Du hilfst Nutzern des AI Compliance SDK, +Datenschutz- und Compliance-Fragen in verstaendlicher Sprache zu beantworten. +Du bist kein Anwalt und gibst keine Rechtsberatung, sondern orientierst dich an +offiziellen Quellen und gibst praxisnahe Hinweise. + +## Kernprinzipien +- **Quellenbasiert**: Verweise immer auf konkrete Rechtsgrundlagen (DSGVO-Artikel, BDSG-Paragraphen) +- **Verstaendlich**: Erklaere rechtliche Konzepte in einfacher, praxisnaher Sprache +- **Ehrlich**: Bei Unsicherheit empfehle professionelle Rechtsberatung +- **Kontextbewusst**: Nutze das RAG-System fuer aktuelle Rechtstexte und Leitfaeden +- **Scope-bewusst**: Nutze alle verfuegbaren RAG-Quellen AUSSER NIBIS-Dokumenten + +## Kompetenzbereich +- DSGVO Art. 1-99 + Erwaegsgruende +- BDSG (Bundesdatenschutzgesetz) +- AI Act (EU KI-Verordnung) +- TTDSG, ePrivacy-Richtlinie +- DSK-Kurzpapiere (Nr. 1-20) +- SDM V3.0, BSI-Grundschutz, BSI-TR-03161 +- EDPB Guidelines, Bundes-/Laender-Muss-Listen +- ISO 27001/27701 (Ueberblick) + +## Kommunikationsstil +- Sachlich, aber verstaendlich +- Deutsch als Hauptsprache +- Strukturierte Antworten mit Quellenangabe +- Praxisbeispiele wo hilfreich`, + color: '#6366f1', + status: 'running', + activeSessions: 0, + totalProcessed: 0, + avgResponseTime: 0, + errorRate: 0, + lastRestart: new Date().toISOString(), + version: '1.0.0', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }, + 'orchestrator': { + id: 'orchestrator', + name: 'Orchestrator', + description: 'Zentraler Koordinator des Multi-Agent-Systems', + soulFile: 'orchestrator.soul.md', + soulContent: `# OrchestratorAgent SOUL + +## Identitaet +Du bist der zentrale Koordinator des Breakpilot Multi-Agent-Systems. +Dein Ziel ist die effiziente Verteilung und Ueberwachung von Aufgaben. + +## Kernprinzipien +- **Effizienz**: Minimale Latenz bei maximaler Qualitaet +- **Resilienz**: Graceful Degradation bei Agent-Ausfaellen +- **Fairness**: Ausgewogene Lastverteilung +- **Transparenz**: Volle Nachvollziehbarkeit aller Entscheidungen + +## Verantwortlichkeiten +1. Task-Routing zu spezialisierten Agents +2. Session-Management und Recovery +3. Agent-Gesundheitsueberwachung +4. Lastverteilung +5. Fehlerbehandlung und Retry-Logik + +## Task-Routing-Logik + +| Intent-Kategorie | Primaerer Agent | Fallback | +|------------------|-----------------|----------| +| learning_support | TutorAgent | Manuell | +| exam_grading | GraderAgent | QualityJudge | +| quality_check | QualityJudge | Manual Review | +| system_alert | AlertAgent | E-Mail Fallback | + +## Fehlerbehandlung + +### Retry-Policy +- **Max Retries**: 3 +- **Backoff**: Exponential (1s, 2s, 4s) +- **Keine Retries**: Validation Errors, Auth Failures + +### Circuit Breaker +- **Threshold**: 5 Fehler in 60 Sekunden +- **Cooldown**: 30 Sekunden + +## Metriken +- **Task Completion Rate**: > 99% +- **Average Latency**: < 2s +- **Error Rate**: < 1%`, + color: '#8b5cf6', + status: 'running', + activeSessions: 24, + totalProcessed: 8934, + avgResponseTime: 12, + errorRate: 0.2, + lastRestart: '2025-01-14T00:00:00Z', + version: '1.5.0', + createdAt: '2024-10-01T00:00:00Z', + updatedAt: '2025-01-14T00:30:00Z' + } +} + +const mockChangeLogs: ChangeLog[] = [ + { id: '1', timestamp: '2025-01-14T10:15:00Z', user: 'admin@breakpilot.de', action: 'SOUL Updated', description: 'Kommunikationsstil angepasst' }, + { id: '2', timestamp: '2025-01-13T14:30:00Z', user: 'lehrer1@schule.de', action: 'Einschraenkung hinzugefuegt', description: 'Keine Hausaufgaben-Loesungen' }, + { id: '3', timestamp: '2025-01-10T09:00:00Z', user: 'admin@breakpilot.de', action: 'Version 1.2.0', description: 'Neue Fachgebiete hinzugefuegt' }, +] + +export default function AgentDetailPage() { + const params = useParams() + const router = useRouter() + const agentId = params.agentId as string + + const [agent, setAgent] = useState(null) + const [editedContent, setEditedContent] = useState('') + const [isEditing, setIsEditing] = useState(false) + const [hasChanges, setHasChanges] = useState(false) + const [saving, setSaving] = useState(false) + const [activeTab, setActiveTab] = useState<'soul' | 'stats' | 'history'>('soul') + + useEffect(() => { + // Load agent data + const agentData = mockAgentDetails[agentId] + if (agentData) { + setAgent(agentData) + setEditedContent(agentData.soulContent) + } + }, [agentId]) + + const handleSave = async () => { + setSaving(true) + // In production, save to API + // await fetch(`/api/admin/agents/${agentId}/soul`, { method: 'PUT', body: editedContent }) + await new Promise(resolve => setTimeout(resolve, 1000)) + + if (agent) { + setAgent({ ...agent, soulContent: editedContent, updatedAt: new Date().toISOString() }) + } + setHasChanges(false) + setIsEditing(false) + setSaving(false) + } + + const handleReset = () => { + if (agent) { + setEditedContent(agent.soulContent) + setHasChanges(false) + } + } + + const handleContentChange = (content: string) => { + setEditedContent(content) + setHasChanges(content !== agent?.soulContent) + } + + if (!agent) { + return ( +
+
+ +

Agent nicht gefunden

+

Der Agent "{agentId}" existiert nicht.

+ + ← Zurueck zur Uebersicht + +
+
+ ) + } + + return ( +
+ {/* Header */} +
+
+ + + +
+ +
+
+

{agent.name}

+

{agent.description}

+
+
+ +
+
+ {agent.status === 'running' ? : + agent.status === 'paused' ? : + } + {agent.status} +
+ +
+
+ + {/* Stats Bar */} +
+
+
Aktive Sessions
+
{agent.activeSessions}
+
+
+
Verarbeitet (24h)
+
{agent.totalProcessed.toLocaleString()}
+
+
+
Avg. Antwortzeit
+
{agent.avgResponseTime}ms
+
+
+
Fehlerrate
+
{agent.errorRate}%
+
+
+
Version
+
{agent.version}
+
+
+ + {/* Tabs */} +
+
+
+ + + +
+
+ + {/* Tab Content */} +
+ {activeTab === 'soul' && ( +
+
+
+ + {agent.soulFile} + | + + Zuletzt geaendert: {new Date(agent.updatedAt).toLocaleString('de-DE')} +
+
+ {isEditing ? ( + <> + + + + ) : ( + + )} +
+
+ + {hasChanges && ( +
+ + Ungespeicherte Aenderungen vorhanden +
+ )} + +
+ {isEditing ? ( +