"""Integrationsmodul – Verdrahtung aller Komponenten. Stellt eine Factory-Funktion bereit, die alle Monorepo-Komponenten mit korrekten Querverweisen erstellt und verdrahtet: - SecretEncryptionManager ↔ ContextGuard (load_env nutzt Entschlüsselung) - SecretEncryptionManager ↔ FederationManager (Team-Repos erhalten nur eigene Secrets) - SecretEncryptionManager ↔ OrchestratorAdapter (Env-Loading via Encryption) Requirements: 2.2, 9.3, 9.4, 10.10 """ from __future__ import annotations import logging from pathlib import Path from typing import Any from monorepo.audit import AuditLogger from monorepo.encryption import MachineContextManager, SecretEncryptionManager from monorepo.federation import FederationManager from monorepo.orchestrator import OrchestratorAdapter from monorepo.security import ContextGuard logger = logging.getLogger(__name__) def create_integrated_stack(root_path: Path) -> dict[str, Any]: """Erstellt alle Monorepo-Komponenten mit vollständiger Verdrahtung. Factory-Funktion die den gesamten Komponentenstack aufbaut, wobei der SecretEncryptionManager als zentrales Bindeglied zwischen ContextGuard, OrchestratorAdapter und FederationManager dient. Ablauf: 1. MachineContext laden (aus shared/config/machine-context.yaml) 2. SecretEncryptionManager erstellen 3. ContextGuard mit encryption_manager erstellen 4. AuditLogger erstellen 5. OrchestratorAdapter mit encryption_manager und context_guard erstellen 6. FederationManager mit encryption_manager erstellen Args: root_path: Wurzelverzeichnis des Monorepos (absoluter Pfad). Returns: Dict mit allen erstellten Komponenten: - "encryption_manager": SecretEncryptionManager - "context_guard": ContextGuard - "audit_logger": AuditLogger - "orchestrator_adapter": OrchestratorAdapter - "federation_manager": FederationManager (oder None wenn team-repos.yaml fehlt) - "machine_context_manager": MachineContextManager Raises: FileNotFoundError: Wenn essentielle Konfigurationsdateien fehlen (access-config.yaml muss existieren; machine-context.yaml ist optional, führt aber zu einem eingeschränkten Stack). """ root_path = root_path.resolve() # 1. MachineContext laden machine_ctx_manager = MachineContextManager(root_path) encryption_manager: SecretEncryptionManager | None = None try: machine_ctx_manager.load() encryption_manager = machine_ctx_manager.create_encryption_manager() logger.info( "SecretEncryptionManager erstellt für Maschine '%s' " "(autorisierte Kontexte: %s).", machine_ctx_manager.machine_context.name, machine_ctx_manager.machine_context.authorized_contexts, ) except FileNotFoundError: logger.warning( "machine-context.yaml nicht gefunden. " "Stack wird ohne Verschlüsselung erstellt." ) except ValueError as e: logger.warning( "machine-context.yaml ungültig: %s. " "Stack wird ohne Verschlüsselung erstellt.", e, ) # 2. ContextGuard mit optionalem encryption_manager erstellen context_guard = ContextGuard( root_path=root_path, encryption_manager=encryption_manager, ) logger.info("ContextGuard erstellt (encryption: %s).", encryption_manager is not None) # 3. AuditLogger erstellen audit_logger = AuditLogger(root_path / ".audit" / "access.log") # 4. OrchestratorAdapter mit encryption_manager verdrahten orchestrator_adapter = OrchestratorAdapter( root_path=root_path, context_guard=context_guard, audit_logger=audit_logger, encryption_manager=encryption_manager, ) logger.info("OrchestratorAdapter erstellt (encryption: %s).", encryption_manager is not None) # 5. FederationManager mit encryption_manager erstellen federation_manager: FederationManager | None = None team_repos_config_path = root_path / "shared" / "config" / "team-repos.yaml" if team_repos_config_path.exists(): try: federation_manager = FederationManager( config_path=team_repos_config_path, monorepo_root=root_path, encryption_manager=encryption_manager, ) logger.info( "FederationManager erstellt (encryption: %s).", encryption_manager is not None, ) except (FileNotFoundError, ValueError) as e: logger.warning( "FederationManager konnte nicht erstellt werden: %s", e ) else: logger.info( "team-repos.yaml nicht gefunden. FederationManager wird nicht erstellt." ) return { "encryption_manager": encryption_manager, "context_guard": context_guard, "audit_logger": audit_logger, "orchestrator_adapter": orchestrator_adapter, "federation_manager": federation_manager, "machine_context_manager": machine_ctx_manager, }