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,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Surprise
8
+ module Runners
9
+ module Surprise
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ # Evaluate a single prediction-outcome pair and compute surprise magnitude.
14
+ # magnitude = |predicted - actual| * sensitivity * valence_weight, clamped to [0,1]
15
+ def evaluate_surprise(domain:, predicted:, actual:, valence: :neutral, **)
16
+ sensitivity = habituation_model.sensitivity_for(domain)
17
+ valence_weight = Helpers::Constants::VALENCE_WEIGHTS.fetch(valence, 0.3)
18
+ raw_diff = (predicted.to_f - actual.to_f).abs
19
+ magnitude = (raw_diff * sensitivity * valence_weight).clamp(0.0, 1.0)
20
+
21
+ threshold = Helpers::Constants::SURPRISE_THRESHOLD
22
+ orienting = should_orient?(domain, magnitude, threshold)
23
+
24
+ event = Helpers::SurpriseEvent.new(
25
+ domain: domain,
26
+ predicted: predicted,
27
+ actual: actual,
28
+ magnitude: magnitude,
29
+ valence: valence,
30
+ orienting: orienting
31
+ )
32
+
33
+ store.record(event)
34
+ habituation_model.habituate(domain)
35
+
36
+ if orienting
37
+ record_cooldown(domain)
38
+ Legion::Logging.debug "[surprise] orienting response triggered: domain=#{domain} magnitude=#{magnitude.round(3)}"
39
+ else
40
+ Legion::Logging.debug "[surprise] surprise recorded: domain=#{domain} magnitude=#{magnitude.round(3)} orienting=false"
41
+ end
42
+
43
+ { success: true, surprise_event: event.to_h, orienting_triggered: orienting }
44
+ end
45
+
46
+ # Per-tick update: extract domain predictions from tick_result, compute surprise for each,
47
+ # decay the store's baseline tracking, and return a summary.
48
+ def update_surprise(tick_result: {}, **)
49
+ predictions = extract_predictions(tick_result)
50
+ events = []
51
+
52
+ predictions.each do |pred|
53
+ next unless pred[:domain] && !pred[:predicted].nil? && !pred[:actual].nil?
54
+
55
+ result = evaluate_surprise(
56
+ domain: pred[:domain],
57
+ predicted: pred[:predicted],
58
+ actual: pred[:actual],
59
+ valence: pred.fetch(:valence, :neutral)
60
+ )
61
+ events << result[:surprise_event] if result[:success]
62
+ end
63
+
64
+ habituation_model.decay_all
65
+ tick_cooldowns
66
+
67
+ orienting_count = events.count { |e| e[:orienting] }
68
+ Legion::Logging.debug "[surprise] tick update: evaluated=#{events.size} orienting=#{orienting_count}"
69
+
70
+ {
71
+ success: true,
72
+ evaluated: events.size,
73
+ orienting_count: orienting_count,
74
+ events: events
75
+ }
76
+ end
77
+
78
+ def surprise_stats(**)
79
+ stats = store.to_h
80
+ top = store.most_surprising(1).first
81
+ avg_mag = stats[:average_magnitude]
82
+
83
+ Legion::Logging.debug "[surprise] stats: total=#{stats[:total_events]} domains=#{stats[:domain_count]}"
84
+
85
+ {
86
+ success: true,
87
+ total_events: stats[:total_events],
88
+ domain_count: stats[:domain_count],
89
+ average_magnitude: avg_mag,
90
+ most_surprising_domain: stats[:most_surprising_domain],
91
+ top_surprise_magnitude: top&.magnitude&.round(4)
92
+ }
93
+ end
94
+
95
+ def domain_sensitivity(domain:, **)
96
+ sensitivity = habituation_model.sensitivity_for(domain)
97
+ baseline = store.baseline_for(domain)
98
+ domain_events = store.by_domain(domain)
99
+
100
+ Legion::Logging.debug "[surprise] domain_sensitivity: domain=#{domain} sensitivity=#{sensitivity.round(3)}"
101
+
102
+ {
103
+ success: true,
104
+ domain: domain,
105
+ sensitivity: sensitivity.round(4),
106
+ baseline: baseline.round(4),
107
+ event_count: domain_events.size
108
+ }
109
+ end
110
+
111
+ def recent_surprises(count: 10, **)
112
+ events = store.recent(count)
113
+ Legion::Logging.debug "[surprise] recent_surprises: count=#{events.size}"
114
+ { success: true, events: events.map(&:to_h), count: events.size }
115
+ end
116
+
117
+ def reset_habituation(domain:, **)
118
+ old_sensitivity = habituation_model.sensitivity_for(domain)
119
+ # Sensitize repeatedly to push back toward 1.0
120
+ steps = ((1.0 - old_sensitivity) / Helpers::Constants::SENSITIZATION_RATE).ceil
121
+ steps.times { habituation_model.sensitize(domain) }
122
+ new_sensitivity = habituation_model.sensitivity_for(domain)
123
+
124
+ Legion::Logging.debug "[surprise] reset_habituation: domain=#{domain} #{old_sensitivity.round(3)} -> #{new_sensitivity.round(3)}"
125
+
126
+ { success: true, domain: domain, old_sensitivity: old_sensitivity.round(4), new_sensitivity: new_sensitivity.round(4) }
127
+ end
128
+
129
+ private
130
+
131
+ def store
132
+ @store ||= Helpers::SurpriseStore.new
133
+ end
134
+
135
+ def habituation_model
136
+ @habituation_model ||= Helpers::HabituationModel.new
137
+ end
138
+
139
+ def cooldowns
140
+ @cooldowns ||= {}
141
+ end
142
+
143
+ def tick_cooldowns
144
+ cooldowns.each_key { |domain| cooldowns[domain] -= 1 }
145
+ cooldowns.reject! { |_, ticks_left| ticks_left <= 0 }
146
+ end
147
+
148
+ def record_cooldown(domain)
149
+ cooldowns[domain] = Helpers::Constants::ORIENTING_COOLDOWN
150
+ end
151
+
152
+ def on_cooldown?(domain)
153
+ (cooldowns[domain] || 0).positive?
154
+ end
155
+
156
+ def should_orient?(domain, magnitude, threshold)
157
+ return false if magnitude < threshold
158
+ return false if on_cooldown?(domain)
159
+
160
+ true
161
+ end
162
+
163
+ def extract_predictions(tick_result)
164
+ return [] unless tick_result.is_a?(Hash)
165
+
166
+ tick_result.fetch(:predictions, [])
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
174
+ 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 Surprise
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 'surprise/version'
4
+ require_relative 'surprise/helpers/constants'
5
+ require_relative 'surprise/helpers/surprise_event'
6
+ require_relative 'surprise/helpers/habituation_model'
7
+ require_relative 'surprise/helpers/surprise_store'
8
+ require_relative 'surprise/runners/surprise'
9
+ require_relative 'surprise/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Attention
15
+ module Surprise
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Switching
8
+ class Client
9
+ include Runners::AttentionSwitching
10
+
11
+ def initialize(engine: nil)
12
+ @default_engine = engine || Helpers::SwitchingEngine.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ 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 Switching
8
+ module Helpers
9
+ module Constants
10
+ # Limits
11
+ MAX_TASK_SETS = 100
12
+ MAX_SWITCH_EVENTS = 500
13
+
14
+ # Switch dynamics
15
+ DEFAULT_SWITCH_COST = 0.3
16
+ RESIDUAL_DECAY_RATE = 0.1
17
+ WARMUP_RATE = 0.15
18
+ CONTEXT_RESTORATION_COST = 0.2
19
+ PRACTICE_REDUCTION = 0.01
20
+
21
+ # Thresholds
22
+ HIGH_COST_THRESHOLD = 0.6
23
+ LOW_COST_THRESHOLD = 0.2
24
+ READY_THRESHOLD = 0.8
25
+
26
+ # Task set types
27
+ TASK_SET_TYPES = %i[
28
+ analytical creative social procedural
29
+ perceptual linguistic spatial emotional
30
+ ].freeze
31
+
32
+ # Switch cost labels
33
+ COST_LABELS = {
34
+ (0.8..) => :prohibitive,
35
+ (0.6...0.8) => :high,
36
+ (0.4...0.6) => :moderate,
37
+ (0.2...0.4) => :low,
38
+ (..0.2) => :negligible
39
+ }.freeze
40
+
41
+ # Readiness labels
42
+ READINESS_LABELS = {
43
+ (0.8..) => :fully_ready,
44
+ (0.6...0.8) => :mostly_ready,
45
+ (0.4...0.6) => :warming_up,
46
+ (0.2...0.4) => :loading,
47
+ (..0.2) => :unprepared
48
+ }.freeze
49
+
50
+ # Residual activation labels
51
+ RESIDUAL_LABELS = {
52
+ (0.8..) => :overwhelming,
53
+ (0.6...0.8) => :strong,
54
+ (0.4...0.6) => :moderate,
55
+ (0.2...0.4) => :fading,
56
+ (..0.2) => :negligible
57
+ }.freeze
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Attention
9
+ module Switching
10
+ module Helpers
11
+ class SwitchEvent
12
+ include Constants
13
+
14
+ attr_reader :id, :from_task_id, :to_task_id, :switch_cost,
15
+ :residual_interference, :warmup_needed, :created_at
16
+
17
+ def initialize(from_task_id:, to_task_id:, switch_cost:, residual_interference:, warmup_needed:)
18
+ @id = SecureRandom.uuid
19
+ @from_task_id = from_task_id
20
+ @to_task_id = to_task_id
21
+ @switch_cost = switch_cost.to_f.clamp(0.0, 1.0).round(10)
22
+ @residual_interference = residual_interference.to_f.clamp(0.0, 1.0).round(10)
23
+ @warmup_needed = warmup_needed.to_f.clamp(0.0, 1.0).round(10)
24
+ @created_at = Time.now.utc
25
+ end
26
+
27
+ def costly?
28
+ @switch_cost >= HIGH_COST_THRESHOLD
29
+ end
30
+
31
+ def cheap?
32
+ @switch_cost <= LOW_COST_THRESHOLD
33
+ end
34
+
35
+ def cost_label
36
+ match = COST_LABELS.find { |range, _| range.cover?(@switch_cost) }
37
+ match ? match.last : :negligible
38
+ end
39
+
40
+ def to_h
41
+ {
42
+ id: @id,
43
+ from_task_id: @from_task_id,
44
+ to_task_id: @to_task_id,
45
+ switch_cost: @switch_cost,
46
+ cost_label: cost_label,
47
+ costly: costly?,
48
+ cheap: cheap?,
49
+ residual_interference: @residual_interference,
50
+ warmup_needed: @warmup_needed,
51
+ created_at: @created_at
52
+ }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Switching
8
+ module Helpers
9
+ class SwitchingEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @task_sets = {}
14
+ @switch_events = []
15
+ @active_task_id = nil
16
+ end
17
+
18
+ def register_task(name:, task_type: :analytical, complexity: 0.5)
19
+ prune_tasks_if_needed
20
+ task = TaskSet.new(name: name, task_type: task_type, complexity: complexity)
21
+ @task_sets[task.id] = task
22
+ task
23
+ end
24
+
25
+ def activate_task(task_id:)
26
+ task = @task_sets[task_id]
27
+ return nil unless task
28
+
29
+ task.activate!
30
+ @active_task_id = task_id
31
+ task
32
+ end
33
+
34
+ def switch_to(task_id:)
35
+ target = @task_sets[task_id]
36
+ return nil unless target
37
+
38
+ current = @task_sets[@active_task_id]
39
+ event = if current && @active_task_id != task_id
40
+ perform_switch(current, target)
41
+ else
42
+ activate_task(task_id: task_id)
43
+ nil
44
+ end
45
+
46
+ @active_task_id = task_id
47
+ { task: target.to_h, switch_event: event&.to_h }
48
+ end
49
+
50
+ def warmup_active
51
+ task = @task_sets[@active_task_id]
52
+ return nil unless task
53
+
54
+ task.warmup!
55
+ end
56
+
57
+ def decay_all_residuals!
58
+ @task_sets.each_value(&:decay_residual!)
59
+ { tasks_decayed: @task_sets.size }
60
+ end
61
+
62
+ def active_task
63
+ @task_sets[@active_task_id]
64
+ end
65
+
66
+ def tasks_with_residual
67
+ @task_sets.values.select(&:residual?)
68
+ end
69
+
70
+ def recent_switches(limit: 10)
71
+ @switch_events.last(limit)
72
+ end
73
+
74
+ def average_switch_cost
75
+ return DEFAULT_SWITCH_COST if @switch_events.empty?
76
+
77
+ costs = @switch_events.map(&:switch_cost)
78
+ (costs.sum / costs.size).round(10)
79
+ end
80
+
81
+ def costly_switches
82
+ @switch_events.select(&:costly?)
83
+ end
84
+
85
+ def cheap_switches
86
+ @switch_events.select(&:cheap?)
87
+ end
88
+
89
+ def switch_cost_between(from_id:, to_id:)
90
+ relevant = @switch_events.select { |e| e.from_task_id == from_id && e.to_task_id == to_id }
91
+ return nil if relevant.empty?
92
+
93
+ costs = relevant.map(&:switch_cost)
94
+ (costs.sum / costs.size).round(10)
95
+ end
96
+
97
+ def most_costly_pair
98
+ return nil if @switch_events.empty?
99
+
100
+ @switch_events.max_by(&:switch_cost)
101
+ end
102
+
103
+ def switching_report
104
+ {
105
+ total_tasks: @task_sets.size,
106
+ total_switches: @switch_events.size,
107
+ active_task: active_task&.to_h,
108
+ average_switch_cost: average_switch_cost,
109
+ costly_count: costly_switches.size,
110
+ cheap_count: cheap_switches.size,
111
+ residual_count: tasks_with_residual.size,
112
+ recent_switches: recent_switches(limit: 5).map(&:to_h)
113
+ }
114
+ end
115
+
116
+ def to_h
117
+ {
118
+ total_tasks: @task_sets.size,
119
+ total_switches: @switch_events.size,
120
+ active_task_id: @active_task_id,
121
+ average_switch_cost: average_switch_cost,
122
+ residual_count: tasks_with_residual.size
123
+ }
124
+ end
125
+
126
+ private
127
+
128
+ def perform_switch(current, target)
129
+ current.deactivate!
130
+ cost = compute_switch_cost(current, target)
131
+ warmup = ((1.0 - target.readiness) * target.complexity).round(10)
132
+ target.activate!
133
+
134
+ event = SwitchEvent.new(
135
+ from_task_id: current.id,
136
+ to_task_id: target.id,
137
+ switch_cost: cost,
138
+ residual_interference: current.residual_activation,
139
+ warmup_needed: warmup
140
+ )
141
+ prune_events_if_needed
142
+ @switch_events << event
143
+ event
144
+ end
145
+
146
+ def compute_switch_cost(current, target)
147
+ type_cost = current.task_type == target.task_type ? 0.0 : 0.15
148
+ complexity_cost = ((current.complexity - target.complexity).abs * 0.3).round(10)
149
+ context_cost = CONTEXT_RESTORATION_COST * target.complexity
150
+ practice_bonus = [target.activation_count * PRACTICE_REDUCTION, 0.2].min
151
+
152
+ (DEFAULT_SWITCH_COST + type_cost + complexity_cost +
153
+ (current.residual_activation * 0.2) + context_cost - practice_bonus).clamp(0.0, 1.0).round(10)
154
+ end
155
+
156
+ def prune_tasks_if_needed
157
+ return if @task_sets.size < MAX_TASK_SETS
158
+
159
+ least_used = @task_sets.values.min_by(&:activation_count)
160
+ @task_sets.delete(least_used.id) if least_used
161
+ end
162
+
163
+ def prune_events_if_needed
164
+ @switch_events.shift while @switch_events.size >= MAX_SWITCH_EVENTS
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Attention
9
+ module Switching
10
+ module Helpers
11
+ class TaskSet
12
+ include Constants
13
+
14
+ attr_reader :id, :name, :task_type, :complexity, :readiness,
15
+ :residual_activation, :activation_count, :created_at
16
+
17
+ def initialize(name:, task_type: :analytical, complexity: 0.5)
18
+ @id = SecureRandom.uuid
19
+ @name = name.to_s
20
+ @task_type = task_type.to_sym
21
+ @complexity = complexity.to_f.clamp(0.0, 1.0).round(10)
22
+ @readiness = 0.0
23
+ @residual_activation = 0.0
24
+ @activation_count = 0
25
+ @created_at = Time.now.utc
26
+ end
27
+
28
+ def activate!
29
+ @readiness = 1.0
30
+ @residual_activation = 0.0
31
+ @activation_count += 1
32
+ self
33
+ end
34
+
35
+ def deactivate!
36
+ @residual_activation = @readiness
37
+ @readiness = 0.0
38
+ self
39
+ end
40
+
41
+ def warmup!(amount: WARMUP_RATE)
42
+ @readiness = (@readiness + amount).clamp(0.0, 1.0).round(10)
43
+ self
44
+ end
45
+
46
+ def decay_residual!
47
+ @residual_activation = (@residual_activation - RESIDUAL_DECAY_RATE).clamp(0.0, 1.0).round(10)
48
+ self
49
+ end
50
+
51
+ def ready?
52
+ @readiness >= READY_THRESHOLD
53
+ end
54
+
55
+ def residual?
56
+ @residual_activation > 0.1
57
+ end
58
+
59
+ def readiness_label
60
+ match = READINESS_LABELS.find { |range, _| range.cover?(@readiness) }
61
+ match ? match.last : :unprepared
62
+ end
63
+
64
+ def residual_label
65
+ match = RESIDUAL_LABELS.find { |range, _| range.cover?(@residual_activation) }
66
+ match ? match.last : :negligible
67
+ end
68
+
69
+ def to_h
70
+ {
71
+ id: @id,
72
+ name: @name,
73
+ task_type: @task_type,
74
+ complexity: @complexity,
75
+ readiness: @readiness,
76
+ readiness_label: readiness_label,
77
+ residual_activation: @residual_activation,
78
+ residual_label: residual_label,
79
+ ready: ready?,
80
+ has_residual: residual?,
81
+ activation_count: @activation_count,
82
+ created_at: @created_at
83
+ }
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end