Class: Legion::Extensions::Agentic::Memory::Episodic::Helpers::EpisodicStore

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb

Constant Summary

Constants included from Constants

Constants::ATTENTION_BOOST, Constants::BINDING_DECAY, Constants::BINDING_STRENGTH_FLOOR, Constants::COHERENCE_LABELS, Constants::DEFAULT_BINDING_STRENGTH, Constants::EPISODE_TTL, Constants::INTEGRATION_THRESHOLD, Constants::MAX_BINDINGS_PER_EPISODE, Constants::MAX_EPISODES, Constants::MAX_HISTORY, Constants::MODALITIES, Constants::RECENTLY_ACCESSED_WINDOW, Constants::REHEARSAL_BOOST

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEpisodicStore

Returns a new instance of EpisodicStore.



14
15
16
17
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 14

def initialize
  @episodes = {}
  @history  = []
end

Instance Attribute Details

#episodesObject (readonly)

Returns the value of attribute episodes.



12
13
14
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 12

def episodes
  @episodes
end

#historyObject (readonly)

Returns the value of attribute history.



12
13
14
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 12

def history
  @history
end

Instance Method Details

#add_to_episode(episode_id:, modality:, content:, source:, strength: DEFAULT_BINDING_STRENGTH) ⇒ Object



27
28
29
30
31
32
33
34
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 27

def add_to_episode(episode_id:, modality:, content:, source:, strength: DEFAULT_BINDING_STRENGTH)
  episode = @episodes[episode_id]
  return { success: false, reason: :episode_not_found } unless episode

  result = episode.add_binding(modality: modality, content: content, source: source, strength: strength)
  record_history(:add_binding, episode_id) if result[:added]
  result
end

#attend_episode(episode_id:) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 36

def attend_episode(episode_id:)
  episode = @episodes[episode_id]
  return { success: false, reason: :episode_not_found } unless episode

  episode.attend
  record_history(:attend, episode_id)
  { success: true, episode_id: episode_id }
end

#countObject



97
98
99
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 97

def count
  @episodes.size
end

#create_episodeObject



19
20
21
22
23
24
25
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 19

def create_episode
  evict_if_full
  episode = Episode.new
  @episodes[episode.id] = episode
  record_history(:create, episode.id)
  episode
end

#integrate(episode_id:) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 54

def integrate(episode_id:)
  episode = @episodes[episode_id]
  return { integrated: false, reason: :episode_not_found } unless episode

  coherence = episode.coherence
  integrated = coherence >= INTEGRATION_THRESHOLD
  {
    integrated:      integrated,
    episode_id:      episode_id,
    coherence:       coherence,
    coherence_label: episode.coherence_label
  }
end

#most_coherent(limit: 5) ⇒ Object



77
78
79
80
81
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 77

def most_coherent(limit: 5)
  @episodes.values
           .sort_by { |ep| -ep.coherence }
           .first(limit)
end

#rehearse_episode(episode_id:) ⇒ Object



45
46
47
48
49
50
51
52
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 45

def rehearse_episode(episode_id:)
  episode = @episodes[episode_id]
  return { success: false, reason: :episode_not_found } unless episode

  episode.rehearse
  record_history(:rehearse, episode_id)
  { success: true, episode_id: episode_id }
end

#retrieve_by_modality(modality:) ⇒ Object



68
69
70
71
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 68

def retrieve_by_modality(modality:)
  mod = modality.to_sym
  @episodes.values.select { |ep| ep.modalities_present.include?(mod) }
end

#retrieve_multimodalObject



73
74
75
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 73

def retrieve_multimodal
  @episodes.values.select(&:multimodal?)
end

#tickObject



83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 83

def tick
  expired_count = 0
  @episodes.delete_if do |_, ep|
    ep.decay_bindings
    if ep.expired?
      expired_count += 1
      true
    else
      false
    end
  end
  { decayed: @episodes.size, expired: expired_count }
end

#to_hObject



101
102
103
104
105
106
107
108
# File 'lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb', line 101

def to_h
  {
    episode_count:    @episodes.size,
    history_size:     @history.size,
    multimodal_count: retrieve_multimodal.size,
    avg_coherence:    average_coherence
  }
end