diff --git a/.env.example b/.env.example index 1814d9f..82074eb 100644 --- a/.env.example +++ b/.env.example @@ -178,16 +178,16 @@ GIT_API_TOKEN=your-git-api-token # ============================================================================ # Enable detailed audit trail of AI decision-making -FORENSIC_AUDIT_ENABLED=true +PUBLIC_FORENSIC_AUDIT_ENABLED=true # Audit detail level: minimal, standard, verbose -FORENSIC_AUDIT_DETAIL_LEVEL=standard +PUBLIC_FORENSIC_AUDIT_DETAIL_LEVEL=standard # Audit retention time (hours) -FORENSIC_AUDIT_RETENTION_HOURS=24 +PUBLIC_FORENSIC_AUDIT_RETENTION_HOURS=24 # Maximum audit entries per request -FORENSIC_AUDIT_MAX_ENTRIES=50 +PUBLIC_FORENSIC_AUDIT_MAX_ENTRIES=50 # ============================================================================ # 10. SIMPLIFIED CONFIDENCE SCORING SYSTEM diff --git a/public/js/auditTrailRenderer.js b/public/js/auditTrailRenderer.js new file mode 100644 index 0000000..9aed45a --- /dev/null +++ b/public/js/auditTrailRenderer.js @@ -0,0 +1,389 @@ +// src/js/auditTrailRenderer.js + +import { auditService } from '../../src/utils/auditService.js'; + +export class AuditTrailRenderer { + constructor(containerId, options = {}) { + this.containerId = containerId; + this.options = { + title: options.title || 'KI-Entscheidungspfad', + collapsible: options.collapsible !== false, + defaultExpanded: options.defaultExpanded || false, + ...options + }; + this.componentId = `audit-trail-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`; + } + + /** + * Render audit trail from raw audit data + * FIXED: Proper Promise handling + */ + render(rawAuditTrail) { + const container = document.getElementById(this.containerId); + if (!container) { + console.error(`[AUDIT RENDERER] Container ${this.containerId} not found`); + return; + } + + if (!rawAuditTrail || !Array.isArray(rawAuditTrail) || rawAuditTrail.length === 0) { + this.renderEmpty(); + return; + } + + try { + console.log('[AUDIT RENDERER] Processing audit trail...', rawAuditTrail.length, 'entries'); + + // Process audit trail using the centralized service (synchronous) + const processedAudit = auditService.processAuditTrail(rawAuditTrail); + + console.log('[AUDIT RENDERER] Processed audit:', processedAudit); + + if (processedAudit && processedAudit.phases && processedAudit.phases.length > 0) { + this.renderProcessed(processedAudit); + // Attach event handlers after DOM is updated + setTimeout(() => this.attachEventHandlers(), 0); + } else { + console.warn('[AUDIT RENDERER] No processed audit data'); + this.renderEmpty(); + } + } catch (error) { + console.error('[AUDIT RENDERER] Failed to render audit trail:', error); + this.renderError(error); + } + } + /** + * Render processed audit trail + */ + renderProcessed(processedAudit) { + const container = document.getElementById(this.containerId); + if (!container) return; + + const detailsId = `${this.componentId}-details`; + + console.log('[AUDIT RENDERER] Rendering processed audit with', processedAudit.phases.length, 'phases'); + + container.innerHTML = ` +
Keine Phasen verfügbar
+ Fehler beim Laden der Audit-Informationen: ${this.escapeHtml(error.message)} +
+