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,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Echo
8
+ module Helpers
9
+ class EchoEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @echoes = {}
14
+ end
15
+
16
+ def create_echo(content:, echo_type: :thought, domain: :general, intensity: DEFAULT_INTENSITY)
17
+ prune_silent
18
+ echo = Echo.new(content: content, echo_type: echo_type, domain: domain, intensity: intensity)
19
+ @echoes[echo.id] = echo
20
+ echo
21
+ end
22
+
23
+ def reinforce_echo(echo_id:, amount: REINFORCEMENT)
24
+ echo = @echoes[echo_id]
25
+ return nil unless echo
26
+
27
+ echo.reinforce!(amount)
28
+ echo
29
+ end
30
+
31
+ def decay_all!
32
+ @echoes.each_value(&:decay!)
33
+ prune_silent
34
+ { echoes_decayed: @echoes.size, pruned: count_silent }
35
+ end
36
+
37
+ def active_echoes = @echoes.values.select(&:active?)
38
+ def priming_echoes = @echoes.values.select(&:priming?)
39
+ def interfering_echoes = @echoes.values.select(&:interfering?)
40
+
41
+ def echoes_by_type(echo_type:)
42
+ @echoes.values.select { |e| e.echo_type == echo_type.to_sym }
43
+ end
44
+
45
+ def echoes_by_domain(domain:)
46
+ @echoes.values.select { |e| e.domain == domain.to_sym }
47
+ end
48
+
49
+ def strongest_echoes(limit: 5) = @echoes.values.sort_by { |e| -e.intensity }.first(limit)
50
+ def faintest_echoes(limit: 5) = @echoes.values.select(&:active?).sort_by(&:intensity).first(limit)
51
+
52
+ def echo_chamber_score
53
+ return 0.0 if @echoes.empty?
54
+
55
+ domains = @echoes.values.map(&:domain).uniq
56
+ return 1.0 if domains.size <= 1
57
+
58
+ domain_concentration(domains)
59
+ end
60
+
61
+ def chamber_label = Constants.label_for(CHAMBER_LABELS, echo_chamber_score)
62
+
63
+ def priming_effect_for(domain:)
64
+ matching = echoes_by_domain(domain: domain).select(&:priming?)
65
+ return 0.0 if matching.empty?
66
+
67
+ matching.sum(&:intensity).clamp(0.0, 1.0).round(10)
68
+ end
69
+
70
+ def interference_level
71
+ interfering = interfering_echoes
72
+ return 0.0 if interfering.empty?
73
+
74
+ (interfering.sum(&:intensity) / @echoes.size).clamp(0.0, 1.0).round(10)
75
+ end
76
+
77
+ def average_intensity
78
+ return 0.0 if @echoes.empty?
79
+
80
+ (@echoes.values.sum(&:intensity) / @echoes.size).round(10)
81
+ end
82
+
83
+ def echo_report
84
+ {
85
+ total_echoes: @echoes.size,
86
+ active_count: active_echoes.size,
87
+ priming_count: priming_echoes.size,
88
+ interfering_count: interfering_echoes.size,
89
+ average_intensity: average_intensity,
90
+ echo_chamber_score: echo_chamber_score,
91
+ chamber_label: chamber_label,
92
+ interference_level: interference_level,
93
+ strongest: strongest_echoes(limit: 3).map(&:to_h)
94
+ }
95
+ end
96
+
97
+ def to_h
98
+ {
99
+ total_echoes: @echoes.size,
100
+ active: active_echoes.size,
101
+ average_intensity: average_intensity,
102
+ chamber_score: echo_chamber_score
103
+ }
104
+ end
105
+
106
+ private
107
+
108
+ def domain_concentration(domains)
109
+ intensities = domains.map { |d| @echoes.values.select { |e| e.domain == d }.sum(&:intensity) }
110
+ total = intensities.sum
111
+ return 0.0 if total.zero?
112
+
113
+ (intensities.max / total).round(10)
114
+ end
115
+
116
+ def count_silent
117
+ @echoes.values.count(&:silent?)
118
+ end
119
+
120
+ def prune_silent
121
+ return if @echoes.size < MAX_ECHOES
122
+
123
+ silent = @echoes.values.select(&:silent?)
124
+ silent.each { |e| @echoes.delete(e.id) }
125
+ return unless @echoes.size >= MAX_ECHOES
126
+
127
+ faintest = @echoes.values.min_by(&:intensity)
128
+ @echoes.delete(faintest.id) if faintest
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Echo
8
+ module Runners
9
+ module CognitiveEcho
10
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
11
+
12
+ def create_echo(content:, echo_type: :thought, domain: :general, intensity: 0.8, engine: nil, **)
13
+ eng = engine || default_engine
14
+ echo = eng.create_echo(content: content, echo_type: echo_type, domain: domain, intensity: intensity)
15
+ { success: true, echo: echo.to_h }
16
+ end
17
+
18
+ def reinforce_echo(echo_id:, amount: 0.15, engine: nil, **)
19
+ eng = engine || default_engine
20
+ echo = eng.reinforce_echo(echo_id: echo_id, amount: amount)
21
+ return { success: false, error: 'echo not found' } unless echo
22
+
23
+ { success: true, echo: echo.to_h }
24
+ end
25
+
26
+ def decay_all(engine: nil, **)
27
+ eng = engine || default_engine
28
+ result = eng.decay_all!
29
+ { success: true, **result }
30
+ end
31
+
32
+ def active_echoes(engine: nil, **)
33
+ eng = engine || default_engine
34
+ { success: true, echoes: eng.active_echoes.map(&:to_h), count: eng.active_echoes.size }
35
+ end
36
+
37
+ def priming_echoes(engine: nil, **)
38
+ eng = engine || default_engine
39
+ { success: true, echoes: eng.priming_echoes.map(&:to_h), count: eng.priming_echoes.size }
40
+ end
41
+
42
+ def interfering_echoes(engine: nil, **)
43
+ eng = engine || default_engine
44
+ { success: true, echoes: eng.interfering_echoes.map(&:to_h), count: eng.interfering_echoes.size }
45
+ end
46
+
47
+ def echoes_by_domain(domain:, engine: nil, **)
48
+ eng = engine || default_engine
49
+ echoes = eng.echoes_by_domain(domain: domain)
50
+ { success: true, echoes: echoes.map(&:to_h), count: echoes.size }
51
+ end
52
+
53
+ def strongest_echoes(limit: 5, engine: nil, **)
54
+ eng = engine || default_engine
55
+ { success: true, echoes: eng.strongest_echoes(limit: limit).map(&:to_h) }
56
+ end
57
+
58
+ def priming_effect(domain:, engine: nil, **)
59
+ eng = engine || default_engine
60
+ effect = eng.priming_effect_for(domain: domain)
61
+ label = Helpers::Constants.label_for(Helpers::Constants::EFFECT_LABELS, effect)
62
+ { success: true, domain: domain.to_sym, priming_effect: effect, effect_label: label }
63
+ end
64
+
65
+ def echo_status(engine: nil, **)
66
+ eng = engine || default_engine
67
+ { success: true, **eng.echo_report }
68
+ end
69
+
70
+ private
71
+
72
+ def default_engine
73
+ @default_engine ||= Helpers::EchoEngine.new
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ 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 Echo
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'echo/version'
4
+ require_relative 'echo/helpers/constants'
5
+ require_relative 'echo/helpers/echo'
6
+ require_relative 'echo/helpers/echo_engine'
7
+ require_relative 'echo/runners/cognitive_echo'
8
+ require_relative 'echo/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Memory
14
+ module Echo
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module EchoChamber
8
+ class Client
9
+ include Runners::CognitiveEchoChamber
10
+
11
+ def initialize(engine: nil)
12
+ @default_engine = engine || Helpers::ChamberEngine.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,134 @@
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 Chamber
12
+ include Constants
13
+
14
+ attr_reader :id, :label, :domain, :state, :wall_thickness,
15
+ :resonance_frequency, :created_at, :disruption_count
16
+
17
+ def initialize(label:, domain: :general, wall_thickness: DEFAULT_WALL_THICKNESS)
18
+ @id = SecureRandom.uuid
19
+ @label = label
20
+ @domain = domain.to_sym
21
+ @state = :forming
22
+ @wall_thickness = wall_thickness.to_f.clamp(0.0, 1.0).round(10)
23
+ @resonance_frequency = 0.0
24
+ @echoes = {}
25
+ @disruption_count = 0
26
+ @created_at = Time.now.utc
27
+ end
28
+
29
+ def add_echo(echo)
30
+ return false if @echoes.size >= MAX_ECHOES
31
+
32
+ @echoes[echo.id] = echo
33
+ recalculate_resonance
34
+ update_state
35
+ true
36
+ end
37
+
38
+ def remove_echo(echo_id)
39
+ removed = @echoes.delete(echo_id)
40
+ recalculate_resonance if removed
41
+ update_state
42
+ !removed.nil?
43
+ end
44
+
45
+ def amplify_all!(rate = AMPLIFICATION_RATE)
46
+ @echoes.each_value { |e| e.amplify!(rate) }
47
+ recalculate_resonance
48
+ update_state
49
+ { amplified: @echoes.size, resonance_frequency: @resonance_frequency }
50
+ end
51
+
52
+ def disrupt!(force)
53
+ force = force.to_f.clamp(0.0, 1.0)
54
+ return { success: false, reason: 'insufficient_force', force: force, wall: @wall_thickness } if force <= @wall_thickness
55
+
56
+ @disruption_count += 1
57
+ breakthrough = force - @wall_thickness
58
+ @wall_thickness = (@wall_thickness - (breakthrough * BREAKTHROUGH_BONUS)).clamp(0.0, 1.0).round(10)
59
+ @echoes.each_value { |e| e.dampen!(breakthrough.round(10)) }
60
+ @state = :disrupted
61
+ recalculate_resonance
62
+ { success: true, force: force, breakthrough: breakthrough.round(10), wall_remaining: @wall_thickness }
63
+ end
64
+
65
+ def sealed?
66
+ @wall_thickness >= SEALED_THRESHOLD
67
+ end
68
+
69
+ def porous?
70
+ @wall_thickness <= POROUS_THRESHOLD
71
+ end
72
+
73
+ def resonance_level
74
+ Constants.label_for(RESONANCE_LABELS, @resonance_frequency)
75
+ end
76
+
77
+ def echo_count
78
+ @echoes.size
79
+ end
80
+
81
+ def active_echoes
82
+ @echoes.values.reject(&:silent?)
83
+ end
84
+
85
+ def resonating_echoes
86
+ @echoes.values.select(&:resonate?)
87
+ end
88
+
89
+ def to_h
90
+ {
91
+ id: @id,
92
+ label: @label,
93
+ domain: @domain,
94
+ state: @state,
95
+ wall_thickness: @wall_thickness,
96
+ resonance_frequency: @resonance_frequency,
97
+ resonance_level: resonance_level,
98
+ sealed: sealed?,
99
+ porous: porous?,
100
+ echo_count: echo_count,
101
+ active_echo_count: active_echoes.size,
102
+ disruption_count: @disruption_count,
103
+ created_at: @created_at
104
+ }
105
+ end
106
+
107
+ private
108
+
109
+ def recalculate_resonance
110
+ return @resonance_frequency = 0.0 if @echoes.empty?
111
+
112
+ resonating = resonating_echoes
113
+ @resonance_frequency = (resonating.size.to_f / @echoes.size).round(10)
114
+ end
115
+
116
+ def update_state
117
+ return if @state == :disrupted || @state == :collapsed
118
+ return @state = :forming if @echoes.empty?
119
+
120
+ @state = if @resonance_frequency >= DISRUPTION_THRESHOLD
121
+ :saturated
122
+ elsif @resonance_frequency >= POROUS_THRESHOLD
123
+ :resonating
124
+ else
125
+ :forming
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module EchoChamber
8
+ module Helpers
9
+ class ChamberEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @echoes = {}
14
+ @chambers = {}
15
+ @disruption_history = []
16
+ end
17
+
18
+ def create_echo(content:, echo_type: :belief, domain: :general,
19
+ source_agent: nil, amplitude: DEFAULT_AMPLITUDE)
20
+ prune_echoes
21
+ echo = Echo.new(
22
+ content: content,
23
+ echo_type: echo_type,
24
+ domain: domain,
25
+ source_agent: source_agent,
26
+ amplitude: amplitude
27
+ )
28
+ @echoes[echo.id] = echo
29
+ echo
30
+ end
31
+
32
+ def create_chamber(label:, domain: :general, wall_thickness: DEFAULT_WALL_THICKNESS)
33
+ prune_chambers
34
+ chamber = Chamber.new(label: label, domain: domain, wall_thickness: wall_thickness)
35
+ @chambers[chamber.id] = chamber
36
+ chamber
37
+ end
38
+
39
+ def amplify_echo(echo_id:, rate: AMPLIFICATION_RATE)
40
+ echo = @echoes[echo_id]
41
+ return nil unless echo
42
+
43
+ echo.amplify!(rate)
44
+ echo
45
+ end
46
+
47
+ def disrupt_chamber(chamber_id:, force:)
48
+ chamber = @chambers[chamber_id]
49
+ return { success: false, error: 'chamber not found' } unless chamber
50
+
51
+ result = chamber.disrupt!(force)
52
+ record_disruption(chamber_id: chamber_id, force: force, result: result) if result[:success]
53
+ result
54
+ end
55
+
56
+ def decay_all!
57
+ echo_count = @echoes.size
58
+ @echoes.each_value { |e| e.dampen!(DECAY_RATE) }
59
+ prune_silent_echoes
60
+ { decayed: echo_count, remaining: @echoes.size, pruned: echo_count - @echoes.size }
61
+ end
62
+
63
+ def echoes_by_type(echo_type:)
64
+ @echoes.values.select { |e| e.echo_type == echo_type.to_sym }
65
+ end
66
+
67
+ def loudest_echoes(limit: 5)
68
+ @echoes.values.sort_by { |e| -e.amplitude }.first(limit)
69
+ end
70
+
71
+ def most_sealed_chambers(limit: 5)
72
+ @chambers.values.sort_by { |c| -c.wall_thickness }.first(limit)
73
+ end
74
+
75
+ def disruption_history
76
+ @disruption_history.dup
77
+ end
78
+
79
+ def add_echo_to_chamber(echo_id:, chamber_id:)
80
+ echo = @echoes[echo_id]
81
+ chamber = @chambers[chamber_id]
82
+ return { success: false, error: 'echo not found' } unless echo
83
+ return { success: false, error: 'chamber not found' } unless chamber
84
+
85
+ added = chamber.add_echo(echo)
86
+ { success: added, echo_id: echo_id, chamber_id: chamber_id }
87
+ end
88
+
89
+ def echo_report
90
+ {
91
+ total_echoes: @echoes.size,
92
+ active_echoes: active_echoes.size,
93
+ resonating_echoes: resonating_echoes.size,
94
+ total_chambers: @chambers.size,
95
+ sealed_chambers: @chambers.values.count(&:sealed?),
96
+ porous_chambers: @chambers.values.count(&:porous?),
97
+ disruption_count: @disruption_history.size,
98
+ loudest: loudest_echoes(limit: 3).map(&:to_h)
99
+ }
100
+ end
101
+
102
+ def active_echoes
103
+ @echoes.values.reject(&:silent?)
104
+ end
105
+
106
+ def resonating_echoes
107
+ @echoes.values.select(&:resonate?)
108
+ end
109
+
110
+ def chamber_by_id(chamber_id)
111
+ @chambers[chamber_id]
112
+ end
113
+
114
+ def echo_by_id(echo_id)
115
+ @echoes[echo_id]
116
+ end
117
+
118
+ private
119
+
120
+ def prune_echoes
121
+ return if @echoes.size < MAX_ECHOES
122
+
123
+ silent = @echoes.values.select(&:silent?)
124
+ silent.each { |e| @echoes.delete(e.id) }
125
+ return unless @echoes.size >= MAX_ECHOES
126
+
127
+ faintest = @echoes.values.min_by(&:amplitude)
128
+ @echoes.delete(faintest.id) if faintest
129
+ end
130
+
131
+ def prune_chambers
132
+ return if @chambers.size < MAX_CHAMBERS
133
+
134
+ collapsed = @chambers.values.select { |c| c.state == :collapsed }
135
+ collapsed.each { |c| @chambers.delete(c.id) }
136
+ end
137
+
138
+ def prune_silent_echoes
139
+ @echoes.select { |_, e| e.silent? }.each_key { |id| @echoes.delete(id) }
140
+ end
141
+
142
+ def record_disruption(chamber_id:, force:, result:)
143
+ @disruption_history << {
144
+ chamber_id: chamber_id,
145
+ force: force,
146
+ breakthrough: result[:breakthrough],
147
+ occurred_at: Time.now.utc
148
+ }
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module EchoChamber
8
+ module Helpers
9
+ module Constants
10
+ MAX_ECHOES = 500
11
+ MAX_CHAMBERS = 50
12
+ AMPLIFICATION_RATE = 0.1
13
+ DECAY_RATE = 0.02
14
+ DISRUPTION_THRESHOLD = 0.7
15
+ SEALED_THRESHOLD = 0.8
16
+ POROUS_THRESHOLD = 0.3
17
+ BREAKTHROUGH_BONUS = 0.15
18
+ SILENT_THRESHOLD = 0.05
19
+ DEFAULT_AMPLITUDE = 0.5
20
+ DEFAULT_WALL_THICKNESS = 0.5
21
+
22
+ ECHO_TYPES = %i[belief assumption bias hypothesis conviction].freeze
23
+
24
+ CHAMBER_STATES = %i[forming resonating saturated disrupted collapsed].freeze
25
+
26
+ RESONANCE_LABELS = {
27
+ (0.8..) => :thunderous,
28
+ (0.6...0.8) => :resonant,
29
+ (0.4...0.6) => :humming,
30
+ (0.2...0.4) => :fading,
31
+ (..0.2) => :silent
32
+ }.freeze
33
+
34
+ AMPLIFICATION_LABELS = {
35
+ (0.8..) => :deafening,
36
+ (0.6...0.8) => :loud,
37
+ (0.4...0.6) => :moderate,
38
+ (0.2...0.4) => :quiet,
39
+ (..0.2) => :muted
40
+ }.freeze
41
+
42
+ CHAMBER_STATE_LABELS = {
43
+ forming: 'Chamber is newly formed, echoes still accumulating',
44
+ resonating: 'Chamber is actively reinforcing beliefs',
45
+ saturated: 'Chamber has reached maximum self-reinforcement',
46
+ disrupted: 'External input has broken through the chamber walls',
47
+ collapsed: 'Chamber has lost coherence and dissolved'
48
+ }.freeze
49
+
50
+ def self.label_for(table, value)
51
+ match = table.find { |range, _| range.cover?(value) }
52
+ match&.last
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end