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,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Archaeology
8
+ module Runners
9
+ module CognitiveArchaeology
10
+ extend self
11
+
12
+ def create_site(domain:, engine: nil, **)
13
+ eng = resolve_engine(engine)
14
+ site = eng.create_site(domain: domain)
15
+ { success: true, site: site.survey }
16
+ rescue ArgumentError => e
17
+ { success: false, error: e.message }
18
+ end
19
+
20
+ def dig(site_id:, engine: nil, **)
21
+ eng = resolve_engine(engine)
22
+ result = eng.dig(site_id: site_id)
23
+ { success: true }.merge(result)
24
+ rescue ArgumentError => e
25
+ { success: false, error: e.message }
26
+ end
27
+
28
+ def excavate(site_id:, engine: nil, **)
29
+ eng = resolve_engine(engine)
30
+ artifact = eng.excavate(site_id: site_id)
31
+ { success: true, artifact: artifact.to_h }
32
+ rescue ArgumentError => e
33
+ { success: false, error: e.message }
34
+ end
35
+
36
+ def restore_artifact(artifact_id:, boost: 0.15, engine: nil, **)
37
+ eng = resolve_engine(engine)
38
+ artifact = eng.restore_artifact(
39
+ artifact_id: artifact_id, boost: boost
40
+ )
41
+ { success: true, artifact: artifact.to_h }
42
+ rescue ArgumentError => e
43
+ { success: false, error: e.message }
44
+ end
45
+
46
+ def list_artifacts(engine: nil, type: nil, domain: nil,
47
+ depth_level: nil, **)
48
+ eng = resolve_engine(engine)
49
+ results = filter_results(eng.all_artifacts,
50
+ type: type, domain: domain,
51
+ depth_level: depth_level)
52
+ { success: true, artifacts: results.map(&:to_h),
53
+ count: results.size }
54
+ end
55
+
56
+ def archaeology_status(engine: nil, **)
57
+ eng = resolve_engine(engine)
58
+ { success: true, report: eng.archaeology_report }
59
+ end
60
+
61
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
62
+
63
+ private
64
+
65
+ def filter_results(artifacts, type:, domain:, depth_level:)
66
+ r = artifacts
67
+ r = r.select { |a| a.artifact_type == type.to_sym } if type
68
+ r = r.select { |a| a.domain == domain.to_sym } if domain
69
+ r = r.select { |a| a.depth_level == depth_level.to_sym } if depth_level
70
+ r
71
+ end
72
+
73
+ def resolve_engine(engine)
74
+ engine || default_engine
75
+ end
76
+
77
+ def default_engine
78
+ @default_engine ||= Helpers::ArchaeologyEngine.new
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ 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 Archaeology
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ require_relative 'archaeology/version'
6
+ require_relative 'archaeology/helpers/constants'
7
+ require_relative 'archaeology/helpers/artifact'
8
+ require_relative 'archaeology/helpers/excavation_site'
9
+ require_relative 'archaeology/helpers/archaeology_engine'
10
+ require_relative 'archaeology/runners/cognitive_archaeology'
11
+ require_relative 'archaeology/client'
12
+
13
+ module Legion
14
+ module Extensions
15
+ module Agentic
16
+ module Memory
17
+ module Archaeology
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Compression
8
+ class Client
9
+ include Runners::CognitiveCompression
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Compression
8
+ module Helpers
9
+ class CompressionEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @chunks = {}
14
+ @abstractions = {}
15
+ end
16
+
17
+ def store_chunk(label:, chunk_type: :semantic, original_size: 1.0)
18
+ prune_chunks_if_needed
19
+ chunk = InformationChunk.new(label: label, chunk_type: chunk_type,
20
+ original_size: original_size)
21
+ @chunks[chunk.id] = chunk
22
+ chunk
23
+ end
24
+
25
+ def compress_chunk(chunk_id:, amount: COMPRESSION_RATE)
26
+ chunk = @chunks[chunk_id]
27
+ return nil unless chunk
28
+
29
+ chunk.compress!(amount: amount)
30
+ end
31
+
32
+ def decompress_chunk(chunk_id:, amount: COMPRESSION_RATE)
33
+ chunk = @chunks[chunk_id]
34
+ return nil unless chunk
35
+
36
+ chunk.decompress!(amount: amount)
37
+ end
38
+
39
+ def abstract_chunks(chunk_ids:, abstraction_label:)
40
+ prune_abstractions_if_needed
41
+ chunks = chunk_ids.filter_map { |id| @chunks[id] }
42
+ return nil if chunks.empty?
43
+
44
+ combined_size = chunks.sum(&:compressed_size)
45
+ abstraction = InformationChunk.new(
46
+ label: abstraction_label,
47
+ chunk_type: :abstract,
48
+ original_size: combined_size
49
+ )
50
+ avg_fidelity = (chunks.sum(&:fidelity) / chunks.size).round(10)
51
+ abstraction.compress!(amount: DEFAULT_COMPRESSION_RATIO)
52
+ @abstractions[abstraction.id] = {
53
+ chunk: abstraction,
54
+ source_ids: chunk_ids,
55
+ fidelity: avg_fidelity
56
+ }
57
+ abstraction
58
+ end
59
+
60
+ def compress_all(amount: COMPRESSION_RATE)
61
+ @chunks.each_value { |c| c.compress!(amount: amount) }
62
+ @chunks.size
63
+ end
64
+
65
+ def chunks_by_type(chunk_type:)
66
+ ct = chunk_type.to_sym
67
+ @chunks.values.select { |c| c.chunk_type == ct }
68
+ end
69
+
70
+ def highly_compressed_chunks
71
+ @chunks.values.select(&:highly_compressed?)
72
+ end
73
+
74
+ def average_compression_ratio
75
+ return 0.0 if @chunks.empty?
76
+
77
+ ratios = @chunks.values.map(&:compression_ratio)
78
+ (ratios.sum / ratios.size).round(10)
79
+ end
80
+
81
+ def average_fidelity
82
+ return 1.0 if @chunks.empty?
83
+
84
+ fids = @chunks.values.map(&:fidelity)
85
+ (fids.sum / fids.size).round(10)
86
+ end
87
+
88
+ def total_original_size
89
+ @chunks.values.sum(&:original_size).round(10)
90
+ end
91
+
92
+ def total_compressed_size
93
+ @chunks.values.sum(&:compressed_size).round(10)
94
+ end
95
+
96
+ def overall_compression_ratio
97
+ return 0.0 if total_original_size.zero?
98
+
99
+ (1.0 - (total_compressed_size / total_original_size)).clamp(0.0, 1.0).round(10)
100
+ end
101
+
102
+ def compression_report
103
+ {
104
+ total_chunks: @chunks.size,
105
+ total_abstractions: @abstractions.size,
106
+ average_compression_ratio: average_compression_ratio,
107
+ overall_compression_ratio: overall_compression_ratio,
108
+ average_fidelity: average_fidelity,
109
+ total_original_size: total_original_size,
110
+ total_compressed_size: total_compressed_size,
111
+ highly_compressed_count: highly_compressed_chunks.size
112
+ }
113
+ end
114
+
115
+ def to_h
116
+ {
117
+ total_chunks: @chunks.size,
118
+ total_abstractions: @abstractions.size,
119
+ average_compression_ratio: average_compression_ratio,
120
+ average_fidelity: average_fidelity
121
+ }
122
+ end
123
+
124
+ private
125
+
126
+ def prune_chunks_if_needed
127
+ return if @chunks.size < MAX_CHUNKS
128
+
129
+ oldest = @chunks.values.min_by(&:created_at)
130
+ @chunks.delete(oldest.id) if oldest
131
+ end
132
+
133
+ def prune_abstractions_if_needed
134
+ return if @abstractions.size < MAX_ABSTRACTIONS
135
+
136
+ oldest_key = @abstractions.min_by { |_, v| v[:chunk].created_at }&.first
137
+ @abstractions.delete(oldest_key) if oldest_key
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Compression
8
+ module Helpers
9
+ module Constants
10
+ MAX_CHUNKS = 500
11
+ MAX_ABSTRACTIONS = 200
12
+
13
+ DEFAULT_COMPRESSION_RATIO = 0.5
14
+ COMPRESSION_RATE = 0.1
15
+ FIDELITY_LOSS_RATE = 0.02
16
+ MIN_FIDELITY = 0.1
17
+
18
+ COMPRESSION_LABELS = {
19
+ (0.8..) => :highly_compressed,
20
+ (0.6...0.8) => :compressed,
21
+ (0.4...0.6) => :moderate,
22
+ (0.2...0.4) => :detailed,
23
+ (..0.2) => :raw
24
+ }.freeze
25
+
26
+ FIDELITY_LABELS = {
27
+ (0.8..) => :pristine,
28
+ (0.6...0.8) => :faithful,
29
+ (0.4...0.6) => :approximate,
30
+ (0.2...0.4) => :lossy,
31
+ (..0.2) => :degraded
32
+ }.freeze
33
+
34
+ CHUNK_TYPES = %i[
35
+ episodic semantic procedural sensory
36
+ emotional abstract relational
37
+ ].freeze
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module Compression
10
+ module Helpers
11
+ class InformationChunk
12
+ include Constants
13
+
14
+ attr_reader :id, :label, :chunk_type, :original_size, :compressed_size,
15
+ :fidelity, :compression_count, :created_at
16
+
17
+ def initialize(label:, chunk_type: :semantic, original_size: 1.0)
18
+ @id = SecureRandom.uuid
19
+ @label = label
20
+ @chunk_type = chunk_type.to_sym
21
+ @original_size = [original_size.to_f, 0.01].max
22
+ @compressed_size = @original_size
23
+ @fidelity = 1.0
24
+ @compression_count = 0
25
+ @created_at = Time.now.utc
26
+ end
27
+
28
+ def compression_ratio
29
+ return 0.0 if @original_size.zero?
30
+
31
+ (1.0 - (@compressed_size / @original_size)).clamp(0.0, 1.0).round(10)
32
+ end
33
+
34
+ def compress!(amount: COMPRESSION_RATE)
35
+ @compressed_size = (@compressed_size * (1.0 - amount)).clamp(0.01, @original_size).round(10)
36
+ @fidelity = (@fidelity - FIDELITY_LOSS_RATE).clamp(MIN_FIDELITY, 1.0).round(10)
37
+ @compression_count += 1
38
+ self
39
+ end
40
+
41
+ def decompress!(amount: COMPRESSION_RATE)
42
+ @compressed_size = (@compressed_size / (1.0 - amount)).clamp(0.01, @original_size).round(10)
43
+ self
44
+ end
45
+
46
+ def highly_compressed?
47
+ compression_ratio >= 0.8
48
+ end
49
+
50
+ def compression_label
51
+ match = COMPRESSION_LABELS.find { |range, _| range.cover?(compression_ratio) }
52
+ match ? match.last : :raw
53
+ end
54
+
55
+ def fidelity_label
56
+ match = FIDELITY_LABELS.find { |range, _| range.cover?(@fidelity) }
57
+ match ? match.last : :degraded
58
+ end
59
+
60
+ def to_h
61
+ {
62
+ id: @id,
63
+ label: @label,
64
+ chunk_type: @chunk_type,
65
+ original_size: @original_size,
66
+ compressed_size: @compressed_size,
67
+ compression_ratio: compression_ratio,
68
+ compression_label: compression_label,
69
+ fidelity: @fidelity,
70
+ fidelity_label: fidelity_label,
71
+ compression_count: @compression_count,
72
+ created_at: @created_at
73
+ }
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ 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 Compression
8
+ module Runners
9
+ module CognitiveCompression
10
+ include Helpers::Constants
11
+
12
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
13
+
14
+ def store_chunk(label:, engine: nil, chunk_type: :semantic, original_size: 1.0, **)
15
+ eng = engine || default_engine
16
+ chunk = eng.store_chunk(label: label, chunk_type: chunk_type, original_size: original_size)
17
+ { success: true, chunk: chunk.to_h }
18
+ end
19
+
20
+ def compress_chunk(chunk_id:, engine: nil, amount: COMPRESSION_RATE, **)
21
+ eng = engine || default_engine
22
+ result = eng.compress_chunk(chunk_id: chunk_id, amount: amount)
23
+ return { success: false, error: 'chunk not found' } unless result
24
+
25
+ { success: true, chunk: result.to_h }
26
+ end
27
+
28
+ def decompress_chunk(chunk_id:, engine: nil, amount: COMPRESSION_RATE, **)
29
+ eng = engine || default_engine
30
+ result = eng.decompress_chunk(chunk_id: chunk_id, amount: amount)
31
+ return { success: false, error: 'chunk not found' } unless result
32
+
33
+ { success: true, chunk: result.to_h }
34
+ end
35
+
36
+ def abstract_chunks(chunk_ids:, abstraction_label:, engine: nil, **)
37
+ eng = engine || default_engine
38
+ result = eng.abstract_chunks(chunk_ids: chunk_ids, abstraction_label: abstraction_label)
39
+ return { success: false, error: 'no valid chunks' } unless result
40
+
41
+ { success: true, abstraction: result.to_h }
42
+ end
43
+
44
+ def compress_all(engine: nil, amount: COMPRESSION_RATE, **)
45
+ eng = engine || default_engine
46
+ count = eng.compress_all(amount: amount)
47
+ { success: true, compressed_count: count }
48
+ end
49
+
50
+ def average_fidelity(engine: nil, **)
51
+ eng = engine || default_engine
52
+ { success: true, fidelity: eng.average_fidelity }
53
+ end
54
+
55
+ def overall_compression_ratio(engine: nil, **)
56
+ eng = engine || default_engine
57
+ { success: true, ratio: eng.overall_compression_ratio }
58
+ end
59
+
60
+ def compression_report(engine: nil, **)
61
+ eng = engine || default_engine
62
+ { success: true, report: eng.compression_report }
63
+ end
64
+
65
+ private
66
+
67
+ def default_engine
68
+ @default_engine ||= Helpers::CompressionEngine.new
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 Compression
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'compression/version'
4
+ require_relative 'compression/helpers/constants'
5
+ require_relative 'compression/helpers/information_chunk'
6
+ require_relative 'compression/helpers/compression_engine'
7
+ require_relative 'compression/runners/cognitive_compression'
8
+ require_relative 'compression/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Memory
14
+ module Compression
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Echo
8
+ class Client
9
+ include Runners::CognitiveEcho
10
+
11
+ def initialize(engine: nil)
12
+ @default_engine = engine || Helpers::EchoEngine.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Memory
7
+ module Echo
8
+ module Helpers
9
+ module Constants
10
+ MAX_ECHOES = 300
11
+ MAX_INTERACTIONS = 500
12
+ DEFAULT_INTENSITY = 0.8
13
+ ECHO_DECAY = 0.1
14
+ REINFORCEMENT = 0.15
15
+ INTERFERENCE_THRESHOLD = 0.4
16
+ PRIMING_THRESHOLD = 0.3
17
+ SILENT_THRESHOLD = 0.05
18
+
19
+ ECHO_TYPES = %i[
20
+ thought emotion decision observation
21
+ prediction error success failure
22
+ ].freeze
23
+
24
+ INTENSITY_LABELS = {
25
+ (0.8..) => :reverberating,
26
+ (0.6...0.8) => :strong,
27
+ (0.4...0.6) => :moderate,
28
+ (0.2...0.4) => :fading,
29
+ (..0.2) => :whisper
30
+ }.freeze
31
+
32
+ EFFECT_LABELS = {
33
+ (0.6..) => :dominant,
34
+ (0.3...0.6) => :influential,
35
+ (0.1...0.3) => :subtle,
36
+ (..0.1) => :negligible
37
+ }.freeze
38
+
39
+ CHAMBER_LABELS = {
40
+ (0.8..) => :echo_chamber,
41
+ (0.6...0.8) => :resonant,
42
+ (0.4...0.6) => :balanced,
43
+ (0.2...0.4) => :diverse,
44
+ (..0.2) => :scattered
45
+ }.freeze
46
+
47
+ def self.label_for(labels, value)
48
+ match = labels.find { |range, _| range.cover?(value) }
49
+ match&.last
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Memory
9
+ module Echo
10
+ module Helpers
11
+ class Echo
12
+ include Constants
13
+
14
+ attr_reader :id, :content, :echo_type, :domain, :intensity,
15
+ :original_intensity, :decay_count, :created_at
16
+
17
+ def initialize(content:, echo_type: :thought, domain: :general, intensity: DEFAULT_INTENSITY)
18
+ @id = SecureRandom.uuid
19
+ @content = content
20
+ @echo_type = validate_type(echo_type)
21
+ @domain = domain.to_sym
22
+ @intensity = intensity.to_f.clamp(0.0, 1.0).round(10)
23
+ @original_intensity = @intensity
24
+ @decay_count = 0
25
+ @created_at = Time.now.utc
26
+ end
27
+
28
+ def decay!
29
+ @decay_count += 1
30
+ @intensity = (@intensity - ECHO_DECAY).clamp(0.0, 1.0).round(10)
31
+ self
32
+ end
33
+
34
+ def reinforce!(amount = REINFORCEMENT)
35
+ @intensity = (@intensity + amount).clamp(0.0, 1.0).round(10)
36
+ self
37
+ end
38
+
39
+ def silent?
40
+ @intensity <= SILENT_THRESHOLD
41
+ end
42
+
43
+ def active?
44
+ @intensity > SILENT_THRESHOLD
45
+ end
46
+
47
+ def priming?
48
+ @intensity >= PRIMING_THRESHOLD
49
+ end
50
+
51
+ def interfering?
52
+ @intensity >= INTERFERENCE_THRESHOLD
53
+ end
54
+
55
+ def persistence
56
+ return 0.0 if @original_intensity.zero?
57
+
58
+ (@intensity / @original_intensity).clamp(0.0, 1.0).round(10)
59
+ end
60
+
61
+ def intensity_label = Constants.label_for(INTENSITY_LABELS, @intensity)
62
+ def effect_label = Constants.label_for(EFFECT_LABELS, @intensity)
63
+
64
+ def to_h
65
+ {
66
+ id: @id,
67
+ content: @content,
68
+ echo_type: @echo_type,
69
+ domain: @domain,
70
+ intensity: @intensity,
71
+ original_intensity: @original_intensity,
72
+ intensity_label: intensity_label,
73
+ effect_label: effect_label,
74
+ priming: priming?,
75
+ interfering: interfering?,
76
+ silent: silent?,
77
+ persistence: persistence,
78
+ decay_count: @decay_count,
79
+ created_at: @created_at
80
+ }
81
+ end
82
+
83
+ private
84
+
85
+ def validate_type(type)
86
+ sym = type.to_sym
87
+ ECHO_TYPES.include?(sym) ? sym : :thought
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end