lex-agentic-affect 0.1.5 → 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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile +2 -0
  4. data/lib/legion/extensions/agentic/affect/appraisal/client.rb +1 -0
  5. data/lib/legion/extensions/agentic/affect/appraisal/runners/appraisal.rb +18 -16
  6. data/lib/legion/extensions/agentic/affect/cognitive_empathy/client.rb +1 -0
  7. data/lib/legion/extensions/agentic/affect/cognitive_empathy/runners/cognitive_empathy.rb +3 -1
  8. data/lib/legion/extensions/agentic/affect/contagion/client.rb +1 -0
  9. data/lib/legion/extensions/agentic/affect/contagion/runners/cognitive_contagion.rb +24 -24
  10. data/lib/legion/extensions/agentic/affect/defusion/client.rb +1 -0
  11. data/lib/legion/extensions/agentic/affect/defusion/runners/cognitive_defusion.rb +21 -21
  12. data/lib/legion/extensions/agentic/affect/emotion/actors/momentum_decay.rb +1 -1
  13. data/lib/legion/extensions/agentic/affect/emotion/client.rb +1 -0
  14. data/lib/legion/extensions/agentic/affect/emotion/runners/gut.rb +7 -7
  15. data/lib/legion/extensions/agentic/affect/emotion/runners/valence.rb +10 -10
  16. data/lib/legion/extensions/agentic/affect/empathy/client.rb +1 -0
  17. data/lib/legion/extensions/agentic/affect/empathy/runners/empathy.rb +14 -14
  18. data/lib/legion/extensions/agentic/affect/fatigue/client.rb +1 -0
  19. data/lib/legion/extensions/agentic/affect/fatigue/runners/fatigue.rb +9 -9
  20. data/lib/legion/extensions/agentic/affect/flow/client.rb +1 -0
  21. data/lib/legion/extensions/agentic/affect/flow/runners/flow.rb +8 -8
  22. data/lib/legion/extensions/agentic/affect/interoception/actors/decay.rb +1 -1
  23. data/lib/legion/extensions/agentic/affect/interoception/client.rb +1 -0
  24. data/lib/legion/extensions/agentic/affect/interoception/runners/interoception.rb +12 -12
  25. data/lib/legion/extensions/agentic/affect/mood/client.rb +1 -0
  26. data/lib/legion/extensions/agentic/affect/mood/runners/mood.rb +7 -7
  27. data/lib/legion/extensions/agentic/affect/motivation/client.rb +1 -0
  28. data/lib/legion/extensions/agentic/affect/motivation/runners/motivation.rb +13 -13
  29. data/lib/legion/extensions/agentic/affect/reappraisal/actors/auto_regulate.rb +1 -1
  30. data/lib/legion/extensions/agentic/affect/reappraisal/client.rb +1 -0
  31. data/lib/legion/extensions/agentic/affect/reappraisal/helpers/llm_enhancer.rb +4 -4
  32. data/lib/legion/extensions/agentic/affect/reappraisal/runners/cognitive_reappraisal.rb +17 -17
  33. data/lib/legion/extensions/agentic/affect/regulation/client.rb +1 -0
  34. data/lib/legion/extensions/agentic/affect/regulation/runners/emotional_regulation.rb +12 -12
  35. data/lib/legion/extensions/agentic/affect/resilience/client.rb +1 -0
  36. data/lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb +10 -10
  37. data/lib/legion/extensions/agentic/affect/resonance/client.rb +1 -0
  38. data/lib/legion/extensions/agentic/affect/resonance/helpers/resonance_engine.rb +10 -6
  39. data/lib/legion/extensions/agentic/affect/resonance/runners/cognitive_resonance.rb +12 -12
  40. data/lib/legion/extensions/agentic/affect/reward/client.rb +1 -0
  41. data/lib/legion/extensions/agentic/affect/reward/runners/reward.rb +10 -10
  42. data/lib/legion/extensions/agentic/affect/somatic_marker/actors/decay.rb +1 -1
  43. data/lib/legion/extensions/agentic/affect/somatic_marker/client.rb +1 -0
  44. data/lib/legion/extensions/agentic/affect/somatic_marker/runners/somatic_marker.rb +31 -31
  45. data/lib/legion/extensions/agentic/affect/version.rb +1 -1
  46. data/lib/legion/extensions/agentic/affect.rb +1 -1
  47. data/spec/legion/extensions/agentic/affect/somatic_marker/helpers/marker_store_spec.rb +1 -1
  48. metadata +1 -1
@@ -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(**)
@@ -7,51 +7,51 @@ module Legion
7
7
  module SomaticMarker
8
8
  module Runners
9
9
  module SomaticMarker
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_marker(action:, domain:, valence:, source: :experience, **)
14
14
  marker = store.register_marker(action: action, domain: domain, valence: valence, source: source)
15
- Legion::Logging.debug "[somatic_marker] register: action=#{action} domain=#{domain} " \
16
- "valence=#{valence.round(3)} source=#{source} id=#{marker.id}"
15
+ log.debug("[somatic_marker] register: action=#{action} domain=#{domain} " \
16
+ "valence=#{valence.round(3)} source=#{source} id=#{marker.id}")
17
17
  { success: true, marker: marker.to_h }
18
18
  rescue StandardError => e
19
- Legion::Logging.error "[somatic_marker] register failed: #{e.message}"
19
+ log.error("[somatic_marker] register failed: #{e.message}")
20
20
  { success: false, error: e.message }
21
21
  end
22
22
 
23
23
  def evaluate_option(action:, domain:, **)
24
24
  result = store.evaluate_option(action: action, domain: domain)
25
- Legion::Logging.debug "[somatic_marker] evaluate: action=#{action} domain=#{domain} " \
26
- "signal=#{result[:signal]} valence=#{result[:valence].round(3)}"
25
+ log.debug("[somatic_marker] evaluate: action=#{action} domain=#{domain} " \
26
+ "signal=#{result[:signal]} valence=#{result[:valence].round(3)}")
27
27
  { success: true }.merge(result)
28
28
  rescue StandardError => e
29
- Legion::Logging.error "[somatic_marker] evaluate failed: #{e.message}"
29
+ log.error("[somatic_marker] evaluate failed: #{e.message}")
30
30
  { success: false, error: e.message }
31
31
  end
32
32
 
33
33
  def make_decision(options:, domain:, **)
34
34
  result = store.decide(options: options, domain: domain)
35
- Legion::Logging.debug "[somatic_marker] decide: domain=#{domain} options=#{options.size} " \
36
- "top=#{result[:ranked].first&.fetch(:action)}"
35
+ log.debug("[somatic_marker] decide: domain=#{domain} options=#{options.size} " \
36
+ "top=#{result[:ranked].first&.fetch(:action)}")
37
37
  { success: true, decision: result }
38
38
  rescue StandardError => e
39
- Legion::Logging.error "[somatic_marker] decide failed: #{e.message}"
39
+ log.error("[somatic_marker] decide failed: #{e.message}")
40
40
  { success: false, error: e.message }
41
41
  end
42
42
 
43
43
  def reinforce(marker_id:, outcome_valence:, **)
44
44
  marker = store.reinforce_marker(marker_id: marker_id, outcome_valence: outcome_valence)
45
45
  unless marker
46
- Legion::Logging.debug "[somatic_marker] reinforce: marker_id=#{marker_id} not found"
46
+ log.debug("[somatic_marker] reinforce: marker_id=#{marker_id} not found")
47
47
  return { success: false, error: 'marker not found' }
48
48
  end
49
49
 
50
- Legion::Logging.debug "[somatic_marker] reinforce: id=#{marker_id} " \
51
- "outcome=#{outcome_valence.round(3)} new_valence=#{marker.valence.round(3)}"
50
+ log.debug("[somatic_marker] reinforce: id=#{marker_id} " \
51
+ "outcome=#{outcome_valence.round(3)} new_valence=#{marker.valence.round(3)}")
52
52
  { success: true, marker: marker.to_h }
53
53
  rescue StandardError => e
54
- Legion::Logging.error "[somatic_marker] reinforce failed: #{e.message}"
54
+ log.error("[somatic_marker] reinforce failed: #{e.message}")
55
55
  { success: false, error: e.message }
56
56
  end
57
57
 
@@ -62,59 +62,59 @@ module Legion
62
62
  comfort: comfort,
63
63
  gut_signal: gut_signal
64
64
  )
65
- Legion::Logging.debug "[somatic_marker] body_update: composite=#{state.composite_valence.round(3)} " \
66
- "stressed=#{state.stressed?}"
65
+ log.debug("[somatic_marker] body_update: composite=#{state.composite_valence.round(3)} " \
66
+ "stressed=#{state.stressed?}")
67
67
  { success: true, body_state: state.to_h }
68
68
  rescue StandardError => e
69
- Legion::Logging.error "[somatic_marker] body update failed: #{e.message}"
69
+ log.error("[somatic_marker] body update failed: #{e.message}")
70
70
  { success: false, error: e.message }
71
71
  end
72
72
 
73
73
  def body_state(**)
74
74
  state = store.body_state
75
- Legion::Logging.debug "[somatic_marker] body_state: composite=#{state.composite_valence.round(3)}"
75
+ log.debug("[somatic_marker] body_state: composite=#{state.composite_valence.round(3)}")
76
76
  { success: true, body_state: state.to_h }
77
77
  rescue StandardError => e
78
- Legion::Logging.error "[somatic_marker] body_state failed: #{e.message}"
78
+ log.error("[somatic_marker] body_state failed: #{e.message}")
79
79
  { success: false, error: e.message }
80
80
  end
81
81
 
82
82
  def markers_for_action(action:, domain:, **)
83
83
  markers = store.markers_for(action: action, domain: domain)
84
- Legion::Logging.debug "[somatic_marker] markers_for: action=#{action} domain=#{domain} " \
85
- "count=#{markers.size}"
84
+ log.debug("[somatic_marker] markers_for: action=#{action} domain=#{domain} " \
85
+ "count=#{markers.size}")
86
86
  { success: true, markers: markers.map(&:to_h), count: markers.size }
87
87
  rescue StandardError => e
88
- Legion::Logging.error "[somatic_marker] markers_for_action failed: #{e.message}"
88
+ log.error("[somatic_marker] markers_for_action failed: #{e.message}")
89
89
  { success: false, error: e.message }
90
90
  end
91
91
 
92
92
  def recent_decisions(limit: 10, **)
93
93
  decisions = store.decision_history(limit: limit)
94
- Legion::Logging.debug "[somatic_marker] recent_decisions: limit=#{limit} count=#{decisions.size}"
94
+ log.debug("[somatic_marker] recent_decisions: limit=#{limit} count=#{decisions.size}")
95
95
  { success: true, decisions: decisions, count: decisions.size }
96
96
  rescue StandardError => e
97
- Legion::Logging.error "[somatic_marker] recent_decisions failed: #{e.message}"
97
+ log.error("[somatic_marker] recent_decisions failed: #{e.message}")
98
98
  { success: false, error: e.message }
99
99
  end
100
100
 
101
101
  def update_somatic_markers(**)
102
102
  result = store.decay_all
103
- Legion::Logging.debug "[somatic_marker] decay: remaining=#{result[:markers_decayed]} " \
104
- "removed=#{result[:markers_removed]}"
103
+ log.debug("[somatic_marker] decay: remaining=#{result[:markers_decayed]} " \
104
+ "removed=#{result[:markers_removed]}")
105
105
  { success: true }.merge(result)
106
106
  rescue StandardError => e
107
- Legion::Logging.error "[somatic_marker] decay failed: #{e.message}"
107
+ log.error("[somatic_marker] decay failed: #{e.message}")
108
108
  { success: false, error: e.message }
109
109
  end
110
110
 
111
111
  def somatic_marker_stats(**)
112
112
  stats = store.to_h
113
- Legion::Logging.debug "[somatic_marker] stats: markers=#{stats[:marker_count]} " \
114
- "decisions=#{stats[:decision_count]}"
113
+ log.debug("[somatic_marker] stats: markers=#{stats[:marker_count]} " \
114
+ "decisions=#{stats[:decision_count]}")
115
115
  { success: true }.merge(stats)
116
116
  rescue StandardError => e
117
- Legion::Logging.error "[somatic_marker] stats failed: #{e.message}"
117
+ log.error("[somatic_marker] stats failed: #{e.message}")
118
118
  { success: false, error: e.message }
119
119
  end
120
120
 
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Agentic
6
6
  module Affect
7
- VERSION = '0.1.5'
7
+ VERSION = '0.1.6'
8
8
  end
9
9
  end
10
10
  end
@@ -23,7 +23,7 @@ module Legion
23
23
  module Extensions
24
24
  module Agentic
25
25
  module Affect
26
- extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
26
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core, false
27
27
 
28
28
  def self.remote_invocable?
29
29
  false
@@ -107,7 +107,7 @@ RSpec.describe Legion::Extensions::Agentic::Affect::SomaticMarker::Helpers::Mark
107
107
 
108
108
  it 'caps options at MAX_OPTIONS_PER_DECISION' do
109
109
  max = Legion::Extensions::Agentic::Affect::SomaticMarker::Helpers::Constants::MAX_OPTIONS_PER_DECISION
110
- options = (max + 5).times.map { |i| :"option_#{i}" }
110
+ options = Array.new(max + 5) { |i| :"option_#{i}" }
111
111
  result = store.decide(options: options, domain: :ops)
112
112
  expect(result[:ranked].size).to eq(max)
113
113
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-agentic-affect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity