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,226 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Schema
8
+ module Helpers
9
+ class AttentionSchemaModel
10
+ include Constants
11
+
12
+ attr_reader :schema_items, :social_models, :meta_accuracy, :attention_history
13
+
14
+ def initialize
15
+ @schema_items = {} # target => SchemaItem
16
+ @social_models = {} # agent_id => { target:, awareness:, updated_at: }
17
+ @meta_accuracy = 0.5 # EMA confidence in schema self-accuracy
18
+ @attention_history = [] # ring buffer of { target:, event:, at: }
19
+ end
20
+
21
+ # --- Focus Management ---
22
+
23
+ # Add or boost an item in the attention schema
24
+ def focus_on(target:, domain:, reason:, source:)
25
+ target = target.to_s
26
+ if @schema_items.key?(target)
27
+ @schema_items[target].boost
28
+ record_history(target, :refocused)
29
+ else
30
+ prune_to_capacity if @schema_items.size >= MAX_SCHEMA_ITEMS
31
+ @schema_items[target] = SchemaItem.new(
32
+ target: target,
33
+ domain: domain,
34
+ reason: reason,
35
+ source: source,
36
+ awareness_level: DEFAULT_AWARENESS + AWARENESS_BOOST
37
+ )
38
+ record_history(target, :focused)
39
+ end
40
+ @schema_items[target]
41
+ end
42
+
43
+ # Remove an item from the schema entirely
44
+ def defocus(target:)
45
+ target = target.to_s
46
+ removed = @schema_items.delete(target)
47
+ record_history(target, :defocused) if removed
48
+ !removed.nil?
49
+ end
50
+
51
+ # --- Awareness Query (core AST operation) ---
52
+
53
+ # "Am I aware of X?" — the central Graziano query
54
+ def am_i_aware_of(target:)
55
+ item = @schema_items[target.to_s]
56
+ return { aware: false, awareness_level: 0.0, label: :unconscious } unless item
57
+
58
+ { aware: item.awareness_level > AWARENESS_FLOOR, awareness_level: item.awareness_level.round(4), label: item.label }
59
+ end
60
+
61
+ # --- Attention Report ---
62
+
63
+ # Natural-language-style summary of current attention state
64
+ def report_awareness
65
+ state = attention_state
66
+ state_str = ATTENTION_STATE_LABELS[state] || 'in an unknown state'
67
+ top_items = top_schema_items(3)
68
+
69
+ return { state: state, state_label: state_str, report: 'No active attention targets.', items: [] } if top_items.empty?
70
+
71
+ primary = top_items.first
72
+ summary = "I am #{state_str}, primarily attending to '#{primary[:target]}' " \
73
+ "(#{primary[:label]}, #{primary[:awareness_level]}). " \
74
+ "Reason: #{primary[:reason]}."
75
+
76
+ if top_items.size > 1
77
+ secondary = top_items[1..]
78
+ .map { |i| "'#{i[:target]}' (#{i[:label]})" }
79
+ .join(', ')
80
+ summary += " Also attending to: #{secondary}."
81
+ end
82
+
83
+ { state: state, state_label: state_str, report: summary, items: top_items }
84
+ end
85
+
86
+ # --- Attention State Classification ---
87
+
88
+ # Overall qualitative attention state
89
+ def attention_state
90
+ return :distracted if @schema_items.empty?
91
+
92
+ top = top_awareness
93
+ avg = average_awareness
94
+
95
+ if top >= HYPERFOCUS_THRESHOLD
96
+ :hyperfocused
97
+ elsif avg < DRIFT_THRESHOLD && @schema_items.size > 3
98
+ :distracted
99
+ elsif avg < DRIFT_THRESHOLD
100
+ :drifting
101
+ elsif top >= 0.6
102
+ :focused
103
+ else
104
+ :normal
105
+ end
106
+ end
107
+
108
+ # --- Social Attention Modeling ---
109
+
110
+ # Record what another agent appears to be attending to
111
+ def model_other_attention(agent_id:, target:, awareness:)
112
+ agent_id = agent_id.to_s
113
+ prune_social_models if @social_models.size >= MAX_SOCIAL_MODELS && !@social_models.key?(agent_id)
114
+ @social_models[agent_id] = {
115
+ target: target.to_s,
116
+ awareness: awareness.clamp(0.0, 1.0),
117
+ updated_at: Time.now.utc
118
+ }
119
+ end
120
+
121
+ # Query what another agent is modeled as attending to
122
+ def query_other_attention(agent_id:)
123
+ @social_models[agent_id.to_s]
124
+ end
125
+
126
+ # --- Meta-Attention ---
127
+
128
+ # Assess whether meta-attention signals are active
129
+ def meta_check
130
+ state = attention_state
131
+ signals = []
132
+
133
+ signals << :drifting if %i[drifting distracted].include?(state)
134
+ signals << :hyperfocus if state == :hyperfocused
135
+ signals << :normal if signals.empty?
136
+
137
+ top = top_awareness
138
+ avg = average_awareness
139
+
140
+ {
141
+ state: state,
142
+ signals: signals,
143
+ top_awareness: top.round(4),
144
+ avg_awareness: avg.round(4),
145
+ schema_size: @schema_items.size,
146
+ meta_accuracy: @meta_accuracy.round(4)
147
+ }
148
+ end
149
+
150
+ # Update the EMA tracking how well the schema predicted actual attention
151
+ def update_meta_accuracy(was_correct:)
152
+ correction = was_correct ? 1.0 : 0.0
153
+ @meta_accuracy += (META_ATTENTION_ALPHA * (correction - @meta_accuracy))
154
+ end
155
+
156
+ # --- Decay ---
157
+
158
+ # Apply per-tick decay to all schema items and prune faded ones
159
+ def decay_all
160
+ @schema_items.each_value(&:decay)
161
+ @schema_items.reject! { |_, item| item.faded? }
162
+ end
163
+
164
+ # --- Accessors ---
165
+
166
+ def schema_size
167
+ @schema_items.size
168
+ end
169
+
170
+ def to_h
171
+ {
172
+ state: attention_state,
173
+ state_label: ATTENTION_STATE_LABELS[attention_state],
174
+ schema_size: schema_size,
175
+ meta_accuracy: @meta_accuracy.round(4),
176
+ top_awareness: top_awareness.round(4),
177
+ avg_awareness: average_awareness.round(4),
178
+ social_models: @social_models.size,
179
+ items: @schema_items.values.map(&:to_h)
180
+ }
181
+ end
182
+
183
+ private
184
+
185
+ def top_awareness
186
+ return 0.0 if @schema_items.empty?
187
+
188
+ @schema_items.values.map(&:awareness_level).max
189
+ end
190
+
191
+ def average_awareness
192
+ return 0.0 if @schema_items.empty?
193
+
194
+ vals = @schema_items.values.map(&:awareness_level)
195
+ vals.sum / vals.size
196
+ end
197
+
198
+ def top_schema_items(count = 3)
199
+ @schema_items.values
200
+ .sort_by { |i| -i.awareness_level }
201
+ .first(count)
202
+ .map(&:to_h)
203
+ end
204
+
205
+ def prune_to_capacity
206
+ # Remove the item with the lowest awareness
207
+ weakest = @schema_items.min_by { |_, item| item.awareness_level }&.first
208
+ @schema_items.delete(weakest) if weakest
209
+ end
210
+
211
+ def prune_social_models
212
+ oldest = @social_models.min_by { |_, v| v[:updated_at] }&.first
213
+ @social_models.delete(oldest) if oldest
214
+ end
215
+
216
+ def record_history(target, event)
217
+ @attention_history << { target: target, event: event, at: Time.now.utc }
218
+ @attention_history.shift while @attention_history.size > MAX_HISTORY
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Schema
8
+ module Helpers
9
+ module Constants
10
+ # Maximum items the schema can model simultaneously
11
+ MAX_SCHEMA_ITEMS = 15
12
+
13
+ # Maximum other agents whose attention we model socially
14
+ MAX_SOCIAL_MODELS = 10
15
+
16
+ # EMA alpha for schema update speed
17
+ SCHEMA_UPDATE_ALPHA = 0.15
18
+
19
+ # Default awareness level for newly focused items
20
+ DEFAULT_AWARENESS = 0.3
21
+
22
+ # Minimum awareness before item is pruned from schema
23
+ AWARENESS_FLOOR = 0.05
24
+
25
+ # Per-tick decay applied to all schema items
26
+ AWARENESS_DECAY = 0.02
27
+
28
+ # Awareness boost applied when re-focusing an existing item
29
+ AWARENESS_BOOST = 0.15
30
+
31
+ # Below this awareness average: attention is drifting
32
+ DRIFT_THRESHOLD = 0.3
33
+
34
+ # Above this awareness (for top item): attention is hyper-focused
35
+ HYPERFOCUS_THRESHOLD = 0.85
36
+
37
+ # EMA alpha for meta-attention accuracy tracking
38
+ META_ATTENTION_ALPHA = 0.1
39
+
40
+ # Maximum entries kept in attention history ring buffer
41
+ MAX_HISTORY = 200
42
+
43
+ # Human-readable labels keyed by awareness level range
44
+ AWARENESS_LABELS = {
45
+ (0.8..) => :vivid,
46
+ (0.6...0.8) => :clear,
47
+ (0.4...0.6) => :dim,
48
+ (0.2...0.4) => :peripheral,
49
+ (..0.2) => :unconscious
50
+ }.freeze
51
+
52
+ # Human-readable attention-state labels
53
+ ATTENTION_STATE_LABELS = {
54
+ hyperfocused: 'deeply engaged',
55
+ focused: 'actively attending',
56
+ normal: 'casually aware',
57
+ drifting: 'attention waning',
58
+ distracted: 'attention scattered'
59
+ }.freeze
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Schema
8
+ module Helpers
9
+ class SchemaItem
10
+ include Constants
11
+
12
+ attr_reader :target, :domain, :reason, :source, :created_at
13
+ attr_accessor :awareness_level
14
+
15
+ def initialize(target:, domain:, reason:, source:, awareness_level: DEFAULT_AWARENESS)
16
+ @target = target
17
+ @domain = domain
18
+ @reason = reason
19
+ @source = source
20
+ @awareness_level = awareness_level.clamp(0.0, 1.0)
21
+ @created_at = Time.now.utc
22
+ end
23
+
24
+ # Duration in seconds since this item entered the schema
25
+ def duration
26
+ Time.now.utc - @created_at
27
+ end
28
+
29
+ # Apply a one-time boost (re-focus event)
30
+ def boost
31
+ @awareness_level = [@awareness_level + AWARENESS_BOOST, 1.0].min
32
+ end
33
+
34
+ # Apply per-tick decay
35
+ def decay
36
+ @awareness_level = [@awareness_level - AWARENESS_DECAY, AWARENESS_FLOOR].max
37
+ end
38
+
39
+ # True when awareness has dropped to the pruning floor
40
+ def faded?
41
+ @awareness_level <= AWARENESS_FLOOR
42
+ end
43
+
44
+ # Symbolic label describing current awareness intensity
45
+ def label
46
+ AWARENESS_LABELS.each { |range, lbl| return lbl if range.cover?(@awareness_level) }
47
+ :unconscious
48
+ end
49
+
50
+ def to_h
51
+ {
52
+ target: @target,
53
+ domain: @domain,
54
+ awareness_level: @awareness_level.round(4),
55
+ label: label,
56
+ reason: @reason,
57
+ source: @source,
58
+ duration: duration.round(2),
59
+ created_at: @created_at
60
+ }
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Schema
8
+ module Runners
9
+ module AttentionSchema
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ # Focus attention on a target — adds or boosts it in the schema
14
+ def focus_on(target:, domain:, reason:, source: :external, **)
15
+ Legion::Logging.debug "[attention_schema] focus_on: target=#{target} domain=#{domain} source=#{source}"
16
+ item = schema_model.focus_on(target: target, domain: domain, reason: reason, source: source)
17
+ {
18
+ success: true,
19
+ target: item.target,
20
+ domain: item.domain,
21
+ awareness_level: item.awareness_level.round(4),
22
+ label: item.label,
23
+ schema_size: schema_model.schema_size
24
+ }
25
+ end
26
+
27
+ # Remove a target from the attention schema
28
+ def defocus(target:, **)
29
+ Legion::Logging.debug "[attention_schema] defocus: target=#{target}"
30
+ removed = schema_model.defocus(target: target)
31
+ { success: true, target: target, removed: removed, schema_size: schema_model.schema_size }
32
+ end
33
+
34
+ # Core AST query: "am I aware of X?"
35
+ def am_i_aware_of(target:, **)
36
+ result = schema_model.am_i_aware_of(target: target)
37
+ Legion::Logging.debug "[attention_schema] am_i_aware_of: target=#{target} aware=#{result[:aware]} level=#{result[:awareness_level]}"
38
+ result.merge(success: true)
39
+ end
40
+
41
+ # Generate a natural-language attention awareness report
42
+ def report_awareness(**)
43
+ report = schema_model.report_awareness
44
+ Legion::Logging.debug "[attention_schema] report_awareness: state=#{report[:state]} items=#{report[:items].size}"
45
+ report.merge(success: true)
46
+ end
47
+
48
+ # Return the current qualitative attention state symbol
49
+ def attention_state(**)
50
+ state = schema_model.attention_state
51
+ label = Helpers::Constants::ATTENTION_STATE_LABELS[state]
52
+ Legion::Logging.debug "[attention_schema] attention_state: state=#{state}"
53
+ { success: true, state: state, label: label }
54
+ end
55
+
56
+ # Model another agent's attention (social attention modeling)
57
+ def model_other_attention(agent_id:, target:, awareness:, **)
58
+ Legion::Logging.debug "[attention_schema] model_other: agent=#{agent_id} target=#{target} awareness=#{awareness}"
59
+ schema_model.model_other_attention(agent_id: agent_id, target: target, awareness: awareness.to_f)
60
+ { success: true, agent_id: agent_id, target: target, awareness: awareness.to_f.clamp(0.0, 1.0).round(4) }
61
+ end
62
+
63
+ # Query what another agent is modeled as attending to
64
+ def query_other_attention(agent_id:, **)
65
+ model = schema_model.query_other_attention(agent_id: agent_id)
66
+ Legion::Logging.debug "[attention_schema] query_other: agent=#{agent_id} found=#{!model.nil?}"
67
+ { success: true, agent_id: agent_id, model: model }
68
+ end
69
+
70
+ # Run meta-attention check: detect drifting, hyper-focus, etc.
71
+ def meta_check(**)
72
+ result = schema_model.meta_check
73
+ Legion::Logging.debug "[attention_schema] meta_check: state=#{result[:state]} signals=#{result[:signals]}"
74
+ result.merge(success: true)
75
+ end
76
+
77
+ # Record whether the schema accurately predicted actual attention (accuracy feedback)
78
+ def update_meta_accuracy(was_correct:, **)
79
+ schema_model.update_meta_accuracy(was_correct: was_correct)
80
+ accuracy = schema_model.meta_accuracy
81
+ Legion::Logging.debug "[attention_schema] meta_accuracy: was_correct=#{was_correct} accuracy=#{accuracy.round(3)}"
82
+ { success: true, was_correct: was_correct, meta_accuracy: accuracy.round(4) }
83
+ end
84
+
85
+ # Tick decay: decay all schema items and prune faded ones
86
+ def decay_schema(**)
87
+ before = schema_model.schema_size
88
+ schema_model.decay_all
89
+ after = schema_model.schema_size
90
+ Legion::Logging.debug "[attention_schema] decay: before=#{before} after=#{after} pruned=#{before - after}"
91
+ {
92
+ success: true,
93
+ before: before,
94
+ after: after,
95
+ pruned: before - after,
96
+ state: schema_model.attention_state
97
+ }
98
+ end
99
+
100
+ # Return full schema stats snapshot
101
+ def schema_stats(**)
102
+ Legion::Logging.debug "[attention_schema] stats: size=#{schema_model.schema_size}"
103
+ { success: true, stats: schema_model.to_h }
104
+ end
105
+
106
+ private
107
+
108
+ def schema_model
109
+ @schema_model ||= Helpers::AttentionSchemaModel.new
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ 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 Schema
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/schema/version'
4
+ require 'legion/extensions/agentic/attention/schema/helpers/constants'
5
+ require 'legion/extensions/agentic/attention/schema/helpers/schema_item'
6
+ require 'legion/extensions/agentic/attention/schema/helpers/attention_schema_model'
7
+ require 'legion/extensions/agentic/attention/schema/runners/attention_schema'
8
+ require 'legion/extensions/agentic/attention/schema/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Attention
14
+ module Schema
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module SensoryGating
8
+ class Client
9
+ include Runners::SensoryGating
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module SensoryGating
8
+ module Helpers
9
+ module Constants
10
+ MAX_STIMULI = 500
11
+ MAX_FILTERS = 100
12
+
13
+ DEFAULT_GATE_THRESHOLD = 0.5
14
+ GATE_ADJUSTMENT = 0.05
15
+ HABITUATION_RATE = 0.02
16
+ SENSITIZATION_RATE = 0.08
17
+
18
+ GATE_LABELS = {
19
+ (0.8..) => :wide_open,
20
+ (0.6...0.8) => :permissive,
21
+ (0.4...0.6) => :selective,
22
+ (0.2...0.4) => :restrictive,
23
+ (..0.2) => :blocked
24
+ }.freeze
25
+
26
+ STIMULUS_LABELS = {
27
+ (0.8..) => :overwhelming,
28
+ (0.6...0.8) => :strong,
29
+ (0.4...0.6) => :moderate,
30
+ (0.2...0.4) => :mild,
31
+ (..0.2) => :subliminal
32
+ }.freeze
33
+
34
+ MODALITY_TYPES = %i[
35
+ visual auditory textual semantic
36
+ emotional temporal social
37
+ ].freeze
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module SensoryGating
8
+ module Helpers
9
+ class GatingEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @filters = {}
14
+ end
15
+
16
+ def create_filter(modality:, gate_threshold: DEFAULT_GATE_THRESHOLD)
17
+ prune_if_needed
18
+ filter = SensoryFilter.new(modality: modality, gate_threshold: gate_threshold)
19
+ @filters[filter.id] = filter
20
+ filter
21
+ end
22
+
23
+ def process_stimulus(filter_id:, intensity:)
24
+ filter = @filters[filter_id]
25
+ return nil unless filter
26
+
27
+ outcome = filter.process(intensity: intensity)
28
+ { outcome: outcome, filter: filter }
29
+ end
30
+
31
+ def open_gate(filter_id:, amount: GATE_ADJUSTMENT)
32
+ filter = @filters[filter_id]
33
+ return nil unless filter
34
+
35
+ filter.open_gate!(amount: amount)
36
+ end
37
+
38
+ def close_gate(filter_id:, amount: GATE_ADJUSTMENT)
39
+ filter = @filters[filter_id]
40
+ return nil unless filter
41
+
42
+ filter.close_gate!(amount: amount)
43
+ end
44
+
45
+ def sensitize(filter_id:, amount: SENSITIZATION_RATE)
46
+ filter = @filters[filter_id]
47
+ return nil unless filter
48
+
49
+ filter.sensitize!(amount: amount)
50
+ end
51
+
52
+ def reset_habituation(filter_id:)
53
+ filter = @filters[filter_id]
54
+ return nil unless filter
55
+
56
+ filter.reset_habituation!
57
+ end
58
+
59
+ def filters_by_modality(modality:)
60
+ m = modality.to_sym
61
+ @filters.values.select { |f| f.modality == m }
62
+ end
63
+
64
+ def average_pass_rate
65
+ return 0.0 if @filters.empty?
66
+
67
+ rates = @filters.values.map(&:pass_rate)
68
+ (rates.sum / rates.size).round(10)
69
+ end
70
+
71
+ def most_restrictive(limit: 5)
72
+ @filters.values.sort_by(&:effective_threshold).reverse.first(limit)
73
+ end
74
+
75
+ def most_permissive(limit: 5)
76
+ @filters.values.sort_by(&:effective_threshold).first(limit)
77
+ end
78
+
79
+ def gating_report
80
+ {
81
+ total_filters: @filters.size,
82
+ average_pass_rate: average_pass_rate,
83
+ most_restrictive: most_restrictive(limit: 3).map(&:to_h),
84
+ most_permissive: most_permissive(limit: 3).map(&:to_h)
85
+ }
86
+ end
87
+
88
+ def to_h
89
+ {
90
+ total_filters: @filters.size,
91
+ average_pass_rate: average_pass_rate
92
+ }
93
+ end
94
+
95
+ private
96
+
97
+ def prune_if_needed
98
+ return if @filters.size < MAX_FILTERS
99
+
100
+ oldest = @filters.values.min_by(&:created_at)
101
+ @filters.delete(oldest.id) if oldest
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end