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,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Lens
8
+ module Helpers
9
+ class LensEngine
10
+ include Constants
11
+
12
+ attr_reader :lenses, :stacks
13
+
14
+ def initialize
15
+ @lenses = {}
16
+ @stacks = {}
17
+ end
18
+
19
+ def create_lens(lens_type:, magnification: nil, clarity: 1.0, distortion: nil, aperture: nil, **)
20
+ lens = Lens.new(
21
+ lens_type: lens_type,
22
+ magnification: magnification,
23
+ clarity: clarity,
24
+ distortion: distortion,
25
+ aperture: aperture
26
+ )
27
+ @lenses[lens.id] = lens
28
+ lens
29
+ end
30
+
31
+ def stack_lenses(lens_ids:, stack_id: nil, **)
32
+ stack_id ||= SecureRandom.uuid
33
+ stack = LensStack.new
34
+
35
+ lens_ids.each do |lid|
36
+ lens = @lenses[lid]
37
+ raise ArgumentError, "lens not found: #{lid}" unless lens
38
+
39
+ stack.push_lens(lens)
40
+ end
41
+
42
+ @stacks[stack_id] = stack
43
+ { stack_id: stack_id, stack: stack }
44
+ end
45
+
46
+ def view_through_stack(stack_id:, content:, **)
47
+ stack = @stacks[stack_id]
48
+ raise ArgumentError, "stack not found: #{stack_id}" unless stack
49
+
50
+ result = stack.view_through(content)
51
+ Legion::Logging.debug "[cognitive_lens] view_through stack=#{stack_id} " \
52
+ "perceived=#{result[:perceived].round(4)} " \
53
+ "magnification=#{result[:combined_magnification].round(2)} " \
54
+ "distortion=#{result[:combined_distortion].round(2)} " \
55
+ "clarity=#{result[:stack_clarity].round(2)}"
56
+ result
57
+ end
58
+
59
+ def degrade_all!(rate: Constants::SMUDGE_RATE_DEFAULT)
60
+ @lenses.each_value { |l| l.smudge!(rate) }
61
+ { degraded: @lenses.size, rate: rate }
62
+ end
63
+
64
+ def clearest_lenses(limit: 3)
65
+ @lenses.values
66
+ .sort_by { |l| -l.clarity }
67
+ .first(limit)
68
+ .map(&:to_h)
69
+ end
70
+
71
+ def most_distorted(limit: 3)
72
+ @lenses.values
73
+ .sort_by { |l| -l.distortion }
74
+ .first(limit)
75
+ .map(&:to_h)
76
+ end
77
+
78
+ def lens_report
79
+ return { lens_count: 0, stack_count: 0, lenses: [], stacks: [] } if @lenses.empty?
80
+
81
+ avg_clarity = (@lenses.values.sum(&:clarity) / @lenses.size).round(10)
82
+ avg_distortion = (@lenses.values.sum(&:distortion) / @lenses.size).round(10)
83
+
84
+ {
85
+ lens_count: @lenses.size,
86
+ stack_count: @stacks.size,
87
+ avg_clarity: avg_clarity,
88
+ avg_distortion: avg_distortion,
89
+ sharp_count: @lenses.values.count(&:sharp?),
90
+ blurry_count: @lenses.values.count(&:blurry?),
91
+ lenses: @lenses.values.map(&:to_h),
92
+ stacks: @stacks.transform_values(&:to_h)
93
+ }
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Lens
8
+ module Helpers
9
+ class LensStack
10
+ include Constants
11
+
12
+ attr_reader :lenses
13
+
14
+ def initialize
15
+ @lenses = []
16
+ end
17
+
18
+ def push_lens(lens)
19
+ raise ArgumentError, 'expected a Lens instance' unless lens.is_a?(Lens)
20
+ raise ArgumentError, "stack is full (max #{Constants::MAX_LENSES})" if @lenses.size >= Constants::MAX_LENSES
21
+
22
+ @lenses << lens
23
+ self
24
+ end
25
+
26
+ def pop_lens
27
+ @lenses.pop
28
+ end
29
+
30
+ def size
31
+ @lenses.size
32
+ end
33
+
34
+ def empty?
35
+ @lenses.empty?
36
+ end
37
+
38
+ def combined_magnification
39
+ return 1.0 if @lenses.empty?
40
+
41
+ # Sub-linear compounding via exponent to avoid extreme values
42
+ base = @lenses.reduce(1.0) { |acc, l| acc * l.magnification }
43
+ base**Constants::STACK_MAGNIFICATION_EXPONENT
44
+ end
45
+
46
+ def combined_distortion
47
+ return 0.0 if @lenses.empty?
48
+
49
+ max_dist = @lenses.map(&:distortion).max
50
+ mean_dist = @lenses.sum(&:distortion) / @lenses.size
51
+ # Blend toward worst distortion
52
+ ((max_dist * Constants::STACK_DISTORTION_BLEND) +
53
+ (mean_dist * (1.0 - Constants::STACK_DISTORTION_BLEND))).clamp(0.0, 1.0).round(10)
54
+ end
55
+
56
+ def stack_clarity
57
+ return 1.0 if @lenses.empty?
58
+
59
+ base = @lenses.map(&:clarity).min
60
+ decay = Constants::STACK_CLARITY_DECAY**(@lenses.size - 1)
61
+ (base * decay).clamp(0.0, 1.0).round(10)
62
+ end
63
+
64
+ # Apply all lenses to a content value (numeric 0.0-1.0) or hash with :value key
65
+ def view_through(content)
66
+ return content if @lenses.empty?
67
+
68
+ raw_value = extract_value(content)
69
+ magnified = apply_magnification(raw_value)
70
+ distorted = apply_distortion(magnified)
71
+ filtered = apply_clarity(distorted)
72
+
73
+ {
74
+ original: raw_value,
75
+ perceived: filtered.round(10),
76
+ combined_magnification: combined_magnification.round(10),
77
+ combined_distortion: combined_distortion.round(10),
78
+ stack_clarity: stack_clarity.round(10),
79
+ lens_count: @lenses.size,
80
+ focus_active: @lenses.any?(&:focused?)
81
+ }
82
+ end
83
+
84
+ def to_h
85
+ {
86
+ lens_count: @lenses.size,
87
+ combined_magnification: combined_magnification.round(10),
88
+ combined_distortion: combined_distortion.round(10),
89
+ stack_clarity: stack_clarity.round(10),
90
+ lenses: @lenses.map(&:to_h)
91
+ }
92
+ end
93
+
94
+ private
95
+
96
+ def extract_value(content)
97
+ if content.is_a?(Hash)
98
+ content.fetch(:value, 0.5).clamp(0.0, 1.0)
99
+ else
100
+ content.to_f.clamp(0.0, 1.0)
101
+ end
102
+ end
103
+
104
+ def apply_magnification(value)
105
+ mag = combined_magnification
106
+ # Magnification centers around 0.5; scale distance from center
107
+ center = 0.5
108
+ distance = value - center
109
+ (center + (distance * mag)).clamp(0.0, 1.0)
110
+ end
111
+
112
+ def apply_distortion(value)
113
+ dist = combined_distortion
114
+ return value if dist.zero?
115
+
116
+ # Barrel distortion pushes values toward extremes
117
+ noise = (value - 0.5).abs * dist * 0.2
118
+ sign = value >= 0.5 ? 1 : -1
119
+ (value + (sign * noise)).clamp(0.0, 1.0)
120
+ end
121
+
122
+ def apply_clarity(value)
123
+ clarity = stack_clarity
124
+ # Low clarity pulls perceived value toward neutral (0.5)
125
+ center = 0.5
126
+ (center + ((value - center) * clarity)).clamp(0.0, 1.0)
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Lens
8
+ module Runners
9
+ module CognitiveLens
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def create_lens(lens_type:, magnification: nil, clarity: 1.0, distortion: nil, aperture: nil,
14
+ engine: nil, **)
15
+ raise ArgumentError, "unknown lens_type: #{lens_type}" unless Helpers::Constants::LENS_TYPES.include?(lens_type)
16
+
17
+ eng = engine || lens_engine
18
+ lens = eng.create_lens(
19
+ lens_type: lens_type,
20
+ magnification: magnification,
21
+ clarity: clarity,
22
+ distortion: distortion,
23
+ aperture: aperture
24
+ )
25
+ Legion::Logging.debug "[cognitive_lens] created lens id=#{lens.id} type=#{lens_type} " \
26
+ "mag=#{lens.magnification.round(2)} clarity=#{lens.clarity.round(2)}"
27
+ { success: true, lens: lens.to_h }
28
+ rescue ArgumentError => e
29
+ Legion::Logging.warn "[cognitive_lens] create_lens failed: #{e.message}"
30
+ { success: false, error: e.message }
31
+ end
32
+
33
+ def stack_lenses(lens_ids:, stack_id: nil, engine: nil, **)
34
+ raise ArgumentError, 'lens_ids must be an array' unless lens_ids.is_a?(Array)
35
+
36
+ eng = engine || lens_engine
37
+ result = eng.stack_lenses(lens_ids: lens_ids, stack_id: stack_id)
38
+ Legion::Logging.debug "[cognitive_lens] stacked #{lens_ids.size} lenses stack_id=#{result[:stack_id]}"
39
+ { success: true, stack_id: result[:stack_id], stack: result[:stack].to_h }
40
+ rescue ArgumentError => e
41
+ Legion::Logging.warn "[cognitive_lens] stack_lenses failed: #{e.message}"
42
+ { success: false, error: e.message }
43
+ end
44
+
45
+ def view_through_stack(stack_id:, content:, engine: nil, **)
46
+ eng = engine || lens_engine
47
+ result = eng.view_through_stack(stack_id: stack_id, content: content)
48
+ { success: true, **result }
49
+ rescue ArgumentError => e
50
+ Legion::Logging.warn "[cognitive_lens] view_through_stack failed: #{e.message}"
51
+ { success: false, error: e.message }
52
+ end
53
+
54
+ def degrade_all(rate: Helpers::Constants::SMUDGE_RATE_DEFAULT, engine: nil, **)
55
+ eng = engine || lens_engine
56
+ result = eng.degrade_all!(rate: rate)
57
+ Legion::Logging.debug "[cognitive_lens] degraded #{result[:degraded]} lenses at rate=#{rate}"
58
+ { success: true, **result }
59
+ end
60
+
61
+ def lens_report(engine: nil, **)
62
+ eng = engine || lens_engine
63
+ report = eng.lens_report
64
+ { success: true, **report }
65
+ end
66
+
67
+ def clearest_lenses(limit: 3, engine: nil, **)
68
+ eng = engine || lens_engine
69
+ lenses = eng.clearest_lenses(limit: limit)
70
+ { success: true, lenses: lenses }
71
+ end
72
+
73
+ def most_distorted(limit: 3, engine: nil, **)
74
+ eng = engine || lens_engine
75
+ lenses = eng.most_distorted(limit: limit)
76
+ { success: true, lenses: lenses }
77
+ end
78
+
79
+ private
80
+
81
+ def lens_engine
82
+ @lens_engine ||= Helpers::LensEngine.new
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Lens
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ require_relative 'lens/version'
6
+ require_relative 'lens/helpers/constants'
7
+ require_relative 'lens/helpers/lens'
8
+ require_relative 'lens/helpers/lens_stack'
9
+ require_relative 'lens/helpers/lens_engine'
10
+ require_relative 'lens/runners/cognitive_lens'
11
+ require_relative 'lens/client'
12
+
13
+ module Legion
14
+ module Extensions
15
+ module Agentic
16
+ module Attention
17
+ module Lens
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Lighthouse
8
+ class Client
9
+ include Runners::CognitiveLighthouse
10
+
11
+ def initialize(engine: nil, **)
12
+ @engine = engine || Helpers::LighthouseEngine.new
13
+ end
14
+
15
+ private
16
+
17
+ def default_engine
18
+ @engine
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Lighthouse
8
+ module Helpers
9
+ class Beacon
10
+ attr_reader :id, :beacon_type, :domain, :content, :sweep_angle, :lit_at
11
+ attr_accessor :luminosity
12
+
13
+ def initialize(beacon_type:, domain:, content:, luminosity: nil, sweep_angle: nil)
14
+ validate_beacon_type!(beacon_type)
15
+ @id = SecureRandom.uuid
16
+ @beacon_type = beacon_type.to_sym
17
+ @domain = domain.to_s
18
+ @content = content.to_s
19
+ @luminosity = (luminosity || 0.7).to_f.clamp(0.0, 1.0).round(10)
20
+ @sweep_angle = (sweep_angle || 0.0).to_f.clamp(0.0, 360.0).round(10)
21
+ @lit_at = Time.now.utc
22
+ end
23
+
24
+ def brighten!(rate: Constants::LUMINOSITY_RATE)
25
+ @luminosity = (@luminosity + rate).clamp(0.0, 1.0).round(10)
26
+ self
27
+ end
28
+
29
+ def dim!(rate: Constants::LUMINOSITY_RATE)
30
+ @luminosity = (@luminosity - rate).clamp(0.0, 1.0).round(10)
31
+ self
32
+ end
33
+
34
+ def extinguished?
35
+ @luminosity <= 0.0
36
+ end
37
+
38
+ def blazing?
39
+ @luminosity >= 0.9
40
+ end
41
+
42
+ def luminosity_label
43
+ Constants.label_for(Constants::LUMINOSITY_LABELS, @luminosity)
44
+ end
45
+
46
+ def to_h
47
+ {
48
+ id: @id,
49
+ beacon_type: @beacon_type,
50
+ domain: @domain,
51
+ content: @content,
52
+ luminosity: @luminosity,
53
+ sweep_angle: @sweep_angle,
54
+ luminosity_label: luminosity_label,
55
+ extinguished: extinguished?,
56
+ blazing: blazing?,
57
+ lit_at: @lit_at
58
+ }
59
+ end
60
+
61
+ private
62
+
63
+ def validate_beacon_type!(type)
64
+ sym = type.to_sym
65
+ return if Constants::BEACON_TYPES.include?(sym)
66
+
67
+ raise ArgumentError,
68
+ "unknown beacon_type: #{type.inspect}; must be one of #{Constants::BEACON_TYPES.inspect}"
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Lighthouse
8
+ module Helpers
9
+ module Constants
10
+ BEACON_TYPES = %i[truth clarity warning guidance hope].freeze
11
+ FOG_TYPES = %i[confusion uncertainty ambiguity doubt overwhelm].freeze
12
+
13
+ MAX_BEACONS = 100
14
+ MAX_FOG_BANKS = 50
15
+
16
+ LUMINOSITY_RATE = 0.1
17
+ FOG_DENSITY_RATE = 0.05
18
+
19
+ # Visibility labels (fog density: high density = low visibility)
20
+ VISIBILITY_LABELS = [
21
+ [(0.0...0.1), :crystal_clear],
22
+ [(0.1...0.3), :clear],
23
+ [(0.3...0.5), :hazy],
24
+ [(0.5...0.7), :foggy],
25
+ [(0.7...0.9), :dense_fog],
26
+ [(0.9..), :blind]
27
+ ].freeze
28
+
29
+ # Luminosity labels (beacon luminosity: high = bright)
30
+ LUMINOSITY_LABELS = [
31
+ [(0.9..), :blazing],
32
+ [(0.7...0.9), :bright],
33
+ [(0.5...0.7), :steady],
34
+ [(0.3...0.5), :dim],
35
+ [(0.1...0.3), :faint],
36
+ [(..0.1), :dark]
37
+ ].freeze
38
+
39
+ def self.label_for(table, value)
40
+ table.each { |range, label| return label if range.cover?(value) }
41
+ table.last.last
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Lighthouse
8
+ module Helpers
9
+ class Fog
10
+ attr_reader :id, :fog_type, :domain, :extent, :formed_at
11
+ attr_accessor :density
12
+
13
+ def initialize(fog_type:, domain:, density: nil, extent: nil)
14
+ validate_fog_type!(fog_type)
15
+ @id = SecureRandom.uuid
16
+ @fog_type = fog_type.to_sym
17
+ @domain = domain.to_s
18
+ @density = (density || 0.5).to_f.clamp(0.0, 1.0).round(10)
19
+ @extent = (extent || 1.0).to_f.clamp(0.0, 1.0).round(10)
20
+ @formed_at = Time.now.utc
21
+ end
22
+
23
+ def thicken!(rate: Constants::FOG_DENSITY_RATE)
24
+ @density = (@density + rate).clamp(0.0, 1.0).round(10)
25
+ self
26
+ end
27
+
28
+ def disperse!(rate: Constants::FOG_DENSITY_RATE)
29
+ @density = (@density - rate).clamp(0.0, 1.0).round(10)
30
+ self
31
+ end
32
+
33
+ def impenetrable?
34
+ @density >= 1.0
35
+ end
36
+
37
+ def clearing?
38
+ @density < 0.2
39
+ end
40
+
41
+ def visibility_label
42
+ Constants.label_for(Constants::VISIBILITY_LABELS, @density)
43
+ end
44
+
45
+ def to_h
46
+ {
47
+ id: @id,
48
+ fog_type: @fog_type,
49
+ domain: @domain,
50
+ density: @density,
51
+ extent: @extent,
52
+ visibility_label: visibility_label,
53
+ impenetrable: impenetrable?,
54
+ clearing: clearing?,
55
+ formed_at: @formed_at
56
+ }
57
+ end
58
+
59
+ private
60
+
61
+ def validate_fog_type!(type)
62
+ sym = type.to_sym
63
+ return if Constants::FOG_TYPES.include?(sym)
64
+
65
+ raise ArgumentError,
66
+ "unknown fog_type: #{type.inspect}; must be one of #{Constants::FOG_TYPES.inspect}"
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end