lex-agentic-memory 0.1.0
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 +7 -0
- data/CHANGELOG.md +12 -0
- data/Gemfile +5 -0
- data/LICENSE +21 -0
- data/README.md +13 -0
- data/lex-agentic-memory.gemspec +30 -0
- data/lib/legion/extensions/agentic/memory/archaeology/client.rb +19 -0
- data/lib/legion/extensions/agentic/memory/archaeology/helpers/archaeology_engine.rb +184 -0
- data/lib/legion/extensions/agentic/memory/archaeology/helpers/artifact.rb +146 -0
- data/lib/legion/extensions/agentic/memory/archaeology/helpers/constants.rb +95 -0
- data/lib/legion/extensions/agentic/memory/archaeology/helpers/excavation_site.rb +97 -0
- data/lib/legion/extensions/agentic/memory/archaeology/runners/cognitive_archaeology.rb +86 -0
- data/lib/legion/extensions/agentic/memory/archaeology/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/archaeology.rb +22 -0
- data/lib/legion/extensions/agentic/memory/compression/client.rb +15 -0
- data/lib/legion/extensions/agentic/memory/compression/helpers/compression_engine.rb +145 -0
- data/lib/legion/extensions/agentic/memory/compression/helpers/constants.rb +44 -0
- data/lib/legion/extensions/agentic/memory/compression/helpers/information_chunk.rb +81 -0
- data/lib/legion/extensions/agentic/memory/compression/runners/cognitive_compression.rb +76 -0
- data/lib/legion/extensions/agentic/memory/compression/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/compression.rb +19 -0
- data/lib/legion/extensions/agentic/memory/echo/client.rb +19 -0
- data/lib/legion/extensions/agentic/memory/echo/helpers/constants.rb +57 -0
- data/lib/legion/extensions/agentic/memory/echo/helpers/echo.rb +95 -0
- data/lib/legion/extensions/agentic/memory/echo/helpers/echo_engine.rb +136 -0
- data/lib/legion/extensions/agentic/memory/echo/runners/cognitive_echo.rb +81 -0
- data/lib/legion/extensions/agentic/memory/echo/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/echo.rb +19 -0
- data/lib/legion/extensions/agentic/memory/echo_chamber/client.rb +19 -0
- data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/chamber.rb +134 -0
- data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_engine.rb +156 -0
- data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/constants.rb +60 -0
- data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/echo.rb +96 -0
- data/lib/legion/extensions/agentic/memory/echo_chamber/runners/cognitive_echo_chamber.rb +84 -0
- data/lib/legion/extensions/agentic/memory/echo_chamber/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/echo_chamber.rb +21 -0
- data/lib/legion/extensions/agentic/memory/episodic/actors/decay.rb +45 -0
- data/lib/legion/extensions/agentic/memory/episodic/client.rb +25 -0
- data/lib/legion/extensions/agentic/memory/episodic/helpers/constants.rb +36 -0
- data/lib/legion/extensions/agentic/memory/episodic/helpers/episode.rb +104 -0
- data/lib/legion/extensions/agentic/memory/episodic/helpers/episodic_binding.rb +57 -0
- data/lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb +141 -0
- data/lib/legion/extensions/agentic/memory/episodic/runners/episodic_buffer.rb +108 -0
- data/lib/legion/extensions/agentic/memory/episodic/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/episodic.rb +20 -0
- data/lib/legion/extensions/agentic/memory/hologram/client.rb +23 -0
- data/lib/legion/extensions/agentic/memory/hologram/helpers/constants.rb +67 -0
- data/lib/legion/extensions/agentic/memory/hologram/helpers/hologram.rb +118 -0
- data/lib/legion/extensions/agentic/memory/hologram/helpers/hologram_engine.rb +117 -0
- data/lib/legion/extensions/agentic/memory/hologram/helpers/holographic_fragment.rb +70 -0
- data/lib/legion/extensions/agentic/memory/hologram/runners/cognitive_hologram.rb +110 -0
- data/lib/legion/extensions/agentic/memory/hologram/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/hologram.rb +22 -0
- data/lib/legion/extensions/agentic/memory/immune_memory/client.rb +19 -0
- data/lib/legion/extensions/agentic/memory/immune_memory/helpers/constants.rb +84 -0
- data/lib/legion/extensions/agentic/memory/immune_memory/helpers/encounter.rb +54 -0
- data/lib/legion/extensions/agentic/memory/immune_memory/helpers/immune_memory_engine.rb +171 -0
- data/lib/legion/extensions/agentic/memory/immune_memory/helpers/memory_cell.rb +97 -0
- data/lib/legion/extensions/agentic/memory/immune_memory/runners/cognitive_immune_memory.rb +76 -0
- data/lib/legion/extensions/agentic/memory/immune_memory/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/immune_memory.rb +20 -0
- data/lib/legion/extensions/agentic/memory/nostalgia/client.rb +31 -0
- data/lib/legion/extensions/agentic/memory/nostalgia/helpers/constants.rb +68 -0
- data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_engine.rb +148 -0
- data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_event.rb +44 -0
- data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgic_memory.rb +97 -0
- data/lib/legion/extensions/agentic/memory/nostalgia/runners/analysis.rb +61 -0
- data/lib/legion/extensions/agentic/memory/nostalgia/runners/recall.rb +60 -0
- data/lib/legion/extensions/agentic/memory/nostalgia/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/nostalgia.rb +21 -0
- data/lib/legion/extensions/agentic/memory/offloading/client.rb +29 -0
- data/lib/legion/extensions/agentic/memory/offloading/helpers/constants.rb +55 -0
- data/lib/legion/extensions/agentic/memory/offloading/helpers/external_store.rb +82 -0
- data/lib/legion/extensions/agentic/memory/offloading/helpers/offloaded_item.rb +65 -0
- data/lib/legion/extensions/agentic/memory/offloading/helpers/offloading_engine.rb +138 -0
- data/lib/legion/extensions/agentic/memory/offloading/runners/cognitive_offloading.rb +102 -0
- data/lib/legion/extensions/agentic/memory/offloading/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/offloading.rb +20 -0
- data/lib/legion/extensions/agentic/memory/paleontology/client.rb +19 -0
- data/lib/legion/extensions/agentic/memory/paleontology/helpers/constants.rb +69 -0
- data/lib/legion/extensions/agentic/memory/paleontology/helpers/excavation.rb +62 -0
- data/lib/legion/extensions/agentic/memory/paleontology/helpers/fossil.rb +125 -0
- data/lib/legion/extensions/agentic/memory/paleontology/helpers/paleontology_engine.rb +170 -0
- data/lib/legion/extensions/agentic/memory/paleontology/runners/cognitive_paleontology.rb +93 -0
- data/lib/legion/extensions/agentic/memory/paleontology/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/paleontology.rb +22 -0
- data/lib/legion/extensions/agentic/memory/palimpsest/client.rb +19 -0
- data/lib/legion/extensions/agentic/memory/palimpsest/helpers/belief_layer.rb +81 -0
- data/lib/legion/extensions/agentic/memory/palimpsest/helpers/constants.rb +56 -0
- data/lib/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest.rb +124 -0
- data/lib/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_engine.rb +117 -0
- data/lib/legion/extensions/agentic/memory/palimpsest/runners/cognitive_palimpsest.rb +105 -0
- data/lib/legion/extensions/agentic/memory/palimpsest/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/palimpsest.rb +21 -0
- data/lib/legion/extensions/agentic/memory/reserve/client.rb +19 -0
- data/lib/legion/extensions/agentic/memory/reserve/helpers/constants.rb +58 -0
- data/lib/legion/extensions/agentic/memory/reserve/helpers/pathway.rb +112 -0
- data/lib/legion/extensions/agentic/memory/reserve/helpers/reserve_engine.rb +163 -0
- data/lib/legion/extensions/agentic/memory/reserve/runners/cognitive_reserve.rb +92 -0
- data/lib/legion/extensions/agentic/memory/reserve/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/reserve.rb +19 -0
- data/lib/legion/extensions/agentic/memory/semantic/actors/decay.rb +45 -0
- data/lib/legion/extensions/agentic/memory/semantic/client.rb +28 -0
- data/lib/legion/extensions/agentic/memory/semantic/helpers/concept.rb +101 -0
- data/lib/legion/extensions/agentic/memory/semantic/helpers/constants.rb +51 -0
- data/lib/legion/extensions/agentic/memory/semantic/helpers/knowledge_store.rb +145 -0
- data/lib/legion/extensions/agentic/memory/semantic/runners/semantic_memory.rb +94 -0
- data/lib/legion/extensions/agentic/memory/semantic/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/semantic.rb +20 -0
- data/lib/legion/extensions/agentic/memory/semantic_priming/client.rb +19 -0
- data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/connection.rb +77 -0
- data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/constants.rb +68 -0
- data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/priming_network.rb +206 -0
- data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/semantic_node.rb +81 -0
- data/lib/legion/extensions/agentic/memory/semantic_priming/runners/semantic_priming.rb +120 -0
- data/lib/legion/extensions/agentic/memory/semantic_priming/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/semantic_priming.rb +20 -0
- data/lib/legion/extensions/agentic/memory/semantic_satiation/client.rb +28 -0
- data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/concept.rb +82 -0
- data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/constants.rb +37 -0
- data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/satiation_engine.rb +103 -0
- data/lib/legion/extensions/agentic/memory/semantic_satiation/runners/semantic_satiation.rb +92 -0
- data/lib/legion/extensions/agentic/memory/semantic_satiation/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/semantic_satiation.rb +19 -0
- data/lib/legion/extensions/agentic/memory/source_monitoring/actors/decay.rb +31 -0
- data/lib/legion/extensions/agentic/memory/source_monitoring/client.rb +28 -0
- data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/constants.rb +66 -0
- data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/source_record.rb +94 -0
- data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/source_tracker.rb +119 -0
- data/lib/legion/extensions/agentic/memory/source_monitoring/runners/source_monitoring.rb +95 -0
- data/lib/legion/extensions/agentic/memory/source_monitoring/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/source_monitoring.rb +19 -0
- data/lib/legion/extensions/agentic/memory/trace/actors/decay.rb +45 -0
- data/lib/legion/extensions/agentic/memory/trace/actors/tier_migration.rb +45 -0
- data/lib/legion/extensions/agentic/memory/trace/batch_decay.rb +44 -0
- data/lib/legion/extensions/agentic/memory/trace/client.rb +32 -0
- data/lib/legion/extensions/agentic/memory/trace/helpers/cache_store.rb +167 -0
- data/lib/legion/extensions/agentic/memory/trace/helpers/decay.rb +68 -0
- data/lib/legion/extensions/agentic/memory/trace/helpers/error_tracer.rb +94 -0
- data/lib/legion/extensions/agentic/memory/trace/helpers/store.rb +260 -0
- data/lib/legion/extensions/agentic/memory/trace/helpers/trace.rb +106 -0
- data/lib/legion/extensions/agentic/memory/trace/local_migrations/20260316000001_create_memory_traces.rb +31 -0
- data/lib/legion/extensions/agentic/memory/trace/local_migrations/20260316000002_create_memory_associations.rb +13 -0
- data/lib/legion/extensions/agentic/memory/trace/persistent_store.rb +94 -0
- data/lib/legion/extensions/agentic/memory/trace/quota.rb +55 -0
- data/lib/legion/extensions/agentic/memory/trace/runners/consolidation.rb +121 -0
- data/lib/legion/extensions/agentic/memory/trace/runners/traces.rb +105 -0
- data/lib/legion/extensions/agentic/memory/trace/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/trace.rb +54 -0
- data/lib/legion/extensions/agentic/memory/transfer/client.rb +28 -0
- data/lib/legion/extensions/agentic/memory/transfer/helpers/constants.rb +34 -0
- data/lib/legion/extensions/agentic/memory/transfer/helpers/domain_knowledge.rb +74 -0
- data/lib/legion/extensions/agentic/memory/transfer/helpers/transfer_engine.rb +188 -0
- data/lib/legion/extensions/agentic/memory/transfer/runners/transfer_learning.rb +77 -0
- data/lib/legion/extensions/agentic/memory/transfer/version.rb +13 -0
- data/lib/legion/extensions/agentic/memory/transfer.rb +19 -0
- data/lib/legion/extensions/agentic/memory/version.rb +11 -0
- data/lib/legion/extensions/agentic/memory.rb +35 -0
- data/spec/legion/extensions/agentic/memory/archaeology/client_spec.rb +38 -0
- data/spec/legion/extensions/agentic/memory/archaeology/cognitive_archaeology_spec.rb +7 -0
- data/spec/legion/extensions/agentic/memory/archaeology/helpers/archaeology_engine_spec.rb +165 -0
- data/spec/legion/extensions/agentic/memory/archaeology/helpers/artifact_spec.rb +196 -0
- data/spec/legion/extensions/agentic/memory/archaeology/helpers/constants_spec.rb +42 -0
- data/spec/legion/extensions/agentic/memory/archaeology/helpers/excavation_site_spec.rb +115 -0
- data/spec/legion/extensions/agentic/memory/archaeology/runners/cognitive_archaeology_spec.rb +96 -0
- data/spec/legion/extensions/agentic/memory/compression/helpers/compression_engine_spec.rb +138 -0
- data/spec/legion/extensions/agentic/memory/compression/helpers/constants_spec.rb +50 -0
- data/spec/legion/extensions/agentic/memory/compression/helpers/information_chunk_spec.rb +123 -0
- data/spec/legion/extensions/agentic/memory/compression/runners/cognitive_compression_spec.rb +80 -0
- data/spec/legion/extensions/agentic/memory/echo/client_spec.rb +20 -0
- data/spec/legion/extensions/agentic/memory/echo/cognitive_echo_spec.rb +7 -0
- data/spec/legion/extensions/agentic/memory/echo/helpers/echo_engine_spec.rb +152 -0
- data/spec/legion/extensions/agentic/memory/echo/helpers/echo_spec.rb +128 -0
- data/spec/legion/extensions/agentic/memory/echo/runners_spec.rb +80 -0
- data/spec/legion/extensions/agentic/memory/echo_chamber/client_spec.rb +84 -0
- data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_engine_spec.rb +266 -0
- data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_spec.rb +249 -0
- data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/constants_spec.rb +130 -0
- data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/echo_spec.rb +252 -0
- data/spec/legion/extensions/agentic/memory/echo_chamber/runners/cognitive_echo_chamber_spec.rb +185 -0
- data/spec/legion/extensions/agentic/memory/episodic/client_spec.rb +80 -0
- data/spec/legion/extensions/agentic/memory/episodic/episodic_buffer_spec.rb +15 -0
- data/spec/legion/extensions/agentic/memory/episodic/helpers/constants_spec.rb +86 -0
- data/spec/legion/extensions/agentic/memory/episodic/helpers/episode_spec.rb +188 -0
- data/spec/legion/extensions/agentic/memory/episodic/helpers/episodic_binding_spec.rb +114 -0
- data/spec/legion/extensions/agentic/memory/episodic/helpers/episodic_store_spec.rb +201 -0
- data/spec/legion/extensions/agentic/memory/episodic/runners/episodic_buffer_spec.rb +208 -0
- data/spec/legion/extensions/agentic/memory/hologram/client_spec.rb +89 -0
- data/spec/legion/extensions/agentic/memory/hologram/cognitive_hologram_spec.rb +39 -0
- data/spec/legion/extensions/agentic/memory/hologram/helpers/constants_spec.rb +143 -0
- data/spec/legion/extensions/agentic/memory/hologram/helpers/hologram_engine_spec.rb +268 -0
- data/spec/legion/extensions/agentic/memory/hologram/helpers/hologram_spec.rb +256 -0
- data/spec/legion/extensions/agentic/memory/hologram/helpers/holographic_fragment_spec.rb +213 -0
- data/spec/legion/extensions/agentic/memory/hologram/runners/cognitive_hologram_spec.rb +239 -0
- data/spec/legion/extensions/agentic/memory/immune_memory/client_spec.rb +18 -0
- data/spec/legion/extensions/agentic/memory/immune_memory/cognitive_immune_memory_spec.rb +7 -0
- data/spec/legion/extensions/agentic/memory/immune_memory/helpers/encounter_spec.rb +85 -0
- data/spec/legion/extensions/agentic/memory/immune_memory/helpers/immune_memory_engine_spec.rb +203 -0
- data/spec/legion/extensions/agentic/memory/immune_memory/helpers/memory_cell_spec.rb +190 -0
- data/spec/legion/extensions/agentic/memory/immune_memory/runners_spec.rb +83 -0
- data/spec/legion/extensions/agentic/memory/nostalgia/client_spec.rb +71 -0
- data/spec/legion/extensions/agentic/memory/nostalgia/helpers/constants_spec.rb +65 -0
- data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_engine_spec.rb +191 -0
- data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_event_spec.rb +59 -0
- data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgic_memory_spec.rb +134 -0
- data/spec/legion/extensions/agentic/memory/nostalgia/runners/analysis_spec.rb +97 -0
- data/spec/legion/extensions/agentic/memory/nostalgia/runners/recall_spec.rb +81 -0
- data/spec/legion/extensions/agentic/memory/offloading/client_spec.rb +30 -0
- data/spec/legion/extensions/agentic/memory/offloading/helpers/constants_spec.rb +71 -0
- data/spec/legion/extensions/agentic/memory/offloading/helpers/external_store_spec.rb +158 -0
- data/spec/legion/extensions/agentic/memory/offloading/helpers/offloaded_item_spec.rb +123 -0
- data/spec/legion/extensions/agentic/memory/offloading/helpers/offloading_engine_spec.rb +250 -0
- data/spec/legion/extensions/agentic/memory/offloading/runners/cognitive_offloading_spec.rb +194 -0
- data/spec/legion/extensions/agentic/memory/paleontology/client_spec.rb +27 -0
- data/spec/legion/extensions/agentic/memory/paleontology/cognitive_paleontology_spec.rb +7 -0
- data/spec/legion/extensions/agentic/memory/paleontology/helpers/constants_spec.rb +33 -0
- data/spec/legion/extensions/agentic/memory/paleontology/helpers/excavation_spec.rb +71 -0
- data/spec/legion/extensions/agentic/memory/paleontology/helpers/fossil_spec.rb +134 -0
- data/spec/legion/extensions/agentic/memory/paleontology/helpers/paleontology_engine_spec.rb +148 -0
- data/spec/legion/extensions/agentic/memory/paleontology/runners/cognitive_paleontology_spec.rb +89 -0
- data/spec/legion/extensions/agentic/memory/palimpsest/client_spec.rb +58 -0
- data/spec/legion/extensions/agentic/memory/palimpsest/helpers/belief_layer_spec.rb +150 -0
- data/spec/legion/extensions/agentic/memory/palimpsest/helpers/constants_spec.rb +63 -0
- data/spec/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_engine_spec.rb +164 -0
- data/spec/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_spec.rb +172 -0
- data/spec/legion/extensions/agentic/memory/palimpsest/runners/cognitive_palimpsest_spec.rb +165 -0
- data/spec/legion/extensions/agentic/memory/reserve/client_spec.rb +37 -0
- data/spec/legion/extensions/agentic/memory/reserve/helpers/pathway_spec.rb +165 -0
- data/spec/legion/extensions/agentic/memory/reserve/helpers/reserve_engine_spec.rb +196 -0
- data/spec/legion/extensions/agentic/memory/reserve/runners/cognitive_reserve_spec.rb +96 -0
- data/spec/legion/extensions/agentic/memory/semantic/client_spec.rb +35 -0
- data/spec/legion/extensions/agentic/memory/semantic/helpers/concept_spec.rb +119 -0
- data/spec/legion/extensions/agentic/memory/semantic/helpers/knowledge_store_spec.rb +140 -0
- data/spec/legion/extensions/agentic/memory/semantic/runners/semantic_memory_spec.rb +103 -0
- data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/connection_spec.rb +98 -0
- data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/priming_network_spec.rb +208 -0
- data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/semantic_node_spec.rb +125 -0
- data/spec/legion/extensions/agentic/memory/semantic_priming/semantic_priming_spec.rb +7 -0
- data/spec/legion/extensions/agentic/memory/semantic_satiation/client_spec.rb +19 -0
- data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/concept_spec.rb +167 -0
- data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/constants_spec.rb +81 -0
- data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/satiation_engine_spec.rb +189 -0
- data/spec/legion/extensions/agentic/memory/semantic_satiation/runners/semantic_satiation_spec.rb +176 -0
- data/spec/legion/extensions/agentic/memory/source_monitoring/client_spec.rb +25 -0
- data/spec/legion/extensions/agentic/memory/source_monitoring/helpers/source_record_spec.rb +152 -0
- data/spec/legion/extensions/agentic/memory/source_monitoring/helpers/source_tracker_spec.rb +139 -0
- data/spec/legion/extensions/agentic/memory/source_monitoring/runners/source_monitoring_spec.rb +102 -0
- data/spec/legion/extensions/agentic/memory/trace/actors/decay_spec.rb +62 -0
- data/spec/legion/extensions/agentic/memory/trace/actors/tier_migration_spec.rb +62 -0
- data/spec/legion/extensions/agentic/memory/trace/batch_decay_spec.rb +26 -0
- data/spec/legion/extensions/agentic/memory/trace/client_spec.rb +62 -0
- data/spec/legion/extensions/agentic/memory/trace/helpers/decay_spec.rb +134 -0
- data/spec/legion/extensions/agentic/memory/trace/helpers/store_spec.rb +217 -0
- data/spec/legion/extensions/agentic/memory/trace/helpers/trace_spec.rb +120 -0
- data/spec/legion/extensions/agentic/memory/trace/local_persistence_spec.rb +255 -0
- data/spec/legion/extensions/agentic/memory/trace/memory_spec.rb +11 -0
- data/spec/legion/extensions/agentic/memory/trace/persistent_store_spec.rb +50 -0
- data/spec/legion/extensions/agentic/memory/trace/quota_spec.rb +56 -0
- data/spec/legion/extensions/agentic/memory/trace/runners/consolidation_spec.rb +118 -0
- data/spec/legion/extensions/agentic/memory/trace/runners/traces_spec.rb +69 -0
- data/spec/legion/extensions/agentic/memory/transfer/client_spec.rb +18 -0
- data/spec/legion/extensions/agentic/memory/transfer/helpers/constants_spec.rb +41 -0
- data/spec/legion/extensions/agentic/memory/transfer/helpers/domain_knowledge_spec.rb +134 -0
- data/spec/legion/extensions/agentic/memory/transfer/helpers/transfer_engine_spec.rb +299 -0
- data/spec/legion/extensions/agentic/memory/transfer/runners/transfer_learning_spec.rb +144 -0
- data/spec/spec_helper.rb +46 -0
- metadata +351 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'securerandom'
|
|
4
|
+
|
|
5
|
+
module Legion
|
|
6
|
+
module Extensions
|
|
7
|
+
module Agentic
|
|
8
|
+
module Memory
|
|
9
|
+
module Trace
|
|
10
|
+
module Helpers
|
|
11
|
+
module Trace
|
|
12
|
+
TRACE_TYPES = %i[firmware identity procedural trust semantic episodic sensory].freeze
|
|
13
|
+
|
|
14
|
+
ORIGINS = %i[firmware direct_experience mesh_transfer imprint].freeze
|
|
15
|
+
|
|
16
|
+
STORAGE_TIERS = %i[hot warm cold erased].freeze
|
|
17
|
+
|
|
18
|
+
BASE_DECAY_RATES = {
|
|
19
|
+
firmware: 0.000,
|
|
20
|
+
identity: 0.001,
|
|
21
|
+
procedural: 0.005,
|
|
22
|
+
trust: 0.008,
|
|
23
|
+
semantic: 0.010,
|
|
24
|
+
episodic: 0.020,
|
|
25
|
+
sensory: 0.100
|
|
26
|
+
}.freeze
|
|
27
|
+
|
|
28
|
+
STARTING_STRENGTHS = {
|
|
29
|
+
firmware: 1.000,
|
|
30
|
+
identity: 1.000,
|
|
31
|
+
procedural: 0.400,
|
|
32
|
+
trust: 0.300,
|
|
33
|
+
semantic: 0.500,
|
|
34
|
+
episodic: 0.600,
|
|
35
|
+
sensory: 0.400
|
|
36
|
+
}.freeze
|
|
37
|
+
|
|
38
|
+
# Tuning constants from spec Section 4.5
|
|
39
|
+
E_WEIGHT = 0.3 # emotional intensity weight on decay
|
|
40
|
+
R_AMOUNT = 0.10 # base reinforcement amount
|
|
41
|
+
IMPRINT_MULTIPLIER = 3.0 # reinforcement boost during imprint window
|
|
42
|
+
AUTO_FIRE_THRESHOLD = 0.85 # procedural auto-fire strength threshold
|
|
43
|
+
ARCHIVE_THRESHOLD = 0.05 # below this, trace moves to cold storage
|
|
44
|
+
PRUNE_THRESHOLD = 0.01 # below this, trace eligible for removal
|
|
45
|
+
HOT_TIER_WINDOW = 86_400 # 24 hours in seconds
|
|
46
|
+
WARM_TIER_WINDOW = 7_776_000 # 90 days in seconds
|
|
47
|
+
RETRIEVAL_RECENCY_HALF = 3600 # half-life for recency scoring (1 hour)
|
|
48
|
+
ASSOCIATION_BONUS = 0.15 # bonus for Hebbian-associated traces
|
|
49
|
+
MAX_ASSOCIATIONS = 20 # max Hebbian links per trace
|
|
50
|
+
COACTIVATION_THRESHOLD = 3 # co-activations before Hebbian link forms
|
|
51
|
+
|
|
52
|
+
module_function
|
|
53
|
+
|
|
54
|
+
def new_trace(type:, content_payload:, content_embedding: nil, emotional_valence: 0.0, # rubocop:disable Metrics/ParameterLists
|
|
55
|
+
emotional_intensity: 0.0, domain_tags: [], origin: :direct_experience,
|
|
56
|
+
source_agent_id: nil, partition_id: nil, imprint_active: false,
|
|
57
|
+
unresolved: false, consolidation_candidate: false, confidence: nil, **)
|
|
58
|
+
raise ArgumentError, "invalid trace type: #{type}" unless TRACE_TYPES.include?(type)
|
|
59
|
+
raise ArgumentError, "invalid origin: #{origin}" unless ORIGINS.include?(origin)
|
|
60
|
+
|
|
61
|
+
now = Time.now.utc
|
|
62
|
+
|
|
63
|
+
{
|
|
64
|
+
trace_id: SecureRandom.uuid,
|
|
65
|
+
trace_type: type,
|
|
66
|
+
content_embedding: content_embedding,
|
|
67
|
+
content_payload: content_payload,
|
|
68
|
+
strength: STARTING_STRENGTHS[type],
|
|
69
|
+
peak_strength: STARTING_STRENGTHS[type],
|
|
70
|
+
base_decay_rate: BASE_DECAY_RATES[type],
|
|
71
|
+
emotional_valence: emotional_valence.clamp(-1.0, 1.0),
|
|
72
|
+
emotional_intensity: emotional_intensity.clamp(0.0, 1.0),
|
|
73
|
+
domain_tags: Array(domain_tags),
|
|
74
|
+
origin: origin,
|
|
75
|
+
source_agent_id: source_agent_id,
|
|
76
|
+
created_at: now,
|
|
77
|
+
last_reinforced: now,
|
|
78
|
+
last_decayed: now,
|
|
79
|
+
reinforcement_count: imprint_active ? 1 : 0,
|
|
80
|
+
confidence: confidence || (type == :firmware ? 1.0 : 0.5),
|
|
81
|
+
storage_tier: :hot,
|
|
82
|
+
partition_id: partition_id,
|
|
83
|
+
encryption_key_id: nil,
|
|
84
|
+
associated_traces: [],
|
|
85
|
+
parent_trace_id: nil,
|
|
86
|
+
child_trace_ids: [],
|
|
87
|
+
unresolved: unresolved,
|
|
88
|
+
consolidation_candidate: consolidation_candidate
|
|
89
|
+
}
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def valid_trace?(trace)
|
|
93
|
+
return false unless trace.is_a?(Hash)
|
|
94
|
+
return false unless TRACE_TYPES.include?(trace[:trace_type])
|
|
95
|
+
return false unless trace[:strength].is_a?(Numeric)
|
|
96
|
+
return false unless trace[:strength].between?(0.0, 1.0)
|
|
97
|
+
|
|
98
|
+
true
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Sequel.migration do
|
|
4
|
+
change do
|
|
5
|
+
create_table(:memory_traces) do
|
|
6
|
+
primary_key :id
|
|
7
|
+
String :trace_id, null: false, unique: true, index: true
|
|
8
|
+
String :trace_type, null: false, index: true
|
|
9
|
+
String :content, text: true, null: false
|
|
10
|
+
Float :strength, null: false, default: 1.0
|
|
11
|
+
Float :peak_strength, null: false, default: 1.0
|
|
12
|
+
Float :base_decay_rate, null: false, default: 0.02
|
|
13
|
+
String :emotional_valence, text: true
|
|
14
|
+
Float :emotional_intensity, default: 0.0
|
|
15
|
+
String :domain_tags, text: true
|
|
16
|
+
String :origin, default: 'direct_experience'
|
|
17
|
+
DateTime :created_at, null: false
|
|
18
|
+
DateTime :last_reinforced
|
|
19
|
+
DateTime :last_decayed
|
|
20
|
+
Integer :reinforcement_count, default: 0
|
|
21
|
+
Float :confidence, default: 0.5
|
|
22
|
+
String :storage_tier, default: 'hot', index: true
|
|
23
|
+
String :partition_id, index: true
|
|
24
|
+
String :associated_traces, text: true
|
|
25
|
+
String :parent_id
|
|
26
|
+
String :child_ids, text: true
|
|
27
|
+
TrueClass :unresolved, default: false, index: true
|
|
28
|
+
TrueClass :consolidation_candidate, default: false
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Sequel.migration do
|
|
4
|
+
change do
|
|
5
|
+
create_table(:memory_associations) do
|
|
6
|
+
primary_key :id
|
|
7
|
+
String :trace_id_a, null: false, index: true
|
|
8
|
+
String :trace_id_b, null: false, index: true
|
|
9
|
+
Integer :coactivation_count, null: false, default: 1
|
|
10
|
+
unique %i[trace_id_a trace_id_b]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Memory
|
|
7
|
+
module Trace
|
|
8
|
+
class PersistentStore
|
|
9
|
+
TABLE = :memory_traces
|
|
10
|
+
|
|
11
|
+
def initialize(agent_id:)
|
|
12
|
+
@agent_id = agent_id
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def write(trace_type:, content:, associations: {}, confidence: 1.0)
|
|
16
|
+
return nil unless db_ready?
|
|
17
|
+
|
|
18
|
+
Legion::Data.connection[TABLE].insert(
|
|
19
|
+
agent_id: @agent_id,
|
|
20
|
+
trace_type: trace_type.to_s,
|
|
21
|
+
content: content.is_a?(String) ? content : Legion::JSON.dump(content),
|
|
22
|
+
associations: Legion::JSON.dump(associations),
|
|
23
|
+
confidence: confidence,
|
|
24
|
+
created_at: Time.now,
|
|
25
|
+
accessed_at: Time.now
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def read(trace_type: nil, limit: 50, min_confidence: 0.0)
|
|
30
|
+
return [] unless db_ready?
|
|
31
|
+
|
|
32
|
+
ds = Legion::Data.connection[TABLE].where(agent_id: @agent_id)
|
|
33
|
+
ds = ds.where(trace_type: trace_type.to_s) if trace_type
|
|
34
|
+
ds = ds.where { confidence >= min_confidence }
|
|
35
|
+
ds.order(Sequel.desc(:accessed_at)).limit(limit).all
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def touch(id)
|
|
39
|
+
return unless db_ready?
|
|
40
|
+
|
|
41
|
+
Legion::Data.connection[TABLE]
|
|
42
|
+
.where(id: id, agent_id: @agent_id)
|
|
43
|
+
.update(accessed_at: Time.now)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def count
|
|
47
|
+
return 0 unless db_ready?
|
|
48
|
+
|
|
49
|
+
Legion::Data.connection[TABLE].where(agent_id: @agent_id).count
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def total_bytes
|
|
53
|
+
return 0 unless db_ready?
|
|
54
|
+
|
|
55
|
+
Legion::Data.connection[TABLE]
|
|
56
|
+
.where(agent_id: @agent_id)
|
|
57
|
+
.sum(Sequel.function(:length, :content)) || 0
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def delete_lowest_confidence(count: 1)
|
|
61
|
+
return 0 unless db_ready?
|
|
62
|
+
|
|
63
|
+
ids = Legion::Data.connection[TABLE]
|
|
64
|
+
.where(agent_id: @agent_id)
|
|
65
|
+
.order(:confidence)
|
|
66
|
+
.limit(count)
|
|
67
|
+
.select(:id)
|
|
68
|
+
Legion::Data.connection[TABLE].where(id: ids).delete
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def delete_least_recently_used(count: 1)
|
|
72
|
+
return 0 unless db_ready?
|
|
73
|
+
|
|
74
|
+
ids = Legion::Data.connection[TABLE]
|
|
75
|
+
.where(agent_id: @agent_id)
|
|
76
|
+
.order(:accessed_at)
|
|
77
|
+
.limit(count)
|
|
78
|
+
.select(:id)
|
|
79
|
+
Legion::Data.connection[TABLE].where(id: ids).delete
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
def db_ready?
|
|
85
|
+
defined?(Legion::Data) && Legion::Data.connection&.table_exists?(TABLE)
|
|
86
|
+
rescue StandardError
|
|
87
|
+
false
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Memory
|
|
7
|
+
module Trace
|
|
8
|
+
class Quota
|
|
9
|
+
DEFAULTS = {
|
|
10
|
+
max_traces: 10_000,
|
|
11
|
+
max_bytes: 52_428_800, # 50MB
|
|
12
|
+
eviction: :lru
|
|
13
|
+
}.freeze
|
|
14
|
+
|
|
15
|
+
attr_reader :max_traces, :max_bytes, :eviction
|
|
16
|
+
|
|
17
|
+
def initialize(**opts)
|
|
18
|
+
config = DEFAULTS.merge(opts)
|
|
19
|
+
@max_traces = config[:max_traces]
|
|
20
|
+
@max_bytes = config[:max_bytes]
|
|
21
|
+
@eviction = config[:eviction].to_sym
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def enforce!(store)
|
|
25
|
+
evict_count = store.count - max_traces
|
|
26
|
+
evict!(store, evict_count) if evict_count.positive?
|
|
27
|
+
|
|
28
|
+
overage = store.total_bytes - max_bytes
|
|
29
|
+
evict!(store, estimate_eviction_count(overage)) if overage.positive?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def within_limits?(store)
|
|
33
|
+
store.count <= max_traces && store.total_bytes <= max_bytes
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def evict!(store, count)
|
|
39
|
+
return if count <= 0
|
|
40
|
+
|
|
41
|
+
case eviction
|
|
42
|
+
when :lru then store.delete_least_recently_used(count: count)
|
|
43
|
+
when :lowest_confidence then store.delete_lowest_confidence(count: count)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def estimate_eviction_count(overage_bytes)
|
|
48
|
+
[(overage_bytes / 1024.0 * 10).ceil, 1].max
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Memory
|
|
7
|
+
module Trace
|
|
8
|
+
module Runners
|
|
9
|
+
module Consolidation
|
|
10
|
+
def reinforce(trace_id:, store: nil, imprint_active: false, **)
|
|
11
|
+
store ||= default_store
|
|
12
|
+
trace = store.get(trace_id)
|
|
13
|
+
return { found: false } unless trace
|
|
14
|
+
return { found: true, reinforced: false, reason: :firmware } if trace[:trace_type] == :firmware
|
|
15
|
+
|
|
16
|
+
new_strength = Helpers::Decay.compute_reinforcement(
|
|
17
|
+
current_strength: trace[:strength], imprint_active: imprint_active
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
now = Time.now.utc
|
|
21
|
+
trace[:strength] = new_strength
|
|
22
|
+
trace[:peak_strength] = [trace[:peak_strength], new_strength].max
|
|
23
|
+
trace[:last_reinforced] = now
|
|
24
|
+
trace[:reinforcement_count] += 1
|
|
25
|
+
|
|
26
|
+
store.store(trace)
|
|
27
|
+
|
|
28
|
+
Legion::Logging.debug "[memory] reinforced #{trace_id[0..7]} strength=#{new_strength.round(3)}#{' (imprint 3x)' if imprint_active}"
|
|
29
|
+
{ found: true, reinforced: true, trace_id: trace_id, new_strength: new_strength }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def decay_cycle(store: nil, tick_count: 1, **)
|
|
33
|
+
store ||= default_store
|
|
34
|
+
decayed = 0
|
|
35
|
+
pruned = 0
|
|
36
|
+
|
|
37
|
+
store.all_traces.each do |trace|
|
|
38
|
+
next if trace[:base_decay_rate].zero?
|
|
39
|
+
|
|
40
|
+
new_strength = Helpers::Decay.compute_decay(
|
|
41
|
+
peak_strength: trace[:peak_strength],
|
|
42
|
+
base_decay_rate: trace[:base_decay_rate],
|
|
43
|
+
ticks_since_access: tick_count,
|
|
44
|
+
emotional_intensity: trace[:emotional_intensity]
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
if new_strength <= Helpers::Trace::PRUNE_THRESHOLD
|
|
48
|
+
store.delete(trace[:trace_id])
|
|
49
|
+
pruned += 1
|
|
50
|
+
else
|
|
51
|
+
trace[:strength] = new_strength
|
|
52
|
+
trace[:last_decayed] = Time.now.utc
|
|
53
|
+
store.store(trace)
|
|
54
|
+
decayed += 1
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
Legion::Logging.debug "[memory] decay cycle: decayed=#{decayed} pruned=#{pruned}"
|
|
59
|
+
{ decayed: decayed, pruned: pruned }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def migrate_tier(store: nil, **)
|
|
63
|
+
store ||= default_store
|
|
64
|
+
migrated = 0
|
|
65
|
+
now = Time.now.utc
|
|
66
|
+
|
|
67
|
+
store.all_traces.each do |trace|
|
|
68
|
+
new_tier = Helpers::Decay.compute_storage_tier(trace: trace, now: now)
|
|
69
|
+
next if trace[:storage_tier] == new_tier
|
|
70
|
+
|
|
71
|
+
trace[:storage_tier] = new_tier
|
|
72
|
+
store.store(trace)
|
|
73
|
+
migrated += 1
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
Legion::Logging.debug "[memory] tier migration: migrated=#{migrated}"
|
|
77
|
+
{ migrated: migrated }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def hebbian_link(trace_id_a: nil, trace_id_b: nil, store: nil, **)
|
|
81
|
+
return { linked: false, reason: :missing_trace_ids } if trace_id_a.nil? || trace_id_b.nil?
|
|
82
|
+
|
|
83
|
+
store ||= default_store
|
|
84
|
+
store.record_coactivation(trace_id_a, trace_id_b)
|
|
85
|
+
Legion::Logging.debug "[memory] hebbian link #{trace_id_a[0..7]} <-> #{trace_id_b[0..7]}"
|
|
86
|
+
{ linked: true }
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def erase_by_type(type:, store: nil, **)
|
|
90
|
+
store ||= default_store
|
|
91
|
+
type = type.to_sym
|
|
92
|
+
traces = store.retrieve_by_type(type, min_strength: 0.0, limit: 100_000)
|
|
93
|
+
count = traces.size
|
|
94
|
+
traces.each { |t| store.delete(t[:trace_id]) }
|
|
95
|
+
Legion::Logging.info "[memory] erased #{count} traces of type=#{type}"
|
|
96
|
+
{ erased: count, type: type }
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def erase_by_agent(partition_id:, store: nil, **)
|
|
100
|
+
store ||= default_store
|
|
101
|
+
traces = store.all_traces.select { |t| t[:partition_id] == partition_id }
|
|
102
|
+
count = traces.size
|
|
103
|
+
traces.each { |t| store.delete(t[:trace_id]) }
|
|
104
|
+
Legion::Logging.info "[memory] erased #{count} traces for partition=#{partition_id}"
|
|
105
|
+
{ erased: count, partition_id: partition_id }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
private
|
|
109
|
+
|
|
110
|
+
def default_store
|
|
111
|
+
@default_store ||= Legion::Extensions::Agentic::Memory::Trace.shared_store
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Memory
|
|
7
|
+
module Trace
|
|
8
|
+
module Runners
|
|
9
|
+
module Traces
|
|
10
|
+
def store_trace(type:, content_payload:, store: nil, **)
|
|
11
|
+
store ||= default_store
|
|
12
|
+
trace = Helpers::Trace.new_trace(type: type.to_sym, content_payload: content_payload, **)
|
|
13
|
+
store.store(trace)
|
|
14
|
+
Legion::Logging.debug "[memory] stored trace #{trace[:trace_id][0..7]} type=#{trace[:trace_type]} strength=#{trace[:strength].round(2)}"
|
|
15
|
+
{ trace_id: trace[:trace_id], trace_type: trace[:trace_type], strength: trace[:strength] }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def get_trace(trace_id:, store: nil, **)
|
|
19
|
+
store ||= default_store
|
|
20
|
+
trace = store.get(trace_id)
|
|
21
|
+
Legion::Logging.debug "[memory] get trace #{trace_id[0..7]} found=#{!trace.nil?}"
|
|
22
|
+
return { found: false } unless trace
|
|
23
|
+
|
|
24
|
+
{ found: true, trace: trace }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def retrieve_by_type(type:, store: nil, min_strength: 0.0, limit: 100, **)
|
|
28
|
+
store ||= default_store
|
|
29
|
+
traces = store.retrieve_by_type(type.to_sym, min_strength: min_strength, limit: limit)
|
|
30
|
+
Legion::Logging.debug "[memory] retrieve_by_type=#{type} count=#{traces.size} min_strength=#{min_strength}"
|
|
31
|
+
{ count: traces.size, traces: traces }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def retrieve_by_domain(domain_tag:, store: nil, min_strength: 0.0, limit: 100, **)
|
|
35
|
+
store ||= default_store
|
|
36
|
+
traces = store.retrieve_by_domain(domain_tag, min_strength: min_strength, limit: limit)
|
|
37
|
+
Legion::Logging.debug "[memory] retrieve_by_domain=#{domain_tag} count=#{traces.size}"
|
|
38
|
+
{ count: traces.size, traces: traces }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def retrieve_associated(trace_id:, store: nil, min_strength: 0.0, limit: 20, **)
|
|
42
|
+
store ||= default_store
|
|
43
|
+
traces = store.retrieve_associated(trace_id, min_strength: min_strength, limit: limit)
|
|
44
|
+
Legion::Logging.debug "[memory] retrieve_associated for #{trace_id[0..7]} count=#{traces.size}"
|
|
45
|
+
{ count: traces.size, traces: traces }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def retrieve_ranked(trace_ids: [], store: nil, query_time: nil, **)
|
|
49
|
+
store ||= default_store
|
|
50
|
+
query_time ||= Time.now.utc
|
|
51
|
+
associated_set = Set.new
|
|
52
|
+
|
|
53
|
+
traces = trace_ids.filter_map { |id| store.get(id) }
|
|
54
|
+
traces.each { |t| associated_set.merge(t[:associated_traces]) }
|
|
55
|
+
|
|
56
|
+
scored = traces.map do |t|
|
|
57
|
+
score = Helpers::Decay.compute_retrieval_score(
|
|
58
|
+
trace: t, query_time: query_time, associated: associated_set.include?(t[:trace_id])
|
|
59
|
+
)
|
|
60
|
+
{ trace: t, score: score }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
result = scored.sort_by { |s| -s[:score] }
|
|
64
|
+
Legion::Logging.debug "[memory] retrieve_ranked ids=#{trace_ids.size} scored=#{result.size}"
|
|
65
|
+
result
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def delete_trace(trace_id:, store: nil, **)
|
|
69
|
+
store ||= default_store
|
|
70
|
+
store.delete(trace_id)
|
|
71
|
+
Legion::Logging.debug "[memory] deleted trace #{trace_id[0..7]}"
|
|
72
|
+
{ deleted: true, trace_id: trace_id }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def retrieve_and_reinforce(limit: 10, store: nil, **)
|
|
76
|
+
store ||= default_store
|
|
77
|
+
all = store.all_traces(min_strength: 0.1)
|
|
78
|
+
top = all.sort_by { |t| -t[:strength] }.first(limit)
|
|
79
|
+
|
|
80
|
+
top.each do |trace|
|
|
81
|
+
next if trace[:base_decay_rate].zero? # skip firmware
|
|
82
|
+
|
|
83
|
+
trace[:reinforcement_count] += 1
|
|
84
|
+
trace[:last_reinforced] = Time.now.utc
|
|
85
|
+
store.store(trace)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
Legion::Logging.debug "[memory] retrieve_and_reinforce: retrieved=#{top.size} from=#{all.size} total"
|
|
89
|
+
{ count: top.size, traces: top }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
def default_store
|
|
95
|
+
@default_store ||= Legion::Extensions::Agentic::Memory::Trace.shared_store
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'legion/extensions/agentic/memory/trace/version'
|
|
4
|
+
require 'legion/extensions/agentic/memory/trace/helpers/trace'
|
|
5
|
+
require 'legion/extensions/agentic/memory/trace/helpers/decay'
|
|
6
|
+
require 'legion/extensions/agentic/memory/trace/helpers/store'
|
|
7
|
+
require 'legion/extensions/agentic/memory/trace/helpers/cache_store'
|
|
8
|
+
require 'legion/extensions/agentic/memory/trace/helpers/error_tracer'
|
|
9
|
+
require 'legion/extensions/agentic/memory/trace/runners/traces'
|
|
10
|
+
require 'legion/extensions/agentic/memory/trace/runners/consolidation'
|
|
11
|
+
require 'legion/extensions/agentic/memory/trace/client'
|
|
12
|
+
|
|
13
|
+
module Legion
|
|
14
|
+
module Extensions
|
|
15
|
+
module Agentic
|
|
16
|
+
module Memory
|
|
17
|
+
module Trace
|
|
18
|
+
class << self
|
|
19
|
+
# Process-wide shared store. All memory runners delegate here so that
|
|
20
|
+
# traces written by one component (ErrorTracer, coldstart, tick) are
|
|
21
|
+
# visible to every other component (dream cycle, cortex, predictions).
|
|
22
|
+
# CacheStore adds cross-process sharing via memcached on top of this.
|
|
23
|
+
def shared_store
|
|
24
|
+
@shared_store ||= create_store
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def reset_store!
|
|
28
|
+
@shared_store = nil
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def create_store
|
|
34
|
+
if defined?(Legion::Cache) && Legion::Cache.respond_to?(:connected?) && Legion::Cache.connected?
|
|
35
|
+
Legion::Logging.debug '[memory] Using shared CacheStore (memcached)'
|
|
36
|
+
Helpers::CacheStore.new
|
|
37
|
+
else
|
|
38
|
+
Legion::Logging.debug '[memory] Using shared in-memory Store'
|
|
39
|
+
Helpers::Store.new
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
if defined?(Legion::Data::Local)
|
|
48
|
+
Legion::Data::Local.register_migrations(
|
|
49
|
+
name: :memory,
|
|
50
|
+
path: File.join(__dir__, 'memory', 'local_migrations')
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'legion/extensions/agentic/memory/transfer/helpers/constants'
|
|
4
|
+
require 'legion/extensions/agentic/memory/transfer/helpers/domain_knowledge'
|
|
5
|
+
require 'legion/extensions/agentic/memory/transfer/helpers/transfer_engine'
|
|
6
|
+
require 'legion/extensions/agentic/memory/transfer/runners/transfer_learning'
|
|
7
|
+
|
|
8
|
+
module Legion
|
|
9
|
+
module Extensions
|
|
10
|
+
module Agentic
|
|
11
|
+
module Memory
|
|
12
|
+
module Transfer
|
|
13
|
+
class Client
|
|
14
|
+
include Runners::TransferLearning
|
|
15
|
+
|
|
16
|
+
def initialize(**)
|
|
17
|
+
@transfer_engine = Helpers::TransferEngine.new
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
attr_reader :transfer_engine
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Memory
|
|
7
|
+
module Transfer
|
|
8
|
+
module Helpers
|
|
9
|
+
module Constants
|
|
10
|
+
MAX_DOMAINS = 200
|
|
11
|
+
POSITIVE_TRANSFER_THRESHOLD = 0.6
|
|
12
|
+
NEGATIVE_TRANSFER_THRESHOLD = 0.3
|
|
13
|
+
TRANSFER_BOOST = 0.15
|
|
14
|
+
INTERFERENCE_PENALTY = 0.1
|
|
15
|
+
|
|
16
|
+
TRANSFER_LABELS = {
|
|
17
|
+
positive: 'positive',
|
|
18
|
+
neutral: 'neutral',
|
|
19
|
+
negative: 'negative',
|
|
20
|
+
interference: 'interference'
|
|
21
|
+
}.freeze
|
|
22
|
+
|
|
23
|
+
DISTANCE_LABELS = {
|
|
24
|
+
near: 'near',
|
|
25
|
+
moderate: 'moderate',
|
|
26
|
+
far: 'far'
|
|
27
|
+
}.freeze
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|