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,255 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sequel'
4
+ require 'sequel/extensions/migration'
5
+
6
+ # Minimal stub for Legion::Data::Local used in persistence specs.
7
+ # Does not require the full legion-data gem.
8
+ module Legion
9
+ module Data
10
+ module Local
11
+ class << self
12
+ attr_reader :connection
13
+
14
+ def setup_in_memory!
15
+ ::Sequel.extension :migration
16
+ @connection = ::Sequel.sqlite
17
+ @connected = true
18
+ run_memory_migrations
19
+ end
20
+
21
+ def connected?
22
+ @connected == true
23
+ end
24
+
25
+ def table_exists?(name)
26
+ @connection&.table_exists?(name) || false
27
+ end
28
+
29
+ def reset!
30
+ @connection&.disconnect
31
+ @connection = nil
32
+ @connected = false
33
+ end
34
+
35
+ private
36
+
37
+ def run_memory_migrations
38
+ migration_path = File.join(
39
+ __dir__,
40
+ '../lib/legion/extensions/memory/local_migrations'
41
+ )
42
+ ::Sequel::TimestampMigrator.new(@connection, migration_path).run
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ RSpec.describe 'lex-memory local SQLite persistence' do
50
+ let(:store) { Legion::Extensions::Agentic::Memory::Trace::Helpers::Store.new }
51
+ let(:trace_helper) { Legion::Extensions::Agentic::Memory::Trace::Helpers::Trace }
52
+
53
+ let(:semantic_trace) do
54
+ trace_helper.new_trace(
55
+ type: :semantic,
56
+ content_payload: { fact: 'SQLite is persistent' },
57
+ domain_tags: ['storage']
58
+ )
59
+ end
60
+
61
+ let(:episodic_trace) do
62
+ trace_helper.new_trace(
63
+ type: :episodic,
64
+ content_payload: { event: 'first boot' },
65
+ domain_tags: ['boot']
66
+ )
67
+ end
68
+
69
+ before(:all) do
70
+ Legion::Data::Local.setup_in_memory!
71
+ end
72
+
73
+ after(:all) do
74
+ Legion::Data::Local.reset!
75
+ end
76
+
77
+ before(:each) do
78
+ # Clear tables between examples so tests are isolated
79
+ db = Legion::Data::Local.connection
80
+ db[:memory_associations].delete
81
+ db[:memory_traces].delete
82
+ Legion::Extensions::Agentic::Memory::Trace.reset_store!
83
+ end
84
+
85
+ describe '#save_to_local' do
86
+ it 'persists traces to the SQLite database' do
87
+ store.store(semantic_trace)
88
+ store.store(episodic_trace)
89
+ store.save_to_local
90
+
91
+ db = Legion::Data::Local.connection
92
+ expect(db[:memory_traces].count).to eq(2)
93
+ end
94
+
95
+ it 'persists trace fields accurately' do
96
+ store.store(semantic_trace)
97
+ store.save_to_local
98
+
99
+ db = Legion::Data::Local.connection
100
+ row = db[:memory_traces].where(trace_id: semantic_trace[:trace_id]).first
101
+ expect(row).not_to be_nil
102
+ expect(row[:trace_type]).to eq('semantic')
103
+ expect(row[:strength]).to eq(semantic_trace[:strength])
104
+ end
105
+
106
+ it 'persists associations to the SQLite database' do
107
+ store.store(semantic_trace)
108
+ store.store(episodic_trace)
109
+
110
+ threshold = Legion::Extensions::Agentic::Memory::Trace::Helpers::Trace::COACTIVATION_THRESHOLD
111
+ threshold.times { store.record_coactivation(semantic_trace[:trace_id], episodic_trace[:trace_id]) }
112
+ store.save_to_local
113
+
114
+ db = Legion::Data::Local.connection
115
+ expect(db[:memory_associations].count).to be > 0
116
+ end
117
+
118
+ it 'updates an existing trace row on subsequent saves' do
119
+ store.store(semantic_trace)
120
+ store.save_to_local
121
+
122
+ # Mutate strength directly and save again
123
+ store.traces[semantic_trace[:trace_id]][:strength] = 0.99
124
+ store.save_to_local
125
+
126
+ db = Legion::Data::Local.connection
127
+ row = db[:memory_traces].where(trace_id: semantic_trace[:trace_id]).first
128
+ expect(row[:strength]).to eq(0.99)
129
+ expect(db[:memory_traces].count).to eq(1)
130
+ end
131
+
132
+ it 'removes pruned traces from the database' do
133
+ store.store(semantic_trace)
134
+ store.store(episodic_trace)
135
+ store.save_to_local
136
+
137
+ # Prune semantic_trace from memory (simulate decay below threshold)
138
+ store.delete(semantic_trace[:trace_id])
139
+ store.save_to_local
140
+
141
+ db = Legion::Data::Local.connection
142
+ expect(db[:memory_traces].count).to eq(1)
143
+ expect(db[:memory_traces].first[:trace_id]).to eq(episodic_trace[:trace_id])
144
+ end
145
+
146
+ it 'replaces association rows on each save' do
147
+ store.store(semantic_trace)
148
+ store.store(episodic_trace)
149
+
150
+ threshold = Legion::Extensions::Agentic::Memory::Trace::Helpers::Trace::COACTIVATION_THRESHOLD
151
+ threshold.times { store.record_coactivation(semantic_trace[:trace_id], episodic_trace[:trace_id]) }
152
+ store.save_to_local
153
+
154
+ first_count = Legion::Data::Local.connection[:memory_associations].count
155
+
156
+ store.save_to_local
157
+
158
+ second_count = Legion::Data::Local.connection[:memory_associations].count
159
+ expect(second_count).to eq(first_count)
160
+ end
161
+
162
+ it 'is a no-op when Local is not connected' do
163
+ allow(Legion::Data::Local).to receive(:connected?).and_return(false)
164
+ expect { store.save_to_local }.not_to raise_error
165
+ end
166
+ end
167
+
168
+ describe '#load_from_local' do
169
+ it 'restores traces from the database into a fresh store' do
170
+ store.store(semantic_trace)
171
+ store.store(episodic_trace)
172
+ store.save_to_local
173
+
174
+ fresh = Legion::Extensions::Agentic::Memory::Trace::Helpers::Store.new
175
+ expect(fresh.count).to eq(2)
176
+ expect(fresh.get(semantic_trace[:trace_id])).not_to be_nil
177
+ expect(fresh.get(episodic_trace[:trace_id])).not_to be_nil
178
+ end
179
+
180
+ it 'restores associations from the database into a fresh store' do
181
+ store.store(semantic_trace)
182
+ store.store(episodic_trace)
183
+
184
+ threshold = Legion::Extensions::Agentic::Memory::Trace::Helpers::Trace::COACTIVATION_THRESHOLD
185
+ threshold.times { store.record_coactivation(semantic_trace[:trace_id], episodic_trace[:trace_id]) }
186
+ store.save_to_local
187
+
188
+ fresh = Legion::Extensions::Agentic::Memory::Trace::Helpers::Store.new
189
+ expect(fresh.associations[semantic_trace[:trace_id]]).not_to be_empty
190
+ end
191
+
192
+ it 'is a no-op when Local is not connected' do
193
+ allow(Legion::Data::Local).to receive(:connected?).and_return(false)
194
+ expect { store.load_from_local }.not_to raise_error
195
+ end
196
+ end
197
+
198
+ describe 'round-trip: save then load' do
199
+ it 'produces identical trace data in a fresh store' do
200
+ store.store(semantic_trace)
201
+ store.store(episodic_trace)
202
+ store.save_to_local
203
+
204
+ fresh = Legion::Extensions::Agentic::Memory::Trace::Helpers::Store.new
205
+ restored = fresh.get(semantic_trace[:trace_id])
206
+
207
+ expect(restored[:trace_id]).to eq(semantic_trace[:trace_id])
208
+ expect(restored[:trace_type]).to eq(:semantic)
209
+ expect(restored[:strength]).to eq(semantic_trace[:strength])
210
+ expect(restored[:domain_tags]).to eq(semantic_trace[:domain_tags])
211
+ expect(restored[:origin]).to eq(semantic_trace[:origin])
212
+ end
213
+
214
+ it 'restores content hash with symbol keys' do
215
+ store.store(semantic_trace)
216
+ store.save_to_local
217
+
218
+ fresh = Legion::Extensions::Agentic::Memory::Trace::Helpers::Store.new
219
+ restored = fresh.get(semantic_trace[:trace_id])
220
+ expect(restored[:content]).to be_a(Hash)
221
+ expect(restored[:content][:fact]).to eq('SQLite is persistent')
222
+ end
223
+
224
+ it 'restores domain_tags as an array' do
225
+ store.store(semantic_trace)
226
+ store.save_to_local
227
+
228
+ fresh = Legion::Extensions::Agentic::Memory::Trace::Helpers::Store.new
229
+ restored = fresh.get(semantic_trace[:trace_id])
230
+ expect(restored[:domain_tags]).to eq(['storage'])
231
+ end
232
+
233
+ it 'preserves storage_tier as a symbol' do
234
+ store.store(semantic_trace)
235
+ store.save_to_local
236
+
237
+ fresh = Legion::Extensions::Agentic::Memory::Trace::Helpers::Store.new
238
+ restored = fresh.get(semantic_trace[:trace_id])
239
+ expect(restored[:storage_tier]).to eq(:hot)
240
+ end
241
+
242
+ it 'preserves association coactivation counts' do
243
+ store.store(semantic_trace)
244
+ store.store(episodic_trace)
245
+
246
+ threshold = Legion::Extensions::Agentic::Memory::Trace::Helpers::Trace::COACTIVATION_THRESHOLD
247
+ threshold.times { store.record_coactivation(semantic_trace[:trace_id], episodic_trace[:trace_id]) }
248
+ store.save_to_local
249
+
250
+ fresh = Legion::Extensions::Agentic::Memory::Trace::Helpers::Store.new
251
+ count = fresh.associations[semantic_trace[:trace_id]][episodic_trace[:trace_id]]
252
+ expect(count).to eq(threshold)
253
+ end
254
+ end
255
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Trace do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::Agentic::Memory::Trace::VERSION).not_to be_nil
6
+ end
7
+
8
+ it 'has a version that is a string' do
9
+ expect(Legion::Extensions::Agentic::Memory::Trace::VERSION).to be_a(String)
10
+ end
11
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'legion/extensions/agentic/memory/trace/persistent_store'
5
+
6
+ RSpec.describe Legion::Extensions::Agentic::Memory::Trace::PersistentStore do
7
+ let(:store) { described_class.new(agent_id: 'test-agent') }
8
+
9
+ describe '#read' do
10
+ it 'returns empty when db unavailable' do
11
+ allow(store).to receive(:db_ready?).and_return(false)
12
+ expect(store.read).to eq([])
13
+ end
14
+ end
15
+
16
+ describe '#write' do
17
+ it 'returns nil when db unavailable' do
18
+ allow(store).to receive(:db_ready?).and_return(false)
19
+ expect(store.write(trace_type: :episodic, content: 'test')).to be_nil
20
+ end
21
+ end
22
+
23
+ describe '#count' do
24
+ it 'returns 0 when db unavailable' do
25
+ allow(store).to receive(:db_ready?).and_return(false)
26
+ expect(store.count).to eq(0)
27
+ end
28
+ end
29
+
30
+ describe '#total_bytes' do
31
+ it 'returns 0 when db unavailable' do
32
+ allow(store).to receive(:db_ready?).and_return(false)
33
+ expect(store.total_bytes).to eq(0)
34
+ end
35
+ end
36
+
37
+ describe '#delete_lowest_confidence' do
38
+ it 'returns 0 when db unavailable' do
39
+ allow(store).to receive(:db_ready?).and_return(false)
40
+ expect(store.delete_lowest_confidence).to eq(0)
41
+ end
42
+ end
43
+
44
+ describe '#delete_least_recently_used' do
45
+ it 'returns 0 when db unavailable' do
46
+ allow(store).to receive(:db_ready?).and_return(false)
47
+ expect(store.delete_least_recently_used).to eq(0)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'legion/extensions/agentic/memory/trace/quota'
5
+
6
+ RSpec.describe Legion::Extensions::Agentic::Memory::Trace::Quota do
7
+ describe '.new' do
8
+ it 'uses defaults' do
9
+ quota = described_class.new
10
+ expect(quota.max_traces).to eq(10_000)
11
+ expect(quota.max_bytes).to eq(52_428_800)
12
+ expect(quota.eviction).to eq(:lru)
13
+ end
14
+
15
+ it 'accepts overrides' do
16
+ quota = described_class.new(max_traces: 500, eviction: :lowest_confidence)
17
+ expect(quota.max_traces).to eq(500)
18
+ expect(quota.eviction).to eq(:lowest_confidence)
19
+ end
20
+ end
21
+
22
+ describe '#within_limits?' do
23
+ let(:quota) { described_class.new(max_traces: 100, max_bytes: 1024) }
24
+ let(:store) { double('store') }
25
+
26
+ it 'returns true when under limits' do
27
+ allow(store).to receive(:count).and_return(50)
28
+ allow(store).to receive(:total_bytes).and_return(512)
29
+ expect(quota.within_limits?(store)).to be true
30
+ end
31
+
32
+ it 'returns false when over trace limit' do
33
+ allow(store).to receive(:count).and_return(200)
34
+ allow(store).to receive(:total_bytes).and_return(512)
35
+ expect(quota.within_limits?(store)).to be false
36
+ end
37
+
38
+ it 'returns false when over byte limit' do
39
+ allow(store).to receive(:count).and_return(50)
40
+ allow(store).to receive(:total_bytes).and_return(2048)
41
+ expect(quota.within_limits?(store)).to be false
42
+ end
43
+ end
44
+
45
+ describe '#enforce!' do
46
+ let(:quota) { described_class.new(max_traces: 10, max_bytes: 1_048_576) }
47
+ let(:store) { double('store') }
48
+
49
+ it 'evicts when over trace limit' do
50
+ allow(store).to receive(:count).and_return(15)
51
+ allow(store).to receive(:total_bytes).and_return(100)
52
+ expect(store).to receive(:delete_least_recently_used).with(count: 5)
53
+ quota.enforce!(store)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/trace/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Memory::Trace::Runners::Consolidation do
6
+ let(:client) { Legion::Extensions::Agentic::Memory::Trace::Client.new }
7
+
8
+ describe '#reinforce' do
9
+ it 'increases trace strength' do
10
+ stored = client.store_trace(type: :semantic, content_payload: {})
11
+ result = client.reinforce(trace_id: stored[:trace_id])
12
+
13
+ expect(result[:reinforced]).to be true
14
+ expect(result[:new_strength]).to eq(0.6) # 0.5 + 0.1
15
+ end
16
+
17
+ it 'applies imprint multiplier' do
18
+ stored = client.store_trace(type: :semantic, content_payload: {})
19
+ result = client.reinforce(trace_id: stored[:trace_id], imprint_active: true)
20
+
21
+ expect(result[:new_strength]).to eq(0.8) # 0.5 + 0.1 * 3.0
22
+ end
23
+
24
+ it 'does not reinforce firmware traces' do
25
+ stored = client.store_trace(type: :firmware, content_payload: { directive_text: 'protect' })
26
+ result = client.reinforce(trace_id: stored[:trace_id])
27
+
28
+ expect(result[:reinforced]).to be false
29
+ expect(result[:reason]).to eq(:firmware)
30
+ end
31
+
32
+ it 'returns found: false for missing traces' do
33
+ result = client.reinforce(trace_id: 'nonexistent')
34
+ expect(result[:found]).to be false
35
+ end
36
+
37
+ it 'clamps at 1.0' do
38
+ stored = client.store_trace(type: :semantic, content_payload: {})
39
+ # Reinforce multiple times
40
+ 10.times { client.reinforce(trace_id: stored[:trace_id]) }
41
+ trace = client.get_trace(trace_id: stored[:trace_id])
42
+ expect(trace[:trace][:strength]).to eq(1.0)
43
+ end
44
+
45
+ it 'increments reinforcement_count' do
46
+ stored = client.store_trace(type: :semantic, content_payload: {})
47
+ 3.times { client.reinforce(trace_id: stored[:trace_id]) }
48
+ trace = client.get_trace(trace_id: stored[:trace_id])
49
+ expect(trace[:trace][:reinforcement_count]).to eq(3)
50
+ end
51
+ end
52
+
53
+ describe '#decay_cycle' do
54
+ it 'decays non-firmware traces' do
55
+ client.store_trace(type: :semantic, content_payload: {})
56
+ client.store_trace(type: :firmware, content_payload: { directive_text: 'protect' })
57
+
58
+ result = client.decay_cycle(tick_count: 100)
59
+ expect(result[:decayed]).to be >= 1
60
+ end
61
+
62
+ it 'prunes traces below threshold' do
63
+ stored = client.store_trace(type: :sensory, content_payload: {})
64
+ trace = client.get_trace(trace_id: stored[:trace_id])
65
+ trace[:trace][:strength] = 0.005
66
+ trace[:trace][:peak_strength] = 0.005
67
+
68
+ result = client.decay_cycle(tick_count: 100_000)
69
+ expect(result[:pruned]).to be >= 0
70
+ end
71
+ end
72
+
73
+ describe '#migrate_tier' do
74
+ it 'migrates traces to correct tier' do
75
+ stored = client.store_trace(type: :semantic, content_payload: {})
76
+ trace = client.get_trace(trace_id: stored[:trace_id])
77
+ trace[:trace][:last_reinforced] = Time.now.utc - (50 * 86_400)
78
+
79
+ result = client.migrate_tier
80
+ expect(result[:migrated]).to be >= 1
81
+ end
82
+ end
83
+
84
+ describe '#hebbian_link' do
85
+ it 'records coactivation' do
86
+ a = client.store_trace(type: :semantic, content_payload: { fact: 'a' })
87
+ b = client.store_trace(type: :semantic, content_payload: { fact: 'b' })
88
+
89
+ result = client.hebbian_link(trace_id_a: a[:trace_id], trace_id_b: b[:trace_id])
90
+ expect(result[:linked]).to be true
91
+ end
92
+ end
93
+
94
+ describe '#erase_by_type' do
95
+ it 'erases all traces of specified type' do
96
+ client.store_trace(type: :sensory, content_payload: {})
97
+ client.store_trace(type: :sensory, content_payload: {})
98
+ client.store_trace(type: :semantic, content_payload: {})
99
+
100
+ result = client.erase_by_type(type: :sensory)
101
+ expect(result[:erased]).to eq(2)
102
+
103
+ remaining = client.retrieve_by_type(type: :sensory)
104
+ expect(remaining[:count]).to eq(0)
105
+ end
106
+ end
107
+
108
+ describe '#erase_by_agent' do
109
+ it 'erases all traces for a partition' do
110
+ client.store_trace(type: :semantic, content_payload: {}, partition_id: 'agent-1')
111
+ client.store_trace(type: :semantic, content_payload: {}, partition_id: 'agent-1')
112
+ client.store_trace(type: :semantic, content_payload: {}, partition_id: 'agent-2')
113
+
114
+ result = client.erase_by_agent(partition_id: 'agent-1')
115
+ expect(result[:erased]).to eq(2)
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/trace/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Memory::Trace::Runners::Traces do
6
+ before(:each) { Legion::Extensions::Agentic::Memory::Trace.reset_store! }
7
+
8
+ let(:client) { Legion::Extensions::Agentic::Memory::Trace::Client.new }
9
+
10
+ describe '#store_trace' do
11
+ it 'stores a semantic trace and returns id' do
12
+ result = client.store_trace(type: :semantic, content_payload: { fact: 'test' })
13
+ expect(result[:trace_id]).to match(/\A[0-9a-f-]{36}\z/)
14
+ expect(result[:trace_type]).to eq(:semantic)
15
+ expect(result[:strength]).to eq(0.5)
16
+ end
17
+
18
+ it 'stores all 7 trace types' do
19
+ Legion::Extensions::Agentic::Memory::Trace::Helpers::Trace::TRACE_TYPES.each do |type|
20
+ result = client.store_trace(type: type, content_payload: {})
21
+ expect(result[:trace_type]).to eq(type)
22
+ end
23
+ end
24
+ end
25
+
26
+ describe '#get_trace' do
27
+ it 'retrieves a stored trace' do
28
+ stored = client.store_trace(type: :episodic, content_payload: { event: 'meeting' })
29
+ result = client.get_trace(trace_id: stored[:trace_id])
30
+ expect(result[:found]).to be true
31
+ expect(result[:trace][:content_payload]).to eq({ event: 'meeting' })
32
+ end
33
+
34
+ it 'returns found: false for missing traces' do
35
+ result = client.get_trace(trace_id: 'nonexistent')
36
+ expect(result[:found]).to be false
37
+ end
38
+ end
39
+
40
+ describe '#retrieve_by_type' do
41
+ it 'returns traces of specified type' do
42
+ client.store_trace(type: :semantic, content_payload: { fact: 'a' })
43
+ client.store_trace(type: :semantic, content_payload: { fact: 'b' })
44
+ client.store_trace(type: :episodic, content_payload: { event: 'c' })
45
+
46
+ result = client.retrieve_by_type(type: :semantic)
47
+ expect(result[:count]).to eq(2)
48
+ end
49
+ end
50
+
51
+ describe '#retrieve_by_domain' do
52
+ it 'returns traces matching domain tag' do
53
+ client.store_trace(type: :semantic, content_payload: {}, domain_tags: ['work'])
54
+ client.store_trace(type: :semantic, content_payload: {}, domain_tags: ['personal'])
55
+
56
+ result = client.retrieve_by_domain(domain_tag: 'work')
57
+ expect(result[:count]).to eq(1)
58
+ end
59
+ end
60
+
61
+ describe '#delete_trace' do
62
+ it 'removes a trace' do
63
+ stored = client.store_trace(type: :semantic, content_payload: {})
64
+ client.delete_trace(trace_id: stored[:trace_id])
65
+ result = client.get_trace(trace_id: stored[:trace_id])
66
+ expect(result[:found]).to be false
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/transfer/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Memory::Transfer::Client do
6
+ let(:client) { described_class.new }
7
+
8
+ it 'responds to all runner methods' do
9
+ expect(client).to respond_to(:learn_domain)
10
+ expect(client).to respond_to(:attempt_transfer)
11
+ expect(client).to respond_to(:set_similarity)
12
+ expect(client).to respond_to(:transfer_effectiveness)
13
+ expect(client).to respond_to(:most_transferable)
14
+ expect(client).to respond_to(:interference_risks)
15
+ expect(client).to respond_to(:transfer_report)
16
+ expect(client).to respond_to(:get_domain)
17
+ end
18
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Transfer::Helpers::Constants do
4
+ subject(:mod) { described_class }
5
+
6
+ it 'defines MAX_DOMAINS as 200' do
7
+ expect(mod::MAX_DOMAINS).to eq(200)
8
+ end
9
+
10
+ it 'defines POSITIVE_TRANSFER_THRESHOLD as 0.6' do
11
+ expect(mod::POSITIVE_TRANSFER_THRESHOLD).to eq(0.6)
12
+ end
13
+
14
+ it 'defines NEGATIVE_TRANSFER_THRESHOLD as 0.3' do
15
+ expect(mod::NEGATIVE_TRANSFER_THRESHOLD).to eq(0.3)
16
+ end
17
+
18
+ it 'defines TRANSFER_BOOST as 0.15' do
19
+ expect(mod::TRANSFER_BOOST).to eq(0.15)
20
+ end
21
+
22
+ it 'defines INTERFERENCE_PENALTY as 0.1' do
23
+ expect(mod::INTERFERENCE_PENALTY).to eq(0.1)
24
+ end
25
+
26
+ it 'defines all four TRANSFER_LABELS' do
27
+ expect(mod::TRANSFER_LABELS.keys).to contain_exactly(:positive, :neutral, :negative, :interference)
28
+ end
29
+
30
+ it 'defines all three DISTANCE_LABELS' do
31
+ expect(mod::DISTANCE_LABELS.keys).to contain_exactly(:near, :moderate, :far)
32
+ end
33
+
34
+ it 'freezes TRANSFER_LABELS' do
35
+ expect(mod::TRANSFER_LABELS).to be_frozen
36
+ end
37
+
38
+ it 'freezes DISTANCE_LABELS' do
39
+ expect(mod::DISTANCE_LABELS).to be_frozen
40
+ end
41
+ end