import { EventEmitter } from 'events'; // 1. Definition af lovlige nervesignaler // Vi har tilføjet 'KNOWLEDGE_INGEST_REQ' så Ingestoren kan lytte export type EventType = | 'SECURITY_THREAT' | 'KNOWLEDGE_GAP' | 'SYSTEM_ERROR' | 'SYSTEM_HEALED' | 'KNOWLEDGE_INGEST_REQ'; // <--- NY: Signal til Cortex Ingestor export type EventSeverity = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'; export interface NeuralEvent { type: EventType; severity: EventSeverity; payload: any; timestamp: Date; source: string; } class NeuralStream extends EventEmitter { private static instance: NeuralStream; private constructor() { super(); // Vi tillader mange lyttere, da både OmniHarvester, Ingestor, og Frontend lytter med this.setMaxListeners(50); } public static getInstance(): NeuralStream { if (!NeuralStream.instance) { NeuralStream.instance = new NeuralStream(); } return NeuralStream.instance; } /** * Publish a neural event to the entire organism */ public emitEvent(type: EventType, severity: EventSeverity, payload: any, source: string = 'System') { const event: NeuralEvent = { type, severity, payload, timestamp: new Date(), source }; // 1. Emit internt til Node.js listeners (ReflexLoader, KnowledgeService) this.emit(type, event); this.emit('*', event); // Catch-all for logging/debugging // 2. Log til konsollen (så vi kan se nervesystemet arbejde) // Kun CRITICAL og HIGH vises med store ikoner for at mindske støj if (severity === 'CRITICAL' || severity === 'HIGH') { const icon = severity === 'CRITICAL' ? '🔥' : '🔴'; console.log(`${icon} [NeuralStream] ${type} from ${source}:`, this.truncate(JSON.stringify(payload), 100)); } else if (process.env.NODE_ENV === 'development') { // I dev mode ser vi alt console.log(`⚡ [NeuralStream] ${type} from ${source}`); } } private truncate(str: string, n: number) { return (str.length > n) ? str.substr(0, n-1) + '...' : str; } } export const neuralStream = NeuralStream.getInstance();