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,260 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Synesthesia::Helpers::SynesthesiaEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ def register(source: :auditory, target: :visual, trigger: { freq: :high },
7
+ response: { color: :red }, strength: 0.6)
8
+ engine.register_mapping(
9
+ source_modality: source,
10
+ target_modality: target,
11
+ trigger_pattern: trigger,
12
+ response_pattern: response,
13
+ strength: strength
14
+ )
15
+ end
16
+
17
+ describe '#register_mapping' do
18
+ it 'returns success with mapping_id' do
19
+ result = register
20
+ expect(result[:success]).to be true
21
+ expect(result[:mapping_id]).to match(/\A[0-9a-f-]{36}\z/)
22
+ end
23
+
24
+ it 'stores the mapping' do
25
+ register
26
+ expect(engine.mappings.size).to eq(1)
27
+ end
28
+
29
+ it 'rejects invalid source_modality' do
30
+ result = engine.register_mapping(source_modality: :unknown, target_modality: :visual,
31
+ trigger_pattern: {}, response_pattern: {})
32
+ expect(result[:success]).to be false
33
+ expect(result[:error]).to eq(:invalid_modality)
34
+ expect(result[:field]).to eq(:source_modality)
35
+ end
36
+
37
+ it 'rejects invalid target_modality' do
38
+ result = engine.register_mapping(source_modality: :auditory, target_modality: :unknown,
39
+ trigger_pattern: {}, response_pattern: {})
40
+ expect(result[:success]).to be false
41
+ expect(result[:error]).to eq(:invalid_modality)
42
+ expect(result[:field]).to eq(:target_modality)
43
+ end
44
+
45
+ it 'accepts all valid modalities' do
46
+ pairs = [%i[visual auditory], %i[tactile emotional], %i[semantic temporal],
47
+ %i[spatial abstract], %i[abstract visual]]
48
+ pairs.each do |src, tgt|
49
+ result = engine.register_mapping(source_modality: src, target_modality: tgt,
50
+ trigger_pattern: {}, response_pattern: {})
51
+ expect(result[:success]).to be true
52
+ end
53
+ end
54
+
55
+ it 'prunes when exceeding MAX_MAPPINGS' do
56
+ 201.times { register }
57
+ expect(engine.mappings.size).to eq(200)
58
+ end
59
+ end
60
+
61
+ describe '#trigger' do
62
+ it 'returns success with empty events when no active mappings' do
63
+ result = engine.trigger(source_modality: :auditory, input: { note: :C4 })
64
+ expect(result[:success]).to be true
65
+ expect(result[:events]).to be_empty
66
+ expect(result[:triggered_count]).to eq(0)
67
+ end
68
+
69
+ it 'fires events for matching active mappings' do
70
+ register(source: :auditory, target: :visual, strength: 0.6)
71
+ result = engine.trigger(source_modality: :auditory, input: { note: :C4 })
72
+ expect(result[:triggered_count]).to eq(1)
73
+ expect(result[:events].first[:mapping_id]).to match(/\A[0-9a-f-]{36}\z/)
74
+ end
75
+
76
+ it 'does not fire events for different source modality' do
77
+ register(source: :visual, target: :auditory, strength: 0.6)
78
+ result = engine.trigger(source_modality: :tactile, input: { pressure: :high })
79
+ expect(result[:triggered_count]).to eq(0)
80
+ end
81
+
82
+ it 'does not fire events for below-threshold mappings' do
83
+ register(source: :auditory, target: :visual, strength: 0.1)
84
+ result = engine.trigger(source_modality: :auditory, input: { note: :C4 })
85
+ expect(result[:triggered_count]).to eq(0)
86
+ end
87
+
88
+ it 'strengthens the mapping on each trigger' do
89
+ register(source: :auditory, target: :visual, strength: 0.6)
90
+ before = engine.mappings.values.first.strength
91
+ engine.trigger(source_modality: :auditory, input: {})
92
+ expect(engine.mappings.values.first.strength).to be > before
93
+ end
94
+
95
+ it 'fires from multiple active mappings for the same modality' do
96
+ register(source: :auditory, target: :visual, strength: 0.6)
97
+ register(source: :auditory, target: :emotional, strength: 0.7)
98
+ result = engine.trigger(source_modality: :auditory, input: { note: :D4 })
99
+ expect(result[:triggered_count]).to eq(2)
100
+ end
101
+
102
+ it 'stores events in @events' do
103
+ register(source: :auditory, target: :visual, strength: 0.6)
104
+ engine.trigger(source_modality: :auditory, input: {})
105
+ expect(engine.events.size).to eq(1)
106
+ end
107
+
108
+ it 'caps events at MAX_EVENTS' do
109
+ register(source: :auditory, target: :visual, strength: 1.0)
110
+ 501.times { engine.trigger(source_modality: :auditory, input: {}) }
111
+ expect(engine.events.size).to eq(500)
112
+ end
113
+
114
+ it 'event has involuntary: true by default' do
115
+ register(source: :auditory, target: :visual, strength: 0.6)
116
+ engine.trigger(source_modality: :auditory, input: {})
117
+ expect(engine.events.first.involuntary).to be true
118
+ end
119
+
120
+ it 'event target_output contains modality and response_pattern' do
121
+ register(source: :auditory, target: :visual, strength: 0.6,
122
+ response: { color: :blue })
123
+ engine.trigger(source_modality: :auditory, input: { note: :E4 })
124
+ output = engine.events.first.target_output
125
+ expect(output[:modality]).to eq(:visual)
126
+ expect(output[:response_pattern]).to eq({ color: :blue })
127
+ end
128
+ end
129
+
130
+ describe '#decay_mappings!' do
131
+ it 'returns success' do
132
+ result = engine.decay_mappings!
133
+ expect(result[:success]).to be true
134
+ end
135
+
136
+ it 'decays all mapping strengths' do
137
+ register(strength: 0.6)
138
+ before = engine.mappings.values.first.strength
139
+ engine.decay_mappings!
140
+ expect(engine.mappings.values.first.strength).to be < before
141
+ end
142
+
143
+ it 'removes mappings that decay to 0' do
144
+ register(strength: 0.01)
145
+ engine.decay_mappings!
146
+ expect(engine.mappings).to be_empty
147
+ end
148
+
149
+ it 'reports removed and remaining counts' do
150
+ 2.times { register }
151
+ result = engine.decay_mappings!
152
+ expect(result).to have_key(:mappings_removed)
153
+ expect(result).to have_key(:mappings_remaining)
154
+ end
155
+ end
156
+
157
+ describe '#cross_modal_richness' do
158
+ it 'returns 0.0 with no mappings' do
159
+ expect(engine.cross_modal_richness).to eq(0.0)
160
+ end
161
+
162
+ it 'returns a value between 0 and 1' do
163
+ register(source: :auditory, target: :visual, strength: 0.6)
164
+ register(source: :visual, target: :emotional, strength: 0.6)
165
+ expect(engine.cross_modal_richness).to be_between(0.0, 1.0)
166
+ end
167
+
168
+ it 'increases as more unique pairs are added' do
169
+ register(source: :auditory, target: :visual, strength: 0.6)
170
+ richness_before = engine.cross_modal_richness
171
+ register(source: :tactile, target: :emotional, strength: 0.6)
172
+ richness_after = engine.cross_modal_richness
173
+ expect(richness_after).to be >= richness_before
174
+ end
175
+ end
176
+
177
+ describe '#dominant_modality_pairs' do
178
+ it 'returns empty when no mappings' do
179
+ expect(engine.dominant_modality_pairs).to be_empty
180
+ end
181
+
182
+ it 'returns pairs sorted by activation count' do
183
+ register(source: :auditory, target: :visual, strength: 0.6)
184
+ 3.times { engine.trigger(source_modality: :auditory, input: {}) }
185
+ register(source: :tactile, target: :emotional, strength: 0.6)
186
+ engine.trigger(source_modality: :tactile, input: {})
187
+
188
+ pairs = engine.dominant_modality_pairs
189
+ expect(pairs.first[:pair]).to eq('auditory->visual')
190
+ end
191
+
192
+ it 'respects the limit' do
193
+ 5.times do |i|
194
+ mods = Legion::Extensions::Agentic::Attention::Synesthesia::Helpers::Constants::MODALITIES
195
+ src = mods[i]
196
+ tgt = mods[i + 1]
197
+ register(source: src, target: tgt, strength: 0.6)
198
+ end
199
+ pairs = engine.dominant_modality_pairs(limit: 3)
200
+ expect(pairs.size).to be <= 3
201
+ end
202
+ end
203
+
204
+ describe '#event_history' do
205
+ it 'returns empty when no events' do
206
+ result = engine.event_history
207
+ expect(result[:success]).to be true
208
+ expect(result[:events]).to be_empty
209
+ expect(result[:count]).to eq(0)
210
+ end
211
+
212
+ it 'returns recent events up to limit' do
213
+ register(source: :auditory, target: :visual, strength: 0.6)
214
+ 5.times { engine.trigger(source_modality: :auditory, input: {}) }
215
+ result = engine.event_history(limit: 3)
216
+ expect(result[:count]).to eq(3)
217
+ end
218
+ end
219
+
220
+ describe '#modality_coverage' do
221
+ it 'returns 0 covered with no active mappings' do
222
+ result = engine.modality_coverage
223
+ expect(result[:coverage_count]).to eq(0)
224
+ expect(result[:total_modalities]).to eq(8)
225
+ end
226
+
227
+ it 'returns covered modalities from active mappings' do
228
+ register(source: :auditory, target: :visual, strength: 0.6)
229
+ result = engine.modality_coverage
230
+ expect(result[:covered_modalities]).to include(:auditory, :visual)
231
+ expect(result[:coverage_count]).to eq(2)
232
+ end
233
+
234
+ it 'does not double-count modalities' do
235
+ register(source: :auditory, target: :visual, strength: 0.6)
236
+ register(source: :auditory, target: :emotional, strength: 0.6)
237
+ result = engine.modality_coverage
238
+ expect(result[:covered_modalities].count(:auditory)).to eq(1)
239
+ end
240
+ end
241
+
242
+ describe '#synesthesia_report' do
243
+ it 'returns a comprehensive hash' do
244
+ result = engine.synesthesia_report
245
+ expect(result).to include(:mapping_count, :active_mapping_count, :event_count,
246
+ :cross_modal_richness, :richness_label,
247
+ :dominant_modality_pairs, :modality_coverage)
248
+ end
249
+
250
+ it 'reflects registered mappings' do
251
+ register
252
+ result = engine.synesthesia_report
253
+ expect(result[:mapping_count]).to eq(1)
254
+ end
255
+
256
+ it 'includes a richness_label' do
257
+ expect(engine.synesthesia_report[:richness_label]).to be_a(Symbol)
258
+ end
259
+ end
260
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Synesthesia::Helpers::SynestheticEvent do
4
+ subject(:event) do
5
+ described_class.new(
6
+ mapping_id: 'abc-123',
7
+ source_input: { note: :C4 },
8
+ target_output: { color: :red },
9
+ intensity: 0.75
10
+ )
11
+ end
12
+
13
+ describe '#initialize' do
14
+ it 'assigns a UUID id' do
15
+ expect(event.id).to match(/\A[0-9a-f-]{36}\z/)
16
+ end
17
+
18
+ it 'stores mapping_id' do
19
+ expect(event.mapping_id).to eq('abc-123')
20
+ end
21
+
22
+ it 'stores source_input' do
23
+ expect(event.source_input).to eq({ note: :C4 })
24
+ end
25
+
26
+ it 'stores target_output' do
27
+ expect(event.target_output).to eq({ color: :red })
28
+ end
29
+
30
+ it 'clamps intensity to [0, 1]' do
31
+ over = described_class.new(mapping_id: 'x', source_input: {}, target_output: {}, intensity: 2.0)
32
+ under = described_class.new(mapping_id: 'x', source_input: {}, target_output: {}, intensity: -1.0)
33
+ expect(over.intensity).to eq(1.0)
34
+ expect(under.intensity).to eq(0.0)
35
+ end
36
+
37
+ it 'defaults involuntary to true' do
38
+ expect(event.involuntary).to be true
39
+ end
40
+
41
+ it 'accepts involuntary: false' do
42
+ voluntary = described_class.new(mapping_id: 'x', source_input: {}, target_output: {},
43
+ intensity: 0.5, involuntary: false)
44
+ expect(voluntary.involuntary).to be false
45
+ end
46
+
47
+ it 'sets triggered_at' do
48
+ expect(event.triggered_at).to be_a(Time)
49
+ end
50
+ end
51
+
52
+ describe '#intensity_label' do
53
+ it 'returns :intense for intensity 0.75' do
54
+ expect(event.intensity_label).to eq(:intense)
55
+ end
56
+
57
+ it 'returns :subliminal for very low intensity' do
58
+ soft = described_class.new(mapping_id: 'x', source_input: {}, target_output: {}, intensity: 0.05)
59
+ expect(soft.intensity_label).to eq(:subliminal)
60
+ end
61
+
62
+ it 'returns :overwhelming for intensity 0.9' do
63
+ loud = described_class.new(mapping_id: 'x', source_input: {}, target_output: {}, intensity: 0.9)
64
+ expect(loud.intensity_label).to eq(:overwhelming)
65
+ end
66
+ end
67
+
68
+ describe '#to_h' do
69
+ it 'includes all expected keys' do
70
+ h = event.to_h
71
+ expect(h).to include(:id, :mapping_id, :source_input, :target_output,
72
+ :intensity, :intensity_label, :involuntary, :triggered_at)
73
+ end
74
+
75
+ it 'reflects correct intensity' do
76
+ expect(event.to_h[:intensity]).to eq(0.75)
77
+ end
78
+
79
+ it 'reflects involuntary flag' do
80
+ expect(event.to_h[:involuntary]).to be true
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,192 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/synesthesia/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Synesthesia::Runners::CognitiveSynesthesia do
6
+ let(:client) { Legion::Extensions::Agentic::Attention::Synesthesia::Client.new }
7
+
8
+ def register_mapping(source: :auditory, target: :visual, trigger: { freq: :high },
9
+ response: { color: :red }, strength: 0.6)
10
+ client.register_mapping(
11
+ source_modality: source,
12
+ target_modality: target,
13
+ trigger_pattern: trigger,
14
+ response_pattern: response,
15
+ strength: strength
16
+ )
17
+ end
18
+
19
+ describe '#register_mapping' do
20
+ it 'returns success with mapping_id' do
21
+ result = register_mapping
22
+ expect(result[:success]).to be true
23
+ expect(result[:mapping_id]).to match(/\A[0-9a-f-]{36}\z/)
24
+ end
25
+
26
+ it 'includes source and target modalities in result' do
27
+ result = register_mapping(source: :tactile, target: :emotional)
28
+ expect(result[:source_modality]).to eq(:tactile)
29
+ expect(result[:target_modality]).to eq(:emotional)
30
+ end
31
+
32
+ it 'rejects invalid source_modality' do
33
+ result = client.register_mapping(source_modality: :unknown, target_modality: :visual,
34
+ trigger_pattern: {}, response_pattern: {})
35
+ expect(result[:success]).to be false
36
+ expect(result[:error]).to eq(:invalid_modality)
37
+ end
38
+
39
+ it 'accepts injected engine kwarg' do
40
+ engine = Legion::Extensions::Agentic::Attention::Synesthesia::Helpers::SynesthesiaEngine.new
41
+ result = client.register_mapping(source_modality: :auditory, target_modality: :visual,
42
+ trigger_pattern: {}, response_pattern: {}, engine: engine)
43
+ expect(result[:success]).to be true
44
+ expect(engine.mappings.size).to eq(1)
45
+ end
46
+ end
47
+
48
+ describe '#trigger' do
49
+ it 'returns success with empty events when no mappings' do
50
+ result = client.trigger(source_modality: :auditory, input: { note: :C4 })
51
+ expect(result[:success]).to be true
52
+ expect(result[:triggered_count]).to eq(0)
53
+ end
54
+
55
+ it 'fires events when active mapping exists' do
56
+ register_mapping(source: :auditory, target: :visual, strength: 0.6)
57
+ result = client.trigger(source_modality: :auditory, input: { note: :A4 })
58
+ expect(result[:triggered_count]).to eq(1)
59
+ end
60
+
61
+ it 'returns event hashes' do
62
+ register_mapping(source: :auditory, target: :visual, strength: 0.6)
63
+ result = client.trigger(source_modality: :auditory, input: { note: :A4 })
64
+ expect(result[:events].first).to include(:id, :mapping_id, :intensity, :involuntary)
65
+ end
66
+
67
+ it 'uses injected engine' do
68
+ engine = Legion::Extensions::Agentic::Attention::Synesthesia::Helpers::SynesthesiaEngine.new
69
+ engine.register_mapping(source_modality: :tactile, target_modality: :emotional,
70
+ trigger_pattern: {}, response_pattern: {}, strength: 0.7)
71
+ result = client.trigger(source_modality: :tactile, input: { pressure: :soft }, engine: engine)
72
+ expect(result[:triggered_count]).to eq(1)
73
+ end
74
+ end
75
+
76
+ describe '#decay_mappings' do
77
+ it 'returns success' do
78
+ result = client.decay_mappings
79
+ expect(result[:success]).to be true
80
+ end
81
+
82
+ it 'reports removed count' do
83
+ result = client.decay_mappings
84
+ expect(result).to have_key(:mappings_removed)
85
+ expect(result).to have_key(:mappings_remaining)
86
+ end
87
+
88
+ it 'decays mappings over multiple calls' do
89
+ register_mapping(strength: 0.4)
90
+ 20.times { client.decay_mappings }
91
+ result = client.decay_mappings
92
+ expect(result[:mappings_remaining]).to eq(0)
93
+ end
94
+ end
95
+
96
+ describe '#cross_modal_richness' do
97
+ it 'returns success with richness 0.0 initially' do
98
+ result = client.cross_modal_richness
99
+ expect(result[:success]).to be true
100
+ expect(result[:richness]).to eq(0.0)
101
+ end
102
+
103
+ it 'returns richness > 0 after adding active mappings' do
104
+ register_mapping(source: :auditory, target: :visual, strength: 0.6)
105
+ result = client.cross_modal_richness
106
+ expect(result[:richness]).to be > 0.0
107
+ end
108
+
109
+ it 'includes richness_label' do
110
+ result = client.cross_modal_richness
111
+ expect(result[:richness_label]).to be_a(Symbol)
112
+ end
113
+ end
114
+
115
+ describe '#dominant_modality_pairs' do
116
+ it 'returns success with empty pairs initially' do
117
+ result = client.dominant_modality_pairs
118
+ expect(result[:success]).to be true
119
+ expect(result[:pairs]).to be_empty
120
+ end
121
+
122
+ it 'returns pairs after triggers' do
123
+ register_mapping(source: :auditory, target: :visual, strength: 0.6)
124
+ 3.times { client.trigger(source_modality: :auditory, input: {}) }
125
+ result = client.dominant_modality_pairs
126
+ expect(result[:pairs].first[:pair]).to eq('auditory->visual')
127
+ end
128
+
129
+ it 'respects limit' do
130
+ result = client.dominant_modality_pairs(limit: 2)
131
+ expect(result[:count]).to be <= 2
132
+ end
133
+ end
134
+
135
+ describe '#event_history' do
136
+ it 'returns success with empty events initially' do
137
+ result = client.event_history
138
+ expect(result[:success]).to be true
139
+ expect(result[:events]).to be_empty
140
+ end
141
+
142
+ it 'returns events after triggering' do
143
+ register_mapping(source: :auditory, target: :visual, strength: 0.6)
144
+ client.trigger(source_modality: :auditory, input: {})
145
+ result = client.event_history
146
+ expect(result[:count]).to eq(1)
147
+ end
148
+
149
+ it 'respects limit' do
150
+ register_mapping(source: :auditory, target: :visual, strength: 0.8)
151
+ 5.times { client.trigger(source_modality: :auditory, input: {}) }
152
+ result = client.event_history(limit: 2)
153
+ expect(result[:count]).to eq(2)
154
+ end
155
+ end
156
+
157
+ describe '#modality_coverage' do
158
+ it 'returns success with 0 coverage initially' do
159
+ result = client.modality_coverage
160
+ expect(result[:success]).to be true
161
+ expect(result[:coverage_count]).to eq(0)
162
+ end
163
+
164
+ it 'reflects active mappings' do
165
+ register_mapping(source: :auditory, target: :visual, strength: 0.6)
166
+ result = client.modality_coverage
167
+ expect(result[:covered_modalities]).to include(:auditory, :visual)
168
+ end
169
+ end
170
+
171
+ describe '#synesthesia_report' do
172
+ it 'returns success with full report hash' do
173
+ result = client.synesthesia_report
174
+ expect(result[:success]).to be true
175
+ expect(result).to include(:mapping_count, :active_mapping_count, :event_count,
176
+ :cross_modal_richness, :richness_label)
177
+ end
178
+
179
+ it 'reflects registered mappings' do
180
+ register_mapping
181
+ result = client.synesthesia_report
182
+ expect(result[:mapping_count]).to eq(1)
183
+ end
184
+
185
+ it 'reflects triggered events' do
186
+ register_mapping(source: :auditory, target: :visual, strength: 0.6)
187
+ client.trigger(source_modality: :auditory, input: { note: :G4 })
188
+ result = client.synesthesia_report
189
+ expect(result[:event_count]).to eq(1)
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Telescope::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ let(:engine) { Legion::Extensions::Agentic::Attention::Telescope::Helpers::ObservatoryEngine.new }
7
+
8
+ it 'includes runner methods' do
9
+ expect(client).to respond_to(:create_telescope)
10
+ expect(client).to respond_to(:zoom_in)
11
+ expect(client).to respond_to(:zoom_out)
12
+ expect(client).to respond_to(:observe)
13
+ expect(client).to respond_to(:focus)
14
+ expect(client).to respond_to(:survey_mode)
15
+ expect(client).to respond_to(:deep_focus)
16
+ expect(client).to respond_to(:list_observations)
17
+ expect(client).to respond_to(:observatory_status)
18
+ end
19
+
20
+ it 'delegates create_telescope to runner' do
21
+ result = client.create_telescope(lens_type: :refractor, engine: engine)
22
+ expect(result[:success]).to be true
23
+ end
24
+
25
+ it 'delegates observatory_status to runner' do
26
+ result = client.observatory_status(engine: engine)
27
+ expect(result[:success]).to be true
28
+ expect(result[:report]).to have_key(:total_telescopes)
29
+ end
30
+ end
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Telescope::Helpers::Constants do
4
+ describe 'LENS_TYPES' do
5
+ it 'contains expected lens types' do
6
+ expect(described_class::LENS_TYPES).to include(:refractor, :reflector, :catadioptric, :radio, :adaptive)
7
+ end
8
+
9
+ it 'is frozen' do
10
+ expect(described_class::LENS_TYPES).to be_frozen
11
+ end
12
+ end
13
+
14
+ describe 'OBSERVATION_MODES' do
15
+ it 'contains expected modes' do
16
+ expect(described_class::OBSERVATION_MODES).to include(:survey, :focused, :tracking, :spectral)
17
+ end
18
+
19
+ it 'is frozen' do
20
+ expect(described_class::OBSERVATION_MODES).to be_frozen
21
+ end
22
+ end
23
+
24
+ describe 'numeric constants' do
25
+ it 'MAX_TELESCOPES is 100' do
26
+ expect(described_class::MAX_TELESCOPES).to eq(100)
27
+ end
28
+
29
+ it 'MAX_OBSERVATIONS is 500' do
30
+ expect(described_class::MAX_OBSERVATIONS).to eq(500)
31
+ end
32
+
33
+ it 'BASE_MAGNIFICATION is 1.0' do
34
+ expect(described_class::BASE_MAGNIFICATION).to eq(1.0)
35
+ end
36
+
37
+ it 'MAX_MAGNIFICATION is 100.0' do
38
+ expect(described_class::MAX_MAGNIFICATION).to eq(100.0)
39
+ end
40
+
41
+ it 'FIELD_OF_VIEW_BASE is 1.0' do
42
+ expect(described_class::FIELD_OF_VIEW_BASE).to eq(1.0)
43
+ end
44
+
45
+ it 'ATMOSPHERIC_DISTORTION is 0.1' do
46
+ expect(described_class::ATMOSPHERIC_DISTORTION).to eq(0.1)
47
+ end
48
+ end
49
+
50
+ describe 'CLARITY_LABELS' do
51
+ it 'is an array of range-label pairs' do
52
+ expect(described_class::CLARITY_LABELS).to be_an(Array)
53
+ described_class::CLARITY_LABELS.each do |pair|
54
+ expect(pair.size).to eq(2)
55
+ expect(pair.first).to be_a(Range)
56
+ expect(pair.last).to be_a(Symbol)
57
+ end
58
+ end
59
+
60
+ it 'includes crystal, clear, hazy, blurry, blind labels' do
61
+ labels = described_class::CLARITY_LABELS.map(&:last)
62
+ expect(labels).to include(:crystal, :clear, :hazy, :blurry, :blind)
63
+ end
64
+ end
65
+
66
+ describe 'DISTANCE_LABELS' do
67
+ it 'is an array of range-label pairs' do
68
+ expect(described_class::DISTANCE_LABELS).to be_an(Array)
69
+ end
70
+
71
+ it 'includes cosmic, deep, medium, near, myopic labels' do
72
+ labels = described_class::DISTANCE_LABELS.map(&:last)
73
+ expect(labels).to include(:cosmic, :deep, :medium, :near, :myopic)
74
+ end
75
+ end
76
+
77
+ describe '.label_for' do
78
+ it 'returns :crystal for high clarity' do
79
+ result = described_class.label_for(described_class::CLARITY_LABELS, 0.95)
80
+ expect(result).to eq(:crystal)
81
+ end
82
+
83
+ it 'returns :blind for very low clarity' do
84
+ result = described_class.label_for(described_class::CLARITY_LABELS, 0.1)
85
+ expect(result).to eq(:blind)
86
+ end
87
+
88
+ it 'returns :clear for mid-high clarity' do
89
+ result = described_class.label_for(described_class::CLARITY_LABELS, 0.75)
90
+ expect(result).to eq(:clear)
91
+ end
92
+
93
+ it 'returns :cosmic for high distance' do
94
+ result = described_class.label_for(described_class::DISTANCE_LABELS, 0.9)
95
+ expect(result).to eq(:cosmic)
96
+ end
97
+
98
+ it 'returns :myopic for very low distance' do
99
+ result = described_class.label_for(described_class::DISTANCE_LABELS, 0.05)
100
+ expect(result).to eq(:myopic)
101
+ end
102
+
103
+ it 'returns last label as fallback' do
104
+ result = described_class.label_for(described_class::CLARITY_LABELS, -999.0)
105
+ expect(result).to eq(described_class::CLARITY_LABELS.last.last)
106
+ end
107
+ end
108
+ end