lex-agentic-affect 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE +201 -21
  5. data/README.md +1 -1
  6. data/lib/legion/extensions/agentic/affect/appraisal/client.rb +1 -0
  7. data/lib/legion/extensions/agentic/affect/appraisal/runners/appraisal.rb +18 -16
  8. data/lib/legion/extensions/agentic/affect/cognitive_empathy/client.rb +1 -0
  9. data/lib/legion/extensions/agentic/affect/cognitive_empathy/runners/cognitive_empathy.rb +3 -1
  10. data/lib/legion/extensions/agentic/affect/contagion/client.rb +1 -0
  11. data/lib/legion/extensions/agentic/affect/contagion/runners/cognitive_contagion.rb +24 -24
  12. data/lib/legion/extensions/agentic/affect/defusion/client.rb +1 -0
  13. data/lib/legion/extensions/agentic/affect/defusion/runners/cognitive_defusion.rb +21 -21
  14. data/lib/legion/extensions/agentic/affect/emotion/actors/momentum_decay.rb +1 -1
  15. data/lib/legion/extensions/agentic/affect/emotion/client.rb +1 -0
  16. data/lib/legion/extensions/agentic/affect/emotion/runners/gut.rb +7 -7
  17. data/lib/legion/extensions/agentic/affect/emotion/runners/valence.rb +10 -10
  18. data/lib/legion/extensions/agentic/affect/empathy/client.rb +1 -0
  19. data/lib/legion/extensions/agentic/affect/empathy/runners/empathy.rb +14 -14
  20. data/lib/legion/extensions/agentic/affect/fatigue/client.rb +1 -0
  21. data/lib/legion/extensions/agentic/affect/fatigue/runners/fatigue.rb +9 -9
  22. data/lib/legion/extensions/agentic/affect/flow/client.rb +1 -0
  23. data/lib/legion/extensions/agentic/affect/flow/runners/flow.rb +8 -8
  24. data/lib/legion/extensions/agentic/affect/interoception/actors/decay.rb +1 -1
  25. data/lib/legion/extensions/agentic/affect/interoception/client.rb +1 -0
  26. data/lib/legion/extensions/agentic/affect/interoception/runners/interoception.rb +12 -12
  27. data/lib/legion/extensions/agentic/affect/mood/client.rb +1 -0
  28. data/lib/legion/extensions/agentic/affect/mood/runners/mood.rb +7 -7
  29. data/lib/legion/extensions/agentic/affect/motivation/client.rb +1 -0
  30. data/lib/legion/extensions/agentic/affect/motivation/runners/motivation.rb +13 -13
  31. data/lib/legion/extensions/agentic/affect/reappraisal/actors/auto_regulate.rb +1 -1
  32. data/lib/legion/extensions/agentic/affect/reappraisal/client.rb +1 -0
  33. data/lib/legion/extensions/agentic/affect/reappraisal/helpers/llm_enhancer.rb +4 -4
  34. data/lib/legion/extensions/agentic/affect/reappraisal/runners/cognitive_reappraisal.rb +17 -17
  35. data/lib/legion/extensions/agentic/affect/regulation/client.rb +1 -0
  36. data/lib/legion/extensions/agentic/affect/regulation/runners/emotional_regulation.rb +12 -12
  37. data/lib/legion/extensions/agentic/affect/resilience/client.rb +1 -0
  38. data/lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb +10 -10
  39. data/lib/legion/extensions/agentic/affect/resonance/client.rb +1 -0
  40. data/lib/legion/extensions/agentic/affect/resonance/helpers/resonance_engine.rb +10 -6
  41. data/lib/legion/extensions/agentic/affect/resonance/runners/cognitive_resonance.rb +12 -12
  42. data/lib/legion/extensions/agentic/affect/reward/client.rb +1 -0
  43. data/lib/legion/extensions/agentic/affect/reward/runners/reward.rb +10 -10
  44. data/lib/legion/extensions/agentic/affect/somatic_marker/actors/decay.rb +1 -1
  45. data/lib/legion/extensions/agentic/affect/somatic_marker/client.rb +1 -0
  46. data/lib/legion/extensions/agentic/affect/somatic_marker/runners/somatic_marker.rb +31 -31
  47. data/lib/legion/extensions/agentic/affect/version.rb +1 -1
  48. data/lib/legion/extensions/agentic/affect.rb +2 -2
  49. data/spec/legion/extensions/agentic/affect/somatic_marker/helpers/marker_store_spec.rb +1 -1
  50. metadata +1 -1
@@ -7,8 +7,8 @@ module Legion
7
7
  module Motivation
8
8
  module Runners
9
9
  module Motivation
10
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
- Legion::Extensions::Helpers.const_defined?(:Lex)
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
12
12
 
13
13
  def update_motivation(tick_results: {}, **)
14
14
  extract_drive_signals(tick_results)
@@ -16,9 +16,9 @@ module Legion
16
16
  burnout = motivation_store.burnout_check
17
17
  mode = motivation_store.drive_state.current_mode
18
18
 
19
- Legion::Logging.debug "[motivation] mode=#{mode} " \
20
- "overall=#{motivation_store.drive_state.overall_level.round(3)} " \
21
- "amotivated=#{motivation_store.drive_state.amotivated?}"
19
+ log.debug("[motivation] mode=#{mode} " \
20
+ "overall=#{motivation_store.drive_state.overall_level.round(3)} " \
21
+ "amotivated=#{motivation_store.drive_state.amotivated?}")
22
22
 
23
23
  {
24
24
  mode: mode,
@@ -37,7 +37,7 @@ module Legion
37
37
  motivation_store.drive_state.update_drive(drive_sym, signal.to_f)
38
38
  level = motivation_store.drive_state.drive_level(drive_sym)
39
39
 
40
- Legion::Logging.debug "[motivation] drive signal: #{drive_sym}=#{level.round(3)}"
40
+ log.debug("[motivation] drive signal: #{drive_sym}=#{level.round(3)}")
41
41
  { success: true, drive: drive_sym, level: level.round(4) }
42
42
  end
43
43
 
@@ -47,29 +47,29 @@ module Legion
47
47
 
48
48
  if result
49
49
  energy = motivation_store.goal_energy(goal_id)
50
- Legion::Logging.info "[motivation] committed goal=#{goal_id} energy=#{energy.round(3)}"
50
+ log.info("[motivation] committed goal=#{goal_id} energy=#{energy.round(3)}")
51
51
  { success: true, goal_id: goal_id, energy: energy.round(4) }
52
52
  else
53
- Legion::Logging.warn "[motivation] commit_goal rejected: no valid drives for #{goal_id}"
53
+ log.warn("[motivation] commit_goal rejected: no valid drives for #{goal_id}")
54
54
  { success: false, error: 'no valid drives provided' }
55
55
  end
56
56
  end
57
57
 
58
58
  def release_goal(goal_id:, **)
59
59
  motivation_store.release_goal(goal_id)
60
- Legion::Logging.debug "[motivation] released goal=#{goal_id}"
60
+ log.debug("[motivation] released goal=#{goal_id}")
61
61
  { success: true, goal_id: goal_id }
62
62
  end
63
63
 
64
64
  def motivation_for(goal_id:, **)
65
65
  energy = motivation_store.goal_energy(goal_id)
66
- Legion::Logging.debug "[motivation] motivation_for goal=#{goal_id} energy=#{energy.round(3)}"
66
+ log.debug("[motivation] motivation_for goal=#{goal_id} energy=#{energy.round(3)}")
67
67
  { goal_id: goal_id, energy: energy.round(4) }
68
68
  end
69
69
 
70
70
  def most_motivated_goal(**)
71
71
  result = motivation_store.most_motivated_goal
72
- Legion::Logging.debug "[motivation] most_motivated_goal=#{result&.fetch(:goal_id, nil)}"
72
+ log.debug("[motivation] most_motivated_goal=#{result&.fetch(:goal_id, nil)}")
73
73
  result || { goal_id: nil, energy: 0.0, drives: [] }
74
74
  end
75
75
 
@@ -78,7 +78,7 @@ module Legion
78
78
  { level: d[:level].round(4), satisfied: d[:satisfied] }
79
79
  end
80
80
 
81
- Legion::Logging.debug '[motivation] drive_status'
81
+ log.debug('[motivation] drive_status')
82
82
  {
83
83
  drives: drives,
84
84
  mode: motivation_store.drive_state.current_mode,
@@ -87,7 +87,7 @@ module Legion
87
87
  end
88
88
 
89
89
  def motivation_stats(**)
90
- Legion::Logging.debug '[motivation] stats'
90
+ log.debug('[motivation] stats')
91
91
  motivation_store.stats
92
92
  end
93
93
 
@@ -8,7 +8,7 @@ module Legion
8
8
  module Affect
9
9
  module Reappraisal
10
10
  module Actor
11
- class AutoRegulate < Legion::Extensions::Actors::Every
11
+ class AutoRegulate < Legion::Extensions::Actors::Every # rubocop:disable Legion/Extension/EveryActorRequiresTime
12
12
  def runner_class
13
13
  Legion::Extensions::Agentic::Affect::Reappraisal::Runners::CognitiveReappraisal
14
14
  end
@@ -11,6 +11,7 @@ module Legion
11
11
  module Affect
12
12
  module Reappraisal
13
13
  class Client
14
+ include Legion::Extensions::Helpers::Lex
14
15
  include Runners::CognitiveReappraisal
15
16
 
16
17
  def initialize(engine: nil, **)
@@ -18,7 +18,7 @@ module Legion
18
18
 
19
19
  def available?
20
20
  !!(defined?(Legion::LLM) && Legion::LLM.respond_to?(:started?) && Legion::LLM.started?)
21
- rescue StandardError
21
+ rescue StandardError => _e
22
22
  false
23
23
  end
24
24
 
@@ -33,7 +33,7 @@ module Legion
33
33
  response = llm_ask(prompt)
34
34
  parse_generate_reappraisal_response(response)
35
35
  rescue StandardError => e
36
- Legion::Logging.warn "[cognitive_reappraisal:llm] generate_reappraisal failed: #{e.message}"
36
+ Legion::Logging.warn("[cognitive_reappraisal:llm] generate_reappraisal failed: #{e.message}") # rubocop:disable Legion/HelperMigration/DirectLogging
37
37
  nil
38
38
  end
39
39
 
@@ -47,7 +47,7 @@ module Legion
47
47
  content = response&.message&.dig(:content)
48
48
  ::Struct.new(:content).new(content) if content
49
49
  else
50
- chat = Legion::LLM.chat
50
+ chat = Legion::LLM.chat # rubocop:disable Legion/HelperMigration/DirectLlm
51
51
  chat.with_instructions(SYSTEM_PROMPT)
52
52
  chat.ask(prompt)
53
53
  end
@@ -58,7 +58,7 @@ module Legion
58
58
  !!(defined?(Legion::LLM::Pipeline::GaiaCaller) &&
59
59
  Legion::LLM.respond_to?(:pipeline_enabled?) &&
60
60
  Legion::LLM.pipeline_enabled?)
61
- rescue StandardError
61
+ rescue StandardError => _e
62
62
  false
63
63
  end
64
64
  private_class_method :pipeline_available?
@@ -7,15 +7,15 @@ module Legion
7
7
  module Reappraisal
8
8
  module Runners
9
9
  module CognitiveReappraisal
10
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
- Legion::Extensions::Helpers.const_defined?(:Lex)
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
12
12
 
13
13
  def register_event(content:, valence:, intensity:, appraisal:, engine: nil, **)
14
14
  eng = engine || reappraisal_engine
15
15
  event = eng.register_event(content: content, valence: valence, intensity: intensity, appraisal: appraisal)
16
16
 
17
- Legion::Logging.debug "[cognitive_reappraisal] registered event id=#{event.id[0..7]} " \
18
- "valence=#{event.initial_valence.round(2)} intensity=#{event.initial_intensity.round(2)}"
17
+ log.debug("[cognitive_reappraisal] registered event id=#{event.id[0..7]} " \
18
+ "valence=#{event.initial_valence.round(2)} intensity=#{event.initial_intensity.round(2)}")
19
19
 
20
20
  {
21
21
  success: true,
@@ -37,10 +37,10 @@ module Legion
37
37
  result = eng.reappraise(event_id: event_id, strategy: strategy, new_appraisal: appraisal)
38
38
 
39
39
  if result[:success]
40
- Legion::Logging.info "[cognitive_reappraisal] reappraised event=#{event_id[0..7]} " \
41
- "strategy=#{strategy} change=#{result[:change].round(2)}"
40
+ log.info("[cognitive_reappraisal] reappraised event=#{event_id[0..7]} " \
41
+ "strategy=#{strategy} change=#{result[:change].round(2)}")
42
42
  else
43
- Legion::Logging.debug "[cognitive_reappraisal] reappraisal failed event=#{event_id[0..7]} reason=#{result[:reason]}"
43
+ log.debug("[cognitive_reappraisal] reappraisal failed event=#{event_id[0..7]} reason=#{result[:reason]}")
44
44
  end
45
45
 
46
46
  result
@@ -56,10 +56,10 @@ module Legion
56
56
  result = eng.reappraise(event_id: event_id, strategy: strategy, new_appraisal: appraisal)
57
57
 
58
58
  if result[:success]
59
- Legion::Logging.info "[cognitive_reappraisal] auto-reappraised event=#{event_id[0..7]} " \
60
- "strategy=#{strategy}"
59
+ log.info("[cognitive_reappraisal] auto-reappraised event=#{event_id[0..7]} " \
60
+ "strategy=#{strategy}")
61
61
  else
62
- Legion::Logging.debug "[cognitive_reappraisal] auto-reappraisal failed: #{result[:reason]}"
62
+ log.debug("[cognitive_reappraisal] auto-reappraisal failed: #{result[:reason]}")
63
63
  end
64
64
 
65
65
  result
@@ -68,27 +68,27 @@ module Legion
68
68
  def negative_events(engine: nil, **)
69
69
  eng = engine || reappraisal_engine
70
70
  events = eng.negative_events
71
- Legion::Logging.debug "[cognitive_reappraisal] negative events count=#{events.size}"
71
+ log.debug("[cognitive_reappraisal] negative events count=#{events.size}")
72
72
  { events: events.map(&:to_h), count: events.size }
73
73
  end
74
74
 
75
75
  def intense_events(engine: nil, **)
76
76
  eng = engine || reappraisal_engine
77
77
  events = eng.intense_events
78
- Legion::Logging.debug "[cognitive_reappraisal] intense events count=#{events.size}"
78
+ log.debug("[cognitive_reappraisal] intense events count=#{events.size}")
79
79
  { events: events.map(&:to_h), count: events.size }
80
80
  end
81
81
 
82
82
  def most_regulated_events(limit: 5, engine: nil, **)
83
83
  eng = engine || reappraisal_engine
84
84
  events = eng.most_regulated(limit: limit)
85
- Legion::Logging.debug "[cognitive_reappraisal] most regulated count=#{events.size}"
85
+ log.debug("[cognitive_reappraisal] most regulated count=#{events.size}")
86
86
  { events: events.map(&:to_h), count: events.size }
87
87
  end
88
88
 
89
89
  def reappraisal_status(engine: nil, **)
90
90
  eng = engine || reappraisal_engine
91
- Legion::Logging.debug "[cognitive_reappraisal] status: overall=#{eng.overall_regulation_ability.round(2)}"
91
+ log.debug("[cognitive_reappraisal] status: overall=#{eng.overall_regulation_ability.round(2)}")
92
92
  {
93
93
  overall_regulation_ability: eng.overall_regulation_ability,
94
94
  average_regulation: eng.average_regulation,
@@ -100,7 +100,7 @@ module Legion
100
100
 
101
101
  def reappraisal_report(engine: nil, **)
102
102
  eng = engine || reappraisal_engine
103
- Legion::Logging.debug '[cognitive_reappraisal] generating report'
103
+ log.debug('[cognitive_reappraisal] generating report')
104
104
  { success: true, report: eng.reappraisal_report }
105
105
  end
106
106
 
@@ -121,7 +121,7 @@ module Legion
121
121
  event_ids << event.id
122
122
  end
123
123
 
124
- Legion::Logging.debug "[reappraisal] regulate pending: checked=#{checked} regulated=#{regulated}"
124
+ log.debug("[reappraisal] regulate pending: checked=#{checked} regulated=#{regulated}")
125
125
  { checked: checked, regulated: regulated, event_ids: event_ids }
126
126
  end
127
127
 
@@ -132,7 +132,7 @@ module Legion
132
132
  end
133
133
 
134
134
  def llm_appraisal_for(event, strategy)
135
- return nil unless event && Helpers::LlmEnhancer.available?
135
+ return nil unless event && Helpers::LlmEnhancer.available? # rubocop:disable Legion/Extension/RunnerReturnHash
136
136
 
137
137
  result = Helpers::LlmEnhancer.generate_reappraisal(
138
138
  event_content: event.content,
@@ -10,6 +10,7 @@ module Legion
10
10
  module Affect
11
11
  module Regulation
12
12
  class Client
13
+ include Legion::Extensions::Helpers::Lex
13
14
  include Runners::EmotionalRegulation
14
15
 
15
16
  attr_reader :regulation_model
@@ -7,8 +7,8 @@ module Legion
7
7
  module Regulation
8
8
  module Runners
9
9
  module EmotionalRegulation
10
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
- Legion::Extensions::Helpers.const_defined?(:Lex)
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
12
12
 
13
13
  # Apply emotion regulation. Auto-selects strategy when none is provided.
14
14
  def regulate_emotion(emotion_magnitude:, emotion_valence: :neutral, strategy: nil, **)
@@ -23,10 +23,10 @@ module Legion
23
23
  strategy: chosen
24
24
  )
25
25
 
26
- Legion::Logging.debug "[emotional_regulation] regulate: strategy=#{chosen} " \
27
- "magnitude=#{emotion_magnitude.round(2)} -> " \
28
- "#{result[:regulated_magnitude].round(2)} " \
29
- "cost=#{result[:cost].round(3)} success=#{result[:success]}"
26
+ log.debug("[emotional_regulation] regulate: strategy=#{chosen} " \
27
+ "magnitude=#{emotion_magnitude.round(2)} -> " \
28
+ "#{result[:regulated_magnitude].round(2)} " \
29
+ "cost=#{result[:cost].round(3)} success=#{result[:success]}")
30
30
 
31
31
  { success: true }.merge(result)
32
32
  end
@@ -39,8 +39,8 @@ module Legion
39
39
  context: context
40
40
  )
41
41
 
42
- Legion::Logging.debug "[emotional_regulation] recommend: magnitude=#{emotion_magnitude.round(2)} " \
43
- "context=#{context} recommended=#{result[:recommended]}"
42
+ log.debug("[emotional_regulation] recommend: magnitude=#{emotion_magnitude.round(2)} " \
43
+ "context=#{context} recommended=#{result[:recommended]}")
44
44
 
45
45
  { success: true }.merge(result)
46
46
  end
@@ -51,7 +51,7 @@ module Legion
51
51
  ability = regulation_model.overall_regulation_ability
52
52
  label = regulation_model.regulation_label
53
53
 
54
- Legion::Logging.debug "[emotional_regulation] decay tick: ability=#{ability.round(3)} label=#{label}"
54
+ log.debug("[emotional_regulation] decay tick: ability=#{ability.round(3)} label=#{label}")
55
55
 
56
56
  { success: true, overall_ability: ability, regulation_label: label }
57
57
  end
@@ -62,7 +62,7 @@ module Legion
62
62
  [strategy, regulation_model.skill_for(strategy)]
63
63
  end
64
64
 
65
- Legion::Logging.debug "[emotional_regulation] profile query: overall=#{regulation_model.overall_regulation_ability.round(3)}"
65
+ log.debug("[emotional_regulation] profile query: overall=#{regulation_model.overall_regulation_ability.round(3)}")
66
66
 
67
67
  {
68
68
  success: true,
@@ -76,7 +76,7 @@ module Legion
76
76
  # Return recent regulation events.
77
77
  def regulation_history(count: 20, **)
78
78
  events = regulation_model.regulation_history.last(count)
79
- Legion::Logging.debug "[emotional_regulation] history: requested=#{count} returned=#{events.size}"
79
+ log.debug("[emotional_regulation] history: requested=#{count} returned=#{events.size}")
80
80
  { success: true, events: events, count: events.size }
81
81
  end
82
82
 
@@ -100,7 +100,7 @@ module Legion
100
100
  [strategy, { count: events.size, successes: events.count { |e| e[:success] } }]
101
101
  end
102
102
 
103
- Legion::Logging.debug "[emotional_regulation] stats: total=#{total} success_rate=#{(successes.to_f / total).round(2)}"
103
+ log.debug("[emotional_regulation] stats: total=#{total} success_rate=#{(successes.to_f / total).round(2)}")
104
104
 
105
105
  {
106
106
  success: true,
@@ -11,6 +11,7 @@ module Legion
11
11
  module Affect
12
12
  module Resilience
13
13
  class Client
14
+ include Legion::Extensions::Helpers::Lex
14
15
  include Runners::Resilience
15
16
 
16
17
  attr_reader :adversity_tracker, :resilience_model
@@ -7,17 +7,17 @@ module Legion
7
7
  module Resilience
8
8
  module Runners
9
9
  module Resilience
10
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
- Legion::Extensions::Helpers.const_defined?(:Lex)
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
12
12
 
13
13
  def update_resilience(tick_results: {}, **)
14
14
  detect_adversities(tick_results)
15
15
  recovery = adversity_tracker.tick_recovery
16
16
  resilience_model.update_from_tracker(adversity_tracker)
17
17
 
18
- Legion::Logging.debug "[resilience] active=#{recovery[:active_count]} " \
19
- "resolved=#{recovery[:resolved_count]} " \
20
- "composite=#{resilience_model.composite_score.round(3)}"
18
+ log.debug("[resilience] active=#{recovery[:active_count]} " \
19
+ "resolved=#{recovery[:resolved_count]} " \
20
+ "composite=#{resilience_model.composite_score.round(3)}")
21
21
 
22
22
  {
23
23
  active_adversities: recovery[:active_count],
@@ -33,13 +33,13 @@ module Legion
33
33
  adversity = adversity_tracker.register(type: type, severity: severity, context: context)
34
34
  return { success: false, error: 'invalid type or severity' } unless adversity
35
35
 
36
- Legion::Logging.info "[resilience] adversity registered: type=#{type} severity=#{severity}"
36
+ log.info("[resilience] adversity registered: type=#{type} severity=#{severity}")
37
37
  { success: true, adversity: adversity }
38
38
  end
39
39
 
40
40
  def resilience_status(**)
41
41
  model_state = resilience_model.to_h
42
- Legion::Logging.debug "[resilience] status: #{model_state[:class]} score=#{model_state[:composite]}"
42
+ log.debug("[resilience] status: #{model_state[:class]} score=#{model_state[:composite]}")
43
43
 
44
44
  model_state.merge(
45
45
  active_adversities: adversity_tracker.active_adversities.size,
@@ -50,7 +50,7 @@ module Legion
50
50
  end
51
51
 
52
52
  def adversity_report(**)
53
- Legion::Logging.debug '[resilience] adversity report'
53
+ log.debug('[resilience] adversity report')
54
54
 
55
55
  {
56
56
  active: adversity_tracker.active_adversities,
@@ -65,12 +65,12 @@ module Legion
65
65
  detail = resilience_model.dimension_detail(dimension.to_sym)
66
66
  return { error: "unknown dimension: #{dimension}" } unless detail
67
67
 
68
- Legion::Logging.debug "[resilience] dimension #{dimension}: #{detail[:value]}"
68
+ log.debug("[resilience] dimension #{dimension}: #{detail[:value]}")
69
69
  detail
70
70
  end
71
71
 
72
72
  def resilience_stats(**)
73
- Legion::Logging.debug '[resilience] stats'
73
+ log.debug('[resilience] stats')
74
74
 
75
75
  {
76
76
  composite: resilience_model.composite_score.round(4),
@@ -11,6 +11,7 @@ module Legion
11
11
  module Affect
12
12
  module Resonance
13
13
  class Client
14
+ include Legion::Extensions::Helpers::Lex
14
15
  include Runners::CognitiveResonance
15
16
 
16
17
  def initialize(**)
@@ -43,7 +43,7 @@ module Legion
43
43
 
44
44
  def adjust_vigilance(amount:)
45
45
  @vigilance = (@vigilance + amount).clamp(0.0, 1.0)
46
- Legion::Logging.debug "[cognitive_resonance] vigilance adjusted to #{@vigilance.round(3)}"
46
+ Legion::Logging.debug("[cognitive_resonance] vigilance adjusted to #{@vigilance.round(3)}") # rubocop:disable Legion/HelperMigration/DirectLogging
47
47
  @vigilance
48
48
  end
49
49
 
@@ -73,8 +73,10 @@ module Legion
73
73
  def resonate_with(match, normalized)
74
74
  category = @categories[match[:id]]
75
75
  category.update_prototype!(input: normalized)
76
- Legion::Logging.debug "[cognitive_resonance] resonance with category #{match[:id][0..7]} " \
77
- "quality=#{match[:quality].round(3)} vigilance=#{@vigilance.round(3)}"
76
+ # rubocop:disable Legion/HelperMigration/DirectLogging
77
+ Legion::Logging.debug("[cognitive_resonance] resonance with category #{match[:id][0..7]} " \
78
+ "quality=#{match[:quality].round(3)} vigilance=#{@vigilance.round(3)}")
79
+ # rubocop:enable Legion/HelperMigration/DirectLogging
78
80
  {
79
81
  outcome: :resonance,
80
82
  category_id: match[:id],
@@ -88,8 +90,10 @@ module Legion
88
90
  prune_if_full!
89
91
  category = Category.new(prototype: normalized)
90
92
  @categories[category.id] = category
91
- Legion::Logging.debug "[cognitive_resonance] new category #{category.id[0..7]} " \
92
- "total=#{@categories.size} vigilance=#{@vigilance.round(3)}"
93
+ # rubocop:disable Legion/HelperMigration/DirectLogging
94
+ Legion::Logging.debug("[cognitive_resonance] new category #{category.id[0..7]} " \
95
+ "total=#{@categories.size} vigilance=#{@vigilance.round(3)}")
96
+ # rubocop:enable Legion/HelperMigration/DirectLogging
93
97
  {
94
98
  outcome: :new_category,
95
99
  category_id: category.id,
@@ -104,7 +108,7 @@ module Legion
104
108
 
105
109
  oldest_id = @categories.min_by { |_, cat| cat.last_matched_at || Time.at(0) }.first
106
110
  @categories.delete(oldest_id)
107
- Legion::Logging.debug "[cognitive_resonance] pruned oldest category #{oldest_id[0..7]}"
111
+ Legion::Logging.debug("[cognitive_resonance] pruned oldest category #{oldest_id[0..7]}") # rubocop:disable Legion/HelperMigration/DirectLogging
108
112
  end
109
113
  end
110
114
  end
@@ -7,16 +7,16 @@ module Legion
7
7
  module Resonance
8
8
  module Runners
9
9
  module CognitiveResonance
10
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
- Legion::Extensions::Helpers.const_defined?(:Lex)
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
12
12
 
13
13
  def present_input(input:, engine: nil, **)
14
14
  resonance_engine = engine || default_engine
15
15
  return { success: false, error: :empty_input } if input.nil? || input.empty?
16
16
 
17
17
  result = resonance_engine.present_input(input: input)
18
- Legion::Logging.debug "[cognitive_resonance] present_input outcome=#{result[:outcome]} " \
19
- "category=#{result[:category_id][0..7]}"
18
+ log.debug("[cognitive_resonance] present_input outcome=#{result[:outcome]} " \
19
+ "category=#{result[:category_id][0..7]}")
20
20
  { success: true }.merge(result)
21
21
  end
22
22
 
@@ -29,8 +29,8 @@ module Legion
29
29
 
30
30
  if match
31
31
  quality_label = Helpers::Constants.match_label(match[:quality])
32
- Legion::Logging.debug "[cognitive_resonance] classify category=#{match[:id][0..7]} " \
33
- "quality=#{match[:quality].round(3)} label=#{quality_label}"
32
+ log.debug("[cognitive_resonance] classify category=#{match[:id][0..7]} " \
33
+ "quality=#{match[:quality].round(3)} label=#{quality_label}")
34
34
  {
35
35
  success: true,
36
36
  found: true,
@@ -39,7 +39,7 @@ module Legion
39
39
  label: quality_label
40
40
  }
41
41
  else
42
- Legion::Logging.debug '[cognitive_resonance] classify found=false (no categories)'
42
+ log.debug('[cognitive_resonance] classify found=false (no categories)')
43
43
  { success: true, found: false, category_id: nil, quality: 0.0, label: :none }
44
44
  end
45
45
  end
@@ -50,7 +50,7 @@ module Legion
50
50
  new_vigilance = resonance_engine.adjust_vigilance(amount: clamped_amount)
51
51
  vigilance_label = Helpers::Constants.vigilance_label(new_vigilance)
52
52
 
53
- Legion::Logging.debug "[cognitive_resonance] vigilance=#{new_vigilance.round(3)} label=#{vigilance_label}"
53
+ log.debug("[cognitive_resonance] vigilance=#{new_vigilance.round(3)} label=#{vigilance_label}")
54
54
  {
55
55
  success: true,
56
56
  vigilance: new_vigilance,
@@ -62,21 +62,21 @@ module Legion
62
62
  def resonance_report(engine: nil, **)
63
63
  resonance_engine = engine || default_engine
64
64
  report = resonance_engine.resonance_report
65
- Legion::Logging.debug "[cognitive_resonance] report categories=#{report[:category_count]} " \
66
- "vigilance=#{report[:vigilance].round(3)}"
65
+ log.debug("[cognitive_resonance] report categories=#{report[:category_count]} " \
66
+ "vigilance=#{report[:vigilance].round(3)}")
67
67
  { success: true }.merge(report)
68
68
  end
69
69
 
70
70
  def category_count(engine: nil, **)
71
71
  resonance_engine = engine || default_engine
72
72
  count = resonance_engine.category_count
73
- Legion::Logging.debug "[cognitive_resonance] category_count=#{count}"
73
+ log.debug("[cognitive_resonance] category_count=#{count}")
74
74
  { success: true, count: count }
75
75
  end
76
76
 
77
77
  def reset_engine(**)
78
78
  @default_engine = nil
79
- Legion::Logging.debug '[cognitive_resonance] engine reset'
79
+ log.debug('[cognitive_resonance] engine reset')
80
80
  { success: true, reset: true }
81
81
  end
82
82
 
@@ -11,6 +11,7 @@ module Legion
11
11
  module Affect
12
12
  module Reward
13
13
  class Client
14
+ include Legion::Extensions::Helpers::Lex
14
15
  include Runners::Reward
15
16
 
16
17
  attr_reader :reward_store
@@ -7,14 +7,14 @@ module Legion
7
7
  module Reward
8
8
  module Runners
9
9
  module Reward
10
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
- Legion::Extensions::Helpers.const_defined?(:Lex)
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
12
12
 
13
13
  def compute_reward(tick_results: {}, **)
14
14
  result = reward_store.process_tick(tick_results)
15
15
 
16
- Legion::Logging.debug "[reward] reward=#{result[:reward]} rpe=#{result[:rpe]} " \
17
- "class=#{result[:rpe_class]} learning=#{result[:learning_signal]}"
16
+ log.debug("[reward] reward=#{result[:reward]} rpe=#{result[:rpe]} " \
17
+ "class=#{result[:rpe_class]} learning=#{result[:learning_signal]}")
18
18
 
19
19
  result
20
20
  end
@@ -23,21 +23,21 @@ module Legion
23
23
  sig = reward_store.signal
24
24
  health = reward_store.health_assessment
25
25
 
26
- Legion::Logging.debug "[reward] status: avg=#{sig.running_average.round(3)} " \
27
- "predicted=#{sig.predicted_reward.round(3)} health=#{health[:status]}"
26
+ log.debug("[reward] status: avg=#{sig.running_average.round(3)} " \
27
+ "predicted=#{sig.predicted_reward.round(3)} health=#{health[:status]}")
28
28
 
29
29
  sig.to_h.merge(health: health)
30
30
  end
31
31
 
32
32
  def reward_for(domain:, **)
33
33
  report = reward_store.domain_report(domain)
34
- Legion::Logging.debug "[reward] domain=#{domain} avg=#{report[:average].round(3)} trend=#{report[:trend]}"
34
+ log.debug("[reward] domain=#{domain} avg=#{report[:average].round(3)} trend=#{report[:trend]}")
35
35
  report
36
36
  end
37
37
 
38
38
  def reward_history(limit: 20, **)
39
39
  recent = reward_store.signal.recent_rewards(limit)
40
- Legion::Logging.debug "[reward] history: #{recent.size} entries"
40
+ log.debug("[reward] history: #{recent.size} entries")
41
41
 
42
42
  {
43
43
  history: recent,
@@ -48,7 +48,7 @@ module Legion
48
48
 
49
49
  def domain_rewards(**)
50
50
  averages = reward_store.all_domain_averages
51
- Legion::Logging.debug "[reward] domains: #{averages.size} tracked"
51
+ log.debug("[reward] domains: #{averages.size} tracked")
52
52
 
53
53
  {
54
54
  domains: averages,
@@ -62,7 +62,7 @@ module Legion
62
62
  sig = reward_store.signal
63
63
  health = reward_store.health_assessment
64
64
 
65
- Legion::Logging.debug '[reward] stats'
65
+ log.debug('[reward] stats')
66
66
 
67
67
  {
68
68
  running_average: sig.running_average.round(4),
@@ -8,7 +8,7 @@ module Legion
8
8
  module Affect
9
9
  module SomaticMarker
10
10
  module Actor
11
- class Decay < Legion::Extensions::Actors::Every
11
+ class Decay < Legion::Extensions::Actors::Every # rubocop:disable Legion/Extension/EveryActorRequiresTime
12
12
  def runner_class
13
13
  Legion::Extensions::Agentic::Affect::SomaticMarker::Runners::SomaticMarker
14
14
  end
@@ -12,6 +12,7 @@ module Legion
12
12
  module Affect
13
13
  module SomaticMarker
14
14
  class Client
15
+ include Legion::Extensions::Helpers::Lex
15
16
  include Runners::SomaticMarker
16
17
 
17
18
  def initialize(**)