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,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Lens::Helpers::LensStack do
4
+ let(:lens_class) { Legion::Extensions::Agentic::Attention::Lens::Helpers::Lens }
5
+ let(:stack) { described_class.new }
6
+
7
+ let(:magnifying) { lens_class.new(lens_type: :magnifying, magnification: 2.0, clarity: 1.0, distortion: 0.1) }
8
+ let(:wide_angle) { lens_class.new(lens_type: :wide_angle, magnification: 0.5, clarity: 0.9, distortion: 0.2) }
9
+ let(:polarized) { lens_class.new(lens_type: :polarized, magnification: 1.0, clarity: 0.8, distortion: 0.0) }
10
+
11
+ describe '#push_lens' do
12
+ it 'adds a lens to the stack' do
13
+ stack.push_lens(magnifying)
14
+ expect(stack.size).to eq(1)
15
+ end
16
+
17
+ it 'returns self for chaining' do
18
+ expect(stack.push_lens(magnifying)).to eq(stack)
19
+ end
20
+
21
+ it 'raises ArgumentError for non-Lens objects' do
22
+ expect { stack.push_lens('not_a_lens') }.to raise_error(ArgumentError, /expected a Lens/)
23
+ end
24
+
25
+ it 'raises ArgumentError when stack is full' do
26
+ lens_count = Legion::Extensions::Agentic::Attention::Lens::Helpers::Constants::MAX_LENSES
27
+ lens_count.times { stack.push_lens(lens_class.new(lens_type: :magnifying)) }
28
+ expect { stack.push_lens(lens_class.new(lens_type: :wide_angle)) }.to raise_error(ArgumentError, /stack is full/)
29
+ end
30
+ end
31
+
32
+ describe '#pop_lens' do
33
+ it 'removes and returns the last lens' do
34
+ stack.push_lens(magnifying)
35
+ stack.push_lens(wide_angle)
36
+ popped = stack.pop_lens
37
+ expect(popped).to eq(wide_angle)
38
+ expect(stack.size).to eq(1)
39
+ end
40
+
41
+ it 'returns nil when stack is empty' do
42
+ expect(stack.pop_lens).to be_nil
43
+ end
44
+ end
45
+
46
+ describe '#empty?' do
47
+ it 'returns true for new stack' do
48
+ expect(stack.empty?).to be true
49
+ end
50
+
51
+ it 'returns false after pushing a lens' do
52
+ stack.push_lens(magnifying)
53
+ expect(stack.empty?).to be false
54
+ end
55
+ end
56
+
57
+ describe '#combined_magnification' do
58
+ it 'returns 1.0 for empty stack' do
59
+ expect(stack.combined_magnification).to eq(1.0)
60
+ end
61
+
62
+ it 'applies sub-linear compounding for single lens' do
63
+ stack.push_lens(magnifying)
64
+ expected = (2.0**Legion::Extensions::Agentic::Attention::Lens::Helpers::Constants::STACK_MAGNIFICATION_EXPONENT)
65
+ expect(stack.combined_magnification).to be_within(0.001).of(expected)
66
+ end
67
+
68
+ it 'compounds magnification for multiple lenses' do
69
+ stack.push_lens(magnifying)
70
+ stack.push_lens(wide_angle)
71
+ expect(stack.combined_magnification).to be > 0.0
72
+ end
73
+ end
74
+
75
+ describe '#combined_distortion' do
76
+ it 'returns 0.0 for empty stack' do
77
+ expect(stack.combined_distortion).to eq(0.0)
78
+ end
79
+
80
+ it 'returns lens distortion for single lens' do
81
+ stack.push_lens(polarized)
82
+ expect(stack.combined_distortion).to eq(0.0)
83
+ end
84
+
85
+ it 'blends toward worst distortion for multiple lenses' do
86
+ stack.push_lens(magnifying) # 0.1 distortion
87
+ stack.push_lens(wide_angle) # 0.2 distortion
88
+ expect(stack.combined_distortion).to be_between(0.1, 0.2)
89
+ end
90
+
91
+ it 'is clamped between 0 and 1' do
92
+ stack.push_lens(lens_class.new(lens_type: :fish_eye))
93
+ expect(stack.combined_distortion).to be_between(0.0, 1.0)
94
+ end
95
+ end
96
+
97
+ describe '#stack_clarity' do
98
+ it 'returns 1.0 for empty stack' do
99
+ expect(stack.stack_clarity).to eq(1.0)
100
+ end
101
+
102
+ it 'returns lens clarity for single lens' do
103
+ stack.push_lens(polarized)
104
+ expect(stack.stack_clarity).to be <= polarized.clarity
105
+ end
106
+
107
+ it 'decays clarity with each additional lens' do
108
+ stack.push_lens(magnifying)
109
+ single_clarity = stack.stack_clarity
110
+
111
+ stack.push_lens(wide_angle)
112
+ expect(stack.stack_clarity).to be < single_clarity
113
+ end
114
+
115
+ it 'is clamped between 0 and 1' do
116
+ 3.times { stack.push_lens(lens_class.new(lens_type: :magnifying, clarity: 0.5)) }
117
+ expect(stack.stack_clarity).to be_between(0.0, 1.0)
118
+ end
119
+ end
120
+
121
+ describe '#view_through' do
122
+ it 'returns original content when stack is empty' do
123
+ expect(stack.view_through(0.6)).to eq(0.6)
124
+ end
125
+
126
+ it 'returns a result hash with expected keys' do
127
+ stack.push_lens(magnifying)
128
+ result = stack.view_through(0.5)
129
+ expect(result.keys).to include(:original, :perceived, :combined_magnification,
130
+ :combined_distortion, :stack_clarity, :lens_count, :focus_active)
131
+ end
132
+
133
+ it 'preserves neutral value (0.5) through neutral magnification' do
134
+ lens = lens_class.new(lens_type: :polarized, magnification: 1.0, distortion: 0.0, clarity: 1.0)
135
+ stack.push_lens(lens)
136
+ result = stack.view_through(0.5)
137
+ expect(result[:perceived]).to be_within(0.05).of(0.5)
138
+ end
139
+
140
+ it 'magnifies values away from center' do
141
+ stack.push_lens(magnifying)
142
+ result = stack.view_through(0.8)
143
+ expect(result[:perceived]).to be > 0.5
144
+ end
145
+
146
+ it 'accepts hash content with :value key' do
147
+ stack.push_lens(magnifying)
148
+ result = stack.view_through({ value: 0.7 })
149
+ expect(result[:original]).to be_within(0.001).of(0.7)
150
+ end
151
+
152
+ it 'reports focus_active as true when a lens is focused' do
153
+ magnifying.focus!('target')
154
+ stack.push_lens(magnifying)
155
+ result = stack.view_through(0.5)
156
+ expect(result[:focus_active]).to be true
157
+ end
158
+
159
+ it 'reports focus_active as false when no lens is focused' do
160
+ stack.push_lens(magnifying)
161
+ result = stack.view_through(0.5)
162
+ expect(result[:focus_active]).to be false
163
+ end
164
+ end
165
+
166
+ describe '#to_h' do
167
+ it 'includes stack summary fields' do
168
+ stack.push_lens(magnifying)
169
+ h = stack.to_h
170
+ expect(h.keys).to include(:lens_count, :combined_magnification, :combined_distortion,
171
+ :stack_clarity, :lenses)
172
+ end
173
+
174
+ it 'includes lens details' do
175
+ stack.push_lens(magnifying)
176
+ expect(stack.to_h[:lenses].size).to eq(1)
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/lens/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Lens::Runners::CognitiveLens do
6
+ let(:client) { Legion::Extensions::Agentic::Attention::Lens::Client.new }
7
+ let(:engine) { Legion::Extensions::Agentic::Attention::Lens::Helpers::LensEngine.new }
8
+
9
+ describe '#create_lens' do
10
+ it 'returns success: true' do
11
+ result = client.create_lens(lens_type: :magnifying)
12
+ expect(result[:success]).to be true
13
+ end
14
+
15
+ it 'returns lens hash' do
16
+ result = client.create_lens(lens_type: :magnifying)
17
+ expect(result[:lens]).to include(:id, :lens_type, :magnification)
18
+ end
19
+
20
+ it 'creates all supported lens types' do
21
+ lens_types = Legion::Extensions::Agentic::Attention::Lens::Helpers::Constants::LENS_TYPES
22
+ lens_types.each do |lt|
23
+ result = client.create_lens(lens_type: lt)
24
+ expect(result[:success]).to be true
25
+ end
26
+ end
27
+
28
+ it 'returns success: false for invalid lens type' do
29
+ result = client.create_lens(lens_type: :quantum)
30
+ expect(result[:success]).to be false
31
+ expect(result[:error]).to match(/unknown lens_type/)
32
+ end
33
+
34
+ it 'forwards custom magnification' do
35
+ result = client.create_lens(lens_type: :magnifying, magnification: 3.0)
36
+ expect(result[:lens][:magnification]).to be_within(0.001).of(3.0)
37
+ end
38
+
39
+ it 'forwards custom clarity' do
40
+ result = client.create_lens(lens_type: :magnifying, clarity: 0.7)
41
+ expect(result[:lens][:clarity]).to be_within(0.001).of(0.7)
42
+ end
43
+
44
+ it 'accepts injected engine' do
45
+ result = client.create_lens(lens_type: :wide_angle, engine: engine)
46
+ expect(result[:success]).to be true
47
+ expect(engine.lenses.size).to eq(1)
48
+ end
49
+ end
50
+
51
+ describe '#stack_lenses' do
52
+ let(:lens1_result) { client.create_lens(lens_type: :magnifying) }
53
+ let(:lens2_result) { client.create_lens(lens_type: :wide_angle) }
54
+ let(:lens1_id) { lens1_result[:lens][:id] }
55
+ let(:lens2_id) { lens2_result[:lens][:id] }
56
+
57
+ it 'returns success: true' do
58
+ result = client.stack_lenses(lens_ids: [lens1_id, lens2_id])
59
+ expect(result[:success]).to be true
60
+ end
61
+
62
+ it 'returns a stack_id' do
63
+ result = client.stack_lenses(lens_ids: [lens1_id])
64
+ expect(result[:stack_id]).to be_a(String)
65
+ end
66
+
67
+ it 'returns stack details' do
68
+ result = client.stack_lenses(lens_ids: [lens1_id])
69
+ expect(result[:stack]).to include(:lens_count, :combined_magnification)
70
+ end
71
+
72
+ it 'returns success: false for unknown lens ids' do
73
+ result = client.stack_lenses(lens_ids: ['unknown'])
74
+ expect(result[:success]).to be false
75
+ end
76
+
77
+ it 'returns success: false when lens_ids is not an array' do
78
+ result = client.stack_lenses(lens_ids: 'bad')
79
+ expect(result[:success]).to be false
80
+ end
81
+ end
82
+
83
+ describe '#view_through_stack' do
84
+ let(:lens_id) do
85
+ client.create_lens(lens_type: :magnifying)[:lens][:id]
86
+ end
87
+ let(:stack_id) do
88
+ client.stack_lenses(lens_ids: [lens_id])[:stack_id]
89
+ end
90
+
91
+ it 'returns success: true' do
92
+ result = client.view_through_stack(stack_id: stack_id, content: 0.6)
93
+ expect(result[:success]).to be true
94
+ end
95
+
96
+ it 'returns perceived value' do
97
+ result = client.view_through_stack(stack_id: stack_id, content: 0.6)
98
+ expect(result[:perceived]).to be_between(0.0, 1.0)
99
+ end
100
+
101
+ it 'returns success: false for unknown stack_id' do
102
+ result = client.view_through_stack(stack_id: 'bad', content: 0.5)
103
+ expect(result[:success]).to be false
104
+ end
105
+ end
106
+
107
+ describe '#degrade_all' do
108
+ it 'returns success: true' do
109
+ result = client.degrade_all
110
+ expect(result[:success]).to be true
111
+ end
112
+
113
+ it 'reports number of degraded lenses' do
114
+ client.create_lens(lens_type: :magnifying)
115
+ client.create_lens(lens_type: :wide_angle)
116
+ result = client.degrade_all
117
+ expect(result[:degraded]).to eq(2)
118
+ end
119
+
120
+ it 'accepts custom rate' do
121
+ result = client.degrade_all(rate: 0.1)
122
+ expect(result[:rate]).to eq(0.1)
123
+ end
124
+ end
125
+
126
+ describe '#lens_report' do
127
+ it 'returns success: true' do
128
+ result = client.lens_report
129
+ expect(result[:success]).to be true
130
+ end
131
+
132
+ it 'includes lens_count' do
133
+ result = client.lens_report
134
+ expect(result).to have_key(:lens_count)
135
+ end
136
+
137
+ it 'counts created lenses' do
138
+ client.create_lens(lens_type: :magnifying)
139
+ client.create_lens(lens_type: :polarized)
140
+ result = client.lens_report
141
+ expect(result[:lens_count]).to eq(2)
142
+ end
143
+ end
144
+
145
+ describe '#clearest_lenses' do
146
+ it 'returns success: true' do
147
+ result = client.clearest_lenses
148
+ expect(result[:success]).to be true
149
+ end
150
+
151
+ it 'returns lenses array' do
152
+ client.create_lens(lens_type: :magnifying, clarity: 0.9)
153
+ result = client.clearest_lenses
154
+ expect(result[:lenses]).to be_an(Array)
155
+ end
156
+
157
+ it 'respects limit' do
158
+ 5.times { client.create_lens(lens_type: :magnifying) }
159
+ result = client.clearest_lenses(limit: 2)
160
+ expect(result[:lenses].size).to be <= 2
161
+ end
162
+ end
163
+
164
+ describe '#most_distorted' do
165
+ it 'returns success: true' do
166
+ result = client.most_distorted
167
+ expect(result[:success]).to be true
168
+ end
169
+
170
+ it 'returns lenses array' do
171
+ client.create_lens(lens_type: :fish_eye)
172
+ result = client.most_distorted
173
+ expect(result[:lenses]).to be_an(Array)
174
+ end
175
+
176
+ it 'respects limit' do
177
+ 5.times { client.create_lens(lens_type: :fish_eye) }
178
+ result = client.most_distorted(limit: 2)
179
+ expect(result[:lenses].size).to be <= 2
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Lighthouse::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'creates a client with default engine' do
8
+ expect(client).to be_a(described_class)
9
+ end
10
+
11
+ it 'accepts an injected engine' do
12
+ custom = Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::LighthouseEngine.new
13
+ c = described_class.new(engine: custom)
14
+ expect(c).to be_a(described_class)
15
+ end
16
+ end
17
+
18
+ describe 'runner method delegation' do
19
+ it 'responds to light_beacon' do
20
+ expect(client).to respond_to(:light_beacon)
21
+ end
22
+
23
+ it 'responds to create_fog' do
24
+ expect(client).to respond_to(:create_fog)
25
+ end
26
+
27
+ it 'responds to sweep' do
28
+ expect(client).to respond_to(:sweep)
29
+ end
30
+
31
+ it 'responds to list_beacons' do
32
+ expect(client).to respond_to(:list_beacons)
33
+ end
34
+
35
+ it 'responds to navigation_status' do
36
+ expect(client).to respond_to(:navigation_status)
37
+ end
38
+ end
39
+
40
+ describe 'full lifecycle' do
41
+ it 'lights a beacon and checks status' do
42
+ result = client.light_beacon(beacon_type: :truth, domain: 'reasoning', content: 'seek truth')
43
+ expect(result[:success]).to be true
44
+
45
+ status = client.navigation_status
46
+ expect(status[:report][:total_beacons]).to eq(1)
47
+ end
48
+
49
+ it 'creates fog and sweeps with beacon' do
50
+ beacon_result = client.light_beacon(
51
+ beacon_type: :clarity, domain: 'planning', content: 'clear path', luminosity: 0.8
52
+ )
53
+ fog_result = client.create_fog(fog_type: :confusion, domain: 'planning', density: 0.7)
54
+
55
+ sweep_result = client.sweep(
56
+ beacon_id: beacon_result[:beacon][:id],
57
+ fog_id: fog_result[:fog][:id]
58
+ )
59
+
60
+ expect(sweep_result[:success]).to be true
61
+ expect(sweep_result[:fog][:density]).to be < 0.7
62
+ end
63
+
64
+ it 'lists beacons after lighting multiple' do
65
+ client.light_beacon(beacon_type: :guidance, domain: 'alpha', content: 'first')
66
+ client.light_beacon(beacon_type: :hope, domain: 'beta', content: 'second')
67
+
68
+ result = client.list_beacons
69
+ expect(result[:count]).to eq(2)
70
+ end
71
+
72
+ it 'persists state across calls using its own engine' do
73
+ c1 = described_class.new
74
+ c1.light_beacon(beacon_type: :warning, domain: 'x', content: 'y')
75
+
76
+ c2 = described_class.new
77
+ expect(c1.navigation_status[:report][:total_beacons]).to eq(1)
78
+ expect(c2.navigation_status[:report][:total_beacons]).to eq(0)
79
+ end
80
+
81
+ it 'returns failure gracefully for invalid types' do
82
+ result = client.light_beacon(beacon_type: :phantom, domain: 'x', content: 'y')
83
+ expect(result[:success]).to be false
84
+ expect(result[:error]).to be_a(String)
85
+ end
86
+
87
+ it 'filters beacons by type' do
88
+ client.light_beacon(beacon_type: :truth, domain: 'a', content: 'first')
89
+ client.light_beacon(beacon_type: :hope, domain: 'b', content: 'second')
90
+ client.light_beacon(beacon_type: :truth, domain: 'c', content: 'third')
91
+
92
+ result = client.list_beacons(beacon_type: :truth)
93
+ expect(result[:count]).to eq(2)
94
+ end
95
+
96
+ it 'navigation_status shows fog metrics' do
97
+ client.create_fog(fog_type: :overwhelm, domain: 'x', density: 0.9)
98
+ report = client.navigation_status[:report]
99
+ expect(report[:total_fog_banks]).to eq(1)
100
+ expect(report[:avg_density]).to be > 0
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,170 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::Beacon do
4
+ subject(:beacon) { described_class.new(beacon_type: :truth, domain: 'reasoning', content: 'north star') }
5
+
6
+ describe '#initialize' do
7
+ it 'sets beacon_type as symbol' do
8
+ expect(beacon.beacon_type).to eq(:truth)
9
+ end
10
+
11
+ it 'sets domain as string' do
12
+ expect(beacon.domain).to eq('reasoning')
13
+ end
14
+
15
+ it 'sets content as string' do
16
+ expect(beacon.content).to eq('north star')
17
+ end
18
+
19
+ it 'defaults luminosity to 0.7' do
20
+ expect(beacon.luminosity).to be_within(0.001).of(0.7)
21
+ end
22
+
23
+ it 'defaults sweep_angle to 0.0' do
24
+ expect(beacon.sweep_angle).to be_within(0.001).of(0.0)
25
+ end
26
+
27
+ it 'assigns a UUID id' do
28
+ expect(beacon.id).to match(/\A[0-9a-f-]{36}\z/)
29
+ end
30
+
31
+ it 'sets lit_at timestamp' do
32
+ expect(beacon.lit_at).to be_a(Time)
33
+ end
34
+
35
+ it 'clamps luminosity to [0, 1]' do
36
+ b = described_class.new(beacon_type: :clarity, domain: 'x', content: 'y', luminosity: 2.0)
37
+ expect(b.luminosity).to eq(1.0)
38
+ end
39
+
40
+ it 'clamps sweep_angle to [0, 360]' do
41
+ b = described_class.new(beacon_type: :hope, domain: 'x', content: 'y', sweep_angle: 400.0)
42
+ expect(b.sweep_angle).to eq(360.0)
43
+ end
44
+
45
+ it 'raises for unknown beacon_type' do
46
+ expect do
47
+ described_class.new(beacon_type: :mirage, domain: 'x', content: 'y')
48
+ end.to raise_error(ArgumentError, /unknown beacon_type/)
49
+ end
50
+
51
+ it 'accepts all valid beacon types' do
52
+ Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::Constants::BEACON_TYPES.each do |type|
53
+ expect do
54
+ described_class.new(beacon_type: type, domain: 'test', content: 'test')
55
+ end.not_to raise_error
56
+ end
57
+ end
58
+ end
59
+
60
+ describe '#brighten!' do
61
+ it 'increases luminosity by default rate' do
62
+ beacon.luminosity = 0.5
63
+ beacon.brighten!
64
+ expect(beacon.luminosity).to be_within(0.001).of(0.6)
65
+ end
66
+
67
+ it 'accepts custom rate' do
68
+ beacon.luminosity = 0.5
69
+ beacon.brighten!(rate: 0.2)
70
+ expect(beacon.luminosity).to be_within(0.001).of(0.7)
71
+ end
72
+
73
+ it 'clamps at 1.0' do
74
+ beacon.luminosity = 0.95
75
+ beacon.brighten!(rate: 0.1)
76
+ expect(beacon.luminosity).to eq(1.0)
77
+ end
78
+
79
+ it 'returns self for chaining' do
80
+ expect(beacon.brighten!).to eq(beacon)
81
+ end
82
+ end
83
+
84
+ describe '#dim!' do
85
+ it 'decreases luminosity by default rate' do
86
+ beacon.luminosity = 0.5
87
+ beacon.dim!
88
+ expect(beacon.luminosity).to be_within(0.001).of(0.4)
89
+ end
90
+
91
+ it 'accepts custom rate' do
92
+ beacon.luminosity = 0.5
93
+ beacon.dim!(rate: 0.3)
94
+ expect(beacon.luminosity).to be_within(0.001).of(0.2)
95
+ end
96
+
97
+ it 'clamps at 0.0' do
98
+ beacon.luminosity = 0.05
99
+ beacon.dim!(rate: 0.1)
100
+ expect(beacon.luminosity).to eq(0.0)
101
+ end
102
+
103
+ it 'returns self for chaining' do
104
+ expect(beacon.dim!).to eq(beacon)
105
+ end
106
+ end
107
+
108
+ describe '#extinguished?' do
109
+ it 'returns false when luminosity > 0' do
110
+ beacon.luminosity = 0.5
111
+ expect(beacon.extinguished?).to be false
112
+ end
113
+
114
+ it 'returns true when luminosity is 0' do
115
+ beacon.luminosity = 0.0
116
+ expect(beacon.extinguished?).to be true
117
+ end
118
+ end
119
+
120
+ describe '#blazing?' do
121
+ it 'returns false for moderate luminosity' do
122
+ beacon.luminosity = 0.5
123
+ expect(beacon.blazing?).to be false
124
+ end
125
+
126
+ it 'returns true when luminosity >= 0.9' do
127
+ beacon.luminosity = 0.9
128
+ expect(beacon.blazing?).to be true
129
+ end
130
+ end
131
+
132
+ describe '#luminosity_label' do
133
+ it 'returns a symbol' do
134
+ expect(beacon.luminosity_label).to be_a(Symbol)
135
+ end
136
+
137
+ it 'returns :blazing for luminosity 1.0' do
138
+ beacon.luminosity = 1.0
139
+ expect(beacon.luminosity_label).to eq(:blazing)
140
+ end
141
+
142
+ it 'returns :dark for luminosity 0.0' do
143
+ beacon.luminosity = 0.0
144
+ expect(beacon.luminosity_label).to eq(:dark)
145
+ end
146
+
147
+ it 'returns :steady for mid-range luminosity' do
148
+ beacon.luminosity = 0.6
149
+ expect(beacon.luminosity_label).to eq(:steady)
150
+ end
151
+ end
152
+
153
+ describe '#to_h' do
154
+ it 'includes expected keys' do
155
+ h = beacon.to_h
156
+ %i[id beacon_type domain content luminosity sweep_angle
157
+ luminosity_label extinguished blazing lit_at].each do |k|
158
+ expect(h).to have_key(k)
159
+ end
160
+ end
161
+
162
+ it 'beacon_type matches' do
163
+ expect(beacon.to_h[:beacon_type]).to eq(:truth)
164
+ end
165
+
166
+ it 'extinguished is boolean' do
167
+ expect(beacon.to_h[:extinguished]).to be(false).or be(true)
168
+ end
169
+ end
170
+ end