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,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Kaleidoscope
8
+ module Runners
9
+ module CognitiveKaleidoscope
10
+ extend self
11
+
12
+ def create_facet(facet_type:, domain:, content:,
13
+ brilliance: nil, transparency: nil, angle: nil, engine: nil, **)
14
+ eng = resolve_engine(engine)
15
+ f = eng.create_facet(facet_type: facet_type, domain: domain, content: content,
16
+ brilliance: brilliance, transparency: transparency, angle: angle)
17
+ { success: true, facet: f.to_h }
18
+ rescue ArgumentError => e
19
+ { success: false, error: e.message }
20
+ end
21
+
22
+ def create_pattern(symmetry: :radial, complexity: nil, stability: nil, engine: nil, **)
23
+ eng = resolve_engine(engine)
24
+ p = eng.create_pattern(symmetry: symmetry, complexity: complexity, stability: stability)
25
+ { success: true, pattern: p.to_h }
26
+ rescue ArgumentError => e
27
+ { success: false, error: e.message }
28
+ end
29
+
30
+ def add_to_pattern(facet_id:, pattern_id:, engine: nil, **)
31
+ eng = resolve_engine(engine)
32
+ status = eng.add_facet_to_pattern(facet_id: facet_id, pattern_id: pattern_id)
33
+ { success: true, status: status }
34
+ rescue ArgumentError => e
35
+ { success: false, error: e.message }
36
+ end
37
+
38
+ def rotate(facet_id: nil, pattern_id: nil, degrees: nil, engine: nil, **)
39
+ eng = resolve_engine(engine)
40
+ deg = degrees || (Helpers::Constants::ROTATION_STEP * 360)
41
+ if pattern_id
42
+ p = eng.rotate_pattern(pattern_id: pattern_id, degrees: deg)
43
+ { success: true, pattern: p.to_h }
44
+ elsif facet_id
45
+ f = eng.rotate_facet(facet_id: facet_id, degrees: deg)
46
+ { success: true, facet: f.to_h }
47
+ else
48
+ { success: false, error: 'must provide facet_id or pattern_id' }
49
+ end
50
+ rescue ArgumentError => e
51
+ { success: false, error: e.message }
52
+ end
53
+
54
+ def polish(facet_id:, rate: nil, engine: nil, **)
55
+ eng = resolve_engine(engine)
56
+ f = eng.polish_facet(facet_id: facet_id, rate: rate || 0.1)
57
+ { success: true, facet: f.to_h }
58
+ rescue ArgumentError => e
59
+ { success: false, error: e.message }
60
+ end
61
+
62
+ def list_facets(engine: nil, facet_type: nil, **)
63
+ eng = resolve_engine(engine)
64
+ results = eng.all_facets
65
+ results = results.select { |f| f.facet_type == facet_type.to_sym } if facet_type
66
+ { success: true, facets: results.map(&:to_h), count: results.size }
67
+ end
68
+
69
+ def kaleidoscope_status(engine: nil, **)
70
+ eng = resolve_engine(engine)
71
+ { success: true, report: eng.kaleidoscope_report }
72
+ end
73
+
74
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
75
+
76
+ private
77
+
78
+ def resolve_engine(engine)
79
+ engine || default_engine
80
+ end
81
+
82
+ def default_engine
83
+ @default_engine ||= Helpers::KaleidoscopeEngine.new
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ 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 Kaleidoscope
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 'kaleidoscope/version'
6
+ require_relative 'kaleidoscope/helpers/constants'
7
+ require_relative 'kaleidoscope/helpers/facet'
8
+ require_relative 'kaleidoscope/helpers/pattern'
9
+ require_relative 'kaleidoscope/helpers/kaleidoscope_engine'
10
+ require_relative 'kaleidoscope/runners/cognitive_kaleidoscope'
11
+ require_relative 'kaleidoscope/client'
12
+
13
+ module Legion
14
+ module Extensions
15
+ module Agentic
16
+ module Attention
17
+ module Kaleidoscope
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/latent_inhibition/helpers/constants'
4
+ require 'legion/extensions/agentic/attention/latent_inhibition/helpers/stimulus_record'
5
+ require 'legion/extensions/agentic/attention/latent_inhibition/helpers/inhibition_engine'
6
+ require 'legion/extensions/agentic/attention/latent_inhibition/runners/latent_inhibition'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Attention
12
+ module LatentInhibition
13
+ class Client
14
+ include Runners::LatentInhibition
15
+
16
+ def initialize(**)
17
+ @default_engine = Helpers::InhibitionEngine.new
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :default_engine
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module LatentInhibition
8
+ module Helpers
9
+ module Constants
10
+ MAX_STIMULI = 500
11
+ INHIBITION_RATE = 0.03
12
+ DISINHIBITION_RATE = 0.2
13
+ NOVELTY_THRESHOLD = 3
14
+
15
+ INHIBITION_LABELS = {
16
+ (0.0..0.2) => :uninhibited,
17
+ (0.2..0.4) => :low,
18
+ (0.4..0.6) => :moderate,
19
+ (0.6..0.8) => :high,
20
+ (0.8..1.0) => :saturated
21
+ }.freeze
22
+
23
+ NOVELTY_LABELS = {
24
+ true => :novel,
25
+ false => :familiar
26
+ }.freeze
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module LatentInhibition
8
+ module Helpers
9
+ class InhibitionEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @stimuli = {}
14
+ end
15
+
16
+ def expose_stimulus(label:)
17
+ stimulus = find_or_create(label)
18
+ stimulus.expose!
19
+ prune_if_needed
20
+ stimulus.to_h
21
+ end
22
+
23
+ def attempt_association(label:, outcome:)
24
+ stimulus = find_or_create(label)
25
+ effectiveness = stimulus.associate!(outcome: outcome)
26
+ {
27
+ label: label,
28
+ outcome: outcome,
29
+ effectiveness: effectiveness,
30
+ inhibition_score: stimulus.inhibition_score,
31
+ inhibition_label: stimulus.inhibition_label,
32
+ blocked: effectiveness < 0.1
33
+ }
34
+ end
35
+
36
+ def disinhibit(label:, intensity:)
37
+ return { label: label, status: :not_found } unless @stimuli.key?(label)
38
+
39
+ stimulus = @stimuli[label]
40
+ prior_score = stimulus.inhibition_score
41
+ stimulus.disinhibit!(intensity: intensity)
42
+ {
43
+ label: label,
44
+ prior_score: prior_score,
45
+ new_score: stimulus.inhibition_score,
46
+ reduction: (prior_score - stimulus.inhibition_score).round(10)
47
+ }
48
+ end
49
+
50
+ def novel_stimuli
51
+ @stimuli.values.select(&:novel?).map(&:to_h)
52
+ end
53
+
54
+ def most_inhibited(limit: 10)
55
+ @stimuli.values
56
+ .sort_by { |s| -s.inhibition_score }
57
+ .first(limit)
58
+ .map(&:to_h)
59
+ end
60
+
61
+ def inhibition_report
62
+ stimuli = @stimuli.values
63
+ return empty_report if stimuli.empty?
64
+
65
+ {
66
+ total_stimuli: stimuli.size,
67
+ novel_count: stimuli.count(&:novel?),
68
+ inhibited_count: stimuli.count { |s| s.inhibition_score > 0.0 },
69
+ saturated_count: stimuli.count { |s| s.inhibition_label == :saturated },
70
+ mean_inhibition: (stimuli.sum(&:inhibition_score) / stimuli.size).round(10),
71
+ max_inhibition: stimuli.map(&:inhibition_score).max.round(10),
72
+ label_breakdown: label_breakdown(stimuli)
73
+ }
74
+ end
75
+
76
+ def prune_if_needed
77
+ return if @stimuli.size <= Constants::MAX_STIMULI
78
+
79
+ overflow = @stimuli.size - Constants::MAX_STIMULI
80
+ oldest = @stimuli.values.sort_by { |s| s.last_exposed_at || Time.at(0) }.first(overflow)
81
+ oldest.each { |s| @stimuli.delete(s.label) }
82
+ end
83
+
84
+ def to_h
85
+ {
86
+ stimuli: @stimuli.transform_values(&:to_h),
87
+ report: inhibition_report
88
+ }
89
+ end
90
+
91
+ private
92
+
93
+ def find_or_create(label)
94
+ @stimuli[label] ||= StimulusRecord.new(label: label)
95
+ end
96
+
97
+ def empty_report
98
+ {
99
+ total_stimuli: 0,
100
+ novel_count: 0,
101
+ inhibited_count: 0,
102
+ saturated_count: 0,
103
+ mean_inhibition: 0.0,
104
+ max_inhibition: 0.0,
105
+ label_breakdown: {}
106
+ }
107
+ end
108
+
109
+ def label_breakdown(stimuli)
110
+ stimuli.group_by(&:inhibition_label).transform_values(&:count)
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Attention
9
+ module LatentInhibition
10
+ module Helpers
11
+ class StimulusRecord
12
+ include Constants
13
+
14
+ attr_reader :id, :label, :exposure_count, :inhibition_score, :last_exposed_at, :associations
15
+
16
+ def initialize(label:)
17
+ @id = SecureRandom.uuid
18
+ @label = label
19
+ @exposure_count = 0
20
+ @inhibition_score = 0.0
21
+ @last_exposed_at = nil
22
+ @associations = []
23
+ end
24
+
25
+ def expose!
26
+ @exposure_count += 1
27
+ @last_exposed_at = Time.now.utc
28
+ @inhibition_score = (@inhibition_score + Constants::INHIBITION_RATE).clamp(0.0, 1.0).round(10)
29
+ self
30
+ end
31
+
32
+ def associate!(outcome:)
33
+ effectiveness = (1.0 - @inhibition_score).clamp(0.0, 1.0).round(10)
34
+ @associations << { outcome: outcome, effectiveness: effectiveness, recorded_at: Time.now.utc }
35
+ effectiveness
36
+ end
37
+
38
+ def disinhibit!(intensity:)
39
+ reduction = (Constants::DISINHIBITION_RATE * intensity.clamp(0.0, 1.0)).round(10)
40
+ @inhibition_score = (@inhibition_score - reduction).clamp(0.0, 1.0).round(10)
41
+ self
42
+ end
43
+
44
+ def novel?
45
+ @exposure_count < Constants::NOVELTY_THRESHOLD
46
+ end
47
+
48
+ def inhibition_label
49
+ Constants::INHIBITION_LABELS.find { |range, _| range.cover?(@inhibition_score) }&.last || :saturated
50
+ end
51
+
52
+ def to_h
53
+ {
54
+ id: @id,
55
+ label: @label,
56
+ exposure_count: @exposure_count,
57
+ inhibition_score: @inhibition_score,
58
+ inhibition_label: inhibition_label,
59
+ novel: novel?,
60
+ last_exposed_at: @last_exposed_at,
61
+ associations: @associations.dup
62
+ }
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module LatentInhibition
8
+ module Runners
9
+ module LatentInhibition
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def expose(label:, engine: nil, **)
14
+ eng = engine || default_engine
15
+ result = eng.expose_stimulus(label: label)
16
+
17
+ Legion::Logging.debug "[latent_inhibition] expose: label=#{label} " \
18
+ "exposure_count=#{result[:exposure_count]} " \
19
+ "inhibition=#{result[:inhibition_score].round(4)} " \
20
+ "label=#{result[:inhibition_label]} novel=#{result[:novel]}"
21
+ result
22
+ end
23
+
24
+ def associate(label:, outcome:, engine: nil, **)
25
+ eng = engine || default_engine
26
+ result = eng.attempt_association(label: label, outcome: outcome)
27
+
28
+ Legion::Logging.debug "[latent_inhibition] associate: label=#{label} outcome=#{outcome} " \
29
+ "effectiveness=#{result[:effectiveness].round(4)} blocked=#{result[:blocked]}"
30
+ result
31
+ end
32
+
33
+ def disinhibit(label:, intensity: 1.0, engine: nil, **)
34
+ eng = engine || default_engine
35
+ result = eng.disinhibit(label: label, intensity: intensity)
36
+
37
+ Legion::Logging.debug "[latent_inhibition] disinhibit: label=#{label} " \
38
+ "prior=#{result[:prior_score]&.round(4)} new=#{result[:new_score]&.round(4)}"
39
+ result
40
+ end
41
+
42
+ def novel_stimuli(engine: nil, **)
43
+ eng = engine || default_engine
44
+ stimuli = eng.novel_stimuli
45
+
46
+ Legion::Logging.debug "[latent_inhibition] novel_stimuli: count=#{stimuli.size}"
47
+ { stimuli: stimuli, count: stimuli.size }
48
+ end
49
+
50
+ def most_inhibited(limit: 10, engine: nil, **)
51
+ eng = engine || default_engine
52
+ stimuli = eng.most_inhibited(limit: limit)
53
+
54
+ Legion::Logging.debug "[latent_inhibition] most_inhibited: limit=#{limit} returned=#{stimuli.size}"
55
+ { stimuli: stimuli, count: stimuli.size }
56
+ end
57
+
58
+ def inhibition_report(engine: nil, **)
59
+ eng = engine || default_engine
60
+ report = eng.inhibition_report
61
+
62
+ Legion::Logging.debug "[latent_inhibition] report: total=#{report[:total_stimuli]} " \
63
+ "novel=#{report[:novel_count]} mean=#{report[:mean_inhibition]&.round(4)}"
64
+ report
65
+ end
66
+
67
+ private
68
+
69
+ def default_engine
70
+ @default_engine ||= Helpers::InhibitionEngine.new
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ 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 LatentInhibition
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/latent_inhibition/version'
4
+ require 'legion/extensions/agentic/attention/latent_inhibition/helpers/constants'
5
+ require 'legion/extensions/agentic/attention/latent_inhibition/helpers/stimulus_record'
6
+ require 'legion/extensions/agentic/attention/latent_inhibition/helpers/inhibition_engine'
7
+ require 'legion/extensions/agentic/attention/latent_inhibition/runners/latent_inhibition'
8
+ require 'legion/extensions/agentic/attention/latent_inhibition/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Attention
14
+ module LatentInhibition
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/lens/helpers/constants'
4
+ require 'legion/extensions/agentic/attention/lens/helpers/lens'
5
+ require 'legion/extensions/agentic/attention/lens/helpers/lens_stack'
6
+ require 'legion/extensions/agentic/attention/lens/helpers/lens_engine'
7
+ require 'legion/extensions/agentic/attention/lens/runners/cognitive_lens'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Agentic
12
+ module Attention
13
+ module Lens
14
+ class Client
15
+ include Runners::CognitiveLens
16
+
17
+ def initialize(**)
18
+ @lens_engine = Helpers::LensEngine.new
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :lens_engine
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,58 @@
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
+ module Constants
10
+ LENS_TYPES = %i[magnifying wide_angle fish_eye polarized telescopic microscopic].freeze
11
+
12
+ DISTORTION_TYPES = %i[none barrel pincushion mustache wave spiral].freeze
13
+
14
+ MAX_LENSES = 8
15
+
16
+ CLARITY_LABELS = [
17
+ [0.0..0.2, :opaque],
18
+ [0.2..0.4, :foggy],
19
+ [0.4..0.6, :hazy],
20
+ [0.6..0.8, :clear],
21
+ [0.8..1.0, :crystal]
22
+ ].freeze
23
+
24
+ MAGNIFICATION_LABELS = [
25
+ [0.1..0.5, :micro],
26
+ [0.5..1.0, :normal],
27
+ [1.0..2.0, :zoom],
28
+ [2.0..5.0, :telephoto],
29
+ [5.0..10.0, :extreme]
30
+ ].freeze
31
+
32
+ # Default optical properties per lens type
33
+ LENS_DEFAULTS = {
34
+ magnifying: { magnification: 2.0, aperture: 0.6, distortion: 0.1 },
35
+ wide_angle: { magnification: 0.5, aperture: 0.9, distortion: 0.2 },
36
+ fish_eye: { magnification: 0.3, aperture: 1.0, distortion: 0.8 },
37
+ polarized: { magnification: 1.0, aperture: 0.4, distortion: 0.0 },
38
+ telescopic: { magnification: 8.0, aperture: 0.3, distortion: 0.15 },
39
+ microscopic: { magnification: 9.0, aperture: 0.5, distortion: 0.05 }
40
+ }.freeze
41
+
42
+ # Smudge degrades clarity; clean restores it
43
+ SMUDGE_RATE_DEFAULT = 0.05
44
+ CLEAN_BOOST_DEFAULT = 0.1
45
+ CLARITY_SHARP_THRESHOLD = 0.7
46
+ CLARITY_BLURRY_THRESHOLD = 0.35
47
+
48
+ # Stack combination weights
49
+ STACK_MAGNIFICATION_EXPONENT = 0.8 # sub-linear compounding prevents extremes
50
+ STACK_DISTORTION_BLEND = 0.6 # weight toward worst distortion
51
+ STACK_CLARITY_DECAY = 0.9 # each additional lens costs 10% clarity
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,99 @@
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 Lens
10
+ include Constants
11
+
12
+ attr_reader :id, :lens_type, :magnification, :clarity, :distortion, :aperture,
13
+ :focus_target, :created_at
14
+
15
+ def initialize(lens_type:, magnification: nil, clarity: 1.0, distortion: nil, aperture: nil)
16
+ raise ArgumentError, "unknown lens_type: #{lens_type}" unless Constants::LENS_TYPES.include?(lens_type)
17
+
18
+ defaults = Constants::LENS_DEFAULTS.fetch(lens_type)
19
+
20
+ @id = SecureRandom.uuid
21
+ @lens_type = lens_type
22
+ @magnification = (magnification || defaults[:magnification]).clamp(0.1, 10.0).round(10)
23
+ @clarity = clarity.clamp(0.0, 1.0).round(10)
24
+ @distortion = (distortion || defaults[:distortion]).clamp(0.0, 1.0).round(10)
25
+ @aperture = (aperture || defaults[:aperture]).clamp(0.0, 1.0).round(10)
26
+ @focus_target = nil
27
+ @created_at = Time.now.utc
28
+ end
29
+
30
+ def focus!(target)
31
+ @focus_target = target
32
+ self
33
+ end
34
+
35
+ def defocus!
36
+ @focus_target = nil
37
+ self
38
+ end
39
+
40
+ def smudge!(rate = Constants::SMUDGE_RATE_DEFAULT)
41
+ @clarity = (@clarity - rate.clamp(0.0, 1.0)).clamp(0.0, 1.0).round(10)
42
+ self
43
+ end
44
+
45
+ def clean!(boost = Constants::CLEAN_BOOST_DEFAULT)
46
+ @clarity = (@clarity + boost.clamp(0.0, 1.0)).clamp(0.0, 1.0).round(10)
47
+ self
48
+ end
49
+
50
+ def sharp?
51
+ @clarity >= Constants::CLARITY_SHARP_THRESHOLD
52
+ end
53
+
54
+ def blurry?
55
+ @clarity <= Constants::CLARITY_BLURRY_THRESHOLD
56
+ end
57
+
58
+ def clarity_label
59
+ Constants::CLARITY_LABELS.find { |range, _| range.cover?(@clarity) }&.last || :crystal
60
+ end
61
+
62
+ def magnification_label
63
+ Constants::MAGNIFICATION_LABELS.find { |range, _| range.cover?(@magnification) }&.last || :extreme
64
+ end
65
+
66
+ def focused?
67
+ !@focus_target.nil?
68
+ end
69
+
70
+ def depth_of_field
71
+ # Larger aperture = shallower depth of field; higher magnification = shallower
72
+ base = 1.0 - @aperture
73
+ mag_factor = 1.0 / [magnification, 0.1].max
74
+ ((base * 0.6) + (mag_factor * 0.4)).clamp(0.0, 1.0).round(10)
75
+ end
76
+
77
+ def to_h
78
+ {
79
+ id: @id,
80
+ lens_type: @lens_type,
81
+ magnification: @magnification,
82
+ clarity: @clarity,
83
+ distortion: @distortion,
84
+ aperture: @aperture,
85
+ focus_target: @focus_target,
86
+ sharp: sharp?,
87
+ blurry: blurry?,
88
+ clarity_label: clarity_label,
89
+ magnification_label: magnification_label,
90
+ depth_of_field: depth_of_field
91
+ }
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end