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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile +2 -0
- data/LICENSE +201 -21
- data/README.md +1 -1
- data/lib/legion/extensions/agentic/affect/appraisal/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/appraisal/runners/appraisal.rb +18 -16
- data/lib/legion/extensions/agentic/affect/cognitive_empathy/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/cognitive_empathy/runners/cognitive_empathy.rb +3 -1
- data/lib/legion/extensions/agentic/affect/contagion/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/contagion/runners/cognitive_contagion.rb +24 -24
- data/lib/legion/extensions/agentic/affect/defusion/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/defusion/runners/cognitive_defusion.rb +21 -21
- data/lib/legion/extensions/agentic/affect/emotion/actors/momentum_decay.rb +1 -1
- data/lib/legion/extensions/agentic/affect/emotion/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/emotion/runners/gut.rb +7 -7
- data/lib/legion/extensions/agentic/affect/emotion/runners/valence.rb +10 -10
- data/lib/legion/extensions/agentic/affect/empathy/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/empathy/runners/empathy.rb +14 -14
- data/lib/legion/extensions/agentic/affect/fatigue/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/fatigue/runners/fatigue.rb +9 -9
- data/lib/legion/extensions/agentic/affect/flow/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/flow/runners/flow.rb +8 -8
- data/lib/legion/extensions/agentic/affect/interoception/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/affect/interoception/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/interoception/runners/interoception.rb +12 -12
- data/lib/legion/extensions/agentic/affect/mood/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/mood/runners/mood.rb +7 -7
- data/lib/legion/extensions/agentic/affect/motivation/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/motivation/runners/motivation.rb +13 -13
- data/lib/legion/extensions/agentic/affect/reappraisal/actors/auto_regulate.rb +1 -1
- data/lib/legion/extensions/agentic/affect/reappraisal/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/reappraisal/helpers/llm_enhancer.rb +4 -4
- data/lib/legion/extensions/agentic/affect/reappraisal/runners/cognitive_reappraisal.rb +17 -17
- data/lib/legion/extensions/agentic/affect/regulation/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/regulation/runners/emotional_regulation.rb +12 -12
- data/lib/legion/extensions/agentic/affect/resilience/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb +10 -10
- data/lib/legion/extensions/agentic/affect/resonance/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/resonance/helpers/resonance_engine.rb +10 -6
- data/lib/legion/extensions/agentic/affect/resonance/runners/cognitive_resonance.rb +12 -12
- data/lib/legion/extensions/agentic/affect/reward/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/reward/runners/reward.rb +10 -10
- data/lib/legion/extensions/agentic/affect/somatic_marker/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/affect/somatic_marker/client.rb +1 -0
- data/lib/legion/extensions/agentic/affect/somatic_marker/runners/somatic_marker.rb +31 -31
- data/lib/legion/extensions/agentic/affect/version.rb +1 -1
- data/lib/legion/extensions/agentic/affect.rb +2 -2
- data/spec/legion/extensions/agentic/affect/somatic_marker/helpers/marker_store_spec.rb +1 -1
- 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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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
|
|
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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
41
|
-
|
|
40
|
+
log.info("[cognitive_reappraisal] reappraised event=#{event_id[0..7]} " \
|
|
41
|
+
"strategy=#{strategy} change=#{result[:change].round(2)}")
|
|
42
42
|
else
|
|
43
|
-
|
|
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
|
-
|
|
60
|
-
|
|
59
|
+
log.info("[cognitive_reappraisal] auto-reappraised event=#{event_id[0..7]} " \
|
|
60
|
+
"strategy=#{strategy}")
|
|
61
61
|
else
|
|
62
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
@@ -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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
+
log.debug("[emotional_regulation] stats: total=#{total} success_rate=#{(successes.to_f / total).round(2)}")
|
|
104
104
|
|
|
105
105
|
{
|
|
106
106
|
success: true,
|
|
@@ -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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
+
log.debug("[resilience] dimension #{dimension}: #{detail[:value]}")
|
|
69
69
|
detail
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
def resilience_stats(**)
|
|
73
|
-
|
|
73
|
+
log.debug('[resilience] stats')
|
|
74
74
|
|
|
75
75
|
{
|
|
76
76
|
composite: resilience_model.composite_score.round(4),
|
|
@@ -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
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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
|
-
|
|
79
|
+
log.debug('[cognitive_resonance] engine reset')
|
|
80
80
|
{ success: true, reset: true }
|
|
81
81
|
end
|
|
82
82
|
|
|
@@ -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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|