Class: Legion::Extensions::Agentic::Affect::PersonalityState

Inherits:
Object
  • Object
show all
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

Constructor Details

#initializePersonalityState

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

Returns:

  • (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.message}"
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_entriesObject



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_hObject



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