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,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Semantic
8
+ module Helpers
9
+ class Concept
10
+ attr_reader :id, :name, :domain, :properties, :relations, :created_at
11
+ attr_accessor :confidence, :access_count
12
+
13
+ def initialize(name:, domain: :general, confidence: nil, properties: {})
14
+ @id = SecureRandom.uuid
15
+ @name = name
16
+ @domain = domain
17
+ @confidence = (confidence || Constants::DEFAULT_CONFIDENCE).clamp(0.0, 1.0)
18
+ @properties = properties.dup
19
+ @relations = []
20
+ @access_count = 0
21
+ @created_at = Time.now.utc
22
+ end
23
+
24
+ def add_relation(type:, target_name:, confidence: nil)
25
+ return false unless Constants::RELATION_TYPES.include?(type)
26
+
27
+ existing = @relations.find { |r| r[:type] == type && r[:target] == target_name }
28
+ if existing
29
+ existing[:confidence] = [existing[:confidence] + Constants::ACCESS_BOOST, 1.0].min
30
+ return existing
31
+ end
32
+
33
+ trim_relations if @relations.size >= Constants::MAX_RELATIONS_PER_CONCEPT
34
+ rel = { type: type, target: target_name, confidence: (confidence || Constants::DEFAULT_CONFIDENCE).clamp(0.0, 1.0) }
35
+ @relations << rel
36
+ rel
37
+ end
38
+
39
+ def relations_of_type(type)
40
+ @relations.select { |r| r[:type] == type }
41
+ end
42
+
43
+ def related_concepts
44
+ @relations.map { |r| r[:target] }.uniq
45
+ end
46
+
47
+ def set_property(key, value)
48
+ @properties[key] = value
49
+ end
50
+
51
+ def get_property(key)
52
+ @properties[key]
53
+ end
54
+
55
+ def access
56
+ @access_count += 1
57
+ @confidence = [@confidence + Constants::ACCESS_BOOST, 1.0].min
58
+ end
59
+
60
+ def decay
61
+ @confidence = [@confidence - Constants::CONFIDENCE_DECAY, Constants::CONFIDENCE_FLOOR].max
62
+ @relations.each { |r| r[:confidence] = [r[:confidence] - Constants::CONFIDENCE_DECAY, Constants::CONFIDENCE_FLOOR].max }
63
+ @relations.reject! { |r| r[:confidence] <= Constants::CONFIDENCE_FLOOR }
64
+ end
65
+
66
+ def faded?
67
+ @confidence <= Constants::CONFIDENCE_FLOOR
68
+ end
69
+
70
+ def label
71
+ Constants::CONFIDENCE_LABELS.each { |range, lbl| return lbl if range.cover?(@confidence) }
72
+ :uncertain
73
+ end
74
+
75
+ def to_h
76
+ {
77
+ id: @id,
78
+ name: @name,
79
+ domain: @domain,
80
+ confidence: @confidence,
81
+ properties: @properties,
82
+ relations: @relations,
83
+ access_count: @access_count,
84
+ label: label,
85
+ created_at: @created_at
86
+ }
87
+ end
88
+
89
+ private
90
+
91
+ def trim_relations
92
+ @relations.sort_by! { |r| r[:confidence] }
93
+ @relations.shift
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Semantic
8
+ module Helpers
9
+ module Constants
10
+ MAX_CONCEPTS = 500
11
+ MAX_RELATIONS_PER_CONCEPT = 50
12
+ MAX_HISTORY = 200
13
+
14
+ # Relation types between concepts
15
+ RELATION_TYPES = %i[
16
+ is_a has_a part_of
17
+ property_of used_for
18
+ causes prevents
19
+ similar_to opposite_of
20
+ instance_of category_of
21
+ ].freeze
22
+
23
+ # Confidence thresholds
24
+ DEFAULT_CONFIDENCE = 0.5
25
+ CONFIDENCE_FLOOR = 0.05
26
+ CONFIDENCE_DECAY = 0.005
27
+ CONFIDENCE_ALPHA = 0.12
28
+
29
+ # Access frequency tracking
30
+ ACCESS_BOOST = 0.05
31
+ ACCESS_DECAY = 0.01
32
+
33
+ # Retrieval spreading activation
34
+ SPREAD_FACTOR = 0.6
35
+ MAX_SPREAD_HOPS = 3
36
+ SPREAD_THRESHOLD = 0.1
37
+
38
+ CONFIDENCE_LABELS = {
39
+ (0.8..) => :established,
40
+ (0.6...0.8) => :reliable,
41
+ (0.4...0.6) => :provisional,
42
+ (0.2...0.4) => :tentative,
43
+ (..0.2) => :uncertain
44
+ }.freeze
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Semantic
8
+ module Helpers
9
+ class KnowledgeStore
10
+ include Constants
11
+
12
+ attr_reader :concepts, :retrieval_history
13
+
14
+ def initialize
15
+ @concepts = {}
16
+ @retrieval_history = []
17
+ end
18
+
19
+ def store(name:, domain: :general, confidence: nil, properties: {})
20
+ if @concepts.key?(name)
21
+ existing = @concepts[name]
22
+ existing.access
23
+ properties.each { |k, v| existing.set_property(k, v) }
24
+ return existing
25
+ end
26
+
27
+ ensure_capacity
28
+ concept = Concept.new(name: name, domain: domain, confidence: confidence, properties: properties)
29
+ @concepts[name] = concept
30
+ concept
31
+ end
32
+
33
+ def relate(source:, target:, type:, confidence: nil)
34
+ store(name: source) unless @concepts.key?(source)
35
+ store(name: target) unless @concepts.key?(target)
36
+ @concepts[source].add_relation(type: type, target_name: target, confidence: confidence)
37
+ end
38
+
39
+ def retrieve(name:)
40
+ concept = @concepts[name]
41
+ return nil unless concept
42
+
43
+ concept.access
44
+ record_retrieval(name)
45
+ concept
46
+ end
47
+
48
+ def query_relations(name:, type: nil)
49
+ concept = @concepts[name]
50
+ return [] unless concept
51
+
52
+ concept.access
53
+ if type
54
+ concept.relations_of_type(type)
55
+ else
56
+ concept.relations
57
+ end
58
+ end
59
+
60
+ def check_is_a(concept_name, category_name)
61
+ rels = query_relations(name: concept_name, type: :is_a)
62
+ rels.any? { |r| r[:target] == category_name }
63
+ end
64
+
65
+ def instances_of(category_name)
66
+ @concepts.values.select do |c|
67
+ c.relations.any? { |r| r[:type] == :is_a && r[:target] == category_name }
68
+ end
69
+ end
70
+
71
+ def spreading_activation(seed:, hops: MAX_SPREAD_HOPS)
72
+ activated = {}
73
+ queue = [[seed, 1.0]]
74
+
75
+ hops.times do
76
+ next_queue = []
77
+ queue.each do |name, strength|
78
+ next if strength < SPREAD_THRESHOLD
79
+ next if activated.key?(name) && activated[name] >= strength
80
+
81
+ activated[name] = strength
82
+ concept = @concepts[name]
83
+ next unless concept
84
+
85
+ concept.related_concepts.each do |related|
86
+ next_strength = strength * SPREAD_FACTOR
87
+ next_queue << [related, next_strength] if next_strength >= SPREAD_THRESHOLD
88
+ end
89
+ end
90
+ queue = next_queue
91
+ end
92
+
93
+ activated.sort_by { |_, s| -s }.to_h
94
+ end
95
+
96
+ def concepts_in_domain(domain)
97
+ @concepts.values.select { |c| c.domain == domain }
98
+ end
99
+
100
+ def search(query)
101
+ @concepts.values.select { |c| c.name.to_s.include?(query.to_s) }
102
+ end
103
+
104
+ def decay_all
105
+ @concepts.each_value(&:decay)
106
+ @concepts.reject! { |_, c| c.faded? }
107
+ end
108
+
109
+ def concept_count
110
+ @concepts.size
111
+ end
112
+
113
+ def relation_count
114
+ @concepts.values.sum { |c| c.relations.size }
115
+ end
116
+
117
+ def to_h
118
+ {
119
+ concepts: concept_count,
120
+ relations: relation_count,
121
+ domains: @concepts.values.map(&:domain).uniq.size,
122
+ history_size: @retrieval_history.size
123
+ }
124
+ end
125
+
126
+ private
127
+
128
+ def ensure_capacity
129
+ return if @concepts.size < MAX_CONCEPTS
130
+
131
+ weakest = @concepts.min_by { |_, c| c.confidence }
132
+ @concepts.delete(weakest.first) if weakest
133
+ end
134
+
135
+ def record_retrieval(name)
136
+ @retrieval_history << { name: name, at: Time.now.utc }
137
+ @retrieval_history.shift while @retrieval_history.size > MAX_HISTORY
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Semantic
8
+ module Runners
9
+ module SemanticMemory
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def store_concept(name:, domain: :general, confidence: nil, properties: {}, **)
14
+ concept = knowledge_store.store(name: name, domain: domain, confidence: confidence, properties: properties)
15
+ Legion::Logging.debug "[semantic_memory] store: name=#{name} domain=#{domain} conf=#{concept.confidence.round(3)}"
16
+ { success: true, concept: concept.to_h }
17
+ end
18
+
19
+ def relate_concepts(source:, target:, type:, confidence: nil, **)
20
+ type_sym = type.to_sym
21
+ result = knowledge_store.relate(source: source, target: target, type: type_sym, confidence: confidence)
22
+ Legion::Logging.debug "[semantic_memory] relate: #{source} --#{type_sym}--> #{target}"
23
+ { success: true, source: source, target: target, type: type_sym, relation: result }
24
+ end
25
+
26
+ def retrieve_concept(name:, **)
27
+ concept = knowledge_store.retrieve(name: name)
28
+ if concept
29
+ Legion::Logging.debug "[semantic_memory] retrieve: name=#{name} conf=#{concept.confidence.round(3)}"
30
+ { success: true, found: true, concept: concept.to_h }
31
+ else
32
+ Legion::Logging.debug "[semantic_memory] retrieve: name=#{name} not_found"
33
+ { success: true, found: false, name: name }
34
+ end
35
+ end
36
+
37
+ def query_concept_relations(name:, type: nil, **)
38
+ relations = knowledge_store.query_relations(name: name, type: type&.to_sym)
39
+ Legion::Logging.debug "[semantic_memory] query_relations: name=#{name} type=#{type} count=#{relations.size}"
40
+ { success: true, name: name, relations: relations, count: relations.size }
41
+ end
42
+
43
+ def check_category(concept:, category:, **)
44
+ result = knowledge_store.check_is_a(concept, category)
45
+ Legion::Logging.debug "[semantic_memory] check_category: #{concept} is_a #{category} = #{result}"
46
+ { success: true, concept: concept, category: category, is_member: result }
47
+ end
48
+
49
+ def find_instances(category:, **)
50
+ instances = knowledge_store.instances_of(category)
51
+ Legion::Logging.debug "[semantic_memory] instances_of: #{category} count=#{instances.size}"
52
+ { success: true, category: category, instances: instances.map(&:name), count: instances.size }
53
+ end
54
+
55
+ def activate_spread(seed:, hops: nil, **)
56
+ hop_count = hops || Helpers::Constants::MAX_SPREAD_HOPS
57
+ activated = knowledge_store.spreading_activation(seed: seed, hops: hop_count)
58
+ Legion::Logging.debug "[semantic_memory] spread: seed=#{seed} hops=#{hop_count} activated=#{activated.size}"
59
+ { success: true, seed: seed, activated: activated, count: activated.size }
60
+ end
61
+
62
+ def concepts_in(domain:, **)
63
+ concepts = knowledge_store.concepts_in_domain(domain)
64
+ Legion::Logging.debug "[semantic_memory] domain_query: domain=#{domain} count=#{concepts.size}"
65
+ { success: true, domain: domain, concepts: concepts.map(&:name), count: concepts.size }
66
+ end
67
+
68
+ def update_semantic_memory(**)
69
+ knowledge_store.decay_all
70
+ Legion::Logging.debug "[semantic_memory] tick: concepts=#{knowledge_store.concept_count} " \
71
+ "relations=#{knowledge_store.relation_count}"
72
+ {
73
+ success: true,
74
+ concepts: knowledge_store.concept_count,
75
+ relations: knowledge_store.relation_count
76
+ }
77
+ end
78
+
79
+ def semantic_memory_stats(**)
80
+ { success: true, stats: knowledge_store.to_h }
81
+ end
82
+
83
+ private
84
+
85
+ def knowledge_store
86
+ @knowledge_store ||= Helpers::KnowledgeStore.new
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ 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 Semantic
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require 'legion/extensions/agentic/memory/semantic/version'
5
+ require 'legion/extensions/agentic/memory/semantic/helpers/constants'
6
+ require 'legion/extensions/agentic/memory/semantic/helpers/concept'
7
+ require 'legion/extensions/agentic/memory/semantic/helpers/knowledge_store'
8
+ require 'legion/extensions/agentic/memory/semantic/runners/semantic_memory'
9
+ require 'legion/extensions/agentic/memory/semantic/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Memory
15
+ module Semantic
16
+ end
17
+ end
18
+ end
19
+ end
20
+ 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 SemanticPriming
8
+ class Client
9
+ include Runners::SemanticPriming
10
+
11
+ def initialize(engine: nil)
12
+ @default_engine = engine || Helpers::PrimingNetwork.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module SemanticPriming
10
+ module Helpers
11
+ class Connection
12
+ include Constants
13
+
14
+ attr_reader :id, :source_id, :target_id, :weight, :traversal_count, :created_at
15
+
16
+ def initialize(source_id:, target_id:, weight: DEFAULT_WEIGHT)
17
+ @id = SecureRandom.uuid
18
+ @source_id = source_id
19
+ @target_id = target_id
20
+ @weight = weight.to_f.clamp(MIN_WEIGHT, 1.0).round(10)
21
+ @traversal_count = 0
22
+ @created_at = Time.now.utc
23
+ end
24
+
25
+ def strengthen!(amount: WEIGHT_GROWTH_RATE)
26
+ @weight = (@weight + amount).clamp(MIN_WEIGHT, 1.0).round(10)
27
+ self
28
+ end
29
+
30
+ def weaken!(amount: WEIGHT_DECAY_RATE)
31
+ @weight = (@weight - amount).clamp(MIN_WEIGHT, 1.0).round(10)
32
+ self
33
+ end
34
+
35
+ def traverse!
36
+ @traversal_count += 1
37
+ strengthen!(amount: WEIGHT_GROWTH_RATE)
38
+ self
39
+ end
40
+
41
+ def strong?
42
+ @weight >= 0.7
43
+ end
44
+
45
+ def weak?
46
+ @weight <= 0.2
47
+ end
48
+
49
+ def spreading_amount(source_activation)
50
+ (source_activation * @weight * SPREADING_FACTOR).round(10)
51
+ end
52
+
53
+ def weight_label
54
+ match = WEIGHT_LABELS.find { |range, _| range.cover?(@weight) }
55
+ match ? match.last : :very_weak
56
+ end
57
+
58
+ def to_h
59
+ {
60
+ id: @id,
61
+ source_id: @source_id,
62
+ target_id: @target_id,
63
+ weight: @weight,
64
+ weight_label: weight_label,
65
+ strong: strong?,
66
+ weak: weak?,
67
+ traversal_count: @traversal_count,
68
+ created_at: @created_at
69
+ }
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module SemanticPriming
8
+ module Helpers
9
+ module Constants
10
+ # Network limits
11
+ MAX_NODES = 500
12
+ MAX_CONNECTIONS = 2000
13
+
14
+ # Activation dynamics
15
+ DEFAULT_ACTIVATION = 0.0
16
+ RESTING_ACTIVATION = 0.0
17
+ MAX_ACTIVATION = 1.0
18
+ ACTIVATION_DECAY = 0.05
19
+ SPREADING_FACTOR = 0.6
20
+ PRIMING_BOOST = 0.3
21
+ ACTIVATION_THRESHOLD = 0.1
22
+
23
+ # Connection properties
24
+ DEFAULT_WEIGHT = 0.5
25
+ WEIGHT_GROWTH_RATE = 0.02
26
+ WEIGHT_DECAY_RATE = 0.01
27
+ MIN_WEIGHT = 0.05
28
+
29
+ # Spreading activation
30
+ MAX_SPREAD_DEPTH = 3
31
+ DEPTH_DECAY_FACTOR = 0.5
32
+
33
+ # Node types
34
+ NODE_TYPES = %i[concept category feature relation action emotion context].freeze
35
+
36
+ # Activation labels
37
+ ACTIVATION_LABELS = {
38
+ (0.8..) => :highly_primed,
39
+ (0.6...0.8) => :primed,
40
+ (0.4...0.6) => :partially_primed,
41
+ (0.2...0.4) => :weakly_primed,
42
+ (..0.2) => :unprimed
43
+ }.freeze
44
+
45
+ # Connection strength labels
46
+ WEIGHT_LABELS = {
47
+ (0.8..) => :very_strong,
48
+ (0.6...0.8) => :strong,
49
+ (0.4...0.6) => :moderate,
50
+ (0.2...0.4) => :weak,
51
+ (..0.2) => :very_weak
52
+ }.freeze
53
+
54
+ # Priming effect labels
55
+ PRIMING_LABELS = {
56
+ (0.8..) => :massive,
57
+ (0.6...0.8) => :strong,
58
+ (0.4...0.6) => :moderate,
59
+ (0.2...0.4) => :mild,
60
+ (..0.2) => :negligible
61
+ }.freeze
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end