Class: Legion::Extensions::Agentic::Defense::Phantom::Helpers::PhantomEngine

Inherits:
Object
  • Object
show all
Includes:
Helpers::Lex
Defined in:
lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb

Instance Method Summary collapse

Constructor Details

#initializePhantomEngine

Returns a new instance of PhantomEngine.



12
13
14
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 12

def initialize
  @phantoms = {}
end

Instance Method Details

#acknowledge(phantom_id:) ⇒ Object



49
50
51
52
53
54
55
56
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 49

def acknowledge(phantom_id:)
  limb = @phantoms[phantom_id]
  return { acknowledged: false, reason: :not_found } unless limb

  limb.adapt!
  log.info("[cognitive_phantom] acknowledged phantom id=#{phantom_id[0..7]} intensity=#{limb.intensity.round(3)} state=#{limb.state}")
  { acknowledged: true, phantom_id: phantom_id, state: limb.state, intensity: limb.intensity }
end

#active_phantomsObject



62
63
64
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 62

def active_phantoms
  @phantoms.values.reject(&:resolved?)
end

#all_phantomsObject



58
59
60
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 58

def all_phantoms
  @phantoms.values
end

#decay_all!Object



44
45
46
47
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 44

def decay_all!
  @phantoms.each_value(&:decay!)
  resolve_check!
end

#most_persistent(limit: 5) ⇒ Object



77
78
79
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 77

def most_persistent(limit: 5)
  active_phantoms.sort_by(&:activation_count).last(limit).reverse
end

#phantom_activity_reportObject



66
67
68
69
70
71
72
73
74
75
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 66

def phantom_activity_report
  all = @phantoms.values
  by_state = Constants::PHANTOM_STATES.to_h { |s| [s, all.count { |p| p.state == s }] }
  {
    total:             all.size,
    active:            active_phantoms.size,
    by_state:          by_state,
    total_activations: all.sum(&:activation_count)
  }
end

#process_stimulus(stimulus:, domain: :general) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 28

def process_stimulus(stimulus:, domain: :general)
  fired = []
  @phantoms.each_value do |limb|
    next if limb.resolved?
    next unless domain_match?(limb, domain)

    signal = limb.trigger!(stimulus)
    next unless signal

    fired << signal
    intensity_str = limb.intensity.round(3).to_s
    log.debug("[cognitive_phantom] phantom fired: cap=#{limb.capability_name} trigger=#{signal.trigger_type} i=#{intensity_str}")
  end
  fired
end

#recently_triggered(limit: 5) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 81

def recently_triggered(limit: 5)
  active_phantoms
    .select(&:last_triggered)
    .sort_by(&:last_triggered)
    .last(limit)
    .reverse
end

#register_removal(capability_name:, capability_domain: :general) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 16

def register_removal(capability_name:, capability_domain: :general)
  if @phantoms.size >= Constants::MAX_PHANTOMS
    log.warn("[cognitive_phantom] MAX_PHANTOMS (#{Constants::MAX_PHANTOMS}) reached, skipping #{capability_name}")
    return nil
  end

  limb = PhantomLimb.new(capability_name: capability_name, capability_domain: capability_domain)
  @phantoms[limb.id] = limb
  log.info("[cognitive_phantom] registered phantom: capability=#{capability_name} domain=#{capability_domain} id=#{limb.id[0..7]}")
  limb
end

#resolve_check!Object



89
90
91
92
93
94
95
# File 'lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb', line 89

def resolve_check!
  newly_resolved = @phantoms.values.select(&:resolved?)
  newly_resolved.each do |limb|
    log.info("[cognitive_phantom] resolved: capability=#{limb.capability_name} activations=#{limb.activation_count}")
  end
  newly_resolved.size
end