main #11

Merged
mstoeck3 merged 66 commits from main into forensic-ai 2025-08-11 12:02:56 +00:00
4 changed files with 75 additions and 39 deletions
Showing only changes of commit 6f065a6e3b - Show all commits

View File

@ -1,5 +1,5 @@
{
"_variables": {
"lastUpdateCheck": 1753528124767
"lastUpdateCheck": 1754571688630
}
}

View File

@ -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

View File

@ -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) {

View File

@ -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<string, any>;
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 };
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();
}
};