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,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/semantic_satiation/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Memory::SemanticSatiation::Runners::SemanticSatiation do
6
+ let(:client) { Legion::Extensions::Agentic::Memory::SemanticSatiation::Client.new }
7
+
8
+ describe '#expose' do
9
+ it 'returns a hash with fluency key' do
10
+ result = client.expose(label: 'banana')
11
+ expect(result[:fluency]).to be_a(Float)
12
+ end
13
+
14
+ it 'reduces fluency on repeated exposure' do
15
+ client.expose(label: 'banana')
16
+ result = client.expose(label: 'banana')
17
+ expect(result[:fluency]).to be < 1.0
18
+ end
19
+
20
+ it 'uses default domain :general' do
21
+ result = client.expose(label: 'banana')
22
+ expect(result[:domain]).to eq(:general)
23
+ end
24
+
25
+ it 'accepts explicit domain' do
26
+ result = client.expose(label: 'apple', domain: :food)
27
+ expect(result[:domain]).to eq(:food)
28
+ end
29
+
30
+ it 'includes satiated flag' do
31
+ result = client.expose(label: 'fresh')
32
+ expect(result).to have_key(:satiated)
33
+ end
34
+ end
35
+
36
+ describe '#register' do
37
+ it 'returns a hash with id key' do
38
+ result = client.register(label: 'oak')
39
+ expect(result[:id]).to match(/\A[0-9a-f-]{36}\z/)
40
+ end
41
+
42
+ it 'includes label in result' do
43
+ result = client.register(label: 'maple')
44
+ expect(result[:label]).to eq('maple')
45
+ end
46
+
47
+ it 'assigns domain' do
48
+ result = client.register(label: 'pine', domain: :nature)
49
+ expect(result[:domain]).to eq(:nature)
50
+ end
51
+ end
52
+
53
+ describe '#expose_by_id' do
54
+ it 'exposes a registered concept by id' do
55
+ registered = client.register(label: 'cedar')
56
+ result = client.expose_by_id(concept_id: registered[:id])
57
+ expect(result[:fluency]).to be < 1.0
58
+ end
59
+
60
+ it 'returns error for unknown concept_id' do
61
+ result = client.expose_by_id(concept_id: 'no-such-id')
62
+ expect(result[:error]).to eq(:not_found)
63
+ end
64
+ end
65
+
66
+ describe '#recover' do
67
+ it 'returns recovered count' do
68
+ client.expose(label: 'worn')
69
+ result = client.recover
70
+ expect(result[:recovered]).to eq(1)
71
+ end
72
+
73
+ it 'accepts custom amount kwarg without error' do
74
+ client.expose(label: 'test')
75
+ expect { client.recover(amount: 0.1) }.not_to raise_error
76
+ end
77
+ end
78
+
79
+ describe '#satiation_status' do
80
+ it 'returns concept_count' do
81
+ client.expose(label: 'word1')
82
+ client.expose(label: 'word2')
83
+ result = client.satiation_status
84
+ expect(result[:concept_count]).to eq(2)
85
+ end
86
+
87
+ it 'includes satiated_count' do
88
+ result = client.satiation_status
89
+ expect(result).to have_key(:satiated_count)
90
+ end
91
+
92
+ it 'includes novelty_report' do
93
+ result = client.satiation_status
94
+ expect(result).to have_key(:novelty_report)
95
+ end
96
+ end
97
+
98
+ describe '#domain_satiation' do
99
+ it 'returns avg_fluency for domain' do
100
+ client.expose(label: 'cat', domain: :animals)
101
+ result = client.domain_satiation(domain: :animals)
102
+ expect(result[:avg_fluency]).to be_a(Float)
103
+ end
104
+
105
+ it 'includes domain in result' do
106
+ result = client.domain_satiation(domain: :animals)
107
+ expect(result[:domain]).to eq(:animals)
108
+ end
109
+
110
+ it 'returns 0.0 for unknown domain' do
111
+ result = client.domain_satiation(domain: :unknown)
112
+ expect(result[:avg_fluency]).to eq(0.0)
113
+ end
114
+ end
115
+
116
+ describe '#most_exposed' do
117
+ it 'returns concepts array' do
118
+ client.expose(label: 'a')
119
+ result = client.most_exposed
120
+ expect(result[:concepts]).to be_an(Array)
121
+ end
122
+
123
+ it 'returns count' do
124
+ client.expose(label: 'b')
125
+ result = client.most_exposed
126
+ expect(result[:count]).to eq(1)
127
+ end
128
+
129
+ it 'respects limit parameter' do
130
+ 5.times { |i| client.expose(label: "w#{i}") }
131
+ result = client.most_exposed(limit: 3)
132
+ expect(result[:concepts].size).to eq(3)
133
+ end
134
+ end
135
+
136
+ describe '#freshest_concepts' do
137
+ it 'returns concepts array' do
138
+ client.register(label: 'fresh')
139
+ result = client.freshest_concepts
140
+ expect(result[:concepts]).to be_an(Array)
141
+ end
142
+
143
+ it 'respects limit parameter' do
144
+ 5.times { |i| client.register(label: "f#{i}") }
145
+ result = client.freshest_concepts(limit: 2)
146
+ expect(result[:concepts].size).to eq(2)
147
+ end
148
+ end
149
+
150
+ describe '#novelty_report' do
151
+ it 'returns distribution hash' do
152
+ client.register(label: 'new_concept')
153
+ result = client.novelty_report
154
+ expect(result[:distribution]).to be_a(Hash)
155
+ end
156
+
157
+ it 'returns total count' do
158
+ client.register(label: 'another')
159
+ result = client.novelty_report
160
+ expect(result[:total]).to eq(1)
161
+ end
162
+ end
163
+
164
+ describe '#prune_saturated' do
165
+ it 'returns removed count' do
166
+ result = client.prune_saturated
167
+ expect(result[:removed]).to be_a(Integer)
168
+ end
169
+
170
+ it 'returns 0 when no saturated concepts' do
171
+ client.register(label: 'healthy')
172
+ result = client.prune_saturated
173
+ expect(result[:removed]).to eq(0)
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/source_monitoring/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Memory::SourceMonitoring::Client do
6
+ subject(:client) { described_class.new }
7
+
8
+ it 'records and verifies sources' do
9
+ rec = client.record_source(content_id: 'fact:x', source: :external_perception)
10
+ result = client.verify_source(record_id: rec[:record][:id])
11
+ expect(result[:success]).to be true
12
+ expect(result[:record][:verified]).to be true
13
+ end
14
+
15
+ it 'performs reality checks' do
16
+ client.record_source(content_id: 'thought:y', source: :internal_generation)
17
+ result = client.reality_check(content_id: 'thought:y')
18
+ expect(result[:status]).to eq(:constructed)
19
+ end
20
+
21
+ it 'reports stats' do
22
+ result = client.source_monitoring_stats
23
+ expect(result[:success]).to be true
24
+ end
25
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::SourceMonitoring::Helpers::SourceRecord do
4
+ subject(:rec) do
5
+ described_class.new(id: :src_one, content_id: 'fact:sky_blue', source: :external_perception)
6
+ end
7
+
8
+ let(:constants) { Legion::Extensions::Agentic::Memory::SourceMonitoring::Helpers::Constants }
9
+
10
+ describe '#initialize' do
11
+ it 'sets id, content_id, and source' do
12
+ expect(rec.id).to eq(:src_one)
13
+ expect(rec.content_id).to eq('fact:sky_blue')
14
+ expect(rec.source).to eq(:external_perception)
15
+ end
16
+
17
+ it 'uses default confidence' do
18
+ expect(rec.confidence).to eq(constants::DEFAULT_CONFIDENCE)
19
+ end
20
+
21
+ it 'starts unverified' do
22
+ expect(rec.verified).to be false
23
+ end
24
+ end
25
+
26
+ describe '#reality_status' do
27
+ it 'returns :real for external perception' do
28
+ expect(rec.reality_status).to eq(:real)
29
+ end
30
+
31
+ it 'returns :constructed for internal generation' do
32
+ r = described_class.new(id: :x, content_id: :y, source: :internal_generation)
33
+ expect(r.reality_status).to eq(:constructed)
34
+ end
35
+
36
+ it 'returns :imagined for imagination' do
37
+ r = described_class.new(id: :x, content_id: :y, source: :imagination)
38
+ expect(r.reality_status).to eq(:imagined)
39
+ end
40
+ end
41
+
42
+ describe '#external? and #internal?' do
43
+ it 'external_perception is external' do
44
+ expect(rec.external?).to be true
45
+ expect(rec.internal?).to be false
46
+ end
47
+
48
+ it 'imagination is internal' do
49
+ r = described_class.new(id: :x, content_id: :y, source: :imagination)
50
+ expect(r.internal?).to be true
51
+ expect(r.external?).to be false
52
+ end
53
+
54
+ it 'inference is neither external nor internal' do
55
+ r = described_class.new(id: :x, content_id: :y, source: :inference)
56
+ expect(r.external?).to be false
57
+ expect(r.internal?).to be false
58
+ end
59
+ end
60
+
61
+ describe '#verify' do
62
+ it 'marks as verified' do
63
+ rec.verify
64
+ expect(rec.verified).to be true
65
+ end
66
+
67
+ it 'boosts confidence' do
68
+ before = rec.confidence
69
+ rec.verify
70
+ expect(rec.confidence).to be > before
71
+ end
72
+ end
73
+
74
+ describe '#correct' do
75
+ it 'changes source' do
76
+ rec.correct(new_source: :memory_retrieval)
77
+ expect(rec.source).to eq(:memory_retrieval)
78
+ end
79
+
80
+ it 'reduces confidence' do
81
+ before = rec.confidence
82
+ rec.correct(new_source: :memory_retrieval)
83
+ expect(rec.confidence).to be < before
84
+ end
85
+
86
+ it 'increments correction count' do
87
+ rec.correct(new_source: :memory_retrieval)
88
+ expect(rec.correction_count).to eq(1)
89
+ end
90
+ end
91
+
92
+ describe '#confused?' do
93
+ it 'returns true when source is in confusion pair and low confidence' do
94
+ rec.confidence = 0.3
95
+ expect(rec.confused?).to be true
96
+ end
97
+
98
+ it 'returns false with high confidence' do
99
+ rec.confidence = 0.8
100
+ expect(rec.confused?).to be false
101
+ end
102
+ end
103
+
104
+ describe '#decay' do
105
+ it 'reduces confidence' do
106
+ before = rec.confidence
107
+ rec.decay
108
+ expect(rec.confidence).to be < before
109
+ end
110
+
111
+ it 'respects floor' do
112
+ 100.times { rec.decay }
113
+ expect(rec.confidence).to be >= constants::CONFIDENCE_FLOOR
114
+ end
115
+ end
116
+
117
+ describe '#faded?' do
118
+ it 'returns false initially' do
119
+ expect(rec.faded?).to be false
120
+ end
121
+
122
+ it 'returns true at floor when unverified' do
123
+ rec.confidence = constants::CONFIDENCE_FLOOR
124
+ expect(rec.faded?).to be true
125
+ end
126
+
127
+ it 'returns false at floor when verified' do
128
+ rec.verify
129
+ rec.confidence = constants::CONFIDENCE_FLOOR
130
+ expect(rec.faded?).to be false
131
+ end
132
+ end
133
+
134
+ describe '#confidence_label' do
135
+ it 'returns a symbol' do
136
+ expect(rec.confidence_label).to be_a(Symbol)
137
+ end
138
+
139
+ it 'returns :confident for default confidence' do
140
+ expect(rec.confidence_label).to eq(:confident)
141
+ end
142
+ end
143
+
144
+ describe '#to_h' do
145
+ it 'returns expected keys' do
146
+ h = rec.to_h
147
+ expect(h).to include(:id, :content_id, :source, :domain, :reality_status,
148
+ :confidence, :confidence_label, :verified, :external,
149
+ :internal, :confused, :corrections, :recorded_at)
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::SourceMonitoring::Helpers::SourceTracker do
4
+ subject(:tracker) { described_class.new }
5
+
6
+ let(:constants) { Legion::Extensions::Agentic::Memory::SourceMonitoring::Helpers::Constants }
7
+
8
+ describe '#record_source' do
9
+ it 'creates a source record' do
10
+ rec = tracker.record_source(content_id: 'fact:one', source: :external_perception)
11
+ expect(rec).to be_a(Legion::Extensions::Agentic::Memory::SourceMonitoring::Helpers::SourceRecord)
12
+ expect(tracker.records.size).to eq(1)
13
+ end
14
+
15
+ it 'rejects invalid sources' do
16
+ expect(tracker.record_source(content_id: 'x', source: :bogus)).to be_nil
17
+ end
18
+
19
+ it 'enforces MAX_RECORDS' do
20
+ constants::MAX_RECORDS.times do |i|
21
+ tracker.record_source(content_id: "fact:#{i}", source: :external_perception)
22
+ end
23
+ expect(tracker.record_source(content_id: 'overflow', source: :external_perception)).to be_nil
24
+ end
25
+ end
26
+
27
+ describe '#attribute' do
28
+ it 'returns records for a content_id sorted by confidence' do
29
+ tracker.record_source(content_id: 'fact:x', source: :external_perception, confidence: 0.5)
30
+ tracker.record_source(content_id: 'fact:x', source: :memory_retrieval, confidence: 0.8)
31
+ results = tracker.attribute(content_id: 'fact:x')
32
+ expect(results.size).to eq(2)
33
+ expect(results.first.confidence).to be > results.last.confidence
34
+ end
35
+
36
+ it 'returns empty for unknown content' do
37
+ expect(tracker.attribute(content_id: 'nope')).to be_empty
38
+ end
39
+ end
40
+
41
+ describe '#verify_source' do
42
+ it 'verifies a record' do
43
+ rec = tracker.record_source(content_id: 'fact:x', source: :external_perception)
44
+ result = tracker.verify_source(record_id: rec.id)
45
+ expect(result.verified).to be true
46
+ end
47
+
48
+ it 'returns nil for unknown record' do
49
+ expect(tracker.verify_source(record_id: :nope)).to be_nil
50
+ end
51
+
52
+ it 'logs attribution' do
53
+ rec = tracker.record_source(content_id: 'fact:x', source: :external_perception)
54
+ tracker.verify_source(record_id: rec.id)
55
+ expect(tracker.attribution_log.size).to eq(1)
56
+ end
57
+ end
58
+
59
+ describe '#correct_source' do
60
+ it 'corrects the source' do
61
+ rec = tracker.record_source(content_id: 'fact:x', source: :external_perception)
62
+ result = tracker.correct_source(record_id: rec.id, new_source: :memory_retrieval)
63
+ expect(result.source).to eq(:memory_retrieval)
64
+ end
65
+
66
+ it 'rejects invalid new source' do
67
+ rec = tracker.record_source(content_id: 'fact:x', source: :external_perception)
68
+ expect(tracker.correct_source(record_id: rec.id, new_source: :bogus)).to be_nil
69
+ end
70
+ end
71
+
72
+ describe '#reality_check' do
73
+ it 'returns status for known content' do
74
+ tracker.record_source(content_id: 'fact:x', source: :external_perception)
75
+ result = tracker.reality_check(content_id: 'fact:x')
76
+ expect(result[:status]).to eq(:real)
77
+ end
78
+
79
+ it 'returns unknown for unknown content' do
80
+ result = tracker.reality_check(content_id: 'nope')
81
+ expect(result[:status]).to eq(:unknown)
82
+ end
83
+ end
84
+
85
+ describe '#confused_records' do
86
+ it 'returns records with source confusion and low confidence' do
87
+ rec = tracker.record_source(content_id: 'fact:x', source: :external_perception, confidence: 0.3)
88
+ confused = tracker.confused_records
89
+ expect(confused.size).to eq(1)
90
+ expect(confused.first[:id]).to eq(rec.id)
91
+ end
92
+ end
93
+
94
+ describe '#records_by_source' do
95
+ it 'filters by source type' do
96
+ tracker.record_source(content_id: 'a', source: :external_perception)
97
+ tracker.record_source(content_id: 'b', source: :imagination)
98
+ results = tracker.records_by_source(source: :imagination)
99
+ expect(results.size).to eq(1)
100
+ end
101
+ end
102
+
103
+ describe '#attribution_accuracy' do
104
+ it 'returns 0 with no verifications' do
105
+ expect(tracker.attribution_accuracy).to eq(0.0)
106
+ end
107
+
108
+ it 'returns ratio of hits to total' do
109
+ rec = tracker.record_source(content_id: 'a', source: :external_perception)
110
+ tracker.verify_source(record_id: rec.id)
111
+ rec2 = tracker.record_source(content_id: 'b', source: :imagination)
112
+ tracker.correct_source(record_id: rec2.id, new_source: :memory_retrieval)
113
+ expect(tracker.attribution_accuracy).to eq(0.5)
114
+ end
115
+ end
116
+
117
+ describe '#decay_all' do
118
+ it 'decays records and removes faded ones' do
119
+ tracker.record_source(content_id: 'faint', source: :inference, confidence: 0.12)
120
+ 20.times { tracker.decay_all }
121
+ expect(tracker.records.values.none? { |r| r.content_id == 'faint' }).to be true
122
+ end
123
+
124
+ it 'preserves verified records' do
125
+ rec = tracker.record_source(content_id: 'solid', source: :external_perception, confidence: 0.12)
126
+ tracker.verify_source(record_id: rec.id)
127
+ 20.times { tracker.decay_all }
128
+ expect(tracker.records).to have_key(rec.id)
129
+ end
130
+ end
131
+
132
+ describe '#to_h' do
133
+ it 'returns summary hash' do
134
+ h = tracker.to_h
135
+ expect(h).to include(:total_records, :verified_count, :confused_count,
136
+ :accuracy, :source_distribution, :attribution_log_size)
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/source_monitoring/runners/source_monitoring'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Memory::SourceMonitoring::Runners::SourceMonitoring do
6
+ let(:tracker) { Legion::Extensions::Agentic::Memory::SourceMonitoring::Helpers::SourceTracker.new }
7
+ let(:host) do
8
+ obj = Object.new
9
+ obj.extend(described_class)
10
+ obj.instance_variable_set(:@tracker, tracker)
11
+ obj
12
+ end
13
+
14
+ describe '#record_source' do
15
+ it 'records successfully' do
16
+ result = host.record_source(content_id: 'fact:x', source: :external_perception)
17
+ expect(result[:success]).to be true
18
+ expect(result[:record][:source]).to eq(:external_perception)
19
+ end
20
+
21
+ it 'fails for invalid source' do
22
+ result = host.record_source(content_id: 'fact:x', source: :bogus)
23
+ expect(result[:success]).to be false
24
+ end
25
+ end
26
+
27
+ describe '#attribute_source' do
28
+ it 'returns matching records' do
29
+ host.record_source(content_id: 'fact:x', source: :external_perception)
30
+ result = host.attribute_source(content_id: 'fact:x')
31
+ expect(result[:count]).to eq(1)
32
+ end
33
+ end
34
+
35
+ describe '#verify_source' do
36
+ it 'verifies a record' do
37
+ rec = host.record_source(content_id: 'fact:x', source: :external_perception)
38
+ result = host.verify_source(record_id: rec[:record][:id])
39
+ expect(result[:success]).to be true
40
+ expect(result[:record][:verified]).to be true
41
+ end
42
+
43
+ it 'fails for unknown record' do
44
+ result = host.verify_source(record_id: :nope)
45
+ expect(result[:success]).to be false
46
+ end
47
+ end
48
+
49
+ describe '#correct_source' do
50
+ it 'corrects a source' do
51
+ rec = host.record_source(content_id: 'fact:x', source: :external_perception)
52
+ result = host.correct_source(record_id: rec[:record][:id], new_source: :memory_retrieval)
53
+ expect(result[:success]).to be true
54
+ expect(result[:record][:source]).to eq(:memory_retrieval)
55
+ end
56
+ end
57
+
58
+ describe '#reality_check' do
59
+ it 'returns reality status' do
60
+ host.record_source(content_id: 'fact:x', source: :imagination)
61
+ result = host.reality_check(content_id: 'fact:x')
62
+ expect(result[:status]).to eq(:imagined)
63
+ end
64
+ end
65
+
66
+ describe '#confused_sources' do
67
+ it 'returns confused records' do
68
+ result = host.confused_sources
69
+ expect(result[:success]).to be true
70
+ end
71
+ end
72
+
73
+ describe '#sources_by_type' do
74
+ it 'filters by source type' do
75
+ host.record_source(content_id: 'a', source: :inference)
76
+ result = host.sources_by_type(source: :inference)
77
+ expect(result[:count]).to eq(1)
78
+ end
79
+ end
80
+
81
+ describe '#attribution_accuracy' do
82
+ it 'returns accuracy' do
83
+ result = host.attribution_accuracy
84
+ expect(result[:success]).to be true
85
+ end
86
+ end
87
+
88
+ describe '#update_source_monitoring' do
89
+ it 'decays and returns count' do
90
+ result = host.update_source_monitoring
91
+ expect(result[:success]).to be true
92
+ end
93
+ end
94
+
95
+ describe '#source_monitoring_stats' do
96
+ it 'returns stats' do
97
+ result = host.source_monitoring_stats
98
+ expect(result[:success]).to be true
99
+ expect(result[:stats]).to include(:total_records)
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Stub the framework actor base class since legionio gem is not available in test
4
+ module Legion
5
+ module Extensions
6
+ module Actors
7
+ class Every # rubocop:disable Lint/EmptyClass
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ # Intercept the require in the actor file so it doesn't fail
14
+ $LOADED_FEATURES << 'legion/extensions/actors/every'
15
+
16
+ require 'legion/extensions/agentic/memory/trace/actors/decay'
17
+
18
+ RSpec.describe Legion::Extensions::Agentic::Memory::Trace::Actor::Decay do
19
+ subject(:actor) { described_class.new }
20
+
21
+ describe '#runner_class' do
22
+ it 'returns the Consolidation module' do
23
+ expect(actor.runner_class).to eq(Legion::Extensions::Agentic::Memory::Trace::Runners::Consolidation)
24
+ end
25
+ end
26
+
27
+ describe '#runner_function' do
28
+ it 'returns decay_cycle' do
29
+ expect(actor.runner_function).to eq('decay_cycle')
30
+ end
31
+ end
32
+
33
+ describe '#time' do
34
+ it 'returns 60 seconds' do
35
+ expect(actor.time).to eq(60)
36
+ end
37
+ end
38
+
39
+ describe '#run_now?' do
40
+ it 'returns false' do
41
+ expect(actor.run_now?).to be false
42
+ end
43
+ end
44
+
45
+ describe '#use_runner?' do
46
+ it 'returns false' do
47
+ expect(actor.use_runner?).to be false
48
+ end
49
+ end
50
+
51
+ describe '#check_subtask?' do
52
+ it 'returns false' do
53
+ expect(actor.check_subtask?).to be false
54
+ end
55
+ end
56
+
57
+ describe '#generate_task?' do
58
+ it 'returns false' do
59
+ expect(actor.generate_task?).to be false
60
+ end
61
+ end
62
+ end