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,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Episodic::Helpers::Episode do
4
+ let(:episode) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a uuid id' do
8
+ expect(episode.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'starts with empty bindings' do
12
+ expect(episode.bindings).to be_empty
13
+ end
14
+
15
+ it 'sets created_at' do
16
+ expect(episode.created_at).to be_a(Time)
17
+ end
18
+
19
+ it 'sets last_accessed' do
20
+ expect(episode.last_accessed).to be_a(Time)
21
+ end
22
+ end
23
+
24
+ describe '#add_binding' do
25
+ it 'adds a binding successfully' do
26
+ result = episode.add_binding(modality: :verbal, content: 'test', source: :phonological_loop)
27
+ expect(result[:added]).to be true
28
+ expect(result[:binding_id]).not_to be_nil
29
+ end
30
+
31
+ it 'stores binding in the bindings hash' do
32
+ result = episode.add_binding(modality: :verbal, content: 'test', source: :phonological_loop)
33
+ expect(episode.bindings).to have_key(result[:binding_id])
34
+ end
35
+
36
+ it 'rejects binding when at capacity' do
37
+ 10.times { |i| episode.add_binding(modality: :verbal, content: "item #{i}", source: :test) }
38
+ result = episode.add_binding(modality: :visual, content: 'overflow', source: :test)
39
+ expect(result[:added]).to be false
40
+ expect(result[:reason]).to eq(:capacity_full)
41
+ end
42
+
43
+ it 'accepts all modalities' do
44
+ %i[verbal visual spatial semantic emotional procedural temporal].each_with_index do |mod, idx|
45
+ result = episode.add_binding(modality: mod, content: "content #{idx}", source: :test)
46
+ expect(result[:added]).to be true
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#remove_binding' do
52
+ it 'removes an existing binding' do
53
+ result = episode.add_binding(modality: :verbal, content: 'test', source: :test)
54
+ remove_result = episode.remove_binding(binding_id: result[:binding_id])
55
+ expect(remove_result[:removed]).to be true
56
+ end
57
+
58
+ it 'returns false for unknown binding' do
59
+ result = episode.remove_binding(binding_id: 'nonexistent-id')
60
+ expect(result[:removed]).to be false
61
+ end
62
+ end
63
+
64
+ describe '#attend' do
65
+ it 'updates last_accessed' do
66
+ before = episode.last_accessed
67
+ sleep(0.01)
68
+ episode.attend
69
+ expect(episode.last_accessed).to be >= before
70
+ end
71
+
72
+ it 'boosts all binding strengths' do
73
+ episode.add_binding(modality: :verbal, content: 'test', source: :test, strength: 0.3)
74
+ initial_strengths = episode.bindings.values.map(&:strength)
75
+ episode.attend
76
+ episode.bindings.values.each_with_index do |b, i|
77
+ expect(b.strength).to be > initial_strengths[i]
78
+ end
79
+ end
80
+ end
81
+
82
+ describe '#rehearse' do
83
+ it 'updates last_accessed' do
84
+ before = episode.last_accessed
85
+ sleep(0.01)
86
+ episode.rehearse
87
+ expect(episode.last_accessed).to be >= before
88
+ end
89
+
90
+ it 'boosts bindings by REHEARSAL_BOOST' do
91
+ episode.add_binding(modality: :verbal, content: 'test', source: :test, strength: 0.3)
92
+ initial = episode.bindings.values.first.strength
93
+ episode.rehearse
94
+ expect(episode.bindings.values.first.strength).to be_within(0.001).of(initial + 0.15)
95
+ end
96
+ end
97
+
98
+ describe '#modalities_present' do
99
+ it 'returns empty array for empty episode' do
100
+ expect(episode.modalities_present).to eq([])
101
+ end
102
+
103
+ it 'returns unique modalities' do
104
+ episode.add_binding(modality: :verbal, content: 'a', source: :test)
105
+ episode.add_binding(modality: :visual, content: 'b', source: :test)
106
+ episode.add_binding(modality: :verbal, content: 'c', source: :test)
107
+ expect(episode.modalities_present).to contain_exactly(:verbal, :visual)
108
+ end
109
+ end
110
+
111
+ describe '#coherence' do
112
+ it 'returns 0.0 for empty episode' do
113
+ expect(episode.coherence).to eq(0.0)
114
+ end
115
+
116
+ it 'returns 0.0 when no bindings are integrated' do
117
+ episode.add_binding(modality: :verbal, content: 'x', source: :test, strength: 0.1)
118
+ expect(episode.coherence).to eq(0.0)
119
+ end
120
+
121
+ it 'returns average strength of integrated bindings' do
122
+ episode.add_binding(modality: :verbal, content: 'a', source: :test, strength: 0.6)
123
+ episode.add_binding(modality: :visual, content: 'b', source: :test, strength: 0.8)
124
+ expected = (0.6 + 0.8) / 2.0
125
+ expect(episode.coherence).to be_within(0.001).of(expected)
126
+ end
127
+ end
128
+
129
+ describe '#coherence_label' do
130
+ it 'returns :fragmented for low coherence' do
131
+ episode.add_binding(modality: :verbal, content: 'x', source: :test, strength: 0.1)
132
+ expect(episode.coherence_label).to eq(:fragmented)
133
+ end
134
+
135
+ it 'returns coherence label for integrated bindings' do
136
+ episode.add_binding(modality: :verbal, content: 'a', source: :test, strength: 0.7)
137
+ episode.add_binding(modality: :visual, content: 'b', source: :test, strength: 0.7)
138
+ expect(episode.coherence_label).to eq(:coherent)
139
+ end
140
+ end
141
+
142
+ describe '#multimodal?' do
143
+ it 'returns false for single modality' do
144
+ episode.add_binding(modality: :verbal, content: 'a', source: :test)
145
+ expect(episode.multimodal?).to be false
146
+ end
147
+
148
+ it 'returns true for 2+ modalities' do
149
+ episode.add_binding(modality: :verbal, content: 'a', source: :test)
150
+ episode.add_binding(modality: :visual, content: 'b', source: :test)
151
+ expect(episode.multimodal?).to be true
152
+ end
153
+ end
154
+
155
+ describe '#expired?' do
156
+ it 'returns false for fresh episode' do
157
+ expect(episode.expired?).to be false
158
+ end
159
+ end
160
+
161
+ describe '#decay_bindings' do
162
+ it 'decays all binding strengths' do
163
+ episode.add_binding(modality: :verbal, content: 'a', source: :test, strength: 0.5)
164
+ initial = episode.bindings.values.first.strength
165
+ episode.decay_bindings
166
+ expect(episode.bindings.values.first.strength).to be < initial
167
+ end
168
+
169
+ it 'removes faded bindings' do
170
+ episode.add_binding(modality: :verbal, content: 'a', source: :test, strength: 0.04)
171
+ episode.decay_bindings
172
+ expect(episode.bindings).to be_empty
173
+ end
174
+ end
175
+
176
+ describe '#to_h' do
177
+ it 'returns a hash with expected keys' do
178
+ h = episode.to_h
179
+ expect(h.keys).to include(:id, :bindings, :created_at, :last_accessed, :modalities)
180
+ expect(h.keys).to include(:coherence, :coherence_label, :multimodal, :binding_count)
181
+ end
182
+
183
+ it 'reflects current binding count' do
184
+ episode.add_binding(modality: :verbal, content: 'a', source: :test)
185
+ expect(episode.to_h[:binding_count]).to eq(1)
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Episodic::Helpers::EpisodicBinding do
4
+ let(:binding) { described_class.new(modality: :verbal, content: 'hello world', source: :phonological_loop) }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a uuid id' do
8
+ expect(binding.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'assigns modality as symbol' do
12
+ expect(binding.modality).to eq(:verbal)
13
+ end
14
+
15
+ it 'assigns content' do
16
+ expect(binding.content).to eq('hello world')
17
+ end
18
+
19
+ it 'assigns source as symbol' do
20
+ expect(binding.source).to eq(:phonological_loop)
21
+ end
22
+
23
+ it 'defaults strength to DEFAULT_BINDING_STRENGTH' do
24
+ expect(binding.strength).to eq(0.5)
25
+ end
26
+
27
+ it 'accepts custom strength' do
28
+ b = described_class.new(modality: :visual, content: 'image', source: :visuospatial, strength: 0.8)
29
+ expect(b.strength).to eq(0.8)
30
+ end
31
+
32
+ it 'clamps strength to 0..1' do
33
+ b = described_class.new(modality: :visual, content: 'x', source: :perception, strength: 1.5)
34
+ expect(b.strength).to eq(1.0)
35
+ end
36
+
37
+ it 'raises ArgumentError for invalid modality' do
38
+ expect do
39
+ described_class.new(modality: :invalid_mod, content: 'x', source: :test)
40
+ end.to raise_error(ArgumentError, /invalid modality/)
41
+ end
42
+
43
+ it 'accepts all valid modalities' do
44
+ %i[verbal visual spatial semantic emotional procedural temporal].each do |mod|
45
+ expect { described_class.new(modality: mod, content: 'x', source: :test) }.not_to raise_error
46
+ end
47
+ end
48
+ end
49
+
50
+ describe '#decay' do
51
+ it 'reduces strength by BINDING_DECAY' do
52
+ initial = binding.strength
53
+ binding.decay
54
+ expect(binding.strength).to be_within(0.001).of(initial - 0.015)
55
+ end
56
+
57
+ it 'does not go below 0.0' do
58
+ b = described_class.new(modality: :verbal, content: 'x', source: :test, strength: 0.01)
59
+ b.decay
60
+ expect(b.strength).to be >= 0.0
61
+ end
62
+ end
63
+
64
+ describe '#strengthen' do
65
+ it 'increases strength by the given amount' do
66
+ initial = binding.strength
67
+ binding.strengthen(0.1)
68
+ expect(binding.strength).to be_within(0.001).of(initial + 0.1)
69
+ end
70
+
71
+ it 'clamps at 1.0' do
72
+ b = described_class.new(modality: :verbal, content: 'x', source: :test, strength: 0.95)
73
+ b.strengthen(0.5)
74
+ expect(b.strength).to eq(1.0)
75
+ end
76
+ end
77
+
78
+ describe '#integrated?' do
79
+ it 'returns true when strength >= INTEGRATION_THRESHOLD' do
80
+ b = described_class.new(modality: :verbal, content: 'x', source: :test, strength: 0.5)
81
+ expect(b.integrated?).to be true
82
+ end
83
+
84
+ it 'returns false when strength < INTEGRATION_THRESHOLD' do
85
+ b = described_class.new(modality: :verbal, content: 'x', source: :test, strength: 0.3)
86
+ expect(b.integrated?).to be false
87
+ end
88
+ end
89
+
90
+ describe '#faded?' do
91
+ it 'returns true when strength <= BINDING_STRENGTH_FLOOR' do
92
+ b = described_class.new(modality: :verbal, content: 'x', source: :test, strength: 0.04)
93
+ expect(b.faded?).to be true
94
+ end
95
+
96
+ it 'returns false when strength is above floor' do
97
+ expect(binding.faded?).to be false
98
+ end
99
+ end
100
+
101
+ describe '#to_h' do
102
+ it 'returns a hash with all fields' do
103
+ h = binding.to_h
104
+ expect(h).to include(:id, :modality, :content, :source, :strength)
105
+ end
106
+
107
+ it 'contains correct values' do
108
+ h = binding.to_h
109
+ expect(h[:modality]).to eq(:verbal)
110
+ expect(h[:content]).to eq('hello world')
111
+ expect(h[:source]).to eq(:phonological_loop)
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,201 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Episodic::Helpers::EpisodicStore do
4
+ let(:store) { described_class.new }
5
+
6
+ def add_multimodal_episode(the_store)
7
+ ep = the_store.create_episode
8
+ the_store.add_to_episode(episode_id: ep.id, modality: :verbal, content: 'a', source: :test)
9
+ the_store.add_to_episode(episode_id: ep.id, modality: :visual, content: 'b', source: :test)
10
+ ep
11
+ end
12
+
13
+ describe '#initialize' do
14
+ it 'starts with empty episodes' do
15
+ expect(store.episodes).to be_empty
16
+ end
17
+
18
+ it 'starts with empty history' do
19
+ expect(store.history).to be_empty
20
+ end
21
+ end
22
+
23
+ describe '#create_episode' do
24
+ it 'returns an Episode' do
25
+ ep = store.create_episode
26
+ expect(ep).to be_a(Legion::Extensions::Agentic::Memory::Episodic::Helpers::Episode)
27
+ end
28
+
29
+ it 'stores the episode' do
30
+ ep = store.create_episode
31
+ expect(store.episodes).to have_key(ep.id)
32
+ end
33
+
34
+ it 'records history' do
35
+ store.create_episode
36
+ expect(store.history.last[:event]).to eq(:create)
37
+ end
38
+
39
+ it 'evicts oldest expired episode when at capacity' do
40
+ stub_const('Legion::Extensions::Agentic::Memory::Episodic::Helpers::Constants::MAX_EPISODES', 2)
41
+ e1 = store.create_episode
42
+ e2 = store.create_episode
43
+ expect(store.count).to eq(2)
44
+ allow(e1).to receive(:expired?).and_return(true)
45
+ allow(e2).to receive(:expired?).and_return(false)
46
+ store.create_episode
47
+ expect(store.count).to eq(2)
48
+ end
49
+ end
50
+
51
+ describe '#add_to_episode' do
52
+ let(:ep) { store.create_episode }
53
+
54
+ it 'adds binding to existing episode' do
55
+ result = store.add_to_episode(
56
+ episode_id: ep.id, modality: :verbal, content: 'hello', source: :phonological_loop
57
+ )
58
+ expect(result[:added]).to be true
59
+ end
60
+
61
+ it 'returns failure for missing episode' do
62
+ result = store.add_to_episode(
63
+ episode_id: 'nonexistent', modality: :verbal, content: 'x', source: :test
64
+ )
65
+ expect(result[:success]).to be false
66
+ expect(result[:reason]).to eq(:episode_not_found)
67
+ end
68
+ end
69
+
70
+ describe '#attend_episode' do
71
+ it 'returns success for existing episode' do
72
+ ep = store.create_episode
73
+ result = store.attend_episode(episode_id: ep.id)
74
+ expect(result[:success]).to be true
75
+ end
76
+
77
+ it 'returns failure for missing episode' do
78
+ result = store.attend_episode(episode_id: 'missing')
79
+ expect(result[:success]).to be false
80
+ end
81
+ end
82
+
83
+ describe '#rehearse_episode' do
84
+ it 'returns success for existing episode' do
85
+ ep = store.create_episode
86
+ result = store.rehearse_episode(episode_id: ep.id)
87
+ expect(result[:success]).to be true
88
+ end
89
+
90
+ it 'returns failure for missing episode' do
91
+ result = store.rehearse_episode(episode_id: 'missing')
92
+ expect(result[:success]).to be false
93
+ end
94
+ end
95
+
96
+ describe '#integrate' do
97
+ let(:ep) { store.create_episode }
98
+
99
+ it 'returns integrated: false for low-coherence episode' do
100
+ store.add_to_episode(episode_id: ep.id, modality: :verbal, content: 'x', source: :test, strength: 0.1)
101
+ result = store.integrate(episode_id: ep.id)
102
+ expect(result[:integrated]).to be false
103
+ end
104
+
105
+ it 'returns integrated: true for high-coherence episode' do
106
+ store.add_to_episode(episode_id: ep.id, modality: :verbal, content: 'a', source: :test, strength: 0.9)
107
+ store.add_to_episode(episode_id: ep.id, modality: :visual, content: 'b', source: :test, strength: 0.9)
108
+ result = store.integrate(episode_id: ep.id)
109
+ expect(result[:integrated]).to be true
110
+ end
111
+
112
+ it 'returns failure for missing episode' do
113
+ result = store.integrate(episode_id: 'missing')
114
+ expect(result[:integrated]).to be false
115
+ expect(result[:reason]).to eq(:episode_not_found)
116
+ end
117
+
118
+ it 'includes coherence label' do
119
+ store.add_to_episode(episode_id: ep.id, modality: :verbal, content: 'a', source: :test, strength: 0.9)
120
+ result = store.integrate(episode_id: ep.id)
121
+ expect(result[:coherence_label]).not_to be_nil
122
+ end
123
+ end
124
+
125
+ describe '#retrieve_by_modality' do
126
+ it 'returns episodes containing that modality' do
127
+ add_multimodal_episode(store)
128
+ results = store.retrieve_by_modality(modality: :verbal)
129
+ expect(results.size).to eq(1)
130
+ end
131
+
132
+ it 'returns empty array when no match' do
133
+ expect(store.retrieve_by_modality(modality: :temporal)).to be_empty
134
+ end
135
+ end
136
+
137
+ describe '#retrieve_multimodal' do
138
+ it 'returns episodes with 2+ modalities' do
139
+ add_multimodal_episode(store)
140
+ expect(store.retrieve_multimodal.size).to eq(1)
141
+ end
142
+
143
+ it 'excludes single-modality episodes' do
144
+ ep = store.create_episode
145
+ store.add_to_episode(episode_id: ep.id, modality: :verbal, content: 'x', source: :test)
146
+ expect(store.retrieve_multimodal).to be_empty
147
+ end
148
+ end
149
+
150
+ describe '#most_coherent' do
151
+ it 'returns episodes sorted by coherence descending' do
152
+ ep1 = store.create_episode
153
+ store.add_to_episode(episode_id: ep1.id, modality: :verbal, content: 'a', source: :test, strength: 0.9)
154
+ ep2 = store.create_episode
155
+ store.add_to_episode(episode_id: ep2.id, modality: :visual, content: 'b', source: :test, strength: 0.5)
156
+
157
+ results = store.most_coherent(limit: 2)
158
+ expect(results.first.id).to eq(ep1.id)
159
+ end
160
+
161
+ it 'respects limit' do
162
+ 3.times { store.create_episode }
163
+ expect(store.most_coherent(limit: 2).size).to be <= 2
164
+ end
165
+ end
166
+
167
+ describe '#tick' do
168
+ it 'returns a hash with decayed and expired counts' do
169
+ store.create_episode
170
+ result = store.tick
171
+ expect(result).to include(:decayed, :expired)
172
+ end
173
+
174
+ it 'removes episodes with faded bindings that are also expired' do
175
+ ep = store.create_episode
176
+ allow(store.episodes[ep.id]).to receive(:expired?).and_return(true)
177
+ store.tick
178
+ expect(store.episodes).not_to have_key(ep.id)
179
+ end
180
+ end
181
+
182
+ describe '#count' do
183
+ it 'returns current episode count' do
184
+ store.create_episode
185
+ store.create_episode
186
+ expect(store.count).to eq(2)
187
+ end
188
+ end
189
+
190
+ describe '#to_h' do
191
+ it 'returns stats hash' do
192
+ h = store.to_h
193
+ expect(h).to include(:episode_count, :history_size, :multimodal_count, :avg_coherence)
194
+ end
195
+
196
+ it 'reflects current episode count' do
197
+ store.create_episode
198
+ expect(store.to_h[:episode_count]).to eq(1)
199
+ end
200
+ end
201
+ end