Class: Legion::Extensions::Agentic::Attention::Blink::Helpers::BlinkEngine

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb

Constant Summary

Constants included from Constants

Constants::DEFAULT_BLINK_DURATION, Constants::LAG1_SPARING_THRESHOLD, Constants::MAX_BLINKS, Constants::MAX_BLINK_DURATION, Constants::MAX_STIMULI, Constants::MIN_BLINK_DURATION, Constants::PROCESSING_LABELS, Constants::RECOVERY_LABELS, Constants::RECOVERY_RATE, Constants::SALIENCE_THRESHOLD, Constants::STIMULUS_TYPES

Instance Method Summary collapse

Constructor Details

#initializeBlinkEngine

Returns a new instance of BlinkEngine.



12
13
14
15
16
17
18
19
20
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 12

def initialize
  @stimuli       = {}
  @blink_active  = false
  @blink_start   = nil
  @blink_duration = DEFAULT_BLINK_DURATION
  @recovery      = 1.0
  @total_blinks  = 0
  @total_misses  = 0
end

Instance Method Details



82
83
84
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 82

def adjust_blink_duration(duration:)
  @blink_duration = duration.to_f.clamp(MIN_BLINK_DURATION, MAX_BLINK_DURATION)
end

Returns:

  • (Boolean)


40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 40

def blink_active?
  return false unless @blink_active

  elapsed = Time.now.utc.to_f - @blink_start
  if elapsed >= @blink_duration
    @blink_active = false
    @recovery = 1.0
    return false
  end

  true
end


112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 112

def blink_report
  {
    total_stimuli:  @stimuli.size,
    total_blinks:   @total_blinks,
    total_misses:   @total_misses,
    miss_rate:      miss_rate,
    blink_active:   blink_active?,
    recovery_level: recovery_level,
    recovery_label: recovery_label,
    blink_duration: @blink_duration,
    avg_quality:    processing_quality_average,
    recent_missed:  missed_stimuli.last(5).map(&:to_h)
  }
end

#force_blink!(duration: DEFAULT_BLINK_DURATION) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 66

def force_blink!(duration: DEFAULT_BLINK_DURATION)
  @blink_active = true
  @blink_start = Time.now.utc.to_f
  @blink_duration = duration.to_f.clamp(MIN_BLINK_DURATION, MAX_BLINK_DURATION)
  @recovery = 0.0
  @total_blinks += 1
  { blink_active: true, duration: @blink_duration, total_blinks: @total_blinks }
end

#force_recover!Object



75
76
77
78
79
80
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 75

def force_recover!
  @blink_active = false
  @recovery = 1.0
  @blink_start = nil
  { blink_active: false, recovery: 1.0 }
end

#miss_rateObject



86
87
88
89
90
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 86

def miss_rate
  return 0.0 if @stimuli.empty?

  (@total_misses.to_f / @stimuli.size).round(10)
end

#missed_stimuliObject



96
97
98
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 96

def missed_stimuli
  @stimuli.values.select(&:missed?)
end

#processing_quality_averageObject



105
106
107
108
109
110
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 105

def processing_quality_average
  return 0.0 if @stimuli.empty?

  qualities = @stimuli.values.map(&:processing_quality)
  (qualities.sum / qualities.size).round(10)
end

#recent_stimuli(limit: 10) ⇒ Object



92
93
94
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 92

def recent_stimuli(limit: 10)
  @stimuli.values.sort_by { |s| -s.arrival_time }.first(limit)
end

#recovery_labelObject



61
62
63
64
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 61

def recovery_label
  match = RECOVERY_LABELS.find { |range, _| range.cover?(recovery_level) }
  match ? match.last : :saturated
end

#recovery_levelObject



53
54
55
56
57
58
59
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 53

def recovery_level
  return 1.0 unless @blink_active

  elapsed = Time.now.utc.to_f - @blink_start
  progress = (elapsed / @blink_duration).clamp(0.0, 1.0)
  (progress**0.5).round(10)
end

#stimuli_by_type(stimulus_type:) ⇒ Object



100
101
102
103
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 100

def stimuli_by_type(stimulus_type:)
  st = stimulus_type.to_sym
  @stimuli.values.select { |s| s.stimulus_type == st }
end

#submit_stimulus(stimulus_type:, content:, salience: 0.5) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 22

def submit_stimulus(stimulus_type:, content:, salience: 0.5)
  prune_stimuli_if_needed
  stimulus = Stimulus.new(
    stimulus_type: stimulus_type,
    content:       content,
    salience:      salience
  )

  quality = compute_processing_quality(stimulus)
  stimulus.process!(quality: quality)

  trigger_blink!(stimulus) if stimulus.salient? && !@blink_active
  @total_misses += 1 if stimulus.missed?

  @stimuli[stimulus.id] = stimulus
  stimulus
end

#to_hObject



127
128
129
130
131
132
133
134
135
# File 'lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb', line 127

def to_h
  {
    total_stimuli: @stimuli.size,
    total_blinks:  @total_blinks,
    miss_rate:     miss_rate,
    blink_active:  blink_active?,
    avg_quality:   processing_quality_average
  }
end