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,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module FeatureBinding
8
+ module Helpers
9
+ class BindingField
10
+ include Constants
11
+
12
+ attr_reader :features, :objects, :binding_history
13
+
14
+ def initialize
15
+ @features = {}
16
+ @objects = {}
17
+ @binding_history = []
18
+ @object_counter = 0
19
+ end
20
+
21
+ def register_feature(id:, dimension:, value:, source: :perception, salience: 0.5)
22
+ return @features[id] if @features.key?(id)
23
+ return nil if @features.size >= MAX_FEATURES
24
+
25
+ @features[id] = Feature.new(id: id, dimension: dimension, value: value, source: source, salience: salience)
26
+ end
27
+
28
+ def bind(feature_ids:, attention: false)
29
+ ids = Array(feature_ids).select { |fid| @features.key?(fid) }
30
+ return nil if ids.size < 2
31
+ return nil if @objects.size >= MAX_OBJECTS
32
+
33
+ @object_counter += 1
34
+ obj_id = :"object_#{@object_counter}"
35
+ strength = attention ? DEFAULT_BINDING_STRENGTH + ATTENTION_BOOST : DEFAULT_BINDING_STRENGTH
36
+
37
+ obj = BoundObject.new(id: obj_id, feature_ids: ids, binding_strength: strength)
38
+ obj.confirm if attention
39
+ @objects[obj_id] = obj
40
+
41
+ record_binding(obj_id, ids, attention)
42
+ obj
43
+ end
44
+
45
+ def attend(object_id:)
46
+ obj = @objects[object_id]
47
+ return nil unless obj
48
+
49
+ obj.strengthen
50
+ obj.confirm unless obj.confirmed?
51
+ obj
52
+ end
53
+
54
+ def unbind(object_id:)
55
+ obj = @objects.delete(object_id)
56
+ !obj.nil?
57
+ end
58
+
59
+ def features_of(object_id:)
60
+ obj = @objects[object_id]
61
+ return [] unless obj
62
+
63
+ obj.feature_ids.filter_map { |fid| @features[fid]&.to_h }
64
+ end
65
+
66
+ def objects_with_feature(feature_id:)
67
+ @objects.values.select { |o| o.includes_feature?(feature_id) }.map(&:to_h)
68
+ end
69
+
70
+ def illusory_conjunctions
71
+ @objects.values.select { |o| o.state == :illusory }.map(&:to_h)
72
+ end
73
+
74
+ def unbound_features
75
+ bound_ids = @objects.values.flat_map(&:feature_ids).uniq
76
+ @features.values.reject { |f| bound_ids.include?(f.id) }.map(&:to_h)
77
+ end
78
+
79
+ def search_by_dimension(dimension:, value: nil)
80
+ matches = @features.values.select { |f| f.dimension == dimension }
81
+ matches = matches.select { |f| f.value == value } if value
82
+ matches.map(&:to_h)
83
+ end
84
+
85
+ def decay_all
86
+ @features.each_value(&:decay)
87
+ @features.reject! { |_, f| f.faded? }
88
+
89
+ @objects.each_value(&:decay)
90
+ @objects.reject! { |_, o| o.dissolved? }
91
+ end
92
+
93
+ def feature_count
94
+ @features.size
95
+ end
96
+
97
+ def object_count
98
+ @objects.size
99
+ end
100
+
101
+ def to_h
102
+ {
103
+ features: @features.size,
104
+ objects: @objects.size,
105
+ confirmed_objects: @objects.values.count(&:confirmed?),
106
+ illusory_count: @objects.values.count { |o| o.state == :illusory },
107
+ unbound_features: unbound_features.size,
108
+ history_size: @binding_history.size
109
+ }
110
+ end
111
+
112
+ private
113
+
114
+ def record_binding(obj_id, feature_ids, attended)
115
+ @binding_history << { object_id: obj_id, features: feature_ids, attended: attended, at: Time.now.utc }
116
+ @binding_history.shift while @binding_history.size > MAX_BINDING_HISTORY
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module FeatureBinding
8
+ module Helpers
9
+ class BoundObject
10
+ include Constants
11
+
12
+ attr_reader :id, :feature_ids, :bound_at, :confirmed_at
13
+ attr_accessor :binding_strength
14
+
15
+ def initialize(id:, feature_ids:, binding_strength: DEFAULT_BINDING_STRENGTH)
16
+ @id = id
17
+ @feature_ids = Array(feature_ids).uniq
18
+ @binding_strength = binding_strength.to_f.clamp(0.0, 1.0)
19
+ @bound_at = Time.now.utc
20
+ @confirmed_at = nil
21
+ end
22
+
23
+ def confirm
24
+ @confirmed_at = Time.now.utc
25
+ @binding_strength = [@binding_strength + ATTENTION_BOOST, 1.0].min
26
+ end
27
+
28
+ def confirmed?
29
+ !@confirmed_at.nil?
30
+ end
31
+
32
+ def strengthen(amount = ATTENTION_BOOST)
33
+ @binding_strength = [@binding_strength + amount, 1.0].min
34
+ end
35
+
36
+ def decay
37
+ @binding_strength = [@binding_strength - BINDING_DECAY, 0.0].max
38
+ end
39
+
40
+ def dissolved?
41
+ @binding_strength <= BINDING_STRENGTH_FLOOR
42
+ end
43
+
44
+ def state
45
+ if @binding_strength >= BINDING_CONFIRMATION_THRESHOLD && confirmed?
46
+ :bound
47
+ elsif @binding_strength >= ILLUSORY_CONJUNCTION_THRESHOLD
48
+ :tentative
49
+ elsif @binding_strength > BINDING_STRENGTH_FLOOR
50
+ :illusory
51
+ else
52
+ :unbound
53
+ end
54
+ end
55
+
56
+ def feature_count
57
+ @feature_ids.size
58
+ end
59
+
60
+ def includes_feature?(feature_id)
61
+ @feature_ids.include?(feature_id)
62
+ end
63
+
64
+ def strength_label
65
+ STRENGTH_LABELS.each { |range, lbl| return lbl if range.cover?(@binding_strength) }
66
+ :dissolving
67
+ end
68
+
69
+ def to_h
70
+ {
71
+ id: @id,
72
+ features: @feature_ids.dup,
73
+ feature_count: feature_count,
74
+ binding_strength: @binding_strength.round(4),
75
+ strength_label: strength_label,
76
+ state: state,
77
+ state_label: BINDING_STATE_LABELS[state],
78
+ confirmed: confirmed?,
79
+ bound_at: @bound_at,
80
+ confirmed_at: @confirmed_at
81
+ }
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module FeatureBinding
8
+ module Helpers
9
+ module Constants
10
+ MAX_FEATURES = 200
11
+ MAX_BINDINGS = 100
12
+ MAX_OBJECTS = 50
13
+ MAX_BINDING_HISTORY = 200
14
+
15
+ BINDING_STRENGTH_FLOOR = 0.05
16
+ BINDING_DECAY = 0.01
17
+ BINDING_ALPHA = 0.15
18
+ ATTENTION_BOOST = 0.3
19
+ DEFAULT_BINDING_STRENGTH = 0.3
20
+
21
+ ILLUSORY_CONJUNCTION_THRESHOLD = 0.3
22
+ BINDING_CONFIRMATION_THRESHOLD = 0.6
23
+ FEATURE_SALIENCE_FLOOR = 0.05
24
+
25
+ FEATURE_DIMENSIONS = %i[
26
+ shape color size motion texture location
27
+ pitch volume timbre temporal_pattern
28
+ semantic syntactic pragmatic
29
+ valence arousal familiarity
30
+ ].freeze
31
+
32
+ BINDING_STATE_LABELS = {
33
+ bound: 'features unified into coherent object',
34
+ tentative: 'binding forming, not yet confirmed',
35
+ illusory: 'incorrect binding (conjunction error)',
36
+ unbound: 'features floating in pre-attentive field'
37
+ }.freeze
38
+
39
+ STRENGTH_LABELS = {
40
+ (0.8..) => :solid,
41
+ (0.6...0.8) => :firm,
42
+ (0.4...0.6) => :forming,
43
+ (0.2...0.4) => :weak,
44
+ (..0.2) => :dissolving
45
+ }.freeze
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module FeatureBinding
8
+ module Helpers
9
+ class Feature
10
+ include Constants
11
+
12
+ attr_reader :id, :dimension, :value, :source, :detected_at
13
+ attr_accessor :salience
14
+
15
+ def initialize(id:, dimension:, value:, source: :perception, salience: 0.5)
16
+ @id = id
17
+ @dimension = dimension
18
+ @value = value
19
+ @source = source
20
+ @salience = salience.to_f.clamp(0.0, 1.0)
21
+ @detected_at = Time.now.utc
22
+ end
23
+
24
+ def salient?
25
+ @salience > FEATURE_SALIENCE_FLOOR
26
+ end
27
+
28
+ def decay
29
+ @salience = [@salience - BINDING_DECAY, 0.0].max
30
+ end
31
+
32
+ def faded?
33
+ @salience <= FEATURE_SALIENCE_FLOOR
34
+ end
35
+
36
+ def to_h
37
+ {
38
+ id: @id,
39
+ dimension: @dimension,
40
+ value: @value,
41
+ source: @source,
42
+ salience: @salience.round(4),
43
+ detected_at: @detected_at
44
+ }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module FeatureBinding
8
+ module Runners
9
+ module FeatureBinding
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def register_feature(id:, dimension:, value:, source: :perception, salience: 0.5, **)
14
+ Legion::Logging.debug "[feature_binding] register: id=#{id} dim=#{dimension} val=#{value}"
15
+ feature = field.register_feature(id: id, dimension: dimension, value: value, source: source,
16
+ salience: salience)
17
+ if feature
18
+ { success: true, feature: feature.to_h, total_features: field.feature_count }
19
+ else
20
+ { success: false, reason: :limit_reached }
21
+ end
22
+ end
23
+
24
+ def bind_features(feature_ids:, attention: false, **)
25
+ Legion::Logging.debug "[feature_binding] bind: features=#{feature_ids} attention=#{attention}"
26
+ obj = field.bind(feature_ids: feature_ids, attention: attention)
27
+ if obj
28
+ { success: true, object: obj.to_h, total_objects: field.object_count }
29
+ else
30
+ { success: false, reason: :insufficient_features }
31
+ end
32
+ end
33
+
34
+ def attend_object(object_id:, **)
35
+ Legion::Logging.debug "[feature_binding] attend: object=#{object_id}"
36
+ obj = field.attend(object_id: object_id.to_sym)
37
+ if obj
38
+ { success: true, object: obj.to_h }
39
+ else
40
+ { success: false, reason: :not_found }
41
+ end
42
+ end
43
+
44
+ def unbind_object(object_id:, **)
45
+ Legion::Logging.debug "[feature_binding] unbind: object=#{object_id}"
46
+ removed = field.unbind(object_id: object_id.to_sym)
47
+ { success: removed }
48
+ end
49
+
50
+ def features_of_object(object_id:, **)
51
+ features = field.features_of(object_id: object_id.to_sym)
52
+ Legion::Logging.debug "[feature_binding] features_of: object=#{object_id} count=#{features.size}"
53
+ { success: true, features: features, count: features.size }
54
+ end
55
+
56
+ def objects_with(feature_id:, **)
57
+ objects = field.objects_with_feature(feature_id: feature_id)
58
+ Legion::Logging.debug "[feature_binding] objects_with: feature=#{feature_id} count=#{objects.size}"
59
+ { success: true, objects: objects, count: objects.size }
60
+ end
61
+
62
+ def illusory_conjunctions(**)
63
+ illusions = field.illusory_conjunctions
64
+ Legion::Logging.debug "[feature_binding] illusory: #{illusions.size}"
65
+ { success: true, illusory: illusions, count: illusions.size }
66
+ end
67
+
68
+ def unbound_features(**)
69
+ unbound = field.unbound_features
70
+ Legion::Logging.debug "[feature_binding] unbound: #{unbound.size}"
71
+ { success: true, unbound: unbound, count: unbound.size }
72
+ end
73
+
74
+ def search_features(dimension:, value: nil, **)
75
+ results = field.search_by_dimension(dimension: dimension, value: value)
76
+ Legion::Logging.debug "[feature_binding] search: dim=#{dimension} found=#{results.size}"
77
+ { success: true, results: results, count: results.size }
78
+ end
79
+
80
+ def update_feature_binding(**)
81
+ Legion::Logging.debug '[feature_binding] tick'
82
+ field.decay_all
83
+ { success: true, features: field.feature_count, objects: field.object_count }
84
+ end
85
+
86
+ def feature_binding_stats(**)
87
+ Legion::Logging.debug '[feature_binding] stats'
88
+ { success: true, stats: field.to_h }
89
+ end
90
+
91
+ private
92
+
93
+ def field
94
+ @field ||= Helpers::BindingField.new
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ 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 FeatureBinding
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/feature_binding/version'
4
+ require 'legion/extensions/agentic/attention/feature_binding/helpers/constants'
5
+ require 'legion/extensions/agentic/attention/feature_binding/helpers/feature'
6
+ require 'legion/extensions/agentic/attention/feature_binding/helpers/bound_object'
7
+ require 'legion/extensions/agentic/attention/feature_binding/helpers/binding_field'
8
+ require 'legion/extensions/agentic/attention/feature_binding/runners/feature_binding'
9
+ require 'legion/extensions/agentic/attention/feature_binding/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Attention
15
+ module FeatureBinding
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/focus/helpers/constants'
4
+ require 'legion/extensions/agentic/attention/focus/helpers/focus'
5
+ require 'legion/extensions/agentic/attention/focus/helpers/focus_manager'
6
+ require 'legion/extensions/agentic/attention/focus/helpers/habituation'
7
+ require 'legion/extensions/agentic/attention/focus/runners/attention'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Agentic
12
+ module Attention
13
+ module Focus
14
+ class Client
15
+ include Runners::Attention
16
+
17
+ def initialize(**)
18
+ @focus_manager = Helpers::FocusManager.new
19
+ @habituation_model = Helpers::Habituation.new
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :focus_manager, :habituation_model
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Focus
8
+ module Helpers
9
+ module Constants
10
+ # Miller's law: 7 +/- 2 simultaneous attention targets
11
+ ATTENTIONAL_CAPACITY = 7
12
+
13
+ # Score weights
14
+ INTRINSIC_WEIGHT = 0.3
15
+ GOAL_RELEVANCE_WEIGHT = 0.3
16
+ NOVELTY_WEIGHT = 0.2
17
+ HABITUATION_WEIGHT = 0.2
18
+
19
+ # Habituation
20
+ HABITUATION_RATE = 0.15 # how fast habituation builds per encounter
21
+ HABITUATION_DECAY = 0.05 # how fast habituation fades per tick without signal
22
+ HABITUATION_CEILING = 0.95 # max habituation (never fully ignore)
23
+ NOVELTY_RESET_FACTOR = 0.3 # how much novelty reduces habituation
24
+
25
+ # Filtering thresholds
26
+ BACKGROUND_THRESHOLD = 0.2 # below this, signal is tagged :background
27
+ MINIMUM_THRESHOLD = 0.05 # below this, signal is dropped entirely
28
+
29
+ # Focus
30
+ MAX_MANUAL_FOCUS = 3 # max manually focused domains
31
+ FOCUS_BOOST = 0.3 # attention boost for manually focused domains
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ 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 Focus
8
+ module Helpers
9
+ module Focus
10
+ module_function
11
+
12
+ def score_signal(signal, habituation_level: 0.0, goal_relevance: 0.0)
13
+ intrinsic = extract_salience(signal)
14
+ novelty = extract_novelty(signal)
15
+
16
+ weighted = (intrinsic * Constants::INTRINSIC_WEIGHT) +
17
+ (goal_relevance * Constants::GOAL_RELEVANCE_WEIGHT) +
18
+ (novelty * Constants::NOVELTY_WEIGHT) +
19
+ ((1.0 - habituation_level) * Constants::HABITUATION_WEIGHT)
20
+
21
+ weighted.clamp(0.0, 1.0)
22
+ end
23
+
24
+ def extract_salience(signal)
25
+ return 0.0 unless signal.is_a?(Hash)
26
+
27
+ signal[:salience] || signal[:attention_score] || 0.0
28
+ end
29
+
30
+ def extract_novelty(signal)
31
+ return 0.5 unless signal.is_a?(Hash)
32
+
33
+ signal[:novelty] || 0.5
34
+ end
35
+
36
+ def extract_domain(signal)
37
+ return :general unless signal.is_a?(Hash)
38
+
39
+ signal[:domain] || signal[:source_type] || :general
40
+ end
41
+
42
+ def tag_signal(signal, attention_score:, attention_tier:)
43
+ return signal unless signal.is_a?(Hash)
44
+
45
+ signal.merge(attention_score: attention_score, attention_tier: attention_tier)
46
+ end
47
+
48
+ def attention_tier(score)
49
+ if score >= 0.7 then :spotlight
50
+ elsif score >= 0.4 then :peripheral
51
+ elsif score >= Constants::BACKGROUND_THRESHOLD then :background
52
+ else :filtered
53
+ end
54
+ end
55
+
56
+ def deduplicate(signals)
57
+ seen = {}
58
+ signals.each_with_object([]) do |signal, unique|
59
+ key = signal_identity(signal)
60
+ unless seen[key]
61
+ seen[key] = true
62
+ unique << signal
63
+ end
64
+ end
65
+ end
66
+
67
+ def signal_identity(signal)
68
+ return signal.object_id unless signal.is_a?(Hash)
69
+
70
+ [signal[:source_type], signal[:domain], signal[:value]].hash
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Focus
8
+ module Helpers
9
+ class FocusManager
10
+ attr_reader :manual_focus
11
+
12
+ def initialize
13
+ @manual_focus = {}
14
+ end
15
+
16
+ def focus_on(domain, reason: nil)
17
+ domain = domain.to_sym
18
+ return :already_focused if @manual_focus.key?(domain)
19
+ return :capacity_full if @manual_focus.size >= Constants::MAX_MANUAL_FOCUS
20
+
21
+ @manual_focus[domain] = { reason: reason, focused_at: Time.now.utc }
22
+ :focused
23
+ end
24
+
25
+ def release(domain)
26
+ domain = domain.to_sym
27
+ return :not_focused unless @manual_focus.key?(domain)
28
+
29
+ @manual_focus.delete(domain)
30
+ :released
31
+ end
32
+
33
+ def focused?(domain)
34
+ @manual_focus.key?(domain.to_sym)
35
+ end
36
+
37
+ def focus_boost(domain)
38
+ focused?(domain) ? Constants::FOCUS_BOOST : 0.0
39
+ end
40
+
41
+ def goal_relevance(signal, active_wonders: [])
42
+ domain = Focus.extract_domain(signal)
43
+ base_relevance = focus_boost(domain)
44
+
45
+ wonder_relevance = compute_wonder_relevance(signal, active_wonders)
46
+ [base_relevance + wonder_relevance, 1.0].min
47
+ end
48
+
49
+ private
50
+
51
+ def compute_wonder_relevance(signal, active_wonders)
52
+ return 0.0 if active_wonders.empty?
53
+
54
+ domain = Focus.extract_domain(signal)
55
+ matching = active_wonders.select { |w| w.is_a?(Hash) && w[:domain] == domain }
56
+ return 0.0 if matching.empty?
57
+
58
+ max_score = matching.map { |w| w[:salience] || 0.5 }.max
59
+ max_score * 0.5
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end