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,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Regulation
8
+ module Helpers
9
+ class AttentionController
10
+ include Constants
11
+
12
+ def initialize
13
+ @targets = {}
14
+ @current_target_id = nil
15
+ @zoom = DEFAULT_ZOOM
16
+ @resource = DEFAULT_RESOURCE
17
+ @mode = :diffuse
18
+ @counter = 0
19
+ @history = []
20
+ end
21
+
22
+ def add_target(name:, domain: :general, salience: 0.5)
23
+ return nil if @targets.size >= MAX_TARGETS
24
+
25
+ id = :"target_#{@counter}"
26
+ @counter += 1
27
+ target = AttentionTarget.new(id: id, name: name, domain: domain, salience: salience)
28
+ @targets[id] = target
29
+ target
30
+ end
31
+
32
+ def focus_on(target_id:)
33
+ target = @targets[target_id]
34
+ return nil unless target
35
+
36
+ defocus_current_target
37
+ @current_target_id = target_id
38
+ @mode = :focused
39
+ target.attend!
40
+ record_history(:focus, target_id)
41
+ target
42
+ end
43
+
44
+ def defocus
45
+ defocus_current_target
46
+ @current_target_id = nil
47
+ @mode = :diffuse
48
+ record_history(:defocus, nil)
49
+ true
50
+ end
51
+
52
+ def scan
53
+ @mode = :scanning
54
+ record_history(:scan, nil)
55
+ check_capture
56
+ end
57
+
58
+ def rest
59
+ @mode = :resting
60
+ @current_target_id = nil
61
+ record_history(:rest, nil)
62
+ true
63
+ end
64
+
65
+ def zoom_in(amount: 0.1)
66
+ @zoom = (@zoom + amount.to_f).clamp(ZOOM_FLOOR, ZOOM_CEILING)
67
+ @zoom
68
+ end
69
+
70
+ def zoom_out(amount: 0.1)
71
+ @zoom = (@zoom - amount.to_f).clamp(ZOOM_FLOOR, ZOOM_CEILING)
72
+ @zoom
73
+ end
74
+
75
+ def check_capture
76
+ return nil unless @resource > 0.3
77
+
78
+ candidate = @targets.values
79
+ .select { |t| t.state != :attended && t.salient_enough_to_capture? }
80
+ .max_by(&:salience)
81
+ return nil unless candidate
82
+
83
+ focus_on(target_id: candidate.id)
84
+ @mode = :captured
85
+ record_history(:captured, candidate.id)
86
+ candidate
87
+ end
88
+
89
+ def current_target
90
+ return nil unless @current_target_id
91
+
92
+ @targets[@current_target_id]
93
+ end
94
+
95
+ def most_salient
96
+ @targets.values.max_by(&:salience)
97
+ end
98
+
99
+ def attended_targets
100
+ @targets.values.select { |t| t.state == :attended }
101
+ end
102
+
103
+ def peripheral_targets
104
+ @targets.values.select { |t| t.state == :peripheral }
105
+ end
106
+
107
+ def tick
108
+ case @mode
109
+ when :focused, :captured
110
+ @resource = (@resource - RESOURCE_DRAIN).clamp(RESOURCE_FLOOR, RESOURCE_CEILING)
111
+ when :resting
112
+ @resource = (@resource + RESOURCE_RECOVERY).clamp(RESOURCE_FLOOR, RESOURCE_CEILING)
113
+ end
114
+
115
+ check_capture if @mode == :scanning
116
+ end
117
+
118
+ def resource_label
119
+ RESOURCE_LABELS.each { |range, lbl| return lbl if range.cover?(@resource) }
120
+ :depleted
121
+ end
122
+
123
+ def to_h
124
+ {
125
+ mode: @mode,
126
+ zoom: @zoom.round(4),
127
+ resource: @resource.round(4),
128
+ resource_label: resource_label,
129
+ current_target_id: @current_target_id,
130
+ target_count: @targets.size,
131
+ attended_count: attended_targets.size,
132
+ peripheral_count: peripheral_targets.size,
133
+ history_count: @history.size
134
+ }
135
+ end
136
+
137
+ private
138
+
139
+ def defocus_current_target
140
+ return unless @current_target_id
141
+
142
+ current = @targets[@current_target_id]
143
+ current&.peripheral!
144
+ end
145
+
146
+ def record_history(action, target_id)
147
+ entry = { action: action, target_id: target_id, at: Time.now.utc }
148
+ @history << entry
149
+ @history.shift if @history.size > MAX_HISTORY
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Regulation
8
+ module Helpers
9
+ class AttentionTarget
10
+ include Constants
11
+
12
+ attr_reader :id, :name, :domain, :salience, :state, :attended_since
13
+
14
+ def initialize(id:, name:, domain: :general, salience: 0.5)
15
+ @id = id
16
+ @name = name
17
+ @domain = domain
18
+ @salience = salience.to_f.clamp(0.0, 1.0)
19
+ @state = :peripheral
20
+ @attended_since = nil
21
+ end
22
+
23
+ def attend!
24
+ @state = :attended
25
+ @attended_since = Time.now.utc
26
+ end
27
+
28
+ def ignore!
29
+ @state = :ignored
30
+ @attended_since = nil
31
+ end
32
+
33
+ def peripheral!
34
+ @state = :peripheral
35
+ @attended_since = nil
36
+ end
37
+
38
+ def salient_enough_to_capture?
39
+ @salience >= CAPTURE_THRESHOLD
40
+ end
41
+
42
+ def duration
43
+ return nil unless @state == :attended && @attended_since
44
+
45
+ Time.now.utc - @attended_since
46
+ end
47
+
48
+ def to_h
49
+ {
50
+ id: @id,
51
+ name: @name,
52
+ domain: @domain,
53
+ salience: @salience.round(4),
54
+ state: @state,
55
+ attended_since: @attended_since
56
+ }
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Regulation
8
+ module Helpers
9
+ module Constants
10
+ MAX_TARGETS = 30
11
+ MAX_HISTORY = 200
12
+
13
+ DEFAULT_RESOURCE = 1.0
14
+ RESOURCE_FLOOR = 0.05
15
+ RESOURCE_CEILING = 1.0
16
+ RESOURCE_DRAIN = 0.02
17
+ RESOURCE_RECOVERY = 0.03
18
+
19
+ CAPTURE_THRESHOLD = 0.7
20
+
21
+ DEFAULT_ZOOM = 0.5
22
+ ZOOM_FLOOR = 0.1
23
+ ZOOM_CEILING = 1.0
24
+
25
+ ATTENTION_MODES = %i[focused diffuse scanning resting captured].freeze
26
+ TARGET_STATES = %i[attended peripheral ignored].freeze
27
+
28
+ RESOURCE_LABELS = {
29
+ (0.8..) => :abundant,
30
+ (0.6...0.8) => :adequate,
31
+ (0.4...0.6) => :moderate,
32
+ (0.2...0.4) => :low,
33
+ (..0.2) => :depleted
34
+ }.freeze
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Regulation
8
+ module Runners
9
+ module AttentionRegulation
10
+ include Helpers::Constants
11
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
12
+
13
+ def add_attention_target(name:, domain: :general, salience: 0.5, **)
14
+ target = controller.add_target(name: name, domain: domain, salience: salience)
15
+ return { success: false, reason: :limit_reached } unless target
16
+
17
+ { success: true, target_id: target.id, name: target.name, salience: target.salience }
18
+ end
19
+
20
+ def focus_attention(target_id:, **)
21
+ target = controller.focus_on(target_id: target_id)
22
+ return { success: false, reason: :not_found } unless target
23
+
24
+ { success: true, target_id: target.id, mode: :focused }
25
+ end
26
+
27
+ def defocus_attention(**)
28
+ controller.defocus
29
+ { success: true, mode: :diffuse }
30
+ end
31
+
32
+ def scan_attention(**)
33
+ captured = controller.scan
34
+ result = { success: true, mode: :scanning }
35
+ result[:captured_target_id] = captured.id if captured
36
+ result
37
+ end
38
+
39
+ def rest_attention(**)
40
+ controller.rest
41
+ { success: true, mode: :resting }
42
+ end
43
+
44
+ def zoom_attention_in(amount: 0.1, **)
45
+ zoom = controller.zoom_in(amount: amount)
46
+ { success: true, zoom: zoom.round(4) }
47
+ end
48
+
49
+ def zoom_attention_out(amount: 0.1, **)
50
+ zoom = controller.zoom_out(amount: amount)
51
+ { success: true, zoom: zoom.round(4) }
52
+ end
53
+
54
+ def current_attention_target(**)
55
+ target = controller.current_target
56
+ return { success: true, target: nil } unless target
57
+
58
+ { success: true, target: target.to_h }
59
+ end
60
+
61
+ def most_salient_target(**)
62
+ target = controller.most_salient
63
+ return { success: true, target: nil } unless target
64
+
65
+ { success: true, target: target.to_h }
66
+ end
67
+
68
+ def update_attention(**)
69
+ controller.tick
70
+ { success: true }.merge(controller.to_h)
71
+ end
72
+
73
+ def attention_regulation_stats(**)
74
+ { success: true }.merge(controller.to_h)
75
+ end
76
+
77
+ private
78
+
79
+ def controller
80
+ @controller ||= Helpers::AttentionController.new
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ 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 Regulation
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_relative 'regulation/version'
4
+ require_relative 'regulation/helpers/constants'
5
+ require_relative 'regulation/helpers/attention_controller'
6
+ require_relative 'regulation/helpers/attention_target'
7
+ require_relative 'regulation/runners/attention_regulation'
8
+ require_relative 'regulation/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Attention
14
+ module Regulation
15
+ # Sub-module for attention regulation: top-down and bottom-up attention control
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module RelevanceTheory
8
+ module Helpers
9
+ class Client
10
+ include Runners::RelevanceTheory
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Attention
9
+ module RelevanceTheory
10
+ module Helpers
11
+ class CognitiveInput
12
+ include Constants
13
+
14
+ attr_reader :id, :content, :input_type, :context, :cognitive_effect,
15
+ :processing_effort, :effect_type, :source_id, :created_at
16
+
17
+ def initialize(content:, input_type:, context:, cognitive_effect: DEFAULT_EFFECT,
18
+ processing_effort: DEFAULT_EFFORT, effect_type: :new_implication,
19
+ source_id: nil)
20
+ @id = SecureRandom.uuid
21
+ @content = content
22
+ @input_type = input_type
23
+ @context = context
24
+ @cognitive_effect = cognitive_effect.clamp(EFFECT_FLOOR, EFFECT_CEILING)
25
+ @processing_effort = processing_effort.clamp(EFFORT_FLOOR, EFFORT_CEILING)
26
+ @effect_type = effect_type
27
+ @source_id = source_id
28
+ @created_at = Time.now.utc
29
+ end
30
+
31
+ def relevance
32
+ @cognitive_effect / @processing_effort
33
+ end
34
+
35
+ def normalized_relevance
36
+ relevance.clamp(0.0, 1.0)
37
+ end
38
+
39
+ def relevance_label
40
+ nr = normalized_relevance
41
+ RELEVANCE_LABELS.find { |range, _| range.cover?(nr) }&.last || :irrelevant
42
+ end
43
+
44
+ def worth_processing?
45
+ normalized_relevance >= ATTENTION_THRESHOLD
46
+ end
47
+
48
+ def strengthen!(amount: 0.1)
49
+ @cognitive_effect = (@cognitive_effect + amount).clamp(EFFECT_FLOOR, EFFECT_CEILING)
50
+ end
51
+
52
+ def weaken!(amount: 0.1)
53
+ @cognitive_effect = (@cognitive_effect - amount).clamp(EFFECT_FLOOR, EFFECT_CEILING)
54
+ end
55
+
56
+ def increase_effort!(amount: 0.1)
57
+ @processing_effort = (@processing_effort + amount).clamp(EFFORT_FLOOR, EFFORT_CEILING)
58
+ end
59
+
60
+ def decay!
61
+ @cognitive_effect = (@cognitive_effect - EFFECT_DECAY).clamp(EFFECT_FLOOR, EFFECT_CEILING)
62
+ @processing_effort = (@processing_effort + EFFORT_INFLATION).clamp(EFFORT_FLOOR, EFFORT_CEILING)
63
+ end
64
+
65
+ def to_h
66
+ {
67
+ id: @id,
68
+ content: @content,
69
+ input_type: @input_type,
70
+ context: @context,
71
+ cognitive_effect: @cognitive_effect,
72
+ processing_effort: @processing_effort,
73
+ relevance: relevance.round(3),
74
+ normalized: normalized_relevance.round(3),
75
+ relevance_label: relevance_label,
76
+ worth_processing: worth_processing?,
77
+ effect_type: @effect_type,
78
+ source_id: @source_id,
79
+ created_at: @created_at
80
+ }
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module RelevanceTheory
8
+ module Helpers
9
+ module Constants
10
+ # Relevance = cognitive_effect / processing_effort
11
+ # Higher effect + lower effort = more relevant
12
+
13
+ INPUT_TYPES = %i[assertion question command observation inference].freeze
14
+
15
+ RELEVANCE_LABELS = {
16
+ (0.8..) => :maximally_relevant,
17
+ (0.6...0.8) => :highly_relevant,
18
+ (0.4...0.6) => :moderately_relevant,
19
+ (0.2...0.4) => :marginally_relevant,
20
+ (..0.2) => :irrelevant
21
+ }.freeze
22
+
23
+ EFFECT_TYPES = %i[
24
+ strengthening contradiction new_implication contextual_implication elimination
25
+ ].freeze
26
+
27
+ MAX_INPUTS = 300
28
+ MAX_HISTORY = 500
29
+ MAX_CONTEXTS = 50
30
+
31
+ DEFAULT_EFFECT = 0.5
32
+ DEFAULT_EFFORT = 0.5
33
+ EFFECT_FLOOR = 0.0
34
+ EFFECT_CEILING = 1.0
35
+ EFFORT_FLOOR = 0.01
36
+ EFFORT_CEILING = 1.0
37
+
38
+ # Decay rates
39
+ EFFECT_DECAY = 0.02
40
+ EFFORT_INFLATION = 0.01
41
+
42
+ # Attention allocation: inputs above this threshold get processed
43
+ ATTENTION_THRESHOLD = 0.3
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module RelevanceTheory
8
+ module Helpers
9
+ class RelevanceEngine
10
+ include Constants
11
+
12
+ attr_reader :history
13
+
14
+ def initialize
15
+ @inputs = {}
16
+ @history = []
17
+ end
18
+
19
+ def submit_input(content:, input_type:, context:, cognitive_effect: DEFAULT_EFFECT,
20
+ processing_effort: DEFAULT_EFFORT, effect_type: :new_implication,
21
+ source_id: nil)
22
+ evict_oldest if @inputs.size >= MAX_INPUTS
23
+
24
+ input = CognitiveInput.new(
25
+ content: content,
26
+ input_type: input_type,
27
+ context: context,
28
+ cognitive_effect: cognitive_effect,
29
+ processing_effort: processing_effort,
30
+ effect_type: effect_type,
31
+ source_id: source_id
32
+ )
33
+ @inputs[input.id] = input
34
+ record_history(:submitted, input.id)
35
+ input
36
+ end
37
+
38
+ def assess_relevance(input_id:)
39
+ input = @inputs[input_id]
40
+ return { success: false, reason: :not_found } unless input
41
+
42
+ {
43
+ success: true,
44
+ relevance: input.relevance.round(3),
45
+ normalized: input.normalized_relevance.round(3),
46
+ label: input.relevance_label,
47
+ worth_processing: input.worth_processing?,
48
+ effect: input.cognitive_effect,
49
+ effort: input.processing_effort
50
+ }
51
+ end
52
+
53
+ def strengthen_input(input_id:, amount: 0.1)
54
+ input = @inputs[input_id]
55
+ return { success: false, reason: :not_found } unless input
56
+
57
+ input.strengthen!(amount: amount)
58
+ record_history(:strengthened, input_id)
59
+ { success: true, relevance: input.normalized_relevance.round(3) }
60
+ end
61
+
62
+ def weaken_input(input_id:, amount: 0.1)
63
+ input = @inputs[input_id]
64
+ return { success: false, reason: :not_found } unless input
65
+
66
+ input.weaken!(amount: amount)
67
+ record_history(:weakened, input_id)
68
+ { success: true, relevance: input.normalized_relevance.round(3) }
69
+ end
70
+
71
+ def worth_processing
72
+ @inputs.values.select(&:worth_processing?)
73
+ end
74
+
75
+ def irrelevant_inputs
76
+ @inputs.values.reject(&:worth_processing?)
77
+ end
78
+
79
+ def most_relevant(limit: 5)
80
+ @inputs.values.sort_by { |inp| -inp.normalized_relevance }.first(limit)
81
+ end
82
+
83
+ def by_context(context:)
84
+ @inputs.values.select { |inp| inp.context == context }
85
+ end
86
+
87
+ def by_effect_type(effect_type:)
88
+ @inputs.values.select { |inp| inp.effect_type == effect_type }
89
+ end
90
+
91
+ def context_relevance(context:)
92
+ ctx_inputs = by_context(context: context)
93
+ return 0.0 if ctx_inputs.empty?
94
+
95
+ ctx_inputs.sum(&:normalized_relevance) / ctx_inputs.size
96
+ end
97
+
98
+ def attention_budget
99
+ processable = worth_processing
100
+ total = @inputs.size.to_f
101
+ {
102
+ total_inputs: @inputs.size,
103
+ worth_processing: processable.size,
104
+ filtered_out: @inputs.size - processable.size,
105
+ processing_ratio: total.zero? ? 0.0 : (processable.size / total).round(3),
106
+ avg_relevance: avg_relevance.round(3)
107
+ }
108
+ end
109
+
110
+ def decay_all
111
+ @inputs.each_value(&:decay!)
112
+ end
113
+
114
+ def prune_irrelevant
115
+ ids = @inputs.select { |_id, inp| inp.normalized_relevance <= 0.05 }.keys
116
+ ids.each { |input_id| @inputs.delete(input_id) }
117
+ ids.size
118
+ end
119
+
120
+ def to_h
121
+ {
122
+ total_inputs: @inputs.size,
123
+ processable: worth_processing.size,
124
+ avg_relevance: avg_relevance.round(3),
125
+ history_count: @history.size
126
+ }
127
+ end
128
+
129
+ private
130
+
131
+ def avg_relevance
132
+ return 0.0 if @inputs.empty?
133
+
134
+ @inputs.values.sum(&:normalized_relevance) / @inputs.size
135
+ end
136
+
137
+ def evict_oldest
138
+ oldest_id = @inputs.min_by { |_id, inp| inp.created_at }&.first
139
+ @inputs.delete(oldest_id) if oldest_id
140
+ end
141
+
142
+ def record_history(event, input_id)
143
+ @history << { event: event, input_id: input_id, at: Time.now.utc }
144
+ @history.shift while @history.size > MAX_HISTORY
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end