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,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module ImmuneMemory
8
+ class Client
9
+ include Runners::CognitiveImmuneMemory
10
+
11
+ def initialize
12
+ @default_engine = Helpers::ImmuneMemoryEngine.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module ImmuneMemory
8
+ module Helpers
9
+ module Constants
10
+ MAX_MEMORY_CELLS = 500
11
+ MAX_ENCOUNTERS = 1000
12
+ MAX_ANTIBODY_LIBRARY = 300
13
+
14
+ # T-cell parameters (cell-mediated: direct threat neutralization)
15
+ T_CELL_ACTIVATION_THRESHOLD = 0.4
16
+ T_CELL_BOOST = 0.12
17
+ T_CELL_DECAY = 0.01
18
+ T_CELL_LIFESPAN = 100 # decay cycles before expiry check
19
+
20
+ # B-cell parameters (humoral: antibody production)
21
+ B_CELL_ACTIVATION_THRESHOLD = 0.3
22
+ B_CELL_BOOST = 0.1
23
+ B_CELL_DECAY = 0.008
24
+ B_CELL_ANTIBODY_PRODUCTION = 0.15
25
+
26
+ # Secondary response amplification
27
+ PRIMARY_RESPONSE_SPEED = 1.0
28
+ SECONDARY_RESPONSE_SPEED = 3.0
29
+ MEMORY_RECOGNITION_THRESHOLD = 0.6
30
+
31
+ # Vaccination (pre-exposure)
32
+ VACCINATION_STRENGTH = 0.5
33
+
34
+ THREAT_TYPES = %i[
35
+ prompt_injection data_poisoning social_engineering
36
+ resource_exhaustion privilege_escalation information_leak
37
+ logic_manipulation identity_spoofing
38
+ ].freeze
39
+
40
+ CELL_TYPES = %i[t_helper t_killer b_memory b_plasma].freeze
41
+
42
+ IMMUNITY_LABELS = {
43
+ (0.8..) => :immune,
44
+ (0.6...0.8) => :resistant,
45
+ (0.4...0.6) => :partial,
46
+ (0.2...0.4) => :vulnerable,
47
+ (..0.2) => :naive
48
+ }.freeze
49
+
50
+ RESPONSE_SPEED_LABELS = {
51
+ (2.5..) => :lightning,
52
+ (1.8...2.5) => :rapid,
53
+ (1.0...1.8) => :normal,
54
+ (0.5...1.0) => :slow,
55
+ (..0.5) => :impaired
56
+ }.freeze
57
+
58
+ HEALTH_LABELS = {
59
+ (0.8..) => :robust,
60
+ (0.6...0.8) => :healthy,
61
+ (0.4...0.6) => :adequate,
62
+ (0.2...0.4) => :weakened,
63
+ (..0.2) => :compromised
64
+ }.freeze
65
+
66
+ MATURITY_LABELS = {
67
+ (0.8..) => :veteran,
68
+ (0.6...0.8) => :experienced,
69
+ (0.4...0.6) => :developing,
70
+ (0.2...0.4) => :immature,
71
+ (..0.2) => :naive
72
+ }.freeze
73
+
74
+ def self.label_for(labels, value)
75
+ labels.each { |range, label| return label if range.cover?(value) }
76
+ :unknown
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module ImmuneMemory
10
+ module Helpers
11
+ class Encounter
12
+ include Constants
13
+
14
+ attr_reader :id, :threat_type, :threat_signature, :severity,
15
+ :response_type, :response_speed, :outcome, :created_at
16
+
17
+ def initialize(threat_type:, threat_signature:, severity: 0.5, response_type: :primary,
18
+ response_speed: PRIMARY_RESPONSE_SPEED, outcome: :neutralized)
19
+ @id = SecureRandom.uuid
20
+ @threat_type = threat_type.to_sym
21
+ @threat_signature = threat_signature.to_s
22
+ @severity = severity.to_f.clamp(0.0, 1.0)
23
+ @response_type = response_type.to_sym
24
+ @response_speed = response_speed.to_f.round(10)
25
+ @outcome = outcome.to_sym
26
+ @created_at = Time.now
27
+ end
28
+
29
+ def secondary? = @response_type == :secondary
30
+ def primary? = @response_type == :primary
31
+ def neutralized? = @outcome == :neutralized
32
+ def evaded? = @outcome == :evaded
33
+ def critical? = @severity >= 0.8
34
+
35
+ def to_h
36
+ {
37
+ id: @id,
38
+ threat_type: @threat_type,
39
+ threat_signature: @threat_signature,
40
+ severity: @severity,
41
+ response_type: @response_type,
42
+ response_speed: @response_speed,
43
+ outcome: @outcome,
44
+ critical: critical?,
45
+ created_at: @created_at.iso8601
46
+ }
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module ImmuneMemory
8
+ module Helpers
9
+ class ImmuneMemoryEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @memory_cells = {}
14
+ @encounters = []
15
+ end
16
+
17
+ def create_memory_cell(threat_type:, signature:, cell_type: :b_memory, strength: VACCINATION_STRENGTH)
18
+ prune_expired
19
+ cell = MemoryCell.new(threat_type: threat_type, signature: signature,
20
+ cell_type: cell_type, strength: strength)
21
+ @memory_cells[cell.id] = cell
22
+ cell
23
+ end
24
+
25
+ def vaccinate(threat_type:, signature:, strength: VACCINATION_STRENGTH)
26
+ existing = find_by_signature(signature)
27
+ return existing.activate! if existing
28
+
29
+ create_memory_cell(threat_type: threat_type, signature: signature,
30
+ cell_type: :b_memory, strength: strength)
31
+ end
32
+
33
+ def encounter_threat(threat_type:, threat_signature:, severity: 0.5)
34
+ matching = find_by_signature(threat_signature)
35
+ response_type = matching ? :secondary : :primary
36
+ speed = matching ? matching.response_speed : PRIMARY_RESPONSE_SPEED
37
+ outcome = determine_outcome(matching, severity)
38
+
39
+ matching&.activate!
40
+
41
+ record = Encounter.new(
42
+ threat_type: threat_type, threat_signature: threat_signature,
43
+ severity: severity, response_type: response_type,
44
+ response_speed: speed, outcome: outcome
45
+ )
46
+ @encounters << record
47
+ prune_encounters
48
+
49
+ unless matching
50
+ create_memory_cell(threat_type: threat_type, signature: threat_signature,
51
+ cell_type: :b_memory, strength: B_CELL_ACTIVATION_THRESHOLD)
52
+ end
53
+
54
+ record
55
+ end
56
+
57
+ def decay_all!
58
+ @memory_cells.each_value(&:decay!)
59
+ prune_expired
60
+ { cells_remaining: @memory_cells.size }
61
+ end
62
+
63
+ def find_by_signature(signature)
64
+ @memory_cells.values.find { |c| c.signature == signature.to_s && !c.expired? }
65
+ end
66
+
67
+ def cells_for_threat(threat_type:)
68
+ @memory_cells.values.select { |c| c.threat_type == threat_type.to_sym && !c.expired? }
69
+ end
70
+
71
+ def immunity_for(threat_type:)
72
+ cells = cells_for_threat(threat_type: threat_type)
73
+ return 0.0 if cells.empty?
74
+
75
+ cells.max_by(&:strength).strength
76
+ end
77
+
78
+ def active_cells = @memory_cells.values.reject(&:expired?)
79
+ def t_cells = @memory_cells.values.select(&:t_cell?)
80
+ def b_cells = @memory_cells.values.select(&:b_cell?)
81
+ def veteran_cells = @memory_cells.values.select(&:veteran?)
82
+ def naive_cells = @memory_cells.values.select(&:naive?)
83
+
84
+ def encounters_for(threat_type:)
85
+ @encounters.select { |e| e.threat_type == threat_type.to_sym }
86
+ end
87
+
88
+ def secondary_response_rate
89
+ return 0.0 if @encounters.empty?
90
+
91
+ secondary = @encounters.count(&:secondary?)
92
+ (secondary.to_f / @encounters.size).round(10)
93
+ end
94
+
95
+ def neutralization_rate
96
+ return 0.0 if @encounters.empty?
97
+
98
+ neutralized = @encounters.count(&:neutralized?)
99
+ (neutralized.to_f / @encounters.size).round(10)
100
+ end
101
+
102
+ def average_response_speed
103
+ return PRIMARY_RESPONSE_SPEED if @encounters.empty?
104
+
105
+ (@encounters.sum(&:response_speed) / @encounters.size).round(10)
106
+ end
107
+
108
+ def threat_coverage
109
+ known_types = @memory_cells.values.map(&:threat_type).uniq
110
+ (known_types.size.to_f / THREAT_TYPES.size).clamp(0.0, 1.0).round(10)
111
+ end
112
+
113
+ def overall_health
114
+ return 0.0 if @memory_cells.empty?
115
+
116
+ avg_strength = (@memory_cells.values.sum(&:strength) / @memory_cells.size).round(10)
117
+ coverage_factor = threat_coverage
118
+ ((avg_strength * 0.6) + (coverage_factor * 0.4)).clamp(0.0, 1.0).round(10)
119
+ end
120
+
121
+ def health_label = Constants.label_for(HEALTH_LABELS, overall_health)
122
+
123
+ def immune_report
124
+ {
125
+ total_cells: @memory_cells.size,
126
+ active_cells: active_cells.size,
127
+ t_cells: t_cells.size,
128
+ b_cells: b_cells.size,
129
+ veteran_cells: veteran_cells.size,
130
+ total_encounters: @encounters.size,
131
+ secondary_response_rate: secondary_response_rate,
132
+ neutralization_rate: neutralization_rate,
133
+ average_response_speed: average_response_speed,
134
+ threat_coverage: threat_coverage,
135
+ overall_health: overall_health,
136
+ health_label: health_label
137
+ }
138
+ end
139
+
140
+ def to_h
141
+ {
142
+ total_cells: @memory_cells.size,
143
+ active: active_cells.size,
144
+ encounters: @encounters.size,
145
+ health: overall_health,
146
+ threat_coverage: threat_coverage
147
+ }
148
+ end
149
+
150
+ private
151
+
152
+ def determine_outcome(matching_cell, severity)
153
+ return :neutralized if matching_cell && matching_cell.strength >= severity
154
+
155
+ severity < 0.5 ? :neutralized : :evaded
156
+ end
157
+
158
+ def prune_expired
159
+ @memory_cells.reject! { |_, c| c.expired? } if @memory_cells.size >= MAX_MEMORY_CELLS
160
+ end
161
+
162
+ def prune_encounters
163
+ @encounters.shift while @encounters.size > MAX_ENCOUNTERS
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module ImmuneMemory
10
+ module Helpers
11
+ class MemoryCell
12
+ include Constants
13
+
14
+ attr_reader :id, :threat_type, :signature, :cell_type, :created_at,
15
+ :encounter_count, :decay_cycles
16
+ attr_accessor :strength
17
+
18
+ def initialize(threat_type:, signature:, cell_type: :b_memory, strength: VACCINATION_STRENGTH)
19
+ @id = SecureRandom.uuid
20
+ @threat_type = threat_type.to_sym
21
+ @signature = signature.to_s
22
+ @cell_type = valid_cell_type(cell_type)
23
+ @strength = strength.to_f.clamp(0.0, 1.0)
24
+ @encounter_count = 0
25
+ @decay_cycles = 0
26
+ @created_at = Time.now
27
+ end
28
+
29
+ def activate!
30
+ @encounter_count += 1
31
+ boost = t_cell? ? T_CELL_BOOST : B_CELL_BOOST
32
+ @strength = (@strength + boost).clamp(0.0, 1.0).round(10)
33
+ @decay_cycles = 0
34
+ self
35
+ end
36
+
37
+ def decay!
38
+ @decay_cycles += 1
39
+ rate = t_cell? ? T_CELL_DECAY : B_CELL_DECAY
40
+ @strength = (@strength - rate).clamp(0.0, 1.0).round(10)
41
+ self
42
+ end
43
+
44
+ def recognizes?(threat_signature)
45
+ @signature == threat_signature.to_s && @strength >= MEMORY_RECOGNITION_THRESHOLD
46
+ end
47
+
48
+ def t_cell? = %i[t_helper t_killer].include?(@cell_type)
49
+ def b_cell? = %i[b_memory b_plasma].include?(@cell_type)
50
+ def expired? = @strength <= 0.0
51
+ def veteran? = @encounter_count >= 5
52
+ def naive? = @encounter_count.zero?
53
+ def active? = @strength > T_CELL_ACTIVATION_THRESHOLD
54
+
55
+ def response_speed
56
+ return PRIMARY_RESPONSE_SPEED if naive?
57
+
58
+ (PRIMARY_RESPONSE_SPEED + (@encounter_count * 0.4)).clamp(1.0, SECONDARY_RESPONSE_SPEED).round(10)
59
+ end
60
+
61
+ def maturity = (@encounter_count / 10.0).clamp(0.0, 1.0).round(10)
62
+ def maturity_label = Constants.label_for(MATURITY_LABELS, maturity)
63
+ def immunity_label = Constants.label_for(IMMUNITY_LABELS, @strength)
64
+ def speed_label = Constants.label_for(RESPONSE_SPEED_LABELS, response_speed)
65
+
66
+ def to_h
67
+ {
68
+ id: @id,
69
+ threat_type: @threat_type,
70
+ signature: @signature,
71
+ cell_type: @cell_type,
72
+ strength: @strength,
73
+ encounter_count: @encounter_count,
74
+ decay_cycles: @decay_cycles,
75
+ response_speed: response_speed,
76
+ immunity_label: immunity_label,
77
+ maturity_label: maturity_label,
78
+ t_cell: t_cell?,
79
+ b_cell: b_cell?,
80
+ expired: expired?,
81
+ created_at: @created_at.iso8601
82
+ }
83
+ end
84
+
85
+ private
86
+
87
+ def valid_cell_type(type)
88
+ sym = type.to_sym
89
+ CELL_TYPES.include?(sym) ? sym : :b_memory
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module ImmuneMemory
8
+ module Runners
9
+ module CognitiveImmuneMemory
10
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
11
+
12
+ def create_memory_cell(threat_type:, signature:, cell_type: :b_memory, strength: nil, engine: nil, **)
13
+ eng = engine || @default_engine
14
+ cell = eng.create_memory_cell(threat_type: threat_type, signature: signature,
15
+ cell_type: cell_type,
16
+ strength: strength || Helpers::Constants::VACCINATION_STRENGTH)
17
+ { success: true, cell: cell.to_h }
18
+ end
19
+
20
+ def vaccinate(threat_type:, signature:, strength: nil, engine: nil, **)
21
+ eng = engine || @default_engine
22
+ cell = eng.vaccinate(threat_type: threat_type, signature: signature,
23
+ strength: strength || Helpers::Constants::VACCINATION_STRENGTH)
24
+ { success: true, cell: cell.to_h }
25
+ end
26
+
27
+ def encounter_threat(threat_type:, threat_signature:, severity: 0.5, engine: nil, **)
28
+ eng = engine || @default_engine
29
+ record = eng.encounter_threat(threat_type: threat_type, threat_signature: threat_signature,
30
+ severity: severity)
31
+ { success: true, encounter: record.to_h }
32
+ end
33
+
34
+ def decay_all(engine: nil, **)
35
+ eng = engine || @default_engine
36
+ result = eng.decay_all!
37
+ { success: true, **result }
38
+ end
39
+
40
+ def immunity_for(threat_type:, engine: nil, **)
41
+ eng = engine || @default_engine
42
+ immunity = eng.immunity_for(threat_type: threat_type)
43
+ label = Helpers::Constants.label_for(Helpers::Constants::IMMUNITY_LABELS, immunity)
44
+ { success: true, threat_type: threat_type, immunity: immunity, label: label }
45
+ end
46
+
47
+ def active_cells(engine: nil, **)
48
+ eng = engine || @default_engine
49
+ cells = eng.active_cells
50
+ { success: true, count: cells.size, cells: cells.map(&:to_h) }
51
+ end
52
+
53
+ def veteran_cells(engine: nil, **)
54
+ eng = engine || @default_engine
55
+ cells = eng.veteran_cells
56
+ { success: true, count: cells.size, cells: cells.map(&:to_h) }
57
+ end
58
+
59
+ def threat_coverage(engine: nil, **)
60
+ eng = engine || @default_engine
61
+ coverage = eng.threat_coverage
62
+ { success: true, coverage: coverage }
63
+ end
64
+
65
+ def immune_status(engine: nil, **)
66
+ eng = engine || @default_engine
67
+ report = eng.immune_report
68
+ { success: true, **report }
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module ImmuneMemory
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'immune_memory/version'
4
+ require_relative 'immune_memory/helpers/constants'
5
+ require_relative 'immune_memory/helpers/memory_cell'
6
+ require_relative 'immune_memory/helpers/encounter'
7
+ require_relative 'immune_memory/helpers/immune_memory_engine'
8
+ require_relative 'immune_memory/runners/cognitive_immune_memory'
9
+ require_relative 'immune_memory/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Memory
15
+ module ImmuneMemory
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/nostalgia/helpers/constants'
4
+ require 'legion/extensions/agentic/memory/nostalgia/helpers/nostalgic_memory'
5
+ require 'legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_event'
6
+ require 'legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_engine'
7
+ require 'legion/extensions/agentic/memory/nostalgia/runners/recall'
8
+ require 'legion/extensions/agentic/memory/nostalgia/runners/analysis'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Memory
14
+ module Nostalgia
15
+ class Client
16
+ include Runners::Recall
17
+ include Runners::Analysis
18
+
19
+ def initialize(engine: nil)
20
+ @nostalgia_engine = engine || Helpers::NostalgiaEngine.new
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :nostalgia_engine
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Nostalgia
8
+ module Helpers
9
+ module Constants
10
+ MAX_MEMORIES = 300
11
+ MAX_EVENTS = 500
12
+ DEFAULT_WARMTH = 0.3
13
+ WARMTH_GROWTH = 0.02
14
+ WARMTH_CEILING = 0.95
15
+ WARMTH_DECAY = 0.01
16
+ TRIGGER_SENSITIVITY = 0.3
17
+ ROSY_THRESHOLD = 0.6
18
+ BITTERSWEET_THRESHOLD = 0.5
19
+
20
+ MEMORY_DOMAINS = %i[
21
+ relationship
22
+ place
23
+ achievement
24
+ routine
25
+ season
26
+ collaboration
27
+ challenge
28
+ unknown
29
+ ].freeze
30
+
31
+ WARMTH_LABELS = {
32
+ 0.0..0.2 => :faint,
33
+ 0.2..0.4 => :mild,
34
+ 0.4..0.6 => :warm,
35
+ 0.6..0.8 => :tender,
36
+ 0.8..1.0 => :glowing
37
+ }.freeze
38
+
39
+ NOSTALGIA_LABELS = {
40
+ 0.0..0.2 => :absent,
41
+ 0.2..0.4 => :latent,
42
+ 0.4..0.6 => :stirring,
43
+ 0.6..0.8 => :vivid,
44
+ 0.8..1.0 => :overwhelming
45
+ }.freeze
46
+
47
+ RETROSPECTION_LABELS = {
48
+ 0.0..0.2 => :accurate,
49
+ 0.2..0.4 => :slightly_rose_tinted,
50
+ 0.4..0.6 => :moderately_rose_tinted,
51
+ 0.6..0.8 => :strongly_rose_tinted,
52
+ 0.8..1.0 => :heavily_idealized
53
+ }.freeze
54
+
55
+ def self.label_for(labels_hash, value)
56
+ clamped = value.clamp(0.0, 1.0)
57
+ labels_hash.each do |range, label|
58
+ return label if range.cover?(clamped)
59
+ end
60
+ labels_hash.values.last
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end