lex-agentic-attention 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 (315) 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-attention.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/attention/arousal/client.rb +27 -0
  8. data/lib/legion/extensions/agentic/attention/arousal/helpers/arousal_model.rb +84 -0
  9. data/lib/legion/extensions/agentic/attention/arousal/helpers/constants.rb +44 -0
  10. data/lib/legion/extensions/agentic/attention/arousal/runners/arousal.rb +119 -0
  11. data/lib/legion/extensions/agentic/attention/arousal/version.rb +13 -0
  12. data/lib/legion/extensions/agentic/attention/arousal.rb +18 -0
  13. data/lib/legion/extensions/agentic/attention/blindspot/client.rb +19 -0
  14. data/lib/legion/extensions/agentic/attention/blindspot/helpers/blindspot.rb +98 -0
  15. data/lib/legion/extensions/agentic/attention/blindspot/helpers/blindspot_engine.rb +174 -0
  16. data/lib/legion/extensions/agentic/attention/blindspot/helpers/constants.rb +63 -0
  17. data/lib/legion/extensions/agentic/attention/blindspot/helpers/knowledge_boundary.rb +62 -0
  18. data/lib/legion/extensions/agentic/attention/blindspot/runners/cognitive_blindspot.rb +103 -0
  19. data/lib/legion/extensions/agentic/attention/blindspot/version.rb +13 -0
  20. data/lib/legion/extensions/agentic/attention/blindspot.rb +20 -0
  21. data/lib/legion/extensions/agentic/attention/blink/client.rb +19 -0
  22. data/lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb +171 -0
  23. data/lib/legion/extensions/agentic/attention/blink/helpers/constants.rb +46 -0
  24. data/lib/legion/extensions/agentic/attention/blink/helpers/stimulus.rb +68 -0
  25. data/lib/legion/extensions/agentic/attention/blink/runners/attentional_blink.rb +75 -0
  26. data/lib/legion/extensions/agentic/attention/blink/version.rb +13 -0
  27. data/lib/legion/extensions/agentic/attention/blink.rb +19 -0
  28. data/lib/legion/extensions/agentic/attention/economy/client.rb +28 -0
  29. data/lib/legion/extensions/agentic/attention/economy/helpers/attention_budget.rb +143 -0
  30. data/lib/legion/extensions/agentic/attention/economy/helpers/constants.rb +38 -0
  31. data/lib/legion/extensions/agentic/attention/economy/helpers/demand.rb +72 -0
  32. data/lib/legion/extensions/agentic/attention/economy/runners/attention_economy.rb +90 -0
  33. data/lib/legion/extensions/agentic/attention/economy/version.rb +13 -0
  34. data/lib/legion/extensions/agentic/attention/economy.rb +19 -0
  35. data/lib/legion/extensions/agentic/attention/feature_binding/actors/decay.rb +45 -0
  36. data/lib/legion/extensions/agentic/attention/feature_binding/client.rb +29 -0
  37. data/lib/legion/extensions/agentic/attention/feature_binding/helpers/binding_field.rb +124 -0
  38. data/lib/legion/extensions/agentic/attention/feature_binding/helpers/bound_object.rb +89 -0
  39. data/lib/legion/extensions/agentic/attention/feature_binding/helpers/constants.rb +52 -0
  40. data/lib/legion/extensions/agentic/attention/feature_binding/helpers/feature.rb +52 -0
  41. data/lib/legion/extensions/agentic/attention/feature_binding/runners/feature_binding.rb +102 -0
  42. data/lib/legion/extensions/agentic/attention/feature_binding/version.rb +13 -0
  43. data/lib/legion/extensions/agentic/attention/feature_binding.rb +20 -0
  44. data/lib/legion/extensions/agentic/attention/focus/client.rb +30 -0
  45. data/lib/legion/extensions/agentic/attention/focus/helpers/constants.rb +38 -0
  46. data/lib/legion/extensions/agentic/attention/focus/helpers/focus.rb +78 -0
  47. data/lib/legion/extensions/agentic/attention/focus/helpers/focus_manager.rb +67 -0
  48. data/lib/legion/extensions/agentic/attention/focus/helpers/habituation.rb +61 -0
  49. data/lib/legion/extensions/agentic/attention/focus/runners/attention.rb +121 -0
  50. data/lib/legion/extensions/agentic/attention/focus/version.rb +13 -0
  51. data/lib/legion/extensions/agentic/attention/focus.rb +20 -0
  52. data/lib/legion/extensions/agentic/attention/kaleidoscope/client.rb +15 -0
  53. data/lib/legion/extensions/agentic/attention/kaleidoscope/helpers/constants.rb +48 -0
  54. data/lib/legion/extensions/agentic/attention/kaleidoscope/helpers/facet.rb +90 -0
  55. data/lib/legion/extensions/agentic/attention/kaleidoscope/helpers/kaleidoscope_engine.rb +142 -0
  56. data/lib/legion/extensions/agentic/attention/kaleidoscope/helpers/pattern.rb +110 -0
  57. data/lib/legion/extensions/agentic/attention/kaleidoscope/runners/cognitive_kaleidoscope.rb +91 -0
  58. data/lib/legion/extensions/agentic/attention/kaleidoscope/version.rb +13 -0
  59. data/lib/legion/extensions/agentic/attention/kaleidoscope.rb +22 -0
  60. data/lib/legion/extensions/agentic/attention/latent_inhibition/client.rb +28 -0
  61. data/lib/legion/extensions/agentic/attention/latent_inhibition/helpers/constants.rb +33 -0
  62. data/lib/legion/extensions/agentic/attention/latent_inhibition/helpers/inhibition_engine.rb +118 -0
  63. data/lib/legion/extensions/agentic/attention/latent_inhibition/helpers/stimulus_record.rb +70 -0
  64. data/lib/legion/extensions/agentic/attention/latent_inhibition/runners/latent_inhibition.rb +78 -0
  65. data/lib/legion/extensions/agentic/attention/latent_inhibition/version.rb +13 -0
  66. data/lib/legion/extensions/agentic/attention/latent_inhibition.rb +19 -0
  67. data/lib/legion/extensions/agentic/attention/lens/client.rb +29 -0
  68. data/lib/legion/extensions/agentic/attention/lens/helpers/constants.rb +58 -0
  69. data/lib/legion/extensions/agentic/attention/lens/helpers/lens.rb +99 -0
  70. data/lib/legion/extensions/agentic/attention/lens/helpers/lens_engine.rb +101 -0
  71. data/lib/legion/extensions/agentic/attention/lens/helpers/lens_stack.rb +134 -0
  72. data/lib/legion/extensions/agentic/attention/lens/runners/cognitive_lens.rb +90 -0
  73. data/lib/legion/extensions/agentic/attention/lens/version.rb +13 -0
  74. data/lib/legion/extensions/agentic/attention/lens.rb +22 -0
  75. data/lib/legion/extensions/agentic/attention/lighthouse/client.rb +25 -0
  76. data/lib/legion/extensions/agentic/attention/lighthouse/helpers/beacon.rb +76 -0
  77. data/lib/legion/extensions/agentic/attention/lighthouse/helpers/constants.rb +49 -0
  78. data/lib/legion/extensions/agentic/attention/lighthouse/helpers/fog.rb +74 -0
  79. data/lib/legion/extensions/agentic/attention/lighthouse/helpers/lighthouse_engine.rb +127 -0
  80. data/lib/legion/extensions/agentic/attention/lighthouse/runners/cognitive_lighthouse.rb +80 -0
  81. data/lib/legion/extensions/agentic/attention/lighthouse/version.rb +13 -0
  82. data/lib/legion/extensions/agentic/attention/lighthouse.rb +22 -0
  83. data/lib/legion/extensions/agentic/attention/priming/client.rb +21 -0
  84. data/lib/legion/extensions/agentic/attention/priming/helpers/activation_network.rb +130 -0
  85. data/lib/legion/extensions/agentic/attention/priming/helpers/concept_node.rb +92 -0
  86. data/lib/legion/extensions/agentic/attention/priming/helpers/constants.rb +54 -0
  87. data/lib/legion/extensions/agentic/attention/priming/runners/priming.rb +94 -0
  88. data/lib/legion/extensions/agentic/attention/priming/version.rb +13 -0
  89. data/lib/legion/extensions/agentic/attention/priming.rb +19 -0
  90. data/lib/legion/extensions/agentic/attention/prism/client.rb +26 -0
  91. data/lib/legion/extensions/agentic/attention/prism/helpers/beam.rb +169 -0
  92. data/lib/legion/extensions/agentic/attention/prism/helpers/constants.rb +46 -0
  93. data/lib/legion/extensions/agentic/attention/prism/helpers/prism_engine.rb +136 -0
  94. data/lib/legion/extensions/agentic/attention/prism/helpers/spectral_component.rb +72 -0
  95. data/lib/legion/extensions/agentic/attention/prism/runners/cognitive_prism.rb +79 -0
  96. data/lib/legion/extensions/agentic/attention/prism/version.rb +13 -0
  97. data/lib/legion/extensions/agentic/attention/prism.rb +22 -0
  98. data/lib/legion/extensions/agentic/attention/regulation/client.rb +19 -0
  99. data/lib/legion/extensions/agentic/attention/regulation/helpers/attention_controller.rb +157 -0
  100. data/lib/legion/extensions/agentic/attention/regulation/helpers/attention_target.rb +64 -0
  101. data/lib/legion/extensions/agentic/attention/regulation/helpers/constants.rb +41 -0
  102. data/lib/legion/extensions/agentic/attention/regulation/runners/attention_regulation.rb +88 -0
  103. data/lib/legion/extensions/agentic/attention/regulation/version.rb +13 -0
  104. data/lib/legion/extensions/agentic/attention/regulation.rb +20 -0
  105. data/lib/legion/extensions/agentic/attention/relevance_theory/helpers/client.rb +17 -0
  106. data/lib/legion/extensions/agentic/attention/relevance_theory/helpers/cognitive_input.rb +88 -0
  107. data/lib/legion/extensions/agentic/attention/relevance_theory/helpers/constants.rb +50 -0
  108. data/lib/legion/extensions/agentic/attention/relevance_theory/helpers/relevance_engine.rb +152 -0
  109. data/lib/legion/extensions/agentic/attention/relevance_theory/runners/relevance_theory.rb +98 -0
  110. data/lib/legion/extensions/agentic/attention/relevance_theory/version.rb +13 -0
  111. data/lib/legion/extensions/agentic/attention/relevance_theory.rb +19 -0
  112. data/lib/legion/extensions/agentic/attention/salience/client.rb +21 -0
  113. data/lib/legion/extensions/agentic/attention/salience/helpers/constants.rb +44 -0
  114. data/lib/legion/extensions/agentic/attention/salience/helpers/salience_map.rb +122 -0
  115. data/lib/legion/extensions/agentic/attention/salience/helpers/signal_integrator.rb +97 -0
  116. data/lib/legion/extensions/agentic/attention/salience/runners/salience.rb +70 -0
  117. data/lib/legion/extensions/agentic/attention/salience/version.rb +13 -0
  118. data/lib/legion/extensions/agentic/attention/salience.rb +19 -0
  119. data/lib/legion/extensions/agentic/attention/schema/actors/decay.rb +45 -0
  120. data/lib/legion/extensions/agentic/attention/schema/client.rb +28 -0
  121. data/lib/legion/extensions/agentic/attention/schema/helpers/attention_schema_model.rb +226 -0
  122. data/lib/legion/extensions/agentic/attention/schema/helpers/constants.rb +66 -0
  123. data/lib/legion/extensions/agentic/attention/schema/helpers/schema_item.rb +68 -0
  124. data/lib/legion/extensions/agentic/attention/schema/runners/attention_schema.rb +117 -0
  125. data/lib/legion/extensions/agentic/attention/schema/version.rb +13 -0
  126. data/lib/legion/extensions/agentic/attention/schema.rb +19 -0
  127. data/lib/legion/extensions/agentic/attention/sensory_gating/client.rb +15 -0
  128. data/lib/legion/extensions/agentic/attention/sensory_gating/helpers/constants.rb +44 -0
  129. data/lib/legion/extensions/agentic/attention/sensory_gating/helpers/gating_engine.rb +109 -0
  130. data/lib/legion/extensions/agentic/attention/sensory_gating/helpers/sensory_filter.rb +100 -0
  131. data/lib/legion/extensions/agentic/attention/sensory_gating/runners/sensory_gating.rb +73 -0
  132. data/lib/legion/extensions/agentic/attention/sensory_gating/version.rb +13 -0
  133. data/lib/legion/extensions/agentic/attention/sensory_gating.rb +19 -0
  134. data/lib/legion/extensions/agentic/attention/signal_detection/client.rb +28 -0
  135. data/lib/legion/extensions/agentic/attention/signal_detection/helpers/constants.rb +66 -0
  136. data/lib/legion/extensions/agentic/attention/signal_detection/helpers/detection_engine.rb +129 -0
  137. data/lib/legion/extensions/agentic/attention/signal_detection/helpers/detector.rb +136 -0
  138. data/lib/legion/extensions/agentic/attention/signal_detection/runners/signal_detection.rb +113 -0
  139. data/lib/legion/extensions/agentic/attention/signal_detection/version.rb +13 -0
  140. data/lib/legion/extensions/agentic/attention/signal_detection.rb +19 -0
  141. data/lib/legion/extensions/agentic/attention/spotlight/client.rb +29 -0
  142. data/lib/legion/extensions/agentic/attention/spotlight/helpers/attention_target.rb +61 -0
  143. data/lib/legion/extensions/agentic/attention/spotlight/helpers/constants.rb +44 -0
  144. data/lib/legion/extensions/agentic/attention/spotlight/helpers/spotlight.rb +78 -0
  145. data/lib/legion/extensions/agentic/attention/spotlight/helpers/spotlight_engine.rb +163 -0
  146. data/lib/legion/extensions/agentic/attention/spotlight/runners/attention_spotlight.rb +122 -0
  147. data/lib/legion/extensions/agentic/attention/spotlight/version.rb +13 -0
  148. data/lib/legion/extensions/agentic/attention/spotlight.rb +20 -0
  149. data/lib/legion/extensions/agentic/attention/subliminal/client.rb +19 -0
  150. data/lib/legion/extensions/agentic/attention/subliminal/helpers/constants.rb +74 -0
  151. data/lib/legion/extensions/agentic/attention/subliminal/helpers/influence_event.rb +44 -0
  152. data/lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb +149 -0
  153. data/lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_trace.rb +101 -0
  154. data/lib/legion/extensions/agentic/attention/subliminal/runners/subliminal.rb +71 -0
  155. data/lib/legion/extensions/agentic/attention/subliminal/version.rb +13 -0
  156. data/lib/legion/extensions/agentic/attention/subliminal.rb +20 -0
  157. data/lib/legion/extensions/agentic/attention/surprise/client.rb +22 -0
  158. data/lib/legion/extensions/agentic/attention/surprise/helpers/constants.rb +35 -0
  159. data/lib/legion/extensions/agentic/attention/surprise/helpers/habituation_model.rb +62 -0
  160. data/lib/legion/extensions/agentic/attention/surprise/helpers/surprise_event.rb +43 -0
  161. data/lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb +74 -0
  162. data/lib/legion/extensions/agentic/attention/surprise/runners/surprise.rb +174 -0
  163. data/lib/legion/extensions/agentic/attention/surprise/version.rb +13 -0
  164. data/lib/legion/extensions/agentic/attention/surprise.rb +20 -0
  165. data/lib/legion/extensions/agentic/attention/switching/client.rb +19 -0
  166. data/lib/legion/extensions/agentic/attention/switching/helpers/constants.rb +64 -0
  167. data/lib/legion/extensions/agentic/attention/switching/helpers/switch_event.rb +60 -0
  168. data/lib/legion/extensions/agentic/attention/switching/helpers/switching_engine.rb +172 -0
  169. data/lib/legion/extensions/agentic/attention/switching/helpers/task_set.rb +91 -0
  170. data/lib/legion/extensions/agentic/attention/switching/runners/attention_switching.rb +92 -0
  171. data/lib/legion/extensions/agentic/attention/switching/version.rb +13 -0
  172. data/lib/legion/extensions/agentic/attention/switching.rb +20 -0
  173. data/lib/legion/extensions/agentic/attention/synesthesia/client.rb +29 -0
  174. data/lib/legion/extensions/agentic/attention/synesthesia/helpers/constants.rb +52 -0
  175. data/lib/legion/extensions/agentic/attention/synesthesia/helpers/sensory_mapping.rb +70 -0
  176. data/lib/legion/extensions/agentic/attention/synesthesia/helpers/synesthesia_engine.rb +177 -0
  177. data/lib/legion/extensions/agentic/attention/synesthesia/helpers/synesthetic_event.rb +49 -0
  178. data/lib/legion/extensions/agentic/attention/synesthesia/runners/cognitive_synesthesia.rb +83 -0
  179. data/lib/legion/extensions/agentic/attention/synesthesia/version.rb +13 -0
  180. data/lib/legion/extensions/agentic/attention/synesthesia.rb +20 -0
  181. data/lib/legion/extensions/agentic/attention/telescope/client.rb +15 -0
  182. data/lib/legion/extensions/agentic/attention/telescope/helpers/constants.rb +60 -0
  183. data/lib/legion/extensions/agentic/attention/telescope/helpers/observation.rb +68 -0
  184. data/lib/legion/extensions/agentic/attention/telescope/helpers/observatory_engine.rb +126 -0
  185. data/lib/legion/extensions/agentic/attention/telescope/helpers/telescope.rb +129 -0
  186. data/lib/legion/extensions/agentic/attention/telescope/runners/cognitive_telescope.rb +103 -0
  187. data/lib/legion/extensions/agentic/attention/telescope/version.rb +13 -0
  188. data/lib/legion/extensions/agentic/attention/telescope.rb +22 -0
  189. data/lib/legion/extensions/agentic/attention/version.rb +11 -0
  190. data/lib/legion/extensions/agentic/attention.rb +41 -0
  191. data/spec/legion/extensions/agentic/attention/arousal/client_spec.rb +42 -0
  192. data/spec/legion/extensions/agentic/attention/arousal/helpers/arousal_model_spec.rb +160 -0
  193. data/spec/legion/extensions/agentic/attention/arousal/helpers/constants_spec.rb +61 -0
  194. data/spec/legion/extensions/agentic/attention/arousal/runners/arousal_spec.rb +137 -0
  195. data/spec/legion/extensions/agentic/attention/blindspot/client_spec.rb +41 -0
  196. data/spec/legion/extensions/agentic/attention/blindspot/helpers/blindspot_engine_spec.rb +246 -0
  197. data/spec/legion/extensions/agentic/attention/blindspot/helpers/blindspot_spec.rb +204 -0
  198. data/spec/legion/extensions/agentic/attention/blindspot/helpers/constants_spec.rb +82 -0
  199. data/spec/legion/extensions/agentic/attention/blindspot/helpers/knowledge_boundary_spec.rb +104 -0
  200. data/spec/legion/extensions/agentic/attention/blindspot/runners/cognitive_blindspot_spec.rb +179 -0
  201. data/spec/legion/extensions/agentic/attention/blink/client_spec.rb +18 -0
  202. data/spec/legion/extensions/agentic/attention/blink/helpers/blink_engine_spec.rb +147 -0
  203. data/spec/legion/extensions/agentic/attention/blink/helpers/constants_spec.rb +27 -0
  204. data/spec/legion/extensions/agentic/attention/blink/helpers/stimulus_spec.rb +77 -0
  205. data/spec/legion/extensions/agentic/attention/blink/runners/attentional_blink_spec.rb +77 -0
  206. data/spec/legion/extensions/agentic/attention/economy/client_spec.rb +30 -0
  207. data/spec/legion/extensions/agentic/attention/economy/helpers/attention_budget_spec.rb +222 -0
  208. data/spec/legion/extensions/agentic/attention/economy/helpers/constants_spec.rb +112 -0
  209. data/spec/legion/extensions/agentic/attention/economy/helpers/demand_spec.rb +128 -0
  210. data/spec/legion/extensions/agentic/attention/economy/runners/attention_economy_spec.rb +163 -0
  211. data/spec/legion/extensions/agentic/attention/feature_binding/client_spec.rb +20 -0
  212. data/spec/legion/extensions/agentic/attention/feature_binding/helpers/binding_field_spec.rb +207 -0
  213. data/spec/legion/extensions/agentic/attention/feature_binding/helpers/bound_object_spec.rb +149 -0
  214. data/spec/legion/extensions/agentic/attention/feature_binding/helpers/feature_spec.rb +86 -0
  215. data/spec/legion/extensions/agentic/attention/feature_binding/runners/feature_binding_spec.rb +106 -0
  216. data/spec/legion/extensions/agentic/attention/focus/client_spec.rb +19 -0
  217. data/spec/legion/extensions/agentic/attention/focus/helpers/focus_manager_spec.rb +105 -0
  218. data/spec/legion/extensions/agentic/attention/focus/helpers/focus_spec.rb +148 -0
  219. data/spec/legion/extensions/agentic/attention/focus/helpers/habituation_spec.rb +97 -0
  220. data/spec/legion/extensions/agentic/attention/focus/runners/attention_spec.rb +134 -0
  221. data/spec/legion/extensions/agentic/attention/kaleidoscope/client_spec.rb +38 -0
  222. data/spec/legion/extensions/agentic/attention/kaleidoscope/helpers/constants_spec.rb +79 -0
  223. data/spec/legion/extensions/agentic/attention/kaleidoscope/helpers/facet_spec.rb +155 -0
  224. data/spec/legion/extensions/agentic/attention/kaleidoscope/helpers/kaleidoscope_engine_spec.rb +164 -0
  225. data/spec/legion/extensions/agentic/attention/kaleidoscope/helpers/pattern_spec.rb +157 -0
  226. data/spec/legion/extensions/agentic/attention/kaleidoscope/runners/cognitive_kaleidoscope_spec.rb +112 -0
  227. data/spec/legion/extensions/agentic/attention/latent_inhibition/client_spec.rb +49 -0
  228. data/spec/legion/extensions/agentic/attention/latent_inhibition/helpers/constants_spec.rb +57 -0
  229. data/spec/legion/extensions/agentic/attention/latent_inhibition/helpers/inhibition_engine_spec.rb +207 -0
  230. data/spec/legion/extensions/agentic/attention/latent_inhibition/helpers/stimulus_record_spec.rb +175 -0
  231. data/spec/legion/extensions/agentic/attention/latent_inhibition/runners/latent_inhibition_spec.rb +148 -0
  232. data/spec/legion/extensions/agentic/attention/lens/client_spec.rb +64 -0
  233. data/spec/legion/extensions/agentic/attention/lens/helpers/constants_spec.rb +91 -0
  234. data/spec/legion/extensions/agentic/attention/lens/helpers/lens_engine_spec.rb +158 -0
  235. data/spec/legion/extensions/agentic/attention/lens/helpers/lens_spec.rb +222 -0
  236. data/spec/legion/extensions/agentic/attention/lens/helpers/lens_stack_spec.rb +179 -0
  237. data/spec/legion/extensions/agentic/attention/lens/runners/cognitive_lens_spec.rb +182 -0
  238. data/spec/legion/extensions/agentic/attention/lighthouse/client_spec.rb +103 -0
  239. data/spec/legion/extensions/agentic/attention/lighthouse/helpers/beacon_spec.rb +170 -0
  240. data/spec/legion/extensions/agentic/attention/lighthouse/helpers/constants_spec.rb +94 -0
  241. data/spec/legion/extensions/agentic/attention/lighthouse/helpers/fog_spec.rb +166 -0
  242. data/spec/legion/extensions/agentic/attention/lighthouse/helpers/lighthouse_engine_spec.rb +238 -0
  243. data/spec/legion/extensions/agentic/attention/lighthouse/runners/cognitive_lighthouse_spec.rb +182 -0
  244. data/spec/legion/extensions/agentic/attention/priming/client_spec.rb +80 -0
  245. data/spec/legion/extensions/agentic/attention/priming/helpers/activation_network_spec.rb +176 -0
  246. data/spec/legion/extensions/agentic/attention/priming/helpers/concept_node_spec.rb +165 -0
  247. data/spec/legion/extensions/agentic/attention/priming/helpers/constants_spec.rb +51 -0
  248. data/spec/legion/extensions/agentic/attention/priming/runners/priming_spec.rb +141 -0
  249. data/spec/legion/extensions/agentic/attention/prism/client_spec.rb +86 -0
  250. data/spec/legion/extensions/agentic/attention/prism/helpers/beam_spec.rb +182 -0
  251. data/spec/legion/extensions/agentic/attention/prism/helpers/constants_spec.rb +93 -0
  252. data/spec/legion/extensions/agentic/attention/prism/helpers/prism_engine_spec.rb +253 -0
  253. data/spec/legion/extensions/agentic/attention/prism/helpers/spectral_component_spec.rb +171 -0
  254. data/spec/legion/extensions/agentic/attention/prism/runners/cognitive_prism_spec.rb +132 -0
  255. data/spec/legion/extensions/agentic/attention/regulation/client_spec.rb +58 -0
  256. data/spec/legion/extensions/agentic/attention/regulation/helpers/attention_controller_spec.rb +295 -0
  257. data/spec/legion/extensions/agentic/attention/regulation/helpers/attention_target_spec.rb +122 -0
  258. data/spec/legion/extensions/agentic/attention/regulation/runners/attention_regulation_spec.rb +147 -0
  259. data/spec/legion/extensions/agentic/attention/relevance_theory/helpers/cognitive_input_spec.rb +121 -0
  260. data/spec/legion/extensions/agentic/attention/relevance_theory/helpers/relevance_engine_spec.rb +149 -0
  261. data/spec/legion/extensions/agentic/attention/relevance_theory/relevance_theory_spec.rb +11 -0
  262. data/spec/legion/extensions/agentic/attention/relevance_theory/runners/relevance_theory_spec.rb +86 -0
  263. data/spec/legion/extensions/agentic/attention/salience/client_spec.rb +60 -0
  264. data/spec/legion/extensions/agentic/attention/salience/helpers/constants_spec.rb +100 -0
  265. data/spec/legion/extensions/agentic/attention/salience/helpers/salience_map_spec.rb +189 -0
  266. data/spec/legion/extensions/agentic/attention/salience/helpers/signal_integrator_spec.rb +149 -0
  267. data/spec/legion/extensions/agentic/attention/salience/runners/salience_spec.rb +143 -0
  268. data/spec/legion/extensions/agentic/attention/schema/client_spec.rb +47 -0
  269. data/spec/legion/extensions/agentic/attention/schema/helpers/attention_schema_model_spec.rb +219 -0
  270. data/spec/legion/extensions/agentic/attention/schema/helpers/schema_item_spec.rb +114 -0
  271. data/spec/legion/extensions/agentic/attention/schema/runners/attention_schema_spec.rb +185 -0
  272. data/spec/legion/extensions/agentic/attention/sensory_gating/helpers/gating_engine_spec.rb +112 -0
  273. data/spec/legion/extensions/agentic/attention/sensory_gating/helpers/sensory_filter_spec.rb +121 -0
  274. data/spec/legion/extensions/agentic/attention/sensory_gating/runners/sensory_gating_spec.rb +61 -0
  275. data/spec/legion/extensions/agentic/attention/signal_detection/client_spec.rb +20 -0
  276. data/spec/legion/extensions/agentic/attention/signal_detection/helpers/constants_spec.rb +85 -0
  277. data/spec/legion/extensions/agentic/attention/signal_detection/helpers/detection_engine_spec.rb +143 -0
  278. data/spec/legion/extensions/agentic/attention/signal_detection/helpers/detector_spec.rb +179 -0
  279. data/spec/legion/extensions/agentic/attention/signal_detection/runners/signal_detection_spec.rb +151 -0
  280. data/spec/legion/extensions/agentic/attention/spotlight/client_spec.rb +31 -0
  281. data/spec/legion/extensions/agentic/attention/spotlight/helpers/attention_target_spec.rb +121 -0
  282. data/spec/legion/extensions/agentic/attention/spotlight/helpers/constants_spec.rb +82 -0
  283. data/spec/legion/extensions/agentic/attention/spotlight/helpers/spotlight_engine_spec.rb +275 -0
  284. data/spec/legion/extensions/agentic/attention/spotlight/helpers/spotlight_spec.rb +196 -0
  285. data/spec/legion/extensions/agentic/attention/spotlight/runners/attention_spotlight_spec.rb +251 -0
  286. data/spec/legion/extensions/agentic/attention/subliminal/client_spec.rb +21 -0
  287. data/spec/legion/extensions/agentic/attention/subliminal/helpers/influence_event_spec.rb +58 -0
  288. data/spec/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine_spec.rb +161 -0
  289. data/spec/legion/extensions/agentic/attention/subliminal/helpers/subliminal_trace_spec.rb +168 -0
  290. data/spec/legion/extensions/agentic/attention/subliminal/runners_spec.rb +78 -0
  291. data/spec/legion/extensions/agentic/attention/subliminal/subliminal_spec.rb +7 -0
  292. data/spec/legion/extensions/agentic/attention/surprise/client_spec.rb +122 -0
  293. data/spec/legion/extensions/agentic/attention/surprise/helpers/constants_spec.rb +112 -0
  294. data/spec/legion/extensions/agentic/attention/surprise/helpers/habituation_model_spec.rb +127 -0
  295. data/spec/legion/extensions/agentic/attention/surprise/helpers/surprise_event_spec.rb +102 -0
  296. data/spec/legion/extensions/agentic/attention/surprise/helpers/surprise_store_spec.rb +171 -0
  297. data/spec/legion/extensions/agentic/attention/surprise/runners/surprise_spec.rb +266 -0
  298. data/spec/legion/extensions/agentic/attention/switching/attention_switching_spec.rb +7 -0
  299. data/spec/legion/extensions/agentic/attention/switching/helpers/switch_event_spec.rb +74 -0
  300. data/spec/legion/extensions/agentic/attention/switching/helpers/switching_engine_spec.rb +164 -0
  301. data/spec/legion/extensions/agentic/attention/switching/helpers/task_set_spec.rb +134 -0
  302. data/spec/legion/extensions/agentic/attention/synesthesia/client_spec.rb +57 -0
  303. data/spec/legion/extensions/agentic/attention/synesthesia/helpers/constants_spec.rb +89 -0
  304. data/spec/legion/extensions/agentic/attention/synesthesia/helpers/sensory_mapping_spec.rb +135 -0
  305. data/spec/legion/extensions/agentic/attention/synesthesia/helpers/synesthesia_engine_spec.rb +260 -0
  306. data/spec/legion/extensions/agentic/attention/synesthesia/helpers/synesthetic_event_spec.rb +83 -0
  307. data/spec/legion/extensions/agentic/attention/synesthesia/runners/cognitive_synesthesia_spec.rb +192 -0
  308. data/spec/legion/extensions/agentic/attention/telescope/client_spec.rb +30 -0
  309. data/spec/legion/extensions/agentic/attention/telescope/helpers/constants_spec.rb +108 -0
  310. data/spec/legion/extensions/agentic/attention/telescope/helpers/observation_spec.rb +138 -0
  311. data/spec/legion/extensions/agentic/attention/telescope/helpers/observatory_engine_spec.rb +197 -0
  312. data/spec/legion/extensions/agentic/attention/telescope/helpers/telescope_spec.rb +251 -0
  313. data/spec/legion/extensions/agentic/attention/telescope/runners/cognitive_telescope_spec.rb +191 -0
  314. data/spec/spec_helper.rb +46 -0
  315. metadata +399 -0
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Switching::Helpers::SwitchingEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:coding) { engine.register_task(name: 'coding', task_type: :analytical, complexity: 0.7) }
7
+ let(:writing) { engine.register_task(name: 'writing', task_type: :creative, complexity: 0.5) }
8
+ let(:chatting) { engine.register_task(name: 'chatting', task_type: :social, complexity: 0.3) }
9
+
10
+ describe '#register_task' do
11
+ it 'creates a task set' do
12
+ task = engine.register_task(name: 'test')
13
+ expect(task).to be_a(Legion::Extensions::Agentic::Attention::Switching::Helpers::TaskSet)
14
+ end
15
+ end
16
+
17
+ describe '#activate_task' do
18
+ it 'activates the task' do
19
+ engine.activate_task(task_id: coding.id)
20
+ expect(coding.ready?).to be true
21
+ end
22
+
23
+ it 'returns nil for unknown task' do
24
+ expect(engine.activate_task(task_id: 'bad')).to be_nil
25
+ end
26
+ end
27
+
28
+ describe '#switch_to' do
29
+ it 'switches between tasks' do
30
+ engine.activate_task(task_id: coding.id)
31
+ result = engine.switch_to(task_id: writing.id)
32
+ expect(result[:task][:id]).to eq(writing.id)
33
+ expect(result[:switch_event]).not_to be_nil
34
+ end
35
+
36
+ it 'records switch cost' do
37
+ engine.activate_task(task_id: coding.id)
38
+ result = engine.switch_to(task_id: writing.id)
39
+ expect(result[:switch_event][:switch_cost]).to be > 0
40
+ end
41
+
42
+ it 'creates residual on previous task' do
43
+ engine.activate_task(task_id: coding.id)
44
+ engine.switch_to(task_id: writing.id)
45
+ expect(coding.residual?).to be true
46
+ end
47
+
48
+ it 'returns nil for unknown task' do
49
+ expect(engine.switch_to(task_id: 'bad')).to be_nil
50
+ end
51
+
52
+ it 'has no switch event for first activation' do
53
+ result = engine.switch_to(task_id: coding.id)
54
+ expect(result[:switch_event]).to be_nil
55
+ end
56
+ end
57
+
58
+ describe '#warmup_active' do
59
+ it 'increases active task readiness' do
60
+ engine.activate_task(task_id: coding.id)
61
+ engine.switch_to(task_id: writing.id)
62
+ engine.switch_to(task_id: coding.id)
63
+ # After switching back, warmup the task
64
+ initial = coding.readiness
65
+ engine.warmup_active
66
+ expect(coding.readiness).to be >= initial
67
+ end
68
+
69
+ it 'returns nil with no active task' do
70
+ expect(engine.warmup_active).to be_nil
71
+ end
72
+ end
73
+
74
+ describe '#decay_all_residuals!' do
75
+ it 'reduces residual on deactivated tasks' do
76
+ engine.activate_task(task_id: coding.id)
77
+ engine.switch_to(task_id: writing.id)
78
+ original = coding.residual_activation
79
+ engine.decay_all_residuals!
80
+ expect(coding.residual_activation).to be < original
81
+ end
82
+ end
83
+
84
+ describe '#active_task' do
85
+ it 'returns nil initially' do
86
+ expect(engine.active_task).to be_nil
87
+ end
88
+
89
+ it 'returns active task after activation' do
90
+ engine.activate_task(task_id: coding.id)
91
+ expect(engine.active_task.id).to eq(coding.id)
92
+ end
93
+ end
94
+
95
+ describe '#tasks_with_residual' do
96
+ it 'returns tasks with residual activation' do
97
+ engine.activate_task(task_id: coding.id)
98
+ engine.switch_to(task_id: writing.id)
99
+ expect(engine.tasks_with_residual.map(&:id)).to include(coding.id)
100
+ end
101
+ end
102
+
103
+ describe '#average_switch_cost' do
104
+ it 'returns default with no switches' do
105
+ default = Legion::Extensions::Agentic::Attention::Switching::Helpers::Constants::DEFAULT_SWITCH_COST
106
+ expect(engine.average_switch_cost).to eq(default)
107
+ end
108
+
109
+ it 'computes average after switches' do
110
+ engine.activate_task(task_id: coding.id)
111
+ engine.switch_to(task_id: writing.id)
112
+ engine.switch_to(task_id: chatting.id)
113
+ expect(engine.average_switch_cost).to be > 0
114
+ end
115
+ end
116
+
117
+ describe '#switch_cost_between' do
118
+ it 'returns average cost for a specific pair' do
119
+ engine.activate_task(task_id: coding.id)
120
+ engine.switch_to(task_id: writing.id)
121
+ cost = engine.switch_cost_between(from_id: coding.id, to_id: writing.id)
122
+ expect(cost).to be > 0
123
+ end
124
+
125
+ it 'returns nil for unknown pair' do
126
+ expect(engine.switch_cost_between(from_id: 'a', to_id: 'b')).to be_nil
127
+ end
128
+ end
129
+
130
+ describe '#most_costly_pair' do
131
+ it 'returns nil with no switches' do
132
+ expect(engine.most_costly_pair).to be_nil
133
+ end
134
+
135
+ it 'returns the highest cost event' do
136
+ engine.activate_task(task_id: coding.id)
137
+ engine.switch_to(task_id: writing.id)
138
+ expect(engine.most_costly_pair).to be_a(Legion::Extensions::Agentic::Attention::Switching::Helpers::SwitchEvent)
139
+ end
140
+ end
141
+
142
+ describe '#switching_report' do
143
+ it 'returns comprehensive report' do
144
+ engine.activate_task(task_id: coding.id)
145
+ engine.switch_to(task_id: writing.id)
146
+ report = engine.switching_report
147
+ expect(report).to include(
148
+ :total_tasks, :total_switches, :active_task,
149
+ :average_switch_cost, :costly_count, :cheap_count,
150
+ :residual_count, :recent_switches
151
+ )
152
+ end
153
+ end
154
+
155
+ describe '#to_h' do
156
+ it 'returns summary hash' do
157
+ hash = engine.to_h
158
+ expect(hash).to include(
159
+ :total_tasks, :total_switches, :active_task_id,
160
+ :average_switch_cost, :residual_count
161
+ )
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Switching::Helpers::TaskSet do
4
+ subject(:task) { described_class.new(name: 'coding') }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID id' do
8
+ expect(task.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'sets name' do
12
+ expect(task.name).to eq('coding')
13
+ end
14
+
15
+ it 'defaults to analytical type' do
16
+ expect(task.task_type).to eq(:analytical)
17
+ end
18
+
19
+ it 'defaults complexity to 0.5' do
20
+ expect(task.complexity).to eq(0.5)
21
+ end
22
+
23
+ it 'starts with zero readiness' do
24
+ expect(task.readiness).to eq(0.0)
25
+ end
26
+
27
+ it 'starts with zero residual' do
28
+ expect(task.residual_activation).to eq(0.0)
29
+ end
30
+
31
+ it 'clamps high complexity' do
32
+ high = described_class.new(name: 'x', complexity: 5.0)
33
+ expect(high.complexity).to eq(1.0)
34
+ end
35
+ end
36
+
37
+ describe '#activate!' do
38
+ it 'sets readiness to 1.0' do
39
+ task.activate!
40
+ expect(task.readiness).to eq(1.0)
41
+ end
42
+
43
+ it 'clears residual activation' do
44
+ task.activate!
45
+ expect(task.residual_activation).to eq(0.0)
46
+ end
47
+
48
+ it 'increments activation count' do
49
+ task.activate!
50
+ expect(task.activation_count).to eq(1)
51
+ end
52
+ end
53
+
54
+ describe '#deactivate!' do
55
+ it 'transfers readiness to residual' do
56
+ task.activate!
57
+ task.deactivate!
58
+ expect(task.residual_activation).to eq(1.0)
59
+ expect(task.readiness).to eq(0.0)
60
+ end
61
+ end
62
+
63
+ describe '#warmup!' do
64
+ it 'increases readiness' do
65
+ task.warmup!
66
+ expect(task.readiness).to be > 0.0
67
+ end
68
+
69
+ it 'clamps at 1.0' do
70
+ 10.times { task.warmup! }
71
+ expect(task.readiness).to eq(1.0)
72
+ end
73
+ end
74
+
75
+ describe '#decay_residual!' do
76
+ it 'reduces residual activation' do
77
+ task.activate!
78
+ task.deactivate!
79
+ original = task.residual_activation
80
+ task.decay_residual!
81
+ expect(task.residual_activation).to be < original
82
+ end
83
+
84
+ it 'does not go below zero' do
85
+ task.decay_residual!
86
+ expect(task.residual_activation).to eq(0.0)
87
+ end
88
+ end
89
+
90
+ describe '#ready?' do
91
+ it 'is false initially' do
92
+ expect(task.ready?).to be false
93
+ end
94
+
95
+ it 'is true after activation' do
96
+ task.activate!
97
+ expect(task.ready?).to be true
98
+ end
99
+ end
100
+
101
+ describe '#residual?' do
102
+ it 'is false initially' do
103
+ expect(task.residual?).to be false
104
+ end
105
+
106
+ it 'is true after deactivation' do
107
+ task.activate!
108
+ task.deactivate!
109
+ expect(task.residual?).to be true
110
+ end
111
+ end
112
+
113
+ describe '#readiness_label' do
114
+ it 'returns unprepared initially' do
115
+ expect(task.readiness_label).to eq(:unprepared)
116
+ end
117
+
118
+ it 'returns fully_ready when activated' do
119
+ task.activate!
120
+ expect(task.readiness_label).to eq(:fully_ready)
121
+ end
122
+ end
123
+
124
+ describe '#to_h' do
125
+ it 'includes all fields' do
126
+ hash = task.to_h
127
+ expect(hash).to include(
128
+ :id, :name, :task_type, :complexity, :readiness,
129
+ :readiness_label, :residual_activation, :residual_label,
130
+ :ready, :has_residual, :activation_count, :created_at
131
+ )
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/synesthesia/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Synesthesia::Client do
6
+ let(:client) { described_class.new }
7
+
8
+ it 'responds to all runner methods' do
9
+ expect(client).to respond_to(:register_mapping)
10
+ expect(client).to respond_to(:trigger)
11
+ expect(client).to respond_to(:decay_mappings)
12
+ expect(client).to respond_to(:cross_modal_richness)
13
+ expect(client).to respond_to(:dominant_modality_pairs)
14
+ expect(client).to respond_to(:event_history)
15
+ expect(client).to respond_to(:modality_coverage)
16
+ expect(client).to respond_to(:synesthesia_report)
17
+ end
18
+
19
+ it 'accepts an injected engine' do
20
+ engine = Legion::Extensions::Agentic::Attention::Synesthesia::Helpers::SynesthesiaEngine.new
21
+ c = described_class.new(engine: engine)
22
+ c.register_mapping(source_modality: :auditory, target_modality: :visual,
23
+ trigger_pattern: {}, response_pattern: {})
24
+ expect(engine.mappings.size).to eq(1)
25
+ end
26
+
27
+ it 'maintains state across calls' do
28
+ client.register_mapping(source_modality: :auditory, target_modality: :visual,
29
+ trigger_pattern: { freq: :high }, response_pattern: { color: :red },
30
+ strength: 0.7)
31
+ client.trigger(source_modality: :auditory, input: { note: :A4 })
32
+ report = client.synesthesia_report
33
+ expect(report[:mapping_count]).to eq(1)
34
+ expect(report[:event_count]).to eq(1)
35
+ end
36
+
37
+ it 'runs a full cross-modal cycle' do
38
+ client.register_mapping(source_modality: :semantic, target_modality: :visual,
39
+ trigger_pattern: { concept: :danger }, response_pattern: { hue: :red },
40
+ strength: 0.8)
41
+ client.register_mapping(source_modality: :semantic, target_modality: :emotional,
42
+ trigger_pattern: { concept: :danger }, response_pattern: { tone: :fear },
43
+ strength: 0.7)
44
+
45
+ events = client.trigger(source_modality: :semantic, input: { concept: :danger })
46
+ expect(events[:triggered_count]).to eq(2)
47
+
48
+ richness = client.cross_modal_richness
49
+ expect(richness[:richness]).to be > 0.0
50
+
51
+ coverage = client.modality_coverage
52
+ expect(coverage[:covered_modalities]).to include(:semantic, :visual, :emotional)
53
+
54
+ history = client.event_history(limit: 5)
55
+ expect(history[:count]).to eq(2)
56
+ end
57
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Synesthesia::Helpers::Constants do
4
+ describe 'constants' do
5
+ it 'defines MAX_MAPPINGS' do
6
+ expect(described_class::MAX_MAPPINGS).to eq(200)
7
+ end
8
+
9
+ it 'defines MAX_EVENTS' do
10
+ expect(described_class::MAX_EVENTS).to eq(500)
11
+ end
12
+
13
+ it 'defines DEFAULT_STRENGTH' do
14
+ expect(described_class::DEFAULT_STRENGTH).to eq(0.5)
15
+ end
16
+
17
+ it 'defines STRENGTH_BOOST' do
18
+ expect(described_class::STRENGTH_BOOST).to eq(0.1)
19
+ end
20
+
21
+ it 'defines STRENGTH_DECAY' do
22
+ expect(described_class::STRENGTH_DECAY).to eq(0.02)
23
+ end
24
+
25
+ it 'defines TRIGGER_THRESHOLD' do
26
+ expect(described_class::TRIGGER_THRESHOLD).to eq(0.3)
27
+ end
28
+
29
+ it 'defines 8 modalities' do
30
+ expect(described_class::MODALITIES.size).to eq(8)
31
+ end
32
+
33
+ it 'includes all expected modalities' do
34
+ expect(described_class::MODALITIES).to include(:visual, :auditory, :tactile, :emotional,
35
+ :semantic, :temporal, :spatial, :abstract)
36
+ end
37
+
38
+ it 'defines STRENGTH_LABELS with range keys' do
39
+ expect(described_class::STRENGTH_LABELS).to be_a(Hash)
40
+ expect(described_class::STRENGTH_LABELS.values).to include(:dominant, :strong, :moderate, :faint, :trace)
41
+ end
42
+
43
+ it 'defines RICHNESS_LABELS with range keys' do
44
+ expect(described_class::RICHNESS_LABELS).to be_a(Hash)
45
+ expect(described_class::RICHNESS_LABELS.values).to include(:synesthetic, :vivid, :partial, :sparse, :amodal)
46
+ end
47
+
48
+ it 'defines INTENSITY_LABELS with range keys' do
49
+ expect(described_class::INTENSITY_LABELS).to be_a(Hash)
50
+ expect(described_class::INTENSITY_LABELS.values).to include(:overwhelming, :intense, :moderate, :subtle, :subliminal)
51
+ end
52
+ end
53
+
54
+ describe '.label_for' do
55
+ it 'returns dominant for value 0.9' do
56
+ expect(described_class.label_for(described_class::STRENGTH_LABELS, 0.9)).to eq(:dominant)
57
+ end
58
+
59
+ it 'returns strong for value 0.7' do
60
+ expect(described_class.label_for(described_class::STRENGTH_LABELS, 0.7)).to eq(:strong)
61
+ end
62
+
63
+ it 'returns moderate for value 0.5' do
64
+ expect(described_class.label_for(described_class::STRENGTH_LABELS, 0.5)).to eq(:moderate)
65
+ end
66
+
67
+ it 'returns faint for value 0.3' do
68
+ expect(described_class.label_for(described_class::STRENGTH_LABELS, 0.3)).to eq(:faint)
69
+ end
70
+
71
+ it 'returns trace for value 0.1' do
72
+ expect(described_class.label_for(described_class::STRENGTH_LABELS, 0.1)).to eq(:trace)
73
+ end
74
+
75
+ it 'returns unknown for nil' do
76
+ expect(described_class.label_for(described_class::STRENGTH_LABELS, nil)).to eq(:unknown)
77
+ end
78
+
79
+ it 'works with RICHNESS_LABELS' do
80
+ expect(described_class.label_for(described_class::RICHNESS_LABELS, 0.9)).to eq(:synesthetic)
81
+ expect(described_class.label_for(described_class::RICHNESS_LABELS, 0.1)).to eq(:amodal)
82
+ end
83
+
84
+ it 'works with INTENSITY_LABELS' do
85
+ expect(described_class.label_for(described_class::INTENSITY_LABELS, 0.9)).to eq(:overwhelming)
86
+ expect(described_class.label_for(described_class::INTENSITY_LABELS, 0.1)).to eq(:subliminal)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Synesthesia::Helpers::SensoryMapping do
4
+ subject(:mapping) do
5
+ described_class.new(
6
+ source_modality: :auditory,
7
+ target_modality: :visual,
8
+ trigger_pattern: { frequency: :high },
9
+ response_pattern: { color: :bright_red },
10
+ strength: 0.6
11
+ )
12
+ end
13
+
14
+ describe '#initialize' do
15
+ it 'assigns a UUID id' do
16
+ expect(mapping.id).to match(/\A[0-9a-f-]{36}\z/)
17
+ end
18
+
19
+ it 'stores source_modality' do
20
+ expect(mapping.source_modality).to eq(:auditory)
21
+ end
22
+
23
+ it 'stores target_modality' do
24
+ expect(mapping.target_modality).to eq(:visual)
25
+ end
26
+
27
+ it 'stores trigger_pattern' do
28
+ expect(mapping.trigger_pattern).to eq({ frequency: :high })
29
+ end
30
+
31
+ it 'stores response_pattern' do
32
+ expect(mapping.response_pattern).to eq({ color: :bright_red })
33
+ end
34
+
35
+ it 'clamps strength to [0, 1]' do
36
+ over = described_class.new(source_modality: :visual, target_modality: :auditory,
37
+ trigger_pattern: {}, response_pattern: {}, strength: 1.5)
38
+ under = described_class.new(source_modality: :visual, target_modality: :auditory,
39
+ trigger_pattern: {}, response_pattern: {}, strength: -0.5)
40
+ expect(over.strength).to eq(1.0)
41
+ expect(under.strength).to eq(0.0)
42
+ end
43
+
44
+ it 'initializes activation_count to 0' do
45
+ expect(mapping.activation_count).to eq(0)
46
+ end
47
+
48
+ it 'sets created_at' do
49
+ expect(mapping.created_at).to be_a(Time)
50
+ end
51
+
52
+ it 'last_activated_at is nil initially' do
53
+ expect(mapping.last_activated_at).to be_nil
54
+ end
55
+ end
56
+
57
+ describe '#activate!' do
58
+ it 'increments activation_count' do
59
+ expect { mapping.activate! }.to change(mapping, :activation_count).by(1)
60
+ end
61
+
62
+ it 'boosts strength by STRENGTH_BOOST' do
63
+ before = mapping.strength
64
+ mapping.activate!
65
+ expect(mapping.strength).to be_within(0.001).of((before + 0.1).clamp(0.0, 1.0))
66
+ end
67
+
68
+ it 'clamps strength to 1.0' do
69
+ strong = described_class.new(source_modality: :visual, target_modality: :auditory,
70
+ trigger_pattern: {}, response_pattern: {}, strength: 0.95)
71
+ strong.activate!
72
+ expect(strong.strength).to eq(1.0)
73
+ end
74
+
75
+ it 'sets last_activated_at' do
76
+ mapping.activate!
77
+ expect(mapping.last_activated_at).to be_a(Time)
78
+ end
79
+ end
80
+
81
+ describe '#decay!' do
82
+ it 'reduces strength by STRENGTH_DECAY' do
83
+ before = mapping.strength
84
+ mapping.decay!
85
+ expect(mapping.strength).to be_within(0.001).of((before - 0.02).clamp(0.0, 1.0))
86
+ end
87
+
88
+ it 'does not go below 0.0' do
89
+ weak = described_class.new(source_modality: :visual, target_modality: :auditory,
90
+ trigger_pattern: {}, response_pattern: {}, strength: 0.01)
91
+ weak.decay!
92
+ expect(weak.strength).to eq(0.0)
93
+ end
94
+ end
95
+
96
+ describe '#active?' do
97
+ it 'returns true when strength >= TRIGGER_THRESHOLD' do
98
+ expect(mapping.active?).to be true
99
+ end
100
+
101
+ it 'returns false when strength < TRIGGER_THRESHOLD' do
102
+ weak = described_class.new(source_modality: :visual, target_modality: :auditory,
103
+ trigger_pattern: {}, response_pattern: {}, strength: 0.1)
104
+ expect(weak.active?).to be false
105
+ end
106
+ end
107
+
108
+ describe '#strength_label' do
109
+ it 'returns :strong for strength 0.6' do
110
+ expect(mapping.strength_label).to eq(:strong)
111
+ end
112
+
113
+ it 'returns :trace for low strength' do
114
+ weak = described_class.new(source_modality: :visual, target_modality: :auditory,
115
+ trigger_pattern: {}, response_pattern: {}, strength: 0.1)
116
+ expect(weak.strength_label).to eq(:trace)
117
+ end
118
+ end
119
+
120
+ describe '#to_h' do
121
+ it 'includes all expected keys' do
122
+ h = mapping.to_h
123
+ expect(h).to include(:id, :source_modality, :target_modality, :trigger_pattern,
124
+ :response_pattern, :strength, :activation_count, :strength_label,
125
+ :active, :created_at, :last_activated_at)
126
+ end
127
+
128
+ it 'reflects activation state after activate!' do
129
+ mapping.activate!
130
+ h = mapping.to_h
131
+ expect(h[:activation_count]).to eq(1)
132
+ expect(h[:last_activated_at]).to be_a(Time)
133
+ end
134
+ end
135
+ end