lex-agentic-memory 0.1.16 → 0.1.17
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 +5 -0
- data/lex-agentic-memory.gemspec +1 -0
- data/lib/legion/extensions/agentic/memory/archaeology/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/memory/compression/actors/maintenance.rb +1 -1
- data/lib/legion/extensions/agentic/memory/echo/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/memory/echo_chamber/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/memory/echo_chamber/runners/cognitive_echo_chamber.rb +4 -4
- data/lib/legion/extensions/agentic/memory/episodic/runners/episodic_buffer.rb +11 -11
- data/lib/legion/extensions/agentic/memory/hologram/runners/cognitive_hologram.rb +18 -18
- data/lib/legion/extensions/agentic/memory/immune_memory/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/memory/nostalgia/actors/maintenance.rb +1 -1
- data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_engine.rb +2 -2
- data/lib/legion/extensions/agentic/memory/nostalgia/runners/analysis.rb +7 -7
- data/lib/legion/extensions/agentic/memory/nostalgia/runners/recall.rb +6 -6
- data/lib/legion/extensions/agentic/memory/offloading/runners/cognitive_offloading.rb +13 -13
- data/lib/legion/extensions/agentic/memory/palimpsest/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/memory/reserve/actors/maintenance.rb +1 -1
- data/lib/legion/extensions/agentic/memory/semantic/runners/semantic_memory.rb +13 -13
- data/lib/legion/extensions/agentic/memory/semantic_priming/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/memory/semantic_satiation/actors/recovery.rb +1 -1
- data/lib/legion/extensions/agentic/memory/semantic_satiation/runners/semantic_satiation.rb +16 -16
- data/lib/legion/extensions/agentic/memory/source_monitoring/actors/decay.rb +1 -1
- data/lib/legion/extensions/agentic/memory/source_monitoring/runners/source_monitoring.rb +9 -9
- data/lib/legion/extensions/agentic/memory/trace/batch_decay.rb +1 -1
- data/lib/legion/extensions/agentic/memory/trace/helpers/cache_store.rb +14 -14
- data/lib/legion/extensions/agentic/memory/trace/helpers/error_tracer.rb +2 -2
- data/lib/legion/extensions/agentic/memory/trace/helpers/hot_tier.rb +1 -1
- data/lib/legion/extensions/agentic/memory/trace/helpers/postgres_store.rb +5 -5
- data/lib/legion/extensions/agentic/memory/trace/helpers/snapshot.rb +1 -1
- data/lib/legion/extensions/agentic/memory/trace/helpers/store.rb +5 -5
- data/lib/legion/extensions/agentic/memory/trace/persistent_store.rb +3 -3
- data/lib/legion/extensions/agentic/memory/trace/runners/consolidation.rb +6 -6
- data/lib/legion/extensions/agentic/memory/trace/runners/traces.rb +8 -8
- data/lib/legion/extensions/agentic/memory/trace.rb +3 -3
- data/lib/legion/extensions/agentic/memory/transfer/runners/transfer_learning.rb +11 -11
- data/lib/legion/extensions/agentic/memory/version.rb +1 -1
- data/lib/legion/extensions/agentic/memory.rb +1 -1
- data/spec/legion/extensions/agentic/memory/archaeology/actors/decay_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/compression/actors/maintenance_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/echo/actors/decay_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/echo_chamber/actors/decay_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/immune_memory/actors/decay_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/nostalgia/actors/maintenance_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/palimpsest/actors/decay_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/reserve/actors/maintenance_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/semantic_priming/actors/decay_spec.rb +1 -1
- data/spec/legion/extensions/agentic/memory/semantic_satiation/actors/recovery_spec.rb +1 -1
- metadata +15 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fb1bf71d34f865e24372a5bc7f5c8f47d692ec141de8bb40fe5c96269aa78fc9
|
|
4
|
+
data.tar.gz: bc392262705eddec3f4e122b1afb79a6e25da73b20497b508778a95dc6b01d61
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 97ff50ebc6ae1c740d8041b808f2186e23d78dc055d498bd2eda2e527d46f8de85af5ddb2069553e6c9cbdfa5021ea09302713277352efe9c973bc449fd4a0fd
|
|
7
|
+
data.tar.gz: 5990cbe7a015dcfe0d702318d859592dc85245fc8b2dd3b589f6bc7af54bf40954e7b776a01b5fe6c7688fe51bcb06d0de1b1a8390684111386d4d9c92ee38d2
|
data/CHANGELOG.md
CHANGED
data/lex-agentic-memory.gemspec
CHANGED
|
@@ -35,5 +35,6 @@ Gem::Specification.new do |spec|
|
|
|
35
35
|
|
|
36
36
|
spec.add_development_dependency 'rspec', '~> 3.13'
|
|
37
37
|
spec.add_development_dependency 'rubocop', '~> 1.60'
|
|
38
|
+
spec.add_development_dependency 'rubocop-legion', '~> 0.1'
|
|
38
39
|
spec.add_development_dependency 'rubocop-rspec', '~> 2.26'
|
|
39
40
|
end
|
|
@@ -21,7 +21,7 @@ module Legion
|
|
|
21
21
|
source_agent: source_agent,
|
|
22
22
|
amplitude: amplitude
|
|
23
23
|
)
|
|
24
|
-
|
|
24
|
+
log.debug("[cognitive_echo_chamber] echo created id=#{echo.id} type=#{echo_type} domain=#{domain}")
|
|
25
25
|
{ success: true, echo: echo.to_h }
|
|
26
26
|
rescue ArgumentError => e
|
|
27
27
|
{ success: false, error: e.message }
|
|
@@ -32,7 +32,7 @@ module Legion
|
|
|
32
32
|
|
|
33
33
|
eng = engine || default_engine
|
|
34
34
|
chamber = eng.create_chamber(label: label, domain: domain, wall_thickness: wall_thickness)
|
|
35
|
-
|
|
35
|
+
log.debug("[cognitive_echo_chamber] chamber created id=#{chamber.id} label=#{label}")
|
|
36
36
|
{ success: true, chamber: chamber.to_h }
|
|
37
37
|
rescue ArgumentError => e
|
|
38
38
|
{ success: false, error: e.message }
|
|
@@ -43,14 +43,14 @@ module Legion
|
|
|
43
43
|
echo = eng.amplify_echo(echo_id: echo_id, rate: rate)
|
|
44
44
|
return { success: false, error: 'echo not found' } unless echo
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
log.debug("[cognitive_echo_chamber] amplified echo=#{echo_id} amplitude=#{echo.amplitude}")
|
|
47
47
|
{ success: true, echo: echo.to_h }
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
def disrupt(chamber_id:, force:, engine: nil, **)
|
|
51
51
|
eng = engine || default_engine
|
|
52
52
|
result = eng.disrupt_chamber(chamber_id: chamber_id, force: force)
|
|
53
|
-
|
|
53
|
+
log.debug("[cognitive_echo_chamber] disrupt chamber=#{chamber_id} success=#{result[:success]}")
|
|
54
54
|
result
|
|
55
55
|
end
|
|
56
56
|
|
|
@@ -10,7 +10,7 @@ module Legion
|
|
|
10
10
|
def create_episode(**)
|
|
11
11
|
store = default_store
|
|
12
12
|
episode = store.create_episode
|
|
13
|
-
|
|
13
|
+
log.debug("[episodic_buffer] created episode id=#{episode.id[0..7]}")
|
|
14
14
|
{ success: true, episode_id: episode.id, created_at: episode.created_at }
|
|
15
15
|
end
|
|
16
16
|
|
|
@@ -28,10 +28,10 @@ module Legion
|
|
|
28
28
|
)
|
|
29
29
|
|
|
30
30
|
if result[:added]
|
|
31
|
-
|
|
31
|
+
log.debug("[episodic_buffer] add_binding ep=#{episode_id[0..7]} mod=#{modality}")
|
|
32
32
|
{ success: true, episode_id: episode_id, binding_id: result[:binding_id] }
|
|
33
33
|
else
|
|
34
|
-
|
|
34
|
+
log.debug("[episodic_buffer] add_binding failed ep=#{episode_id[0..7]} r=#{result[:reason]}")
|
|
35
35
|
{ success: false, episode_id: episode_id, reason: result[:reason] }
|
|
36
36
|
end
|
|
37
37
|
end
|
|
@@ -39,56 +39,56 @@ module Legion
|
|
|
39
39
|
def attend_episode(episode_id:, **)
|
|
40
40
|
store = default_store
|
|
41
41
|
result = store.attend_episode(episode_id: episode_id)
|
|
42
|
-
|
|
42
|
+
log.debug("[episodic_buffer] attend ep=#{episode_id[0..7]} success=#{result[:success]}")
|
|
43
43
|
result.merge(success: result[:success])
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
def rehearse_episode(episode_id:, **)
|
|
47
47
|
store = default_store
|
|
48
48
|
result = store.rehearse_episode(episode_id: episode_id)
|
|
49
|
-
|
|
49
|
+
log.debug("[episodic_buffer] rehearse ep=#{episode_id[0..7]} success=#{result[:success]}")
|
|
50
50
|
result.merge(success: result[:success])
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def check_integration(episode_id:, **)
|
|
54
54
|
store = default_store
|
|
55
55
|
result = store.integrate(episode_id: episode_id)
|
|
56
|
-
|
|
56
|
+
log.debug("[episodic_buffer] check_integration ep=#{episode_id[0..7]} ok=#{result[:integrated]}")
|
|
57
57
|
result.merge(success: true)
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def retrieve_by_modality(modality:, **)
|
|
61
61
|
store = default_store
|
|
62
62
|
episodes = store.retrieve_by_modality(modality: modality.to_sym)
|
|
63
|
-
|
|
63
|
+
log.debug("[episodic_buffer] retrieve_by_modality mod=#{modality} count=#{episodes.size}")
|
|
64
64
|
{ success: true, modality: modality, count: episodes.size, episodes: episodes.map(&:to_h) }
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
def retrieve_multimodal(**)
|
|
68
68
|
store = default_store
|
|
69
69
|
episodes = store.retrieve_multimodal
|
|
70
|
-
|
|
70
|
+
log.debug("[episodic_buffer] retrieve_multimodal count=#{episodes.size}")
|
|
71
71
|
{ success: true, count: episodes.size, episodes: episodes.map(&:to_h) }
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
def most_coherent(limit: 5, **)
|
|
75
75
|
store = default_store
|
|
76
76
|
episodes = store.most_coherent(limit: limit)
|
|
77
|
-
|
|
77
|
+
log.debug("[episodic_buffer] most_coherent limit=#{limit} returned=#{episodes.size}")
|
|
78
78
|
{ success: true, count: episodes.size, episodes: episodes.map(&:to_h) }
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
def update_episodic_buffer(**)
|
|
82
82
|
store = default_store
|
|
83
83
|
result = store.tick
|
|
84
|
-
|
|
84
|
+
log.debug("[episodic_buffer] tick decayed=#{result[:decayed]} expired=#{result[:expired]}")
|
|
85
85
|
{ success: true }.merge(result)
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def episodic_buffer_stats(**)
|
|
89
89
|
store = default_store
|
|
90
90
|
stats = store.to_h
|
|
91
|
-
|
|
91
|
+
log.debug("[episodic_buffer] stats episodes=#{stats[:episode_count]}")
|
|
92
92
|
{ success: true }.merge(stats)
|
|
93
93
|
end
|
|
94
94
|
|
|
@@ -7,8 +7,8 @@ module Legion
|
|
|
7
7
|
module Hologram
|
|
8
8
|
module Runners
|
|
9
9
|
module CognitiveHologram
|
|
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 create(domain: :general, content: '', engine: nil, **)
|
|
14
14
|
raise ArgumentError, 'content cannot be empty' if content.to_s.strip.empty?
|
|
@@ -16,11 +16,11 @@ module Legion
|
|
|
16
16
|
target_engine = engine || default_engine
|
|
17
17
|
hologram = target_engine.create_hologram(domain: domain, content: content)
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
log.debug("[cognitive_hologram] created hologram: domain=#{domain} id=#{hologram.id}")
|
|
20
20
|
|
|
21
21
|
{ success: true, hologram: hologram.to_h }
|
|
22
22
|
rescue StandardError => e
|
|
23
|
-
|
|
23
|
+
log.error("[cognitive_hologram] create failed: #{e.message}")
|
|
24
24
|
{ success: false, error: e.message }
|
|
25
25
|
end
|
|
26
26
|
|
|
@@ -29,14 +29,14 @@ module Legion
|
|
|
29
29
|
fragments = target_engine.fragment_hologram(hologram_id: hologram_id, count: count)
|
|
30
30
|
|
|
31
31
|
unless fragments
|
|
32
|
-
|
|
32
|
+
log.warn("[cognitive_hologram] fragment: hologram not found id=#{hologram_id}")
|
|
33
33
|
return { success: false, reason: :hologram_not_found }
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
log.debug("[cognitive_hologram] fragmented hologram id=#{hologram_id} count=#{fragments.size}")
|
|
37
37
|
{ success: true, fragment_count: fragments.size, fragments: fragments.map(&:to_h) }
|
|
38
38
|
rescue StandardError => e
|
|
39
|
-
|
|
39
|
+
log.error("[cognitive_hologram] fragment failed: #{e.message}")
|
|
40
40
|
{ success: false, error: e.message }
|
|
41
41
|
end
|
|
42
42
|
|
|
@@ -47,12 +47,12 @@ module Legion
|
|
|
47
47
|
fragment_ids: fragment_ids
|
|
48
48
|
)
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
log.debug("[cognitive_hologram] reconstruct hologram=#{hologram_id} " \
|
|
51
|
+
"fragments=#{fragment_ids.size} success=#{result[:success]}")
|
|
52
52
|
|
|
53
53
|
result.merge(success: result[:success])
|
|
54
54
|
rescue StandardError => e
|
|
55
|
-
|
|
55
|
+
log.error("[cognitive_hologram] reconstruct failed: #{e.message}")
|
|
56
56
|
{ success: false, error: e.message }
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -60,10 +60,10 @@ module Legion
|
|
|
60
60
|
target_engine = engine || default_engine
|
|
61
61
|
holograms = target_engine.holograms.first(limit)
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
log.debug("[cognitive_hologram] list_holograms: count=#{holograms.size} limit=#{limit}")
|
|
64
64
|
{ success: true, holograms: holograms.map(&:to_h), count: holograms.size }
|
|
65
65
|
rescue StandardError => e
|
|
66
|
-
|
|
66
|
+
log.error("[cognitive_hologram] list_holograms failed: #{e.message}")
|
|
67
67
|
{ success: false, error: e.message }
|
|
68
68
|
end
|
|
69
69
|
|
|
@@ -74,12 +74,12 @@ module Legion
|
|
|
74
74
|
hologram_id_b: hologram_id_b
|
|
75
75
|
)
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
log.debug('[cognitive_hologram] interference_check: ' \
|
|
78
|
+
"a=#{hologram_id_a} b=#{hologram_id_b} score=#{result[:interference]}")
|
|
79
79
|
|
|
80
80
|
result.merge(success: true)
|
|
81
81
|
rescue StandardError => e
|
|
82
|
-
|
|
82
|
+
log.error("[cognitive_hologram] interference_check failed: #{e.message}")
|
|
83
83
|
{ success: false, error: e.message }
|
|
84
84
|
end
|
|
85
85
|
|
|
@@ -87,12 +87,12 @@ module Legion
|
|
|
87
87
|
target_engine = engine || default_engine
|
|
88
88
|
report = target_engine.hologram_report
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
log.debug("[cognitive_hologram] status: total=#{report[:total_holograms]} " \
|
|
91
|
+
"avg_resolution=#{report[:average_resolution].round(2)}")
|
|
92
92
|
|
|
93
93
|
{ success: true, report: report }
|
|
94
94
|
rescue StandardError => e
|
|
95
|
-
|
|
95
|
+
log.error("[cognitive_hologram] hologram_status failed: #{e.message}")
|
|
96
96
|
{ success: false, error: e.message }
|
|
97
97
|
end
|
|
98
98
|
|
|
@@ -31,7 +31,7 @@ module Legion
|
|
|
31
31
|
candidates = find_candidates(domain, trigger)
|
|
32
32
|
return [] if candidates.empty?
|
|
33
33
|
|
|
34
|
-
new_events = candidates.
|
|
34
|
+
new_events = candidates.filter_map do |memory|
|
|
35
35
|
intensity = compute_intensity(memory, intensity_hint)
|
|
36
36
|
next unless intensity >= Constants::TRIGGER_SENSITIVITY
|
|
37
37
|
|
|
@@ -44,7 +44,7 @@ module Legion
|
|
|
44
44
|
memory.warm!(intensity * 0.1)
|
|
45
45
|
@events << event
|
|
46
46
|
event
|
|
47
|
-
end
|
|
47
|
+
end
|
|
48
48
|
|
|
49
49
|
@events.shift while @events.size > Constants::MAX_EVENTS
|
|
50
50
|
new_events
|
|
@@ -7,13 +7,13 @@ module Legion
|
|
|
7
7
|
module Nostalgia
|
|
8
8
|
module Runners
|
|
9
9
|
module Analysis
|
|
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 warmth_by_domain(engine: nil, **)
|
|
14
14
|
eng = engine || nostalgia_engine
|
|
15
15
|
by_domain = eng.warmth_by_domain
|
|
16
|
-
|
|
16
|
+
log.debug("[cognitive_nostalgia] warmth_by_domain: #{by_domain.size} domains")
|
|
17
17
|
{ success: true, warmth_by_domain: by_domain }
|
|
18
18
|
end
|
|
19
19
|
|
|
@@ -21,7 +21,7 @@ module Legion
|
|
|
21
21
|
eng = engine || nostalgia_engine
|
|
22
22
|
index = eng.rosy_retrospection_index
|
|
23
23
|
label = Helpers::Constants.label_for(Helpers::Constants::RETROSPECTION_LABELS, index)
|
|
24
|
-
|
|
24
|
+
log.debug("[cognitive_nostalgia] rosy_retrospection_index=#{index.round(2)} label=#{label}")
|
|
25
25
|
{ success: true, index: index, label: label }
|
|
26
26
|
end
|
|
27
27
|
|
|
@@ -29,21 +29,21 @@ module Legion
|
|
|
29
29
|
eng = engine || nostalgia_engine
|
|
30
30
|
proneness = eng.nostalgia_proneness
|
|
31
31
|
label = Helpers::Constants.label_for(Helpers::Constants::NOSTALGIA_LABELS, proneness)
|
|
32
|
-
|
|
32
|
+
log.debug("[cognitive_nostalgia] nostalgia_proneness=#{proneness.round(2)} label=#{label}")
|
|
33
33
|
{ success: true, proneness: proneness, label: label }
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def most_nostalgic_domains(engine: nil, **)
|
|
37
37
|
eng = engine || nostalgia_engine
|
|
38
38
|
domains = eng.most_nostalgic_domains
|
|
39
|
-
|
|
39
|
+
log.debug("[cognitive_nostalgia] most_nostalgic_domains: top=#{domains.first&.fetch(:domain, :none)}")
|
|
40
40
|
{ success: true, domains: domains }
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def bittersweet_memories(engine: nil, **)
|
|
44
44
|
eng = engine || nostalgia_engine
|
|
45
45
|
memories = eng.bittersweet_memories
|
|
46
|
-
|
|
46
|
+
log.debug("[cognitive_nostalgia] bittersweet_memories: count=#{memories.size}")
|
|
47
47
|
{ success: true, memories: memories, count: memories.size }
|
|
48
48
|
end
|
|
49
49
|
|
|
@@ -7,8 +7,8 @@ module Legion
|
|
|
7
7
|
module Nostalgia
|
|
8
8
|
module Runners
|
|
9
9
|
module Recall
|
|
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 store_memory(content:, domain: :unknown, warmth: Helpers::Constants::DEFAULT_WARMTH,
|
|
14
14
|
original_valence: 0.5, engine: nil, **)
|
|
@@ -19,21 +19,21 @@ module Legion
|
|
|
19
19
|
warmth: warmth,
|
|
20
20
|
original_valence: original_valence
|
|
21
21
|
)
|
|
22
|
-
|
|
22
|
+
log.debug("[cognitive_nostalgia] stored memory id=#{memory.id} domain=#{memory.domain} warmth=#{memory.warmth.round(2)}")
|
|
23
23
|
{ success: true, memory: memory.to_h }
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def trigger_nostalgia(trigger:, domain: nil, intensity_hint: nil, engine: nil, **)
|
|
27
27
|
eng = engine || nostalgia_engine
|
|
28
28
|
events = eng.trigger_nostalgia(trigger: trigger, domain: domain, intensity_hint: intensity_hint)
|
|
29
|
-
|
|
29
|
+
log.debug("[cognitive_nostalgia] triggered nostalgia: trigger=#{trigger} events=#{events.size}")
|
|
30
30
|
{ success: true, events: events.map(&:to_h), count: events.size }
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def age_memories(engine: nil, **)
|
|
34
34
|
eng = engine || nostalgia_engine
|
|
35
35
|
eng.age_all!
|
|
36
|
-
|
|
36
|
+
log.debug("[cognitive_nostalgia] aged #{eng.memories.size} memories")
|
|
37
37
|
{ success: true, memory_count: eng.memories.size }
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -42,7 +42,7 @@ module Legion
|
|
|
42
42
|
report = eng.nostalgia_report
|
|
43
43
|
idx = report[:rosy_retrospection_index].round(2)
|
|
44
44
|
pro = report[:nostalgia_proneness].round(2)
|
|
45
|
-
|
|
45
|
+
log.debug("[cognitive_nostalgia] report: index=#{idx} proneness=#{pro}")
|
|
46
46
|
{ success: true, **report }
|
|
47
47
|
end
|
|
48
48
|
|
|
@@ -7,17 +7,17 @@ module Legion
|
|
|
7
7
|
module Offloading
|
|
8
8
|
module Runners
|
|
9
9
|
module CognitiveOffloading
|
|
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_store(name:, store_type:, engine: nil, **)
|
|
14
14
|
eng = engine || offloading_engine
|
|
15
15
|
store = eng.register_store(name: name, store_type: store_type)
|
|
16
16
|
if store
|
|
17
|
-
|
|
17
|
+
log.info("[cognitive_offloading] registered store name=#{name} type=#{store_type} id=#{store.id}")
|
|
18
18
|
{ success: true, store: store.to_h }
|
|
19
19
|
else
|
|
20
|
-
|
|
20
|
+
log.warn('[cognitive_offloading] register_store failed: limit reached or invalid store_type')
|
|
21
21
|
{ success: false, reason: :limit_reached }
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -26,10 +26,10 @@ module Legion
|
|
|
26
26
|
eng = engine || offloading_engine
|
|
27
27
|
item = eng.offload(content: content, item_type: item_type, importance: importance, store_id: store_id)
|
|
28
28
|
if item
|
|
29
|
-
|
|
29
|
+
log.info("[cognitive_offloading] offloaded item=#{item.id} type=#{item_type} importance=#{importance.round(2)} store=#{store_id}")
|
|
30
30
|
{ success: true, item: item.to_h }
|
|
31
31
|
else
|
|
32
|
-
|
|
32
|
+
log.warn("[cognitive_offloading] offload failed: limit reached or store not found store_id=#{store_id}")
|
|
33
33
|
{ success: false, reason: :offload_failed }
|
|
34
34
|
end
|
|
35
35
|
end
|
|
@@ -38,10 +38,10 @@ module Legion
|
|
|
38
38
|
eng = engine || offloading_engine
|
|
39
39
|
item = eng.retrieve(item_id: item_id)
|
|
40
40
|
if item
|
|
41
|
-
|
|
41
|
+
log.debug("[cognitive_offloading] retrieved item=#{item_id} count=#{item.retrieved_count}")
|
|
42
42
|
{ success: true, item: item.to_h }
|
|
43
43
|
else
|
|
44
|
-
|
|
44
|
+
log.warn("[cognitive_offloading] retrieve failed: item not found item_id=#{item_id}")
|
|
45
45
|
{ success: false, reason: :not_found }
|
|
46
46
|
end
|
|
47
47
|
end
|
|
@@ -52,7 +52,7 @@ module Legion
|
|
|
52
52
|
if item
|
|
53
53
|
store = eng.stores[item.store_id]
|
|
54
54
|
trust = store&.trust&.round(2)
|
|
55
|
-
|
|
55
|
+
log.warn("[cognitive_offloading] retrieval failure item=#{item_id} store_trust=#{trust}")
|
|
56
56
|
{ success: true, item_id: item_id, store_trust: trust }
|
|
57
57
|
else
|
|
58
58
|
{ success: false, reason: :not_found }
|
|
@@ -62,21 +62,21 @@ module Legion
|
|
|
62
62
|
def items_in_store(store_id:, engine: nil, **)
|
|
63
63
|
eng = engine || offloading_engine
|
|
64
64
|
items = eng.items_in_store(store_id: store_id)
|
|
65
|
-
|
|
65
|
+
log.debug("[cognitive_offloading] items_in_store store=#{store_id} count=#{items.size}")
|
|
66
66
|
{ success: true, items: items.map(&:to_h), count: items.size }
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def items_by_type(item_type:, engine: nil, **)
|
|
70
70
|
eng = engine || offloading_engine
|
|
71
71
|
items = eng.items_by_type(item_type: item_type)
|
|
72
|
-
|
|
72
|
+
log.debug("[cognitive_offloading] items_by_type type=#{item_type} count=#{items.size}")
|
|
73
73
|
{ success: true, items: items.map(&:to_h), count: items.size }
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
def most_important_offloaded(limit: 10, engine: nil, **)
|
|
77
77
|
eng = engine || offloading_engine
|
|
78
78
|
items = eng.most_important_offloaded(limit: limit)
|
|
79
|
-
|
|
79
|
+
log.debug("[cognitive_offloading] most_important limit=#{limit} count=#{items.size}")
|
|
80
80
|
{ success: true, items: items.map(&:to_h), count: items.size }
|
|
81
81
|
end
|
|
82
82
|
|
|
@@ -84,7 +84,7 @@ module Legion
|
|
|
84
84
|
eng = engine || offloading_engine
|
|
85
85
|
report = eng.offloading_report
|
|
86
86
|
ratio = report[:offloading_ratio]
|
|
87
|
-
|
|
87
|
+
log.debug("[cognitive_offloading] status items=#{report[:total_items]} stores=#{report[:total_stores]} ratio=#{ratio}")
|
|
88
88
|
{ success: true, report: report }
|
|
89
89
|
end
|
|
90
90
|
|
|
@@ -7,68 +7,68 @@ module Legion
|
|
|
7
7
|
module Semantic
|
|
8
8
|
module Runners
|
|
9
9
|
module SemanticMemory
|
|
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 store_concept(name:, domain: :general, confidence: nil, properties: {}, **)
|
|
14
14
|
concept = knowledge_store.store(name: name, domain: domain, confidence: confidence, properties: properties)
|
|
15
|
-
|
|
15
|
+
log.debug("[semantic_memory] store: name=#{name} domain=#{domain} conf=#{concept.confidence.round(3)}")
|
|
16
16
|
{ success: true, concept: concept.to_h }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def relate_concepts(source:, target:, type:, confidence: nil, **)
|
|
20
20
|
type_sym = type.to_sym
|
|
21
21
|
result = knowledge_store.relate(source: source, target: target, type: type_sym, confidence: confidence)
|
|
22
|
-
|
|
22
|
+
log.debug("[semantic_memory] relate: #{source} --#{type_sym}--> #{target}")
|
|
23
23
|
{ success: true, source: source, target: target, type: type_sym, relation: result }
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def retrieve_concept(name:, **)
|
|
27
27
|
concept = knowledge_store.retrieve(name: name)
|
|
28
28
|
if concept
|
|
29
|
-
|
|
29
|
+
log.debug("[semantic_memory] retrieve: name=#{name} conf=#{concept.confidence.round(3)}")
|
|
30
30
|
{ success: true, found: true, concept: concept.to_h }
|
|
31
31
|
else
|
|
32
|
-
|
|
32
|
+
log.debug("[semantic_memory] retrieve: name=#{name} not_found")
|
|
33
33
|
{ success: true, found: false, name: name }
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def query_concept_relations(name:, type: nil, **)
|
|
38
38
|
relations = knowledge_store.query_relations(name: name, type: type&.to_sym)
|
|
39
|
-
|
|
39
|
+
log.debug("[semantic_memory] query_relations: name=#{name} type=#{type} count=#{relations.size}")
|
|
40
40
|
{ success: true, name: name, relations: relations, count: relations.size }
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def check_category(concept:, category:, **)
|
|
44
44
|
result = knowledge_store.check_is_a(concept, category)
|
|
45
|
-
|
|
45
|
+
log.debug("[semantic_memory] check_category: #{concept} is_a #{category} = #{result}")
|
|
46
46
|
{ success: true, concept: concept, category: category, is_member: result }
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def find_instances(category:, **)
|
|
50
50
|
instances = knowledge_store.instances_of(category)
|
|
51
|
-
|
|
51
|
+
log.debug("[semantic_memory] instances_of: #{category} count=#{instances.size}")
|
|
52
52
|
{ success: true, category: category, instances: instances.map(&:name), count: instances.size }
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def activate_spread(seed:, hops: nil, **)
|
|
56
56
|
hop_count = hops || Helpers::Constants::MAX_SPREAD_HOPS
|
|
57
57
|
activated = knowledge_store.spreading_activation(seed: seed, hops: hop_count)
|
|
58
|
-
|
|
58
|
+
log.debug("[semantic_memory] spread: seed=#{seed} hops=#{hop_count} activated=#{activated.size}")
|
|
59
59
|
{ success: true, seed: seed, activated: activated, count: activated.size }
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
def concepts_in(domain:, **)
|
|
63
63
|
concepts = knowledge_store.concepts_in_domain(domain)
|
|
64
|
-
|
|
64
|
+
log.debug("[semantic_memory] domain_query: domain=#{domain} count=#{concepts.size}")
|
|
65
65
|
{ success: true, domain: domain, concepts: concepts.map(&:name), count: concepts.size }
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
def update_semantic_memory(**)
|
|
69
69
|
knowledge_store.decay_all
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
log.debug("[semantic_memory] tick: concepts=#{knowledge_store.concept_count} " \
|
|
71
|
+
"relations=#{knowledge_store.relation_count}")
|
|
72
72
|
{
|
|
73
73
|
success: true,
|
|
74
74
|
concepts: knowledge_store.concept_count,
|