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,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::SemanticPriming::Helpers::SemanticNode do
4
+ subject(:node) { described_class.new(label: 'doctor') }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID id' do
8
+ expect(node.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'sets label' do
12
+ expect(node.label).to eq('doctor')
13
+ end
14
+
15
+ it 'defaults to concept type' do
16
+ expect(node.node_type).to eq(:concept)
17
+ end
18
+
19
+ it 'starts with zero activation' do
20
+ expect(node.activation).to eq(0.0)
21
+ end
22
+
23
+ it 'starts with zero prime count' do
24
+ expect(node.prime_count).to eq(0)
25
+ end
26
+
27
+ it 'clamps high activation' do
28
+ high = described_class.new(label: 'x', activation: 5.0)
29
+ expect(high.activation).to eq(1.0)
30
+ end
31
+ end
32
+
33
+ describe '#prime!' do
34
+ it 'increases activation' do
35
+ node.prime!
36
+ expect(node.activation).to be > 0.0
37
+ end
38
+
39
+ it 'increments prime count' do
40
+ node.prime!
41
+ expect(node.prime_count).to eq(1)
42
+ end
43
+
44
+ it 'clamps at max activation' do
45
+ 5.times { node.prime!(amount: 0.5) }
46
+ expect(node.activation).to eq(1.0)
47
+ end
48
+
49
+ it 'returns self' do
50
+ expect(node.prime!).to eq(node)
51
+ end
52
+ end
53
+
54
+ describe '#decay!' do
55
+ it 'reduces activation' do
56
+ node.prime!(amount: 0.5)
57
+ original = node.activation
58
+ node.decay!
59
+ expect(node.activation).to be < original
60
+ end
61
+
62
+ it 'does not go below zero' do
63
+ node.decay!
64
+ expect(node.activation).to eq(0.0)
65
+ end
66
+ end
67
+
68
+ describe '#access!' do
69
+ it 'increments access count' do
70
+ node.access!
71
+ expect(node.access_count).to eq(1)
72
+ end
73
+ end
74
+
75
+ describe '#reset!' do
76
+ it 'resets activation to resting level' do
77
+ node.prime!(amount: 0.8)
78
+ node.reset!
79
+ expect(node.activation).to eq(0.0)
80
+ end
81
+ end
82
+
83
+ describe '#primed?' do
84
+ it 'is false when unactivated' do
85
+ expect(node.primed?).to be false
86
+ end
87
+
88
+ it 'is true when highly activated' do
89
+ node.prime!(amount: 0.5)
90
+ expect(node.primed?).to be true
91
+ end
92
+ end
93
+
94
+ describe '#active?' do
95
+ it 'is false at zero activation' do
96
+ expect(node.active?).to be false
97
+ end
98
+
99
+ it 'is true above threshold' do
100
+ node.prime!(amount: 0.3)
101
+ expect(node.active?).to be true
102
+ end
103
+ end
104
+
105
+ describe '#activation_label' do
106
+ it 'returns unprimed for zero activation' do
107
+ expect(node.activation_label).to eq(:unprimed)
108
+ end
109
+
110
+ it 'returns primed for high activation' do
111
+ node.prime!(amount: 0.7)
112
+ expect(node.activation_label).to eq(:primed)
113
+ end
114
+ end
115
+
116
+ describe '#to_h' do
117
+ it 'includes all fields' do
118
+ hash = node.to_h
119
+ expect(hash).to include(
120
+ :id, :label, :node_type, :activation, :activation_label,
121
+ :primed, :active, :prime_count, :access_count, :created_at
122
+ )
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::SemanticPriming do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::Agentic::Memory::SemanticPriming::VERSION).to eq('0.1.0')
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/semantic_satiation/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Memory::SemanticSatiation::Client do
6
+ it 'responds to runner methods' do
7
+ client = described_class.new
8
+ expect(client).to respond_to(:expose)
9
+ expect(client).to respond_to(:register)
10
+ expect(client).to respond_to(:expose_by_id)
11
+ expect(client).to respond_to(:recover)
12
+ expect(client).to respond_to(:satiation_status)
13
+ expect(client).to respond_to(:domain_satiation)
14
+ expect(client).to respond_to(:most_exposed)
15
+ expect(client).to respond_to(:freshest_concepts)
16
+ expect(client).to respond_to(:novelty_report)
17
+ expect(client).to respond_to(:prune_saturated)
18
+ end
19
+ end
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::SemanticSatiation::Helpers::Concept do
4
+ subject(:concept) { described_class.new(label: 'banana', domain: :food) }
5
+
6
+ describe '#initialize' do
7
+ it 'generates a uuid id' do
8
+ expect(concept.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'sets label' do
12
+ expect(concept.label).to eq('banana')
13
+ end
14
+
15
+ it 'sets domain' do
16
+ expect(concept.domain).to eq(:food)
17
+ end
18
+
19
+ it 'starts with full fluency' do
20
+ expect(concept.fluency).to eq(1.0)
21
+ end
22
+
23
+ it 'starts with zero exposures' do
24
+ expect(concept.exposure_count).to eq(0)
25
+ end
26
+
27
+ it 'starts with nil last_exposed_at' do
28
+ expect(concept.last_exposed_at).to be_nil
29
+ end
30
+
31
+ it 'sets created_at' do
32
+ expect(concept.created_at).to be_a(Time)
33
+ end
34
+
35
+ it 'defaults domain to :general' do
36
+ c = described_class.new(label: 'test')
37
+ expect(c.domain).to eq(:general)
38
+ end
39
+ end
40
+
41
+ describe '#expose!' do
42
+ it 'increments exposure_count' do
43
+ concept.expose!
44
+ expect(concept.exposure_count).to eq(1)
45
+ end
46
+
47
+ it 'reduces fluency by SATIATION_RATE' do
48
+ expected = (1.0 - Legion::Extensions::Agentic::Memory::SemanticSatiation::Helpers::Constants::SATIATION_RATE).round(10)
49
+ concept.expose!
50
+ expect(concept.fluency).to eq(expected)
51
+ end
52
+
53
+ it 'sets last_exposed_at' do
54
+ concept.expose!
55
+ expect(concept.last_exposed_at).to be_a(Time)
56
+ end
57
+
58
+ it 'does not reduce fluency below 0.0' do
59
+ 20.times { concept.expose! }
60
+ expect(concept.fluency).to be >= 0.0
61
+ end
62
+
63
+ it 'accumulates multiple exposures' do
64
+ 3.times { concept.expose! }
65
+ expect(concept.exposure_count).to eq(3)
66
+ end
67
+ end
68
+
69
+ describe '#recover!' do
70
+ it 'increases fluency by RECOVERY_RATE' do
71
+ concept.expose!
72
+ fluency_before = concept.fluency
73
+ concept.recover!
74
+ expect(concept.fluency).to be > fluency_before
75
+ end
76
+
77
+ it 'does not exceed 1.0' do
78
+ concept.recover!
79
+ expect(concept.fluency).to eq(1.0)
80
+ end
81
+
82
+ it 'accepts custom amount' do
83
+ concept.expose!
84
+ concept.expose!
85
+ fluency_before = concept.fluency
86
+ concept.recover!(amount: 0.5)
87
+ expect(concept.fluency).to be > fluency_before
88
+ end
89
+ end
90
+
91
+ describe '#satiated?' do
92
+ it 'returns false when fluency is full' do
93
+ expect(concept.satiated?).to be false
94
+ end
95
+
96
+ it 'returns true when fluency is below threshold' do
97
+ threshold = Legion::Extensions::Agentic::Memory::SemanticSatiation::Helpers::Constants
98
+ target = 1.0 - threshold::SATIATION_THRESHOLD - 0.05
99
+ allow(concept).to receive(:fluency).and_return(target)
100
+ expect(concept.satiated?).to be true
101
+ end
102
+ end
103
+
104
+ describe '#fluency_label' do
105
+ it 'returns :fluent for high fluency' do
106
+ expect(concept.fluency_label).to eq(:fluent)
107
+ end
108
+
109
+ it 'returns :meaningless for near-zero fluency' do
110
+ 15.times { concept.expose! }
111
+ expect(%i[meaningless satiated reduced]).to include(concept.fluency_label)
112
+ end
113
+ end
114
+
115
+ describe '#novelty' do
116
+ it 'returns 1.0 for a fresh concept' do
117
+ expect(concept.novelty).to eq(1.0)
118
+ end
119
+
120
+ it 'decreases with more exposures' do
121
+ 10.times { concept.expose! }
122
+ expect(concept.novelty).to be < 1.0
123
+ end
124
+
125
+ it 'does not go below 0.0' do
126
+ 100.times { concept.expose! }
127
+ expect(concept.novelty).to be >= 0.0
128
+ end
129
+ end
130
+
131
+ describe '#novelty_label' do
132
+ it 'returns :novel for a fresh concept' do
133
+ expect(concept.novelty_label).to eq(:novel)
134
+ end
135
+
136
+ it 'returns a symbol' do
137
+ expect(concept.novelty_label).to be_a(Symbol)
138
+ end
139
+ end
140
+
141
+ describe '#time_since_exposure' do
142
+ it 'returns nil before first exposure' do
143
+ expect(concept.time_since_exposure).to be_nil
144
+ end
145
+
146
+ it 'returns a numeric value after exposure' do
147
+ concept.expose!
148
+ expect(concept.time_since_exposure).to be_a(Float).or be_a(Integer)
149
+ end
150
+ end
151
+
152
+ describe '#to_h' do
153
+ it 'includes all expected keys' do
154
+ h = concept.to_h
155
+ expect(h.keys).to include(:id, :label, :domain, :fluency, :fluency_label,
156
+ :novelty, :novelty_label, :exposure_count,
157
+ :satiated, :last_exposed_at, :created_at)
158
+ end
159
+
160
+ it 'reflects current state' do
161
+ concept.expose!
162
+ h = concept.to_h
163
+ expect(h[:exposure_count]).to eq(1)
164
+ expect(h[:fluency]).to be < 1.0
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::SemanticSatiation::Helpers::Constants do
4
+ subject(:constants) { described_class }
5
+
6
+ describe 'numeric constants' do
7
+ it 'defines MAX_CONCEPTS as 300' do
8
+ expect(constants::MAX_CONCEPTS).to eq(300)
9
+ end
10
+
11
+ it 'defines SATIATION_RATE as 0.08' do
12
+ expect(constants::SATIATION_RATE).to eq(0.08)
13
+ end
14
+
15
+ it 'defines RECOVERY_RATE as 0.03' do
16
+ expect(constants::RECOVERY_RATE).to eq(0.03)
17
+ end
18
+
19
+ it 'defines SATIATION_THRESHOLD as 0.7' do
20
+ expect(constants::SATIATION_THRESHOLD).to eq(0.7)
21
+ end
22
+
23
+ it 'defines DEFAULT_FLUENCY as 1.0' do
24
+ expect(constants::DEFAULT_FLUENCY).to eq(1.0)
25
+ end
26
+ end
27
+
28
+ describe 'FLUENCY_LABELS' do
29
+ it 'maps high fluency to :fluent' do
30
+ label = constants::FLUENCY_LABELS.find { |range, _| range.cover?(0.9) }&.last
31
+ expect(label).to eq(:fluent)
32
+ end
33
+
34
+ it 'maps mid-high fluency to :normal' do
35
+ label = constants::FLUENCY_LABELS.find { |range, _| range.cover?(0.7) }&.last
36
+ expect(label).to eq(:normal)
37
+ end
38
+
39
+ it 'maps mid fluency to :reduced' do
40
+ label = constants::FLUENCY_LABELS.find { |range, _| range.cover?(0.5) }&.last
41
+ expect(label).to eq(:reduced)
42
+ end
43
+
44
+ it 'maps low fluency to :satiated' do
45
+ label = constants::FLUENCY_LABELS.find { |range, _| range.cover?(0.3) }&.last
46
+ expect(label).to eq(:satiated)
47
+ end
48
+
49
+ it 'maps very low fluency to :meaningless' do
50
+ label = constants::FLUENCY_LABELS.find { |range, _| range.cover?(0.1) }&.last
51
+ expect(label).to eq(:meaningless)
52
+ end
53
+ end
54
+
55
+ describe 'NOVELTY_LABELS' do
56
+ it 'maps high novelty to :novel' do
57
+ label = constants::NOVELTY_LABELS.find { |range, _| range.cover?(0.9) }&.last
58
+ expect(label).to eq(:novel)
59
+ end
60
+
61
+ it 'maps mid-high novelty to :familiar' do
62
+ label = constants::NOVELTY_LABELS.find { |range, _| range.cover?(0.7) }&.last
63
+ expect(label).to eq(:familiar)
64
+ end
65
+
66
+ it 'maps mid novelty to :routine' do
67
+ label = constants::NOVELTY_LABELS.find { |range, _| range.cover?(0.5) }&.last
68
+ expect(label).to eq(:routine)
69
+ end
70
+
71
+ it 'maps low novelty to :overexposed' do
72
+ label = constants::NOVELTY_LABELS.find { |range, _| range.cover?(0.3) }&.last
73
+ expect(label).to eq(:overexposed)
74
+ end
75
+
76
+ it 'maps very low novelty to :saturated' do
77
+ label = constants::NOVELTY_LABELS.find { |range, _| range.cover?(0.1) }&.last
78
+ expect(label).to eq(:saturated)
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,189 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::SemanticSatiation::Helpers::SatiationEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ describe '#register_concept' do
7
+ it 'registers a new concept and returns it' do
8
+ concept = engine.register_concept(label: 'apple')
9
+ expect(concept).to be_a(Legion::Extensions::Agentic::Memory::SemanticSatiation::Helpers::Concept)
10
+ expect(concept.label).to eq('apple')
11
+ end
12
+
13
+ it 'returns existing concept if label already registered' do
14
+ c1 = engine.register_concept(label: 'apple')
15
+ c2 = engine.register_concept(label: 'apple')
16
+ expect(c1.id).to eq(c2.id)
17
+ end
18
+
19
+ it 'assigns the given domain' do
20
+ concept = engine.register_concept(label: 'oak', domain: :nature)
21
+ expect(concept.domain).to eq(:nature)
22
+ end
23
+
24
+ it 'defaults domain to :general' do
25
+ concept = engine.register_concept(label: 'test')
26
+ expect(concept.domain).to eq(:general)
27
+ end
28
+
29
+ it 'stores concept in @concepts' do
30
+ concept = engine.register_concept(label: 'pear')
31
+ expect(engine.concepts[concept.id]).to eq(concept)
32
+ end
33
+ end
34
+
35
+ describe '#expose_concept' do
36
+ it 'reduces fluency for a registered concept' do
37
+ concept = engine.register_concept(label: 'word')
38
+ engine.expose_concept(concept_id: concept.id)
39
+ expect(concept.fluency).to be < 1.0
40
+ end
41
+
42
+ it 'returns error hash for unknown concept_id' do
43
+ result = engine.expose_concept(concept_id: 'nonexistent')
44
+ expect(result[:error]).to eq(:not_found)
45
+ end
46
+
47
+ it 'returns concept hash on success' do
48
+ concept = engine.register_concept(label: 'tree')
49
+ result = engine.expose_concept(concept_id: concept.id)
50
+ expect(result[:fluency]).to be_a(Float)
51
+ end
52
+ end
53
+
54
+ describe '#expose_by_label' do
55
+ it 'creates and exposes a concept by label' do
56
+ result = engine.expose_by_label(label: 'cloud')
57
+ expect(result[:fluency]).to be < 1.0
58
+ end
59
+
60
+ it 'reuses existing concept on second exposure' do
61
+ engine.expose_by_label(label: 'cloud')
62
+ engine.expose_by_label(label: 'cloud')
63
+ concepts_with_label = engine.concepts.values.select { |c| c.label == 'cloud' }
64
+ expect(concepts_with_label.size).to eq(1)
65
+ end
66
+
67
+ it 'increments exposure_count each call' do
68
+ 2.times { engine.expose_by_label(label: 'rain') }
69
+ concept = engine.concepts.values.find { |c| c.label == 'rain' }
70
+ expect(concept.exposure_count).to eq(2)
71
+ end
72
+ end
73
+
74
+ describe '#recover_all' do
75
+ it 'recovers all concepts' do
76
+ engine.expose_by_label(label: 'a')
77
+ engine.expose_by_label(label: 'b')
78
+ result = engine.recover_all
79
+ expect(result[:recovered]).to eq(2)
80
+ end
81
+
82
+ it 'increases fluency of exposed concepts' do
83
+ engine.expose_by_label(label: 'test')
84
+ concept = engine.concepts.values.first
85
+ fluency_before = concept.fluency
86
+ engine.recover_all
87
+ expect(concept.fluency).to be > fluency_before
88
+ end
89
+ end
90
+
91
+ describe '#satiated_concepts' do
92
+ it 'returns empty array when no concepts are satiated' do
93
+ engine.register_concept(label: 'fresh')
94
+ expect(engine.satiated_concepts).to be_empty
95
+ end
96
+
97
+ it 'returns satiated concepts' do
98
+ engine.register_concept(label: 'worn')
99
+ concept = engine.concepts.values.first
100
+ 15.times { concept.expose! }
101
+ expect(engine.satiated_concepts).to include(concept)
102
+ end
103
+ end
104
+
105
+ describe '#most_exposed' do
106
+ it 'returns concepts sorted by exposure_count descending' do
107
+ engine.expose_by_label(label: 'a')
108
+ 3.times { engine.expose_by_label(label: 'b') }
109
+ 2.times { engine.expose_by_label(label: 'c') }
110
+ result = engine.most_exposed(limit: 3)
111
+ expect(result.first.label).to eq('b')
112
+ end
113
+
114
+ it 'respects limit parameter' do
115
+ 5.times { |i| engine.expose_by_label(label: "word#{i}") }
116
+ expect(engine.most_exposed(limit: 3).size).to eq(3)
117
+ end
118
+ end
119
+
120
+ describe '#freshest' do
121
+ it 'returns concepts sorted by fluency descending' do
122
+ engine.register_concept(label: 'fresh')
123
+ worn = engine.register_concept(label: 'worn')
124
+ 5.times { worn.expose! }
125
+ result = engine.freshest(limit: 2)
126
+ expect(result.first.label).to eq('fresh')
127
+ end
128
+
129
+ it 'respects limit parameter' do
130
+ 5.times { |i| engine.register_concept(label: "c#{i}") }
131
+ expect(engine.freshest(limit: 2).size).to eq(2)
132
+ end
133
+ end
134
+
135
+ describe '#domain_satiation' do
136
+ it 'returns average fluency for domain' do
137
+ engine.expose_by_label(label: 'sun', domain: :nature)
138
+ engine.expose_by_label(label: 'moon', domain: :nature)
139
+ result = engine.domain_satiation(domain: :nature)
140
+ expect(result).to be < 1.0
141
+ expect(result).to be > 0.0
142
+ end
143
+
144
+ it 'returns 0.0 for unknown domain' do
145
+ expect(engine.domain_satiation(domain: :unknown)).to eq(0.0)
146
+ end
147
+ end
148
+
149
+ describe '#novelty_report' do
150
+ it 'returns a hash distribution' do
151
+ engine.register_concept(label: 'new')
152
+ report = engine.novelty_report
153
+ expect(report).to be_a(Hash)
154
+ end
155
+
156
+ it 'counts concepts per novelty label' do
157
+ engine.register_concept(label: 'fresh')
158
+ report = engine.novelty_report
159
+ expect(report[:novel]).to eq(1)
160
+ end
161
+ end
162
+
163
+ describe '#prune_saturated' do
164
+ it 'removes concepts with fluency <= 0.05' do
165
+ concept = engine.register_concept(label: 'stale')
166
+ allow(concept).to receive(:fluency).and_return(0.03)
167
+ removed = engine.prune_saturated
168
+ expect(removed).to eq(1)
169
+ end
170
+
171
+ it 'does not remove healthy concepts' do
172
+ engine.register_concept(label: 'healthy')
173
+ engine.prune_saturated
174
+ expect(engine.concepts.size).to eq(1)
175
+ end
176
+ end
177
+
178
+ describe '#to_h' do
179
+ it 'includes expected keys' do
180
+ h = engine.to_h
181
+ expect(h.keys).to include(:concept_count, :satiated_count, :novelty_report, :most_exposed, :freshest)
182
+ end
183
+
184
+ it 'reflects current state' do
185
+ engine.register_concept(label: 'test')
186
+ expect(engine.to_h[:concept_count]).to eq(1)
187
+ end
188
+ end
189
+ end