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,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Compression::Helpers::InformationChunk do
4
+ subject(:chunk) { described_class.new(label: 'test_data') }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID id' do
8
+ expect(chunk.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'sets label' do
12
+ expect(chunk.label).to eq('test_data')
13
+ end
14
+
15
+ it 'defaults to semantic type' do
16
+ expect(chunk.chunk_type).to eq(:semantic)
17
+ end
18
+
19
+ it 'starts with fidelity 1.0' do
20
+ expect(chunk.fidelity).to eq(1.0)
21
+ end
22
+
23
+ it 'starts with 0 compressions' do
24
+ expect(chunk.compression_count).to eq(0)
25
+ end
26
+
27
+ it 'original and compressed sizes start equal' do
28
+ expect(chunk.compressed_size).to eq(chunk.original_size)
29
+ end
30
+ end
31
+
32
+ describe '#compression_ratio' do
33
+ it 'starts at 0.0 (no compression)' do
34
+ expect(chunk.compression_ratio).to eq(0.0)
35
+ end
36
+
37
+ it 'increases after compression' do
38
+ chunk.compress!
39
+ expect(chunk.compression_ratio).to be > 0.0
40
+ end
41
+ end
42
+
43
+ describe '#compress!' do
44
+ it 'reduces compressed_size' do
45
+ original = chunk.compressed_size
46
+ chunk.compress!
47
+ expect(chunk.compressed_size).to be < original
48
+ end
49
+
50
+ it 'reduces fidelity' do
51
+ chunk.compress!
52
+ expect(chunk.fidelity).to be < 1.0
53
+ end
54
+
55
+ it 'increments compression_count' do
56
+ chunk.compress!
57
+ expect(chunk.compression_count).to eq(1)
58
+ end
59
+
60
+ it 'fidelity floors at MIN_FIDELITY' do
61
+ 50.times { chunk.compress! }
62
+ min = Legion::Extensions::Agentic::Memory::Compression::Helpers::Constants::MIN_FIDELITY
63
+ expect(chunk.fidelity).to be >= min
64
+ end
65
+
66
+ it 'returns self' do
67
+ expect(chunk.compress!).to eq(chunk)
68
+ end
69
+ end
70
+
71
+ describe '#decompress!' do
72
+ it 'increases compressed_size' do
73
+ chunk.compress!
74
+ small = chunk.compressed_size
75
+ chunk.decompress!
76
+ expect(chunk.compressed_size).to be > small
77
+ end
78
+
79
+ it 'does not exceed original_size' do
80
+ chunk.decompress!
81
+ expect(chunk.compressed_size).to be <= chunk.original_size
82
+ end
83
+ end
84
+
85
+ describe '#highly_compressed?' do
86
+ it 'is false at start' do
87
+ expect(chunk.highly_compressed?).to be false
88
+ end
89
+
90
+ it 'is true after many compressions' do
91
+ 20.times { chunk.compress! }
92
+ expect(chunk.highly_compressed?).to be true
93
+ end
94
+ end
95
+
96
+ describe '#compression_label' do
97
+ it 'returns :raw at start' do
98
+ expect(chunk.compression_label).to eq(:raw)
99
+ end
100
+
101
+ it 'changes after compression' do
102
+ 10.times { chunk.compress! }
103
+ expect(chunk.compression_label).not_to eq(:raw)
104
+ end
105
+ end
106
+
107
+ describe '#fidelity_label' do
108
+ it 'returns :pristine at start' do
109
+ expect(chunk.fidelity_label).to eq(:pristine)
110
+ end
111
+ end
112
+
113
+ describe '#to_h' do
114
+ it 'includes all fields' do
115
+ hash = chunk.to_h
116
+ expect(hash).to include(
117
+ :id, :label, :chunk_type, :original_size, :compressed_size,
118
+ :compression_ratio, :compression_label, :fidelity, :fidelity_label,
119
+ :compression_count, :created_at
120
+ )
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Compression::Runners::CognitiveCompression do
4
+ let(:client) { Legion::Extensions::Agentic::Memory::Compression::Client.new }
5
+
6
+ describe '#store_chunk' do
7
+ it 'returns success with chunk hash' do
8
+ result = client.store_chunk(label: 'test')
9
+ expect(result[:success]).to be true
10
+ expect(result[:chunk]).to include(:id, :label, :compression_ratio)
11
+ end
12
+ end
13
+
14
+ describe '#compress_chunk' do
15
+ it 'compresses a stored chunk' do
16
+ c = client.store_chunk(label: 'data')
17
+ result = client.compress_chunk(chunk_id: c[:chunk][:id])
18
+ expect(result[:success]).to be true
19
+ expect(result[:chunk][:compression_ratio]).to be > 0.0
20
+ end
21
+
22
+ it 'returns failure for unknown id' do
23
+ result = client.compress_chunk(chunk_id: 'fake')
24
+ expect(result[:success]).to be false
25
+ end
26
+ end
27
+
28
+ describe '#decompress_chunk' do
29
+ it 'decompresses a chunk' do
30
+ c = client.store_chunk(label: 'data')
31
+ client.compress_chunk(chunk_id: c[:chunk][:id])
32
+ result = client.decompress_chunk(chunk_id: c[:chunk][:id])
33
+ expect(result[:success]).to be true
34
+ end
35
+ end
36
+
37
+ describe '#abstract_chunks' do
38
+ it 'creates an abstraction' do
39
+ c1 = client.store_chunk(label: 'a')
40
+ c2 = client.store_chunk(label: 'b')
41
+ result = client.abstract_chunks(chunk_ids: [c1[:chunk][:id], c2[:chunk][:id]],
42
+ abstraction_label: 'ab')
43
+ expect(result[:success]).to be true
44
+ expect(result[:abstraction][:chunk_type]).to eq(:abstract)
45
+ end
46
+ end
47
+
48
+ describe '#compress_all' do
49
+ it 'returns compressed count' do
50
+ client.store_chunk(label: 'a')
51
+ client.store_chunk(label: 'b')
52
+ result = client.compress_all
53
+ expect(result[:success]).to be true
54
+ expect(result[:compressed_count]).to eq(2)
55
+ end
56
+ end
57
+
58
+ describe '#average_fidelity' do
59
+ it 'returns fidelity score' do
60
+ result = client.average_fidelity
61
+ expect(result[:success]).to be true
62
+ expect(result[:fidelity]).to be_a(Numeric)
63
+ end
64
+ end
65
+
66
+ describe '#overall_compression_ratio' do
67
+ it 'returns ratio' do
68
+ result = client.overall_compression_ratio
69
+ expect(result[:success]).to be true
70
+ end
71
+ end
72
+
73
+ describe '#compression_report' do
74
+ it 'returns a full report' do
75
+ result = client.compression_report
76
+ expect(result[:success]).to be true
77
+ expect(result[:report]).to include(:total_chunks, :average_fidelity)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Echo::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ it 'responds to runner methods' do
7
+ expect(client).to respond_to(:create_echo, :decay_all, :echo_status)
8
+ end
9
+
10
+ it 'runs a full echo lifecycle' do
11
+ result = client.create_echo(content: 'security analysis', domain: :security, echo_type: :thought)
12
+ echo_id = result[:echo][:id]
13
+
14
+ client.decay_all
15
+ client.reinforce_echo(echo_id: echo_id)
16
+
17
+ status = client.echo_status
18
+ expect(status[:total_echoes]).to eq(1)
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Echo do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::Agentic::Memory::Echo::VERSION).to eq('0.1.0')
6
+ end
7
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Echo::Helpers::EchoEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ describe '#create_echo' do
7
+ it 'creates and stores an echo' do
8
+ echo = engine.create_echo(content: 'test thought')
9
+ expect(echo.content).to eq('test thought')
10
+ end
11
+ end
12
+
13
+ describe '#reinforce_echo' do
14
+ it 'increases echo intensity' do
15
+ echo = engine.create_echo(content: 'test', intensity: 0.5)
16
+ engine.reinforce_echo(echo_id: echo.id)
17
+ expect(echo.intensity).to be > 0.5
18
+ end
19
+
20
+ it 'returns nil for unknown echo' do
21
+ expect(engine.reinforce_echo(echo_id: 'bad')).to be_nil
22
+ end
23
+ end
24
+
25
+ describe '#decay_all!' do
26
+ it 'decays all echoes' do
27
+ echo = engine.create_echo(content: 'test')
28
+ original = echo.intensity
29
+ engine.decay_all!
30
+ expect(echo.intensity).to be < original
31
+ end
32
+ end
33
+
34
+ describe '#active_echoes' do
35
+ it 'returns non-silent echoes' do
36
+ engine.create_echo(content: 'active', intensity: 0.5)
37
+ engine.create_echo(content: 'silent', intensity: 0.01)
38
+ expect(engine.active_echoes.size).to eq(1)
39
+ end
40
+ end
41
+
42
+ describe '#priming_echoes' do
43
+ it 'returns echoes above priming threshold' do
44
+ engine.create_echo(content: 'strong', intensity: 0.5)
45
+ engine.create_echo(content: 'weak', intensity: 0.1)
46
+ expect(engine.priming_echoes.size).to eq(1)
47
+ end
48
+ end
49
+
50
+ describe '#interfering_echoes' do
51
+ it 'returns echoes above interference threshold' do
52
+ engine.create_echo(content: 'loud', intensity: 0.6)
53
+ engine.create_echo(content: 'quiet', intensity: 0.2)
54
+ expect(engine.interfering_echoes.size).to eq(1)
55
+ end
56
+ end
57
+
58
+ describe '#echoes_by_domain' do
59
+ it 'filters by domain' do
60
+ engine.create_echo(content: 'a', domain: :security)
61
+ engine.create_echo(content: 'b', domain: :memory)
62
+ expect(engine.echoes_by_domain(domain: :security).size).to eq(1)
63
+ end
64
+ end
65
+
66
+ describe '#echoes_by_type' do
67
+ it 'filters by type' do
68
+ engine.create_echo(content: 'a', echo_type: :emotion)
69
+ engine.create_echo(content: 'b', echo_type: :decision)
70
+ expect(engine.echoes_by_type(echo_type: :emotion).size).to eq(1)
71
+ end
72
+ end
73
+
74
+ describe '#strongest_echoes' do
75
+ it 'returns sorted by intensity descending' do
76
+ engine.create_echo(content: 'weak', intensity: 0.3)
77
+ strong = engine.create_echo(content: 'strong', intensity: 0.9)
78
+ expect(engine.strongest_echoes(limit: 1).first.id).to eq(strong.id)
79
+ end
80
+ end
81
+
82
+ describe '#echo_chamber_score' do
83
+ it 'returns 0.0 with no echoes' do
84
+ expect(engine.echo_chamber_score).to eq(0.0)
85
+ end
86
+
87
+ it 'returns 1.0 when all echoes in one domain' do
88
+ engine.create_echo(content: 'a', domain: :security)
89
+ engine.create_echo(content: 'b', domain: :security)
90
+ expect(engine.echo_chamber_score).to eq(1.0)
91
+ end
92
+
93
+ it 'returns lower score with diverse domains' do
94
+ engine.create_echo(content: 'a', domain: :security, intensity: 0.5)
95
+ engine.create_echo(content: 'b', domain: :memory, intensity: 0.5)
96
+ expect(engine.echo_chamber_score).to eq(0.5)
97
+ end
98
+ end
99
+
100
+ describe '#priming_effect_for' do
101
+ it 'returns 0.0 for domain with no priming echoes' do
102
+ expect(engine.priming_effect_for(domain: :security)).to eq(0.0)
103
+ end
104
+
105
+ it 'returns accumulated priming from matching domain' do
106
+ engine.create_echo(content: 'sec1', domain: :security, intensity: 0.5)
107
+ expect(engine.priming_effect_for(domain: :security)).to be > 0.0
108
+ end
109
+ end
110
+
111
+ describe '#interference_level' do
112
+ it 'returns 0.0 with no interfering echoes' do
113
+ engine.create_echo(content: 'x', intensity: 0.2)
114
+ expect(engine.interference_level).to eq(0.0)
115
+ end
116
+
117
+ it 'returns positive when strong echoes exist' do
118
+ engine.create_echo(content: 'x', intensity: 0.8)
119
+ expect(engine.interference_level).to be > 0.0
120
+ end
121
+ end
122
+
123
+ describe '#average_intensity' do
124
+ it 'returns 0.0 with no echoes' do
125
+ expect(engine.average_intensity).to eq(0.0)
126
+ end
127
+
128
+ it 'computes average' do
129
+ engine.create_echo(content: 'a', intensity: 0.4)
130
+ engine.create_echo(content: 'b', intensity: 0.6)
131
+ expect(engine.average_intensity).to eq(0.5)
132
+ end
133
+ end
134
+
135
+ describe '#echo_report' do
136
+ it 'includes key report fields' do
137
+ report = engine.echo_report
138
+ expect(report).to include(
139
+ :total_echoes, :active_count, :priming_count, :interfering_count,
140
+ :average_intensity, :echo_chamber_score, :chamber_label,
141
+ :interference_level, :strongest
142
+ )
143
+ end
144
+ end
145
+
146
+ describe '#to_h' do
147
+ it 'includes summary' do
148
+ hash = engine.to_h
149
+ expect(hash).to include(:total_echoes, :active, :average_intensity, :chamber_score)
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Echo::Helpers::Echo do
4
+ subject(:echo) { described_class.new(content: 'previous thought about security') }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID id' do
8
+ expect(echo.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'stores content' do
12
+ expect(echo.content).to eq('previous thought about security')
13
+ end
14
+
15
+ it 'defaults echo_type to :thought' do
16
+ expect(echo.echo_type).to eq(:thought)
17
+ end
18
+
19
+ it 'defaults domain to :general' do
20
+ expect(echo.domain).to eq(:general)
21
+ end
22
+
23
+ it 'defaults intensity to 0.8' do
24
+ expect(echo.intensity).to eq(0.8)
25
+ end
26
+
27
+ it 'preserves original_intensity' do
28
+ expect(echo.original_intensity).to eq(0.8)
29
+ end
30
+
31
+ it 'clamps intensity' do
32
+ high = described_class.new(content: 'x', intensity: 5.0)
33
+ expect(high.intensity).to eq(1.0)
34
+ end
35
+
36
+ it 'validates echo_type' do
37
+ bad = described_class.new(content: 'x', echo_type: :nonexistent)
38
+ expect(bad.echo_type).to eq(:thought)
39
+ end
40
+ end
41
+
42
+ describe '#decay!' do
43
+ it 'reduces intensity' do
44
+ original = echo.intensity
45
+ echo.decay!
46
+ expect(echo.intensity).to be < original
47
+ end
48
+
49
+ it 'increments decay_count' do
50
+ echo.decay!
51
+ expect(echo.decay_count).to eq(1)
52
+ end
53
+
54
+ it 'clamps at 0.0' do
55
+ 15.times { echo.decay! }
56
+ expect(echo.intensity).to eq(0.0)
57
+ end
58
+ end
59
+
60
+ describe '#reinforce!' do
61
+ it 'increases intensity' do
62
+ echo.decay!
63
+ original = echo.intensity
64
+ echo.reinforce!
65
+ expect(echo.intensity).to be > original
66
+ end
67
+
68
+ it 'clamps at 1.0' do
69
+ 5.times { echo.reinforce! }
70
+ expect(echo.intensity).to eq(1.0)
71
+ end
72
+ end
73
+
74
+ describe '#silent?' do
75
+ it 'is false when active' do
76
+ expect(echo.silent?).to be false
77
+ end
78
+
79
+ it 'is true when fully decayed' do
80
+ 10.times { echo.decay! }
81
+ expect(echo.silent?).to be true
82
+ end
83
+ end
84
+
85
+ describe '#priming?' do
86
+ it 'is true at default intensity' do
87
+ expect(echo.priming?).to be true
88
+ end
89
+
90
+ it 'is false when very faint' do
91
+ faint = described_class.new(content: 'x', intensity: 0.1)
92
+ expect(faint.priming?).to be false
93
+ end
94
+ end
95
+
96
+ describe '#interfering?' do
97
+ it 'is true at default intensity' do
98
+ expect(echo.interfering?).to be true
99
+ end
100
+
101
+ it 'is false when below threshold' do
102
+ weak = described_class.new(content: 'x', intensity: 0.2)
103
+ expect(weak.interfering?).to be false
104
+ end
105
+ end
106
+
107
+ describe '#persistence' do
108
+ it 'is 1.0 when not decayed' do
109
+ expect(echo.persistence).to eq(1.0)
110
+ end
111
+
112
+ it 'decreases after decay' do
113
+ echo.decay!
114
+ expect(echo.persistence).to be < 1.0
115
+ end
116
+ end
117
+
118
+ describe '#to_h' do
119
+ it 'includes all fields' do
120
+ hash = echo.to_h
121
+ expect(hash).to include(
122
+ :id, :content, :echo_type, :domain, :intensity, :original_intensity,
123
+ :intensity_label, :effect_label, :priming, :interfering, :silent,
124
+ :persistence, :decay_count, :created_at
125
+ )
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Echo::Runners::CognitiveEcho do
4
+ let(:engine) { Legion::Extensions::Agentic::Memory::Echo::Helpers::EchoEngine.new }
5
+ let(:runner) do
6
+ obj = Object.new
7
+ obj.extend(described_class)
8
+ obj.instance_variable_set(:@default_engine, engine)
9
+ obj
10
+ end
11
+
12
+ describe '#create_echo' do
13
+ it 'returns success with echo hash' do
14
+ result = runner.create_echo(content: 'test', engine: engine)
15
+ expect(result[:success]).to be true
16
+ expect(result[:echo][:content]).to eq('test')
17
+ end
18
+ end
19
+
20
+ describe '#reinforce_echo' do
21
+ it 'returns success for known echo' do
22
+ echo = engine.create_echo(content: 'test', intensity: 0.5)
23
+ result = runner.reinforce_echo(echo_id: echo.id, engine: engine)
24
+ expect(result[:success]).to be true
25
+ end
26
+
27
+ it 'returns failure for unknown echo' do
28
+ result = runner.reinforce_echo(echo_id: 'bad', engine: engine)
29
+ expect(result[:success]).to be false
30
+ end
31
+ end
32
+
33
+ describe '#decay_all' do
34
+ it 'returns success' do
35
+ result = runner.decay_all(engine: engine)
36
+ expect(result[:success]).to be true
37
+ end
38
+ end
39
+
40
+ describe '#active_echoes' do
41
+ it 'returns active list' do
42
+ engine.create_echo(content: 'test')
43
+ result = runner.active_echoes(engine: engine)
44
+ expect(result[:count]).to eq(1)
45
+ end
46
+ end
47
+
48
+ describe '#priming_echoes' do
49
+ it 'returns priming list' do
50
+ engine.create_echo(content: 'test', intensity: 0.5)
51
+ result = runner.priming_echoes(engine: engine)
52
+ expect(result[:count]).to eq(1)
53
+ end
54
+ end
55
+
56
+ describe '#echoes_by_domain' do
57
+ it 'filters by domain' do
58
+ engine.create_echo(content: 'a', domain: :security)
59
+ result = runner.echoes_by_domain(domain: :security, engine: engine)
60
+ expect(result[:count]).to eq(1)
61
+ end
62
+ end
63
+
64
+ describe '#priming_effect' do
65
+ it 'returns effect and label' do
66
+ engine.create_echo(content: 'test', domain: :security, intensity: 0.5)
67
+ result = runner.priming_effect(domain: :security, engine: engine)
68
+ expect(result[:success]).to be true
69
+ expect(result[:priming_effect]).to be > 0.0
70
+ end
71
+ end
72
+
73
+ describe '#echo_status' do
74
+ it 'returns comprehensive status' do
75
+ result = runner.echo_status(engine: engine)
76
+ expect(result[:success]).to be true
77
+ expect(result).to include(:total_echoes, :echo_chamber_score)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::EchoChamber::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'creates a client with a default engine' do
8
+ expect(client).to respond_to(:create_echo)
9
+ end
10
+
11
+ it 'accepts an injected engine' do
12
+ engine = Legion::Extensions::Agentic::Memory::EchoChamber::Helpers::ChamberEngine.new
13
+ custom = described_class.new(engine: engine)
14
+ expect(custom).to respond_to(:chamber_status)
15
+ end
16
+ end
17
+
18
+ describe 'runner method delegation' do
19
+ it 'responds to create_echo' do
20
+ expect(client).to respond_to(:create_echo)
21
+ end
22
+
23
+ it 'responds to create_chamber' do
24
+ expect(client).to respond_to(:create_chamber)
25
+ end
26
+
27
+ it 'responds to amplify' do
28
+ expect(client).to respond_to(:amplify)
29
+ end
30
+
31
+ it 'responds to disrupt' do
32
+ expect(client).to respond_to(:disrupt)
33
+ end
34
+
35
+ it 'responds to list_echoes' do
36
+ expect(client).to respond_to(:list_echoes)
37
+ end
38
+
39
+ it 'responds to chamber_status' do
40
+ expect(client).to respond_to(:chamber_status)
41
+ end
42
+ end
43
+
44
+ describe 'full echo lifecycle' do
45
+ it 'creates, amplifies, and lists echoes' do
46
+ result = client.create_echo(content: 'confirmation bias', domain: :cognition, echo_type: :bias)
47
+ expect(result[:success]).to be true
48
+ echo_id = result[:echo][:id]
49
+
50
+ amplify_result = client.amplify(echo_id: echo_id)
51
+ expect(amplify_result[:success]).to be true
52
+ expect(amplify_result[:echo][:amplitude]).to be > 0.5
53
+
54
+ list_result = client.list_echoes(echo_type: :bias)
55
+ expect(list_result[:count]).to eq(1)
56
+ end
57
+
58
+ it 'creates a chamber and disrupts it' do
59
+ chamber_result = client.create_chamber(label: 'echo chamber', wall_thickness: 0.4)
60
+ expect(chamber_result[:success]).to be true
61
+ chamber_id = chamber_result[:chamber][:id]
62
+
63
+ disrupt_result = client.disrupt(chamber_id: chamber_id, force: 0.9)
64
+ expect(disrupt_result[:success]).to be true
65
+ end
66
+
67
+ it 'reports status with echoes and chambers' do
68
+ client.create_echo(content: 'belief 1')
69
+ client.create_chamber(label: 'chamber 1')
70
+
71
+ status = client.chamber_status
72
+ expect(status[:total_echoes]).to eq(1)
73
+ expect(status[:total_chambers]).to eq(1)
74
+ end
75
+
76
+ it 'handles disruption failure gracefully' do
77
+ chamber_result = client.create_chamber(label: 'fortified', wall_thickness: 0.9)
78
+ chamber_id = chamber_result[:chamber][:id]
79
+
80
+ result = client.disrupt(chamber_id: chamber_id, force: 0.1)
81
+ expect(result[:success]).to be false
82
+ end
83
+ end
84
+ end