diff --git a/.astro/settings.json b/.astro/settings.json index 8f5d41e..9b63469 100644 --- a/.astro/settings.json +++ b/.astro/settings.json @@ -1,5 +1,5 @@ { "_variables": { - "lastUpdateCheck": 1753528124767 + "lastUpdateCheck": 1754571688630 } } \ No newline at end of file diff --git a/.env.example b/.env.example index 82074eb..1814d9f 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 -PUBLIC_FORENSIC_AUDIT_ENABLED=true +FORENSIC_AUDIT_ENABLED=true # Audit detail level: minimal, standard, verbose -PUBLIC_FORENSIC_AUDIT_DETAIL_LEVEL=standard +FORENSIC_AUDIT_DETAIL_LEVEL=standard # Audit retention time (hours) -PUBLIC_FORENSIC_AUDIT_RETENTION_HOURS=24 +FORENSIC_AUDIT_RETENTION_HOURS=24 # Maximum audit entries per request -PUBLIC_FORENSIC_AUDIT_MAX_ENTRIES=50 +FORENSIC_AUDIT_MAX_ENTRIES=50 # ============================================================================ # 10. SIMPLIFIED CONFIDENCE SCORING SYSTEM diff --git a/src/utils/aiPipeline.ts b/src/utils/aiPipeline.ts index f466ec6..a15408e 100644 --- a/src/utils/aiPipeline.ts +++ b/src/utils/aiPipeline.ts @@ -157,8 +157,20 @@ class ImprovedMicroTaskAIPipeline { weights: `Semantic:${this.confidenceConfig.semanticWeight} Suitability:${this.confidenceConfig.suitabilityWeight}`, thresholds: `${this.confidenceConfig.minimumThreshold}/${this.confidenceConfig.mediumThreshold}/${this.confidenceConfig.highThreshold}` }); + + console.log('[AI PIPELINE] Environment variable debug:', { + FORENSIC_AUDIT_ENABLED: process.env.FORENSIC_AUDIT_ENABLED, + FORENSIC_AUDIT_DETAIL_LEVEL: process.env.FORENSIC_AUDIT_DETAIL_LEVEL, + NODE_ENV: process.env.NODE_ENV, + allEnvKeys: Object.keys(process.env).filter(k => k.includes('AUDIT')), + dotenvLoaded: !!process.env.PUBLIC_BASE_URL // Proxy for "dotenv worked" + }); + + console.log('[AI PIPELINE] Final audit config:', this.auditConfig); } + + private getEnv(key: string): string { const value = process.env[key]; if (!value) { diff --git a/src/utils/auditService.ts b/src/utils/auditService.ts index 9af7ce3..138a3d0 100644 --- a/src/utils/auditService.ts +++ b/src/utils/auditService.ts @@ -1,5 +1,5 @@ // src/utils/auditService.ts - +import 'dotenv/config'; function env(key: string, fallback: string | undefined = undefined): string | undefined { if (typeof process !== 'undefined' && process.env?.[key] !== undefined) { @@ -26,7 +26,7 @@ interface AuditConfig { enabled: boolean; detailLevel: 'minimal' | 'standard' | 'verbose'; retentionHours: number; - maxEntriesPerRequest: number; + maxEntries: number; } interface CompressedAuditEntry { @@ -90,31 +90,50 @@ class AuditService { this.config = this.loadConfig(); } - private loadConfig(): AuditConfig { - const enabledFlag = - (typeof import.meta !== 'undefined' && - (import.meta as any).env?.PUBLIC_FORENSIC_AUDIT_ENABLED) ?? 'false'; + private loadConfig(): AuditConfig { + // Use the env() helper function that handles both server and client contexts + const enabledFlag = env('FORENSIC_AUDIT_ENABLED', 'false'); + const detailLevel = env('FORENSIC_AUDIT_DETAIL_LEVEL', 'standard') as 'minimal' | 'standard' | 'verbose'; + const retentionHours = parseInt(env('FORENSIC_AUDIT_RETENTION_HOURS', '72') || '72', 10); + const maxEntries = parseInt(env('FORENSIC_AUDIT_MAX_ENTRIES', '50') || '50', 10); - return { - enabled: enabledFlag === 'true', - detailLevel: - ((import.meta as any).env?.PUBLIC_FORENSIC_AUDIT_DETAIL_LEVEL as any) || - 'standard', - retentionHours: parseInt( - (import.meta as any).env?.PUBLIC_FORENSIC_AUDIT_RETENTION_HOURS || '72', - 10 - ), - maxEntriesPerRequest: parseInt( - (import.meta as any).env?.PUBLIC_FORENSIC_AUDIT_MAX_ENTRIES || '50', - 10 - ), - }; - } + console.log('[AUDIT SERVICE] Configuration loaded:', { + enabled: enabledFlag === 'true', + detailLevel, + retentionHours, + maxEntries, + context: typeof process !== 'undefined' ? 'server' : 'client' + }); + return { + enabled: enabledFlag === 'true', + detailLevel, + retentionHours, + maxEntries + }; + } + + getDebugInfo(): { + config: AuditConfig; + environment: Record; + context: string; + } { + const context = typeof process !== 'undefined' ? 'server' : 'client'; + + return { + config: this.config, + environment: { + FORENSIC_AUDIT_ENABLED: env('FORENSIC_AUDIT_ENABLED'), + FORENSIC_AUDIT_DETAIL_LEVEL: env('FORENSIC_AUDIT_DETAIL_LEVEL'), + FORENSIC_AUDIT_RETENTION_HOURS: env('FORENSIC_AUDIT_RETENTION_HOURS'), + FORENSIC_AUDIT_MAX_ENTRIES: env('FORENSIC_AUDIT_MAX_ENTRIES'), + processEnvKeys: typeof process !== 'undefined' ? Object.keys(process.env).filter(k => k.includes('AUDIT')) : [], + importMetaEnvAvailable: typeof import.meta !== 'undefined' && !!(import.meta as any).env + }, + context + }; + } - /** - * Add an audit entry with automatic data compression - */ addEntry( phase: string, action: string, @@ -226,9 +245,6 @@ class AuditService { } } - /** - * Compress audit entry for efficient transport - */ private compressEntry(entry: AuditEntry): CompressedAuditEntry | null { if (!entry || typeof entry !== 'object') { console.warn('[AUDIT] Invalid audit entry:', entry); @@ -286,9 +302,6 @@ class AuditService { return String(data); } - /** - * Standard level data compression - */ private summarizeForStorage(data: any): any { if (typeof data === 'string' && data.length > 500) { return data.slice(0, 500) + '...[truncated]'; @@ -299,9 +312,6 @@ class AuditService { return data; } - /** - * Minimal level data compression - */ private minimalSummary(data: any): any { if (typeof data === 'string' && data.length > 100) { return data.slice(0, 100) + '...[truncated]'; @@ -387,4 +397,18 @@ class AuditService { } export const auditService = new AuditService(); -export type { ProcessedAuditTrail, CompressedAuditEntry }; \ No newline at end of file +export type { ProcessedAuditTrail, CompressedAuditEntry }; +// Add this at the bottom of auditService.ts (after the existing exports) + +// Export debug utilities for troubleshooting +export const debugAuditService = { + getDebugInfo() { + return auditService.getDebugInfo(); + }, + isEnabled() { + return auditService.isEnabled(); + }, + getConfig() { + return auditService.getConfig(); + } +}; \ No newline at end of file