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,268 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Hologram::Helpers::HologramEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ def build_hologram(overrides = {})
7
+ engine.create_hologram(
8
+ domain: overrides.fetch(:domain, :memory),
9
+ content: overrides.fetch(:content, 'the quick brown fox jumps over the lazy dog')
10
+ )
11
+ end
12
+
13
+ describe '#create_hologram' do
14
+ it 'returns a Hologram instance' do
15
+ expect(build_hologram).to be_a(Legion::Extensions::Agentic::Memory::Hologram::Helpers::Hologram)
16
+ end
17
+
18
+ it 'stores the hologram internally' do
19
+ h = build_hologram
20
+ expect(engine.get(h.id)).to eq(h)
21
+ end
22
+
23
+ it 'increments hologram count' do
24
+ 3.times { build_hologram }
25
+ expect(engine.holograms.size).to eq(3)
26
+ end
27
+
28
+ it 'assigns the provided domain' do
29
+ h = build_hologram(domain: :emotion)
30
+ expect(h.domain).to eq(:emotion)
31
+ end
32
+
33
+ it 'assigns the provided content' do
34
+ h = build_hologram(content: 'unique content here')
35
+ expect(h.content).to eq('unique content here')
36
+ end
37
+ end
38
+
39
+ describe '#fragment_hologram' do
40
+ let(:hologram) { build_hologram }
41
+
42
+ it 'returns an array of fragments' do
43
+ result = engine.fragment_hologram(hologram_id: hologram.id, count: 3)
44
+ expect(result).to be_an(Array)
45
+ end
46
+
47
+ it 'returns the requested number of fragments' do
48
+ result = engine.fragment_hologram(hologram_id: hologram.id, count: 4)
49
+ expect(result.size).to eq(4)
50
+ end
51
+
52
+ it 'returns nil for unknown hologram_id' do
53
+ result = engine.fragment_hologram(hologram_id: SecureRandom.uuid, count: 2)
54
+ expect(result).to be_nil
55
+ end
56
+
57
+ it 'attaches fragments to the hologram' do
58
+ engine.fragment_hologram(hologram_id: hologram.id, count: 3)
59
+ expect(hologram.fragments.size).to eq(3)
60
+ end
61
+ end
62
+
63
+ describe '#reconstruct_from_fragments' do
64
+ let(:hologram) { build_hologram }
65
+ let(:fragments) { engine.fragment_hologram(hologram_id: hologram.id, count: 4) }
66
+
67
+ it 'returns success: true when sufficient fragments are used' do
68
+ ids = fragments.select(&:sufficient?).map(&:id)
69
+ result = engine.reconstruct_from_fragments(hologram_id: hologram.id, fragment_ids: ids)
70
+ expect(result[:success]).to be true
71
+ end
72
+
73
+ it 'returns success: false when hologram not found' do
74
+ result = engine.reconstruct_from_fragments(
75
+ hologram_id: SecureRandom.uuid,
76
+ fragment_ids: []
77
+ )
78
+ expect(result[:success]).to be false
79
+ expect(result[:reason]).to eq(:hologram_not_found)
80
+ end
81
+
82
+ it 'returns resolution value on success' do
83
+ ids = fragments.map(&:id)
84
+ result = engine.reconstruct_from_fragments(hologram_id: hologram.id, fragment_ids: ids)
85
+ expect(result[:resolution]).to be_a(Float) if result[:success]
86
+ end
87
+
88
+ it 'returns success: false with empty fragment ids and no sufficient fragments match' do
89
+ result = engine.reconstruct_from_fragments(hologram_id: hologram.id, fragment_ids: [])
90
+ expect(result[:success]).to be false
91
+ end
92
+ end
93
+
94
+ describe '#measure_interference' do
95
+ let(:hologram_a) { build_hologram(content: 'the quick brown fox') }
96
+ let(:hologram_b) { build_hologram(content: 'the quick brown fox') }
97
+ let(:hologram_c) { build_hologram(content: 'completely unrelated content here now') }
98
+
99
+ it 'returns interference score as float' do
100
+ result = engine.measure_interference(hologram_id_a: hologram_a.id, hologram_id_b: hologram_b.id)
101
+ expect(result[:interference]).to be_a(Float)
102
+ end
103
+
104
+ it 'returns high interference for near-identical content' do
105
+ result = engine.measure_interference(hologram_id_a: hologram_a.id, hologram_id_b: hologram_b.id)
106
+ expect(result[:interference]).to be > 0.5
107
+ end
108
+
109
+ it 'returns lower interference for dissimilar content' do
110
+ r1 = engine.measure_interference(hologram_id_a: hologram_a.id, hologram_id_b: hologram_b.id)
111
+ r2 = engine.measure_interference(hologram_id_a: hologram_a.id, hologram_id_b: hologram_c.id)
112
+ expect(r1[:interference]).to be >= r2[:interference]
113
+ end
114
+
115
+ it 'includes a label key' do
116
+ result = engine.measure_interference(hologram_id_a: hologram_a.id, hologram_id_b: hologram_b.id)
117
+ expect(result[:label]).to be_a(Symbol)
118
+ end
119
+
120
+ it 'returns reason :hologram_not_found when a hologram is missing' do
121
+ result = engine.measure_interference(
122
+ hologram_id_a: SecureRandom.uuid,
123
+ hologram_id_b: hologram_b.id
124
+ )
125
+ expect(result[:reason]).to eq(:hologram_not_found)
126
+ end
127
+ end
128
+
129
+ describe '#degrade_all!' do
130
+ before do
131
+ hologram = build_hologram
132
+ engine.fragment_hologram(hologram_id: hologram.id, count: 3)
133
+ end
134
+
135
+ it 'reduces fidelity on all fragments' do
136
+ before_values = engine.holograms.flat_map { |h| h.fragments.map(&:fidelity) }
137
+ engine.degrade_all!
138
+ after_values = engine.holograms.flat_map { |h| h.fragments.map(&:fidelity) }
139
+ expect(after_values.sum).to be < before_values.sum
140
+ end
141
+
142
+ it 'affects completeness on all fragments' do
143
+ before_values = engine.holograms.flat_map { |h| h.fragments.map(&:completeness) }
144
+ engine.degrade_all!
145
+ after_values = engine.holograms.flat_map { |h| h.fragments.map(&:completeness) }
146
+ expect(after_values.sum).to be < before_values.sum
147
+ end
148
+ end
149
+
150
+ describe '#best_preserved' do
151
+ before do
152
+ 3.times do |i|
153
+ h = build_hologram(content: "hologram content #{i}")
154
+ engine.fragment_hologram(hologram_id: h.id, count: 2)
155
+ end
156
+ end
157
+
158
+ it 'returns an array' do
159
+ expect(engine.best_preserved(limit: 2)).to be_an(Array)
160
+ end
161
+
162
+ it 'respects the limit' do
163
+ expect(engine.best_preserved(limit: 2).size).to be <= 2
164
+ end
165
+
166
+ it 'returns holograms sorted by resolution descending' do
167
+ top = engine.best_preserved(limit: 3)
168
+ resolutions = top.map(&:resolution)
169
+ expect(resolutions).to eq(resolutions.sort.reverse)
170
+ end
171
+
172
+ it 'returns empty array when no holograms have fragments' do
173
+ fresh_engine = described_class.new
174
+ fresh_engine.create_hologram(domain: :memory, content: 'no fragments')
175
+ expect(fresh_engine.best_preserved).to be_empty
176
+ end
177
+ end
178
+
179
+ describe '#most_fragmented' do
180
+ before do
181
+ 3.times do |i|
182
+ h = build_hologram(content: "content for hologram #{i}")
183
+ engine.fragment_hologram(hologram_id: h.id, count: 2)
184
+ end
185
+ end
186
+
187
+ it 'returns an array' do
188
+ expect(engine.most_fragmented(limit: 2)).to be_an(Array)
189
+ end
190
+
191
+ it 'respects the limit' do
192
+ expect(engine.most_fragmented(limit: 2).size).to be <= 2
193
+ end
194
+
195
+ it 'returns holograms sorted by resolution ascending' do
196
+ result = engine.most_fragmented(limit: 3)
197
+ resolutions = result.map(&:resolution)
198
+ expect(resolutions).to eq(resolutions.sort)
199
+ end
200
+ end
201
+
202
+ describe '#hologram_report' do
203
+ before do
204
+ 2.times do |i|
205
+ h = build_hologram(content: "content number #{i}")
206
+ engine.fragment_hologram(hologram_id: h.id, count: 3)
207
+ end
208
+ end
209
+
210
+ subject(:report) { engine.hologram_report }
211
+
212
+ it 'includes all expected keys' do
213
+ expected_keys = %i[
214
+ total_holograms holograms_with_frags average_resolution
215
+ resolution_label best_preserved_count most_fragmented_count
216
+ ]
217
+ expect(report.keys).to match_array(expected_keys)
218
+ end
219
+
220
+ it 'reports correct total_holograms' do
221
+ expect(report[:total_holograms]).to eq(2)
222
+ end
223
+
224
+ it 'reports correct holograms_with_frags' do
225
+ expect(report[:holograms_with_frags]).to eq(2)
226
+ end
227
+
228
+ it 'reports average_resolution as float' do
229
+ expect(report[:average_resolution]).to be_a(Float)
230
+ end
231
+
232
+ it 'includes resolution_label as symbol' do
233
+ expect(report[:resolution_label]).to be_a(Symbol)
234
+ end
235
+ end
236
+
237
+ describe '#holograms' do
238
+ it 'returns empty array initially' do
239
+ expect(engine.holograms).to be_empty
240
+ end
241
+
242
+ it 'returns all created holograms' do
243
+ 3.times { build_hologram }
244
+ expect(engine.holograms.size).to eq(3)
245
+ end
246
+ end
247
+
248
+ describe '#get' do
249
+ it 'returns the hologram by id' do
250
+ h = build_hologram
251
+ expect(engine.get(h.id)).to eq(h)
252
+ end
253
+
254
+ it 'returns nil for unknown id' do
255
+ expect(engine.get(SecureRandom.uuid)).to be_nil
256
+ end
257
+ end
258
+
259
+ describe 'MAX_HOLOGRAMS pruning' do
260
+ it 'prunes when count reaches MAX_HOLOGRAMS' do
261
+ max = Legion::Extensions::Agentic::Memory::Hologram::Helpers::Constants::MAX_HOLOGRAMS
262
+ max.times { |i| build_hologram(content: "hologram #{i}") }
263
+ expect(engine.holograms.size).to eq(max)
264
+ build_hologram(content: 'one more hologram')
265
+ expect(engine.holograms.size).to be <= max
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,256 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Hologram::Helpers::Hologram do
4
+ let(:domain) { :memory }
5
+ let(:content) { 'the quick brown fox jumps over the lazy dog' }
6
+
7
+ subject(:hologram) { described_class.new(domain: domain, content: content) }
8
+
9
+ describe '#initialize' do
10
+ it 'generates a UUID id' do
11
+ expect(hologram.id).to match(/\A[0-9a-f-]{36}\z/)
12
+ end
13
+
14
+ it 'stores domain as symbol' do
15
+ expect(hologram.domain).to eq(:memory)
16
+ end
17
+
18
+ it 'converts string domain to symbol' do
19
+ h = described_class.new(domain: 'emotion', content: content)
20
+ expect(h.domain).to eq(:emotion)
21
+ end
22
+
23
+ it 'stores content' do
24
+ expect(hologram.content).to eq(content)
25
+ end
26
+
27
+ it 'initializes with empty fragments' do
28
+ expect(hologram.fragments).to be_empty
29
+ end
30
+
31
+ it 'sets created_at to a Time' do
32
+ expect(hologram.created_at).to be_a(Time)
33
+ end
34
+ end
35
+
36
+ describe '#resolution' do
37
+ it 'returns 0.0 when there are no fragments' do
38
+ expect(hologram.resolution).to eq(0.0)
39
+ end
40
+
41
+ it 'returns 0.0 when all fragments are insufficient' do
42
+ hologram.fragment!(2).each { |f| f.degrade!(0.9) }
43
+ expect(hologram.resolution).to eq(0.0)
44
+ end
45
+
46
+ it 'returns a value between 0.0 and 1.0 with sufficient fragments' do
47
+ hologram.fragment!(4)
48
+ expect(hologram.resolution).to be_between(0.0, 1.0)
49
+ end
50
+
51
+ it 'returns a non-zero resolution with high-completeness fragments' do
52
+ hologram.fragment!(2)
53
+ expect(hologram.resolution).to be > 0.0
54
+ end
55
+ end
56
+
57
+ describe '#fragment!' do
58
+ it 'returns an array of HolographicFragment objects' do
59
+ frags = hologram.fragment!(3)
60
+ expect(frags).to all(be_a(Legion::Extensions::Agentic::Memory::Hologram::Helpers::HolographicFragment))
61
+ end
62
+
63
+ it 'creates the requested number of fragments' do
64
+ frags = hologram.fragment!(5)
65
+ expect(frags.size).to eq(5)
66
+ end
67
+
68
+ it 'appends fragments to @fragments' do
69
+ hologram.fragment!(3)
70
+ expect(hologram.fragments.size).to eq(3)
71
+ end
72
+
73
+ it 'accumulates fragments across multiple calls' do
74
+ hologram.fragment!(2)
75
+ hologram.fragment!(3)
76
+ expect(hologram.fragments.size).to eq(5)
77
+ end
78
+
79
+ it 'sets parent_hologram_id to self id on all fragments' do
80
+ frags = hologram.fragment!(4)
81
+ expect(frags.all? { |f| f.parent_hologram_id == hologram.id }).to be true
82
+ end
83
+
84
+ it 'clamps count to minimum 1' do
85
+ frags = hologram.fragment!(0)
86
+ expect(frags.size).to eq(1)
87
+ end
88
+
89
+ it 'clamps count to maximum 20' do
90
+ frags = hologram.fragment!(50)
91
+ expect(frags.size).to eq(20)
92
+ end
93
+
94
+ it 'stores the same content as the hologram in each fragment' do
95
+ frags = hologram.fragment!(3)
96
+ expect(frags.all? { |f| f.content == content }).to be true
97
+ end
98
+ end
99
+
100
+ describe '#reconstruct' do
101
+ context 'with sufficient fragments' do
102
+ let(:fragments) { hologram.fragment!(4) }
103
+
104
+ it 'returns success: true' do
105
+ expect(hologram.reconstruct(fragments)[:success]).to be true
106
+ end
107
+
108
+ it 'returns a resolution value' do
109
+ expect(hologram.reconstruct(fragments)[:resolution]).to be_between(0.0, 1.0)
110
+ end
111
+
112
+ it 'returns a resolution label as symbol' do
113
+ expect(hologram.reconstruct(fragments)[:label]).to be_a(Symbol)
114
+ end
115
+
116
+ it 'returns fragment_count equal to sufficient fragments' do
117
+ result = hologram.reconstruct(fragments)
118
+ expect(result[:fragment_count]).to be_between(1, fragments.size)
119
+ end
120
+
121
+ it 'returns total_fragments equal to input count' do
122
+ result = hologram.reconstruct(fragments)
123
+ expect(result[:total_fragments]).to eq(fragments.size)
124
+ end
125
+ end
126
+
127
+ context 'with no sufficient fragments' do
128
+ let(:bad_fragments) do
129
+ hologram.fragment!(2).tap { |frags| frags.each { |f| f.degrade!(0.9) } }
130
+ end
131
+
132
+ it 'returns success: false' do
133
+ expect(hologram.reconstruct(bad_fragments)[:success]).to be false
134
+ end
135
+
136
+ it 'returns reason :insufficient_fragments' do
137
+ expect(hologram.reconstruct(bad_fragments)[:reason]).to eq(:insufficient_fragments)
138
+ end
139
+
140
+ it 'returns resolution 0.0' do
141
+ expect(hologram.reconstruct(bad_fragments)[:resolution]).to eq(0.0)
142
+ end
143
+ end
144
+
145
+ context 'with empty array' do
146
+ it 'returns success: false' do
147
+ expect(hologram.reconstruct([])[:success]).to be false
148
+ end
149
+ end
150
+ end
151
+
152
+ describe '#add_fragment' do
153
+ it 'appends a fragment to the list' do
154
+ frag = Legion::Extensions::Agentic::Memory::Hologram::Helpers::HolographicFragment.new(
155
+ content: content, parent_hologram_id: hologram.id
156
+ )
157
+ hologram.add_fragment(frag)
158
+ expect(hologram.fragments).to include(frag)
159
+ end
160
+
161
+ it 'returns the added fragment' do
162
+ frag = Legion::Extensions::Agentic::Memory::Hologram::Helpers::HolographicFragment.new(
163
+ content: content, parent_hologram_id: hologram.id
164
+ )
165
+ result = hologram.add_fragment(frag)
166
+ expect(result).to eq(frag)
167
+ end
168
+ end
169
+
170
+ describe '#resolution_label' do
171
+ it 'returns a symbol' do
172
+ expect(hologram.resolution_label).to be_a(Symbol)
173
+ end
174
+
175
+ it 'returns :fragmentary with no fragments' do
176
+ expect(hologram.resolution_label).to eq(:fragmentary)
177
+ end
178
+
179
+ it 'accepts an override value' do
180
+ expect(hologram.resolution_label(0.95)).to eq(:perfect)
181
+ end
182
+ end
183
+
184
+ describe '#interference_with' do
185
+ let(:other) { described_class.new(domain: :emotion, content: 'the quick brown fox') }
186
+
187
+ it 'returns a float between 0.0 and 1.0' do
188
+ score = hologram.interference_with(other)
189
+ expect(score).to be_between(0.0, 1.0)
190
+ end
191
+
192
+ it 'returns higher interference for more overlapping content' do
193
+ close = described_class.new(domain: :memory, content: 'the quick brown fox jumps')
194
+ distant = described_class.new(domain: :memory, content: 'completely different words here')
195
+ expect(hologram.interference_with(close)).to be > hologram.interference_with(distant)
196
+ end
197
+
198
+ it 'returns 0.0 when compared to itself by id' do
199
+ expect(hologram.interference_with(hologram)).to eq(0.0)
200
+ end
201
+
202
+ it 'returns 0.0 when other is nil' do
203
+ expect(hologram.interference_with(nil)).to eq(0.0)
204
+ end
205
+
206
+ it 'returns 0.0 for completely different content' do
207
+ unrelated = described_class.new(domain: :memory, content: 'xyz abc def')
208
+ score = hologram.interference_with(unrelated)
209
+ expect(score).to be >= 0.0
210
+ end
211
+
212
+ it 'returns 1.0 for identical content' do
213
+ twin = described_class.new(domain: :memory, content: content)
214
+ expect(hologram.interference_with(twin)).to be_within(0.001).of(1.0)
215
+ end
216
+ end
217
+
218
+ describe '#to_h' do
219
+ subject(:hash) { hologram.to_h }
220
+
221
+ before { hologram.fragment!(2) }
222
+
223
+ it 'includes :id' do
224
+ expect(hash[:id]).to eq(hologram.id)
225
+ end
226
+
227
+ it 'includes :domain' do
228
+ expect(hash[:domain]).to eq(:memory)
229
+ end
230
+
231
+ it 'includes :content' do
232
+ expect(hash[:content]).to eq(content)
233
+ end
234
+
235
+ it 'includes :resolution as float' do
236
+ expect(hash[:resolution]).to be_a(Float)
237
+ end
238
+
239
+ it 'includes :resolution_label as symbol' do
240
+ expect(hash[:resolution_label]).to be_a(Symbol)
241
+ end
242
+
243
+ it 'includes :fragment_count matching actual count' do
244
+ expect(hash[:fragment_count]).to eq(2)
245
+ end
246
+
247
+ it 'includes :fragments as array of hashes' do
248
+ expect(hash[:fragments]).to be_an(Array)
249
+ expect(hash[:fragments].first).to be_a(Hash)
250
+ end
251
+
252
+ it 'includes :created_at as ISO8601 string' do
253
+ expect(hash[:created_at]).to match(/\d{4}-\d{2}-\d{2}T/)
254
+ end
255
+ end
256
+ end