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,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module EchoChamber
10
+ module Helpers
11
+ class Echo
12
+ include Constants
13
+
14
+ attr_reader :id, :content, :echo_type, :domain, :source_agent,
15
+ :amplitude, :frequency, :original_amplitude, :created_at
16
+
17
+ def initialize(content:, echo_type: :belief, domain: :general,
18
+ source_agent: nil, amplitude: DEFAULT_AMPLITUDE)
19
+ @id = SecureRandom.uuid
20
+ @content = content
21
+ @echo_type = validate_type(echo_type)
22
+ @domain = domain.to_sym
23
+ @source_agent = source_agent
24
+ @amplitude = amplitude.to_f.clamp(0.0, 1.0).round(10)
25
+ @original_amplitude = @amplitude
26
+ @frequency = 1
27
+ @created_at = Time.now.utc
28
+ end
29
+
30
+ def amplify!(rate = AMPLIFICATION_RATE)
31
+ @frequency += 1
32
+ @amplitude = (@amplitude + rate).clamp(0.0, 1.0).round(10)
33
+ self
34
+ end
35
+
36
+ def dampen!(rate = DECAY_RATE)
37
+ @amplitude = (@amplitude - rate).clamp(0.0, 1.0).round(10)
38
+ self
39
+ end
40
+
41
+ def resonate?
42
+ @amplitude >= DISRUPTION_THRESHOLD
43
+ end
44
+
45
+ def fading?
46
+ @amplitude <= POROUS_THRESHOLD
47
+ end
48
+
49
+ def silent?
50
+ @amplitude <= SILENT_THRESHOLD
51
+ end
52
+
53
+ def frequency_label
54
+ Constants.label_for(RESONANCE_LABELS, frequency_score)
55
+ end
56
+
57
+ def amplitude_label
58
+ Constants.label_for(AMPLIFICATION_LABELS, @amplitude)
59
+ end
60
+
61
+ def to_h
62
+ {
63
+ id: @id,
64
+ content: @content,
65
+ echo_type: @echo_type,
66
+ domain: @domain,
67
+ source_agent: @source_agent,
68
+ amplitude: @amplitude,
69
+ original_amplitude: @original_amplitude,
70
+ frequency: @frequency,
71
+ frequency_label: frequency_label,
72
+ amplitude_label: amplitude_label,
73
+ resonate: resonate?,
74
+ fading: fading?,
75
+ silent: silent?,
76
+ created_at: @created_at
77
+ }
78
+ end
79
+
80
+ private
81
+
82
+ def validate_type(type)
83
+ sym = type.to_sym
84
+ ECHO_TYPES.include?(sym) ? sym : :belief
85
+ end
86
+
87
+ def frequency_score
88
+ [@frequency.to_f / 20.0, 1.0].min.round(10)
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module EchoChamber
8
+ module Runners
9
+ module CognitiveEchoChamber
10
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
11
+
12
+ def create_echo(content:, echo_type: :belief, domain: :general,
13
+ source_agent: nil, amplitude: 0.5, engine: nil, **)
14
+ raise ArgumentError, 'content cannot be empty' if content.to_s.strip.empty?
15
+
16
+ eng = engine || default_engine
17
+ echo = eng.create_echo(
18
+ content: content,
19
+ echo_type: echo_type,
20
+ domain: domain,
21
+ source_agent: source_agent,
22
+ amplitude: amplitude
23
+ )
24
+ Legion::Logging.debug "[cognitive_echo_chamber] echo created id=#{echo.id} type=#{echo_type} domain=#{domain}"
25
+ { success: true, echo: echo.to_h }
26
+ rescue ArgumentError => e
27
+ { success: false, error: e.message }
28
+ end
29
+
30
+ def create_chamber(label:, domain: :general, wall_thickness: 0.5, engine: nil, **)
31
+ raise ArgumentError, 'label cannot be empty' if label.to_s.strip.empty?
32
+
33
+ eng = engine || default_engine
34
+ chamber = eng.create_chamber(label: label, domain: domain, wall_thickness: wall_thickness)
35
+ Legion::Logging.debug "[cognitive_echo_chamber] chamber created id=#{chamber.id} label=#{label}"
36
+ { success: true, chamber: chamber.to_h }
37
+ rescue ArgumentError => e
38
+ { success: false, error: e.message }
39
+ end
40
+
41
+ def amplify(echo_id:, rate: 0.1, engine: nil, **)
42
+ eng = engine || default_engine
43
+ echo = eng.amplify_echo(echo_id: echo_id, rate: rate)
44
+ return { success: false, error: 'echo not found' } unless echo
45
+
46
+ Legion::Logging.debug "[cognitive_echo_chamber] amplified echo=#{echo_id} amplitude=#{echo.amplitude}"
47
+ { success: true, echo: echo.to_h }
48
+ end
49
+
50
+ def disrupt(chamber_id:, force:, engine: nil, **)
51
+ eng = engine || default_engine
52
+ result = eng.disrupt_chamber(chamber_id: chamber_id, force: force)
53
+ Legion::Logging.debug "[cognitive_echo_chamber] disrupt chamber=#{chamber_id} success=#{result[:success]}"
54
+ result
55
+ end
56
+
57
+ def list_echoes(echo_type: nil, domain: nil, engine: nil, **)
58
+ eng = engine || default_engine
59
+ echoes = if echo_type
60
+ eng.echoes_by_type(echo_type: echo_type)
61
+ else
62
+ eng.active_echoes
63
+ end
64
+ echoes = echoes.select { |e| e.domain == domain.to_sym } if domain
65
+ { success: true, echoes: echoes.map(&:to_h), count: echoes.size }
66
+ end
67
+
68
+ def chamber_status(engine: nil, **)
69
+ eng = engine || default_engine
70
+ { success: true, **eng.echo_report }
71
+ end
72
+
73
+ private
74
+
75
+ def default_engine
76
+ @default_engine ||= Helpers::ChamberEngine.new
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module EchoChamber
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require_relative 'echo_chamber/version'
5
+ require_relative 'echo_chamber/helpers/constants'
6
+ require_relative 'echo_chamber/helpers/echo'
7
+ require_relative 'echo_chamber/helpers/chamber'
8
+ require_relative 'echo_chamber/helpers/chamber_engine'
9
+ require_relative 'echo_chamber/runners/cognitive_echo_chamber'
10
+ require_relative 'echo_chamber/client'
11
+
12
+ module Legion
13
+ module Extensions
14
+ module Agentic
15
+ module Memory
16
+ module EchoChamber
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/actors/every'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module Episodic
10
+ module Actor
11
+ class Decay < Legion::Extensions::Actors::Every
12
+ def runner_class
13
+ Legion::Extensions::Agentic::Memory::Episodic::Runners::EpisodicBuffer
14
+ end
15
+
16
+ def runner_function
17
+ 'update_episodic_buffer'
18
+ end
19
+
20
+ def time
21
+ 15
22
+ end
23
+
24
+ def run_now?
25
+ false
26
+ end
27
+
28
+ def use_runner?
29
+ false
30
+ end
31
+
32
+ def check_subtask?
33
+ false
34
+ end
35
+
36
+ def generate_task?
37
+ false
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/episodic/runners/episodic_buffer'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module Episodic
10
+ class Client
11
+ include Legion::Extensions::Agentic::Memory::Episodic::Runners::EpisodicBuffer
12
+
13
+ def initialize(store: nil, **)
14
+ @default_store = store || Helpers::EpisodicStore.new
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :default_store
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Episodic
8
+ module Helpers
9
+ module Constants
10
+ MAX_EPISODES = 30
11
+ MAX_BINDINGS_PER_EPISODE = 10
12
+ MAX_HISTORY = 200
13
+ EPISODE_TTL = 120
14
+ BINDING_STRENGTH_FLOOR = 0.05
15
+ BINDING_DECAY = 0.015
16
+ DEFAULT_BINDING_STRENGTH = 0.5
17
+ ATTENTION_BOOST = 0.2
18
+ REHEARSAL_BOOST = 0.15
19
+ INTEGRATION_THRESHOLD = 0.4
20
+ RECENTLY_ACCESSED_WINDOW = 30
21
+
22
+ MODALITIES = %i[verbal visual spatial semantic emotional procedural temporal].freeze
23
+
24
+ COHERENCE_LABELS = {
25
+ (0.0...0.3) => :fragmented,
26
+ (0.3...0.6) => :partial,
27
+ (0.6...0.85) => :coherent,
28
+ (0.85..1.0) => :vivid
29
+ }.freeze
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module Episodic
10
+ module Helpers
11
+ class Episode
12
+ include Constants
13
+
14
+ attr_reader :id, :bindings, :created_at, :last_accessed
15
+
16
+ def initialize
17
+ @id = SecureRandom.uuid
18
+ @bindings = {}
19
+ @created_at = Time.now
20
+ @last_accessed = Time.now
21
+ end
22
+
23
+ def add_binding(modality:, content:, source:, strength: DEFAULT_BINDING_STRENGTH)
24
+ return { added: false, reason: :capacity_full } if @bindings.size >= MAX_BINDINGS_PER_EPISODE
25
+
26
+ binding = EpisodicBinding.new(modality: modality, content: content, source: source, strength: strength)
27
+ @bindings[binding.id] = binding
28
+ { added: true, binding_id: binding.id }
29
+ end
30
+
31
+ def remove_binding(binding_id:)
32
+ removed = !@bindings.delete(binding_id).nil?
33
+ { removed: removed, binding_id: binding_id }
34
+ end
35
+
36
+ def attend
37
+ @last_accessed = Time.now
38
+ @bindings.each_value { |b| b.strengthen(ATTENTION_BOOST) }
39
+ end
40
+
41
+ def rehearse
42
+ @last_accessed = Time.now
43
+ @bindings.each_value { |b| b.strengthen(REHEARSAL_BOOST) }
44
+ end
45
+
46
+ def modalities_present
47
+ @bindings.values.map(&:modality).uniq
48
+ end
49
+
50
+ def coherence
51
+ integrated = @bindings.values.select(&:integrated?)
52
+ return 0.0 if integrated.empty?
53
+
54
+ integrated.sum(&:strength) / integrated.size
55
+ end
56
+
57
+ def coherence_label
58
+ score = coherence
59
+ COHERENCE_LABELS.each do |range, label|
60
+ return label if range.cover?(score)
61
+ end
62
+ :fragmented
63
+ end
64
+
65
+ def multimodal?
66
+ modalities_present.size >= 2
67
+ end
68
+
69
+ def expired?
70
+ age = Time.now - @created_at
71
+ age > EPISODE_TTL && !recently_accessed?
72
+ end
73
+
74
+ def decay_bindings
75
+ @bindings.each_value(&:decay)
76
+ @bindings.delete_if { |_, b| b.faded? }
77
+ end
78
+
79
+ def to_h
80
+ {
81
+ id: @id,
82
+ bindings: @bindings.transform_values(&:to_h),
83
+ created_at: @created_at,
84
+ last_accessed: @last_accessed,
85
+ modalities: modalities_present,
86
+ coherence: coherence,
87
+ coherence_label: coherence_label,
88
+ multimodal: multimodal?,
89
+ binding_count: @bindings.size
90
+ }
91
+ end
92
+
93
+ private
94
+
95
+ def recently_accessed?
96
+ (Time.now - @last_accessed) <= RECENTLY_ACCESSED_WINDOW
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module Episodic
10
+ module Helpers
11
+ class EpisodicBinding
12
+ include Constants
13
+
14
+ attr_reader :id, :modality, :content, :source, :strength
15
+
16
+ def initialize(modality:, content:, source:, strength: DEFAULT_BINDING_STRENGTH)
17
+ raise ArgumentError, "invalid modality: #{modality}" unless MODALITIES.include?(modality.to_sym)
18
+
19
+ @id = SecureRandom.uuid
20
+ @modality = modality.to_sym
21
+ @content = content
22
+ @source = source.to_sym
23
+ @strength = strength.to_f.clamp(0.0, 1.0)
24
+ end
25
+
26
+ def decay
27
+ @strength = [@strength - BINDING_DECAY, 0.0].max
28
+ end
29
+
30
+ def strengthen(amount)
31
+ @strength = [@strength + amount.to_f, 1.0].min
32
+ end
33
+
34
+ def integrated?
35
+ @strength >= INTEGRATION_THRESHOLD
36
+ end
37
+
38
+ def faded?
39
+ @strength <= BINDING_STRENGTH_FLOOR
40
+ end
41
+
42
+ def to_h
43
+ {
44
+ id: @id,
45
+ modality: @modality,
46
+ content: @content,
47
+ source: @source,
48
+ strength: @strength
49
+ }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Episodic
8
+ module Helpers
9
+ class EpisodicStore
10
+ include Constants
11
+
12
+ attr_reader :episodes, :history
13
+
14
+ def initialize
15
+ @episodes = {}
16
+ @history = []
17
+ end
18
+
19
+ def create_episode
20
+ evict_if_full
21
+ episode = Episode.new
22
+ @episodes[episode.id] = episode
23
+ record_history(:create, episode.id)
24
+ episode
25
+ end
26
+
27
+ def add_to_episode(episode_id:, modality:, content:, source:, strength: DEFAULT_BINDING_STRENGTH)
28
+ episode = @episodes[episode_id]
29
+ return { success: false, reason: :episode_not_found } unless episode
30
+
31
+ result = episode.add_binding(modality: modality, content: content, source: source, strength: strength)
32
+ record_history(:add_binding, episode_id) if result[:added]
33
+ result
34
+ end
35
+
36
+ def attend_episode(episode_id:)
37
+ episode = @episodes[episode_id]
38
+ return { success: false, reason: :episode_not_found } unless episode
39
+
40
+ episode.attend
41
+ record_history(:attend, episode_id)
42
+ { success: true, episode_id: episode_id }
43
+ end
44
+
45
+ def rehearse_episode(episode_id:)
46
+ episode = @episodes[episode_id]
47
+ return { success: false, reason: :episode_not_found } unless episode
48
+
49
+ episode.rehearse
50
+ record_history(:rehearse, episode_id)
51
+ { success: true, episode_id: episode_id }
52
+ end
53
+
54
+ def integrate(episode_id:)
55
+ episode = @episodes[episode_id]
56
+ return { integrated: false, reason: :episode_not_found } unless episode
57
+
58
+ coherence = episode.coherence
59
+ integrated = coherence >= INTEGRATION_THRESHOLD
60
+ {
61
+ integrated: integrated,
62
+ episode_id: episode_id,
63
+ coherence: coherence,
64
+ coherence_label: episode.coherence_label
65
+ }
66
+ end
67
+
68
+ def retrieve_by_modality(modality:)
69
+ mod = modality.to_sym
70
+ @episodes.values.select { |ep| ep.modalities_present.include?(mod) }
71
+ end
72
+
73
+ def retrieve_multimodal
74
+ @episodes.values.select(&:multimodal?)
75
+ end
76
+
77
+ def most_coherent(limit: 5)
78
+ @episodes.values
79
+ .sort_by { |ep| -ep.coherence }
80
+ .first(limit)
81
+ end
82
+
83
+ def tick
84
+ expired_count = 0
85
+ @episodes.delete_if do |_, ep|
86
+ ep.decay_bindings
87
+ if ep.expired?
88
+ expired_count += 1
89
+ true
90
+ else
91
+ false
92
+ end
93
+ end
94
+ { decayed: @episodes.size, expired: expired_count }
95
+ end
96
+
97
+ def count
98
+ @episodes.size
99
+ end
100
+
101
+ def to_h
102
+ {
103
+ episode_count: @episodes.size,
104
+ history_size: @history.size,
105
+ multimodal_count: retrieve_multimodal.size,
106
+ avg_coherence: average_coherence
107
+ }
108
+ end
109
+
110
+ private
111
+
112
+ def evict_if_full
113
+ return unless @episodes.size >= MAX_EPISODES
114
+
115
+ expired = @episodes.values.select(&:expired?)
116
+ if expired.any?
117
+ oldest = expired.min_by(&:created_at)
118
+ @episodes.delete(oldest.id)
119
+ else
120
+ lowest = @episodes.values.min_by(&:coherence)
121
+ @episodes.delete(lowest.id) if lowest
122
+ end
123
+ end
124
+
125
+ def record_history(event, episode_id)
126
+ @history << { event: event, episode_id: episode_id, at: Time.now }
127
+ @history.shift if @history.size > MAX_HISTORY
128
+ end
129
+
130
+ def average_coherence
131
+ return 0.0 if @episodes.empty?
132
+
133
+ @episodes.values.sum(&:coherence) / @episodes.size
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end