Class: Legion::Extensions::Agentic::Affect::PersonalityState
- Inherits:
-
Object
- Object
- Legion::Extensions::Agentic::Affect::PersonalityState
- Defined in:
- lib/legion/extensions/agentic/affect/personality_state.rb
Overview
PersonalityState models the Big Five (OCEAN) personality dimensions as global affect modifiers. Traits persist to Apollo Local tagged [‘personality’, ‘ocean’, ‘global’].
Constant Summary collapse
- TRAITS =
%i[openness conscientiousness extraversion agreeableness neuroticism].freeze
- DIRTY_THRESHOLD =
0.02
Instance Method Summary collapse
- #dirty? ⇒ Boolean
- #from_apollo(store:) ⇒ Object
-
#initialize ⇒ PersonalityState
constructor
A new instance of PersonalityState.
- #mark_clean! ⇒ Object
- #to_apollo_entries ⇒ Object
- #to_h ⇒ Object
- #update_trait(trait, value) ⇒ Object
Constructor Details
#initialize ⇒ PersonalityState
Returns a new instance of PersonalityState.
15 16 17 18 19 |
# File 'lib/legion/extensions/agentic/affect/personality_state.rb', line 15 def initialize TRAITS.each { |t| instance_variable_set(:"@#{t}", 0.5) } @dirty = false @last_persisted = snapshot end |
Instance Method Details
#dirty? ⇒ Boolean
29 30 31 |
# File 'lib/legion/extensions/agentic/affect/personality_state.rb', line 29 def dirty? @dirty end |
#from_apollo(store:) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/legion/extensions/agentic/affect/personality_state.rb', line 45 def from_apollo(store:) entries = store.query(tags: %w[personality ocean global]) return if entries.empty? data = ::JSON.parse(entries.first[:content]) TRAITS.each do |trait| val = data[trait.to_s] instance_variable_set(:"@#{trait}", val.to_f.clamp(0.0, 1.0)) if val end @last_persisted = snapshot @dirty = false rescue ::JSON::ParserError => e warn "[personality_state] from_apollo: invalid entry: #{e.}" end |
#mark_clean! ⇒ Object
33 34 35 36 |
# File 'lib/legion/extensions/agentic/affect/personality_state.rb', line 33 def mark_clean! @dirty = false @last_persisted = snapshot end |
#to_apollo_entries ⇒ Object
38 39 40 41 42 43 |
# File 'lib/legion/extensions/agentic/affect/personality_state.rb', line 38 def to_apollo_entries [{ content: ::JSON.generate(to_h.transform_keys(&:to_s)), tags: %w[personality ocean global] }] end |
#to_h ⇒ Object
60 61 62 |
# File 'lib/legion/extensions/agentic/affect/personality_state.rb', line 60 def to_h TRAITS.to_h { |t| [t, instance_variable_get(:"@#{t}")] } end |
#update_trait(trait, value) ⇒ Object
21 22 23 24 25 26 27 |
# File 'lib/legion/extensions/agentic/affect/personality_state.rb', line 21 def update_trait(trait, value) return unless TRAITS.include?(trait) clamped = value.to_f.clamp(0.0, 1.0) instance_variable_set(:"@#{trait}", clamped) @dirty = true if (clamped - @last_persisted[trait]).abs >= DIRTY_THRESHOLD end |