Spaces:
Paused
Paused
| 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(); | |