File size: 2,118 Bytes
529090e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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();