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.
Files changed (267) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE +21 -0
  5. data/README.md +13 -0
  6. data/lex-agentic-memory.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/memory/archaeology/client.rb +19 -0
  8. data/lib/legion/extensions/agentic/memory/archaeology/helpers/archaeology_engine.rb +184 -0
  9. data/lib/legion/extensions/agentic/memory/archaeology/helpers/artifact.rb +146 -0
  10. data/lib/legion/extensions/agentic/memory/archaeology/helpers/constants.rb +95 -0
  11. data/lib/legion/extensions/agentic/memory/archaeology/helpers/excavation_site.rb +97 -0
  12. data/lib/legion/extensions/agentic/memory/archaeology/runners/cognitive_archaeology.rb +86 -0
  13. data/lib/legion/extensions/agentic/memory/archaeology/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/memory/archaeology.rb +22 -0
  15. data/lib/legion/extensions/agentic/memory/compression/client.rb +15 -0
  16. data/lib/legion/extensions/agentic/memory/compression/helpers/compression_engine.rb +145 -0
  17. data/lib/legion/extensions/agentic/memory/compression/helpers/constants.rb +44 -0
  18. data/lib/legion/extensions/agentic/memory/compression/helpers/information_chunk.rb +81 -0
  19. data/lib/legion/extensions/agentic/memory/compression/runners/cognitive_compression.rb +76 -0
  20. data/lib/legion/extensions/agentic/memory/compression/version.rb +13 -0
  21. data/lib/legion/extensions/agentic/memory/compression.rb +19 -0
  22. data/lib/legion/extensions/agentic/memory/echo/client.rb +19 -0
  23. data/lib/legion/extensions/agentic/memory/echo/helpers/constants.rb +57 -0
  24. data/lib/legion/extensions/agentic/memory/echo/helpers/echo.rb +95 -0
  25. data/lib/legion/extensions/agentic/memory/echo/helpers/echo_engine.rb +136 -0
  26. data/lib/legion/extensions/agentic/memory/echo/runners/cognitive_echo.rb +81 -0
  27. data/lib/legion/extensions/agentic/memory/echo/version.rb +13 -0
  28. data/lib/legion/extensions/agentic/memory/echo.rb +19 -0
  29. data/lib/legion/extensions/agentic/memory/echo_chamber/client.rb +19 -0
  30. data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/chamber.rb +134 -0
  31. data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_engine.rb +156 -0
  32. data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/constants.rb +60 -0
  33. data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/echo.rb +96 -0
  34. data/lib/legion/extensions/agentic/memory/echo_chamber/runners/cognitive_echo_chamber.rb +84 -0
  35. data/lib/legion/extensions/agentic/memory/echo_chamber/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/memory/echo_chamber.rb +21 -0
  37. data/lib/legion/extensions/agentic/memory/episodic/actors/decay.rb +45 -0
  38. data/lib/legion/extensions/agentic/memory/episodic/client.rb +25 -0
  39. data/lib/legion/extensions/agentic/memory/episodic/helpers/constants.rb +36 -0
  40. data/lib/legion/extensions/agentic/memory/episodic/helpers/episode.rb +104 -0
  41. data/lib/legion/extensions/agentic/memory/episodic/helpers/episodic_binding.rb +57 -0
  42. data/lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb +141 -0
  43. data/lib/legion/extensions/agentic/memory/episodic/runners/episodic_buffer.rb +108 -0
  44. data/lib/legion/extensions/agentic/memory/episodic/version.rb +13 -0
  45. data/lib/legion/extensions/agentic/memory/episodic.rb +20 -0
  46. data/lib/legion/extensions/agentic/memory/hologram/client.rb +23 -0
  47. data/lib/legion/extensions/agentic/memory/hologram/helpers/constants.rb +67 -0
  48. data/lib/legion/extensions/agentic/memory/hologram/helpers/hologram.rb +118 -0
  49. data/lib/legion/extensions/agentic/memory/hologram/helpers/hologram_engine.rb +117 -0
  50. data/lib/legion/extensions/agentic/memory/hologram/helpers/holographic_fragment.rb +70 -0
  51. data/lib/legion/extensions/agentic/memory/hologram/runners/cognitive_hologram.rb +110 -0
  52. data/lib/legion/extensions/agentic/memory/hologram/version.rb +13 -0
  53. data/lib/legion/extensions/agentic/memory/hologram.rb +22 -0
  54. data/lib/legion/extensions/agentic/memory/immune_memory/client.rb +19 -0
  55. data/lib/legion/extensions/agentic/memory/immune_memory/helpers/constants.rb +84 -0
  56. data/lib/legion/extensions/agentic/memory/immune_memory/helpers/encounter.rb +54 -0
  57. data/lib/legion/extensions/agentic/memory/immune_memory/helpers/immune_memory_engine.rb +171 -0
  58. data/lib/legion/extensions/agentic/memory/immune_memory/helpers/memory_cell.rb +97 -0
  59. data/lib/legion/extensions/agentic/memory/immune_memory/runners/cognitive_immune_memory.rb +76 -0
  60. data/lib/legion/extensions/agentic/memory/immune_memory/version.rb +13 -0
  61. data/lib/legion/extensions/agentic/memory/immune_memory.rb +20 -0
  62. data/lib/legion/extensions/agentic/memory/nostalgia/client.rb +31 -0
  63. data/lib/legion/extensions/agentic/memory/nostalgia/helpers/constants.rb +68 -0
  64. data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_engine.rb +148 -0
  65. data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_event.rb +44 -0
  66. data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgic_memory.rb +97 -0
  67. data/lib/legion/extensions/agentic/memory/nostalgia/runners/analysis.rb +61 -0
  68. data/lib/legion/extensions/agentic/memory/nostalgia/runners/recall.rb +60 -0
  69. data/lib/legion/extensions/agentic/memory/nostalgia/version.rb +13 -0
  70. data/lib/legion/extensions/agentic/memory/nostalgia.rb +21 -0
  71. data/lib/legion/extensions/agentic/memory/offloading/client.rb +29 -0
  72. data/lib/legion/extensions/agentic/memory/offloading/helpers/constants.rb +55 -0
  73. data/lib/legion/extensions/agentic/memory/offloading/helpers/external_store.rb +82 -0
  74. data/lib/legion/extensions/agentic/memory/offloading/helpers/offloaded_item.rb +65 -0
  75. data/lib/legion/extensions/agentic/memory/offloading/helpers/offloading_engine.rb +138 -0
  76. data/lib/legion/extensions/agentic/memory/offloading/runners/cognitive_offloading.rb +102 -0
  77. data/lib/legion/extensions/agentic/memory/offloading/version.rb +13 -0
  78. data/lib/legion/extensions/agentic/memory/offloading.rb +20 -0
  79. data/lib/legion/extensions/agentic/memory/paleontology/client.rb +19 -0
  80. data/lib/legion/extensions/agentic/memory/paleontology/helpers/constants.rb +69 -0
  81. data/lib/legion/extensions/agentic/memory/paleontology/helpers/excavation.rb +62 -0
  82. data/lib/legion/extensions/agentic/memory/paleontology/helpers/fossil.rb +125 -0
  83. data/lib/legion/extensions/agentic/memory/paleontology/helpers/paleontology_engine.rb +170 -0
  84. data/lib/legion/extensions/agentic/memory/paleontology/runners/cognitive_paleontology.rb +93 -0
  85. data/lib/legion/extensions/agentic/memory/paleontology/version.rb +13 -0
  86. data/lib/legion/extensions/agentic/memory/paleontology.rb +22 -0
  87. data/lib/legion/extensions/agentic/memory/palimpsest/client.rb +19 -0
  88. data/lib/legion/extensions/agentic/memory/palimpsest/helpers/belief_layer.rb +81 -0
  89. data/lib/legion/extensions/agentic/memory/palimpsest/helpers/constants.rb +56 -0
  90. data/lib/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest.rb +124 -0
  91. data/lib/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_engine.rb +117 -0
  92. data/lib/legion/extensions/agentic/memory/palimpsest/runners/cognitive_palimpsest.rb +105 -0
  93. data/lib/legion/extensions/agentic/memory/palimpsest/version.rb +13 -0
  94. data/lib/legion/extensions/agentic/memory/palimpsest.rb +21 -0
  95. data/lib/legion/extensions/agentic/memory/reserve/client.rb +19 -0
  96. data/lib/legion/extensions/agentic/memory/reserve/helpers/constants.rb +58 -0
  97. data/lib/legion/extensions/agentic/memory/reserve/helpers/pathway.rb +112 -0
  98. data/lib/legion/extensions/agentic/memory/reserve/helpers/reserve_engine.rb +163 -0
  99. data/lib/legion/extensions/agentic/memory/reserve/runners/cognitive_reserve.rb +92 -0
  100. data/lib/legion/extensions/agentic/memory/reserve/version.rb +13 -0
  101. data/lib/legion/extensions/agentic/memory/reserve.rb +19 -0
  102. data/lib/legion/extensions/agentic/memory/semantic/actors/decay.rb +45 -0
  103. data/lib/legion/extensions/agentic/memory/semantic/client.rb +28 -0
  104. data/lib/legion/extensions/agentic/memory/semantic/helpers/concept.rb +101 -0
  105. data/lib/legion/extensions/agentic/memory/semantic/helpers/constants.rb +51 -0
  106. data/lib/legion/extensions/agentic/memory/semantic/helpers/knowledge_store.rb +145 -0
  107. data/lib/legion/extensions/agentic/memory/semantic/runners/semantic_memory.rb +94 -0
  108. data/lib/legion/extensions/agentic/memory/semantic/version.rb +13 -0
  109. data/lib/legion/extensions/agentic/memory/semantic.rb +20 -0
  110. data/lib/legion/extensions/agentic/memory/semantic_priming/client.rb +19 -0
  111. data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/connection.rb +77 -0
  112. data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/constants.rb +68 -0
  113. data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/priming_network.rb +206 -0
  114. data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/semantic_node.rb +81 -0
  115. data/lib/legion/extensions/agentic/memory/semantic_priming/runners/semantic_priming.rb +120 -0
  116. data/lib/legion/extensions/agentic/memory/semantic_priming/version.rb +13 -0
  117. data/lib/legion/extensions/agentic/memory/semantic_priming.rb +20 -0
  118. data/lib/legion/extensions/agentic/memory/semantic_satiation/client.rb +28 -0
  119. data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/concept.rb +82 -0
  120. data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/constants.rb +37 -0
  121. data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/satiation_engine.rb +103 -0
  122. data/lib/legion/extensions/agentic/memory/semantic_satiation/runners/semantic_satiation.rb +92 -0
  123. data/lib/legion/extensions/agentic/memory/semantic_satiation/version.rb +13 -0
  124. data/lib/legion/extensions/agentic/memory/semantic_satiation.rb +19 -0
  125. data/lib/legion/extensions/agentic/memory/source_monitoring/actors/decay.rb +31 -0
  126. data/lib/legion/extensions/agentic/memory/source_monitoring/client.rb +28 -0
  127. data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/constants.rb +66 -0
  128. data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/source_record.rb +94 -0
  129. data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/source_tracker.rb +119 -0
  130. data/lib/legion/extensions/agentic/memory/source_monitoring/runners/source_monitoring.rb +95 -0
  131. data/lib/legion/extensions/agentic/memory/source_monitoring/version.rb +13 -0
  132. data/lib/legion/extensions/agentic/memory/source_monitoring.rb +19 -0
  133. data/lib/legion/extensions/agentic/memory/trace/actors/decay.rb +45 -0
  134. data/lib/legion/extensions/agentic/memory/trace/actors/tier_migration.rb +45 -0
  135. data/lib/legion/extensions/agentic/memory/trace/batch_decay.rb +44 -0
  136. data/lib/legion/extensions/agentic/memory/trace/client.rb +32 -0
  137. data/lib/legion/extensions/agentic/memory/trace/helpers/cache_store.rb +167 -0
  138. data/lib/legion/extensions/agentic/memory/trace/helpers/decay.rb +68 -0
  139. data/lib/legion/extensions/agentic/memory/trace/helpers/error_tracer.rb +94 -0
  140. data/lib/legion/extensions/agentic/memory/trace/helpers/store.rb +260 -0
  141. data/lib/legion/extensions/agentic/memory/trace/helpers/trace.rb +106 -0
  142. data/lib/legion/extensions/agentic/memory/trace/local_migrations/20260316000001_create_memory_traces.rb +31 -0
  143. data/lib/legion/extensions/agentic/memory/trace/local_migrations/20260316000002_create_memory_associations.rb +13 -0
  144. data/lib/legion/extensions/agentic/memory/trace/persistent_store.rb +94 -0
  145. data/lib/legion/extensions/agentic/memory/trace/quota.rb +55 -0
  146. data/lib/legion/extensions/agentic/memory/trace/runners/consolidation.rb +121 -0
  147. data/lib/legion/extensions/agentic/memory/trace/runners/traces.rb +105 -0
  148. data/lib/legion/extensions/agentic/memory/trace/version.rb +13 -0
  149. data/lib/legion/extensions/agentic/memory/trace.rb +54 -0
  150. data/lib/legion/extensions/agentic/memory/transfer/client.rb +28 -0
  151. data/lib/legion/extensions/agentic/memory/transfer/helpers/constants.rb +34 -0
  152. data/lib/legion/extensions/agentic/memory/transfer/helpers/domain_knowledge.rb +74 -0
  153. data/lib/legion/extensions/agentic/memory/transfer/helpers/transfer_engine.rb +188 -0
  154. data/lib/legion/extensions/agentic/memory/transfer/runners/transfer_learning.rb +77 -0
  155. data/lib/legion/extensions/agentic/memory/transfer/version.rb +13 -0
  156. data/lib/legion/extensions/agentic/memory/transfer.rb +19 -0
  157. data/lib/legion/extensions/agentic/memory/version.rb +11 -0
  158. data/lib/legion/extensions/agentic/memory.rb +35 -0
  159. data/spec/legion/extensions/agentic/memory/archaeology/client_spec.rb +38 -0
  160. data/spec/legion/extensions/agentic/memory/archaeology/cognitive_archaeology_spec.rb +7 -0
  161. data/spec/legion/extensions/agentic/memory/archaeology/helpers/archaeology_engine_spec.rb +165 -0
  162. data/spec/legion/extensions/agentic/memory/archaeology/helpers/artifact_spec.rb +196 -0
  163. data/spec/legion/extensions/agentic/memory/archaeology/helpers/constants_spec.rb +42 -0
  164. data/spec/legion/extensions/agentic/memory/archaeology/helpers/excavation_site_spec.rb +115 -0
  165. data/spec/legion/extensions/agentic/memory/archaeology/runners/cognitive_archaeology_spec.rb +96 -0
  166. data/spec/legion/extensions/agentic/memory/compression/helpers/compression_engine_spec.rb +138 -0
  167. data/spec/legion/extensions/agentic/memory/compression/helpers/constants_spec.rb +50 -0
  168. data/spec/legion/extensions/agentic/memory/compression/helpers/information_chunk_spec.rb +123 -0
  169. data/spec/legion/extensions/agentic/memory/compression/runners/cognitive_compression_spec.rb +80 -0
  170. data/spec/legion/extensions/agentic/memory/echo/client_spec.rb +20 -0
  171. data/spec/legion/extensions/agentic/memory/echo/cognitive_echo_spec.rb +7 -0
  172. data/spec/legion/extensions/agentic/memory/echo/helpers/echo_engine_spec.rb +152 -0
  173. data/spec/legion/extensions/agentic/memory/echo/helpers/echo_spec.rb +128 -0
  174. data/spec/legion/extensions/agentic/memory/echo/runners_spec.rb +80 -0
  175. data/spec/legion/extensions/agentic/memory/echo_chamber/client_spec.rb +84 -0
  176. data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_engine_spec.rb +266 -0
  177. data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_spec.rb +249 -0
  178. data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/constants_spec.rb +130 -0
  179. data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/echo_spec.rb +252 -0
  180. data/spec/legion/extensions/agentic/memory/echo_chamber/runners/cognitive_echo_chamber_spec.rb +185 -0
  181. data/spec/legion/extensions/agentic/memory/episodic/client_spec.rb +80 -0
  182. data/spec/legion/extensions/agentic/memory/episodic/episodic_buffer_spec.rb +15 -0
  183. data/spec/legion/extensions/agentic/memory/episodic/helpers/constants_spec.rb +86 -0
  184. data/spec/legion/extensions/agentic/memory/episodic/helpers/episode_spec.rb +188 -0
  185. data/spec/legion/extensions/agentic/memory/episodic/helpers/episodic_binding_spec.rb +114 -0
  186. data/spec/legion/extensions/agentic/memory/episodic/helpers/episodic_store_spec.rb +201 -0
  187. data/spec/legion/extensions/agentic/memory/episodic/runners/episodic_buffer_spec.rb +208 -0
  188. data/spec/legion/extensions/agentic/memory/hologram/client_spec.rb +89 -0
  189. data/spec/legion/extensions/agentic/memory/hologram/cognitive_hologram_spec.rb +39 -0
  190. data/spec/legion/extensions/agentic/memory/hologram/helpers/constants_spec.rb +143 -0
  191. data/spec/legion/extensions/agentic/memory/hologram/helpers/hologram_engine_spec.rb +268 -0
  192. data/spec/legion/extensions/agentic/memory/hologram/helpers/hologram_spec.rb +256 -0
  193. data/spec/legion/extensions/agentic/memory/hologram/helpers/holographic_fragment_spec.rb +213 -0
  194. data/spec/legion/extensions/agentic/memory/hologram/runners/cognitive_hologram_spec.rb +239 -0
  195. data/spec/legion/extensions/agentic/memory/immune_memory/client_spec.rb +18 -0
  196. data/spec/legion/extensions/agentic/memory/immune_memory/cognitive_immune_memory_spec.rb +7 -0
  197. data/spec/legion/extensions/agentic/memory/immune_memory/helpers/encounter_spec.rb +85 -0
  198. data/spec/legion/extensions/agentic/memory/immune_memory/helpers/immune_memory_engine_spec.rb +203 -0
  199. data/spec/legion/extensions/agentic/memory/immune_memory/helpers/memory_cell_spec.rb +190 -0
  200. data/spec/legion/extensions/agentic/memory/immune_memory/runners_spec.rb +83 -0
  201. data/spec/legion/extensions/agentic/memory/nostalgia/client_spec.rb +71 -0
  202. data/spec/legion/extensions/agentic/memory/nostalgia/helpers/constants_spec.rb +65 -0
  203. data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_engine_spec.rb +191 -0
  204. data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_event_spec.rb +59 -0
  205. data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgic_memory_spec.rb +134 -0
  206. data/spec/legion/extensions/agentic/memory/nostalgia/runners/analysis_spec.rb +97 -0
  207. data/spec/legion/extensions/agentic/memory/nostalgia/runners/recall_spec.rb +81 -0
  208. data/spec/legion/extensions/agentic/memory/offloading/client_spec.rb +30 -0
  209. data/spec/legion/extensions/agentic/memory/offloading/helpers/constants_spec.rb +71 -0
  210. data/spec/legion/extensions/agentic/memory/offloading/helpers/external_store_spec.rb +158 -0
  211. data/spec/legion/extensions/agentic/memory/offloading/helpers/offloaded_item_spec.rb +123 -0
  212. data/spec/legion/extensions/agentic/memory/offloading/helpers/offloading_engine_spec.rb +250 -0
  213. data/spec/legion/extensions/agentic/memory/offloading/runners/cognitive_offloading_spec.rb +194 -0
  214. data/spec/legion/extensions/agentic/memory/paleontology/client_spec.rb +27 -0
  215. data/spec/legion/extensions/agentic/memory/paleontology/cognitive_paleontology_spec.rb +7 -0
  216. data/spec/legion/extensions/agentic/memory/paleontology/helpers/constants_spec.rb +33 -0
  217. data/spec/legion/extensions/agentic/memory/paleontology/helpers/excavation_spec.rb +71 -0
  218. data/spec/legion/extensions/agentic/memory/paleontology/helpers/fossil_spec.rb +134 -0
  219. data/spec/legion/extensions/agentic/memory/paleontology/helpers/paleontology_engine_spec.rb +148 -0
  220. data/spec/legion/extensions/agentic/memory/paleontology/runners/cognitive_paleontology_spec.rb +89 -0
  221. data/spec/legion/extensions/agentic/memory/palimpsest/client_spec.rb +58 -0
  222. data/spec/legion/extensions/agentic/memory/palimpsest/helpers/belief_layer_spec.rb +150 -0
  223. data/spec/legion/extensions/agentic/memory/palimpsest/helpers/constants_spec.rb +63 -0
  224. data/spec/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_engine_spec.rb +164 -0
  225. data/spec/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_spec.rb +172 -0
  226. data/spec/legion/extensions/agentic/memory/palimpsest/runners/cognitive_palimpsest_spec.rb +165 -0
  227. data/spec/legion/extensions/agentic/memory/reserve/client_spec.rb +37 -0
  228. data/spec/legion/extensions/agentic/memory/reserve/helpers/pathway_spec.rb +165 -0
  229. data/spec/legion/extensions/agentic/memory/reserve/helpers/reserve_engine_spec.rb +196 -0
  230. data/spec/legion/extensions/agentic/memory/reserve/runners/cognitive_reserve_spec.rb +96 -0
  231. data/spec/legion/extensions/agentic/memory/semantic/client_spec.rb +35 -0
  232. data/spec/legion/extensions/agentic/memory/semantic/helpers/concept_spec.rb +119 -0
  233. data/spec/legion/extensions/agentic/memory/semantic/helpers/knowledge_store_spec.rb +140 -0
  234. data/spec/legion/extensions/agentic/memory/semantic/runners/semantic_memory_spec.rb +103 -0
  235. data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/connection_spec.rb +98 -0
  236. data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/priming_network_spec.rb +208 -0
  237. data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/semantic_node_spec.rb +125 -0
  238. data/spec/legion/extensions/agentic/memory/semantic_priming/semantic_priming_spec.rb +7 -0
  239. data/spec/legion/extensions/agentic/memory/semantic_satiation/client_spec.rb +19 -0
  240. data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/concept_spec.rb +167 -0
  241. data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/constants_spec.rb +81 -0
  242. data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/satiation_engine_spec.rb +189 -0
  243. data/spec/legion/extensions/agentic/memory/semantic_satiation/runners/semantic_satiation_spec.rb +176 -0
  244. data/spec/legion/extensions/agentic/memory/source_monitoring/client_spec.rb +25 -0
  245. data/spec/legion/extensions/agentic/memory/source_monitoring/helpers/source_record_spec.rb +152 -0
  246. data/spec/legion/extensions/agentic/memory/source_monitoring/helpers/source_tracker_spec.rb +139 -0
  247. data/spec/legion/extensions/agentic/memory/source_monitoring/runners/source_monitoring_spec.rb +102 -0
  248. data/spec/legion/extensions/agentic/memory/trace/actors/decay_spec.rb +62 -0
  249. data/spec/legion/extensions/agentic/memory/trace/actors/tier_migration_spec.rb +62 -0
  250. data/spec/legion/extensions/agentic/memory/trace/batch_decay_spec.rb +26 -0
  251. data/spec/legion/extensions/agentic/memory/trace/client_spec.rb +62 -0
  252. data/spec/legion/extensions/agentic/memory/trace/helpers/decay_spec.rb +134 -0
  253. data/spec/legion/extensions/agentic/memory/trace/helpers/store_spec.rb +217 -0
  254. data/spec/legion/extensions/agentic/memory/trace/helpers/trace_spec.rb +120 -0
  255. data/spec/legion/extensions/agentic/memory/trace/local_persistence_spec.rb +255 -0
  256. data/spec/legion/extensions/agentic/memory/trace/memory_spec.rb +11 -0
  257. data/spec/legion/extensions/agentic/memory/trace/persistent_store_spec.rb +50 -0
  258. data/spec/legion/extensions/agentic/memory/trace/quota_spec.rb +56 -0
  259. data/spec/legion/extensions/agentic/memory/trace/runners/consolidation_spec.rb +118 -0
  260. data/spec/legion/extensions/agentic/memory/trace/runners/traces_spec.rb +69 -0
  261. data/spec/legion/extensions/agentic/memory/transfer/client_spec.rb +18 -0
  262. data/spec/legion/extensions/agentic/memory/transfer/helpers/constants_spec.rb +41 -0
  263. data/spec/legion/extensions/agentic/memory/transfer/helpers/domain_knowledge_spec.rb +134 -0
  264. data/spec/legion/extensions/agentic/memory/transfer/helpers/transfer_engine_spec.rb +299 -0
  265. data/spec/legion/extensions/agentic/memory/transfer/runners/transfer_learning_spec.rb +144 -0
  266. data/spec/spec_helper.rb +46 -0
  267. 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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Trace
8
+ VERSION = '0.2.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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