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,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Attention
9
+ module Subliminal
10
+ module Helpers
11
+ class InfluenceEvent
12
+ include Constants
13
+
14
+ attr_reader :id, :trace_id, :target, :magnitude, :domain, :created_at
15
+
16
+ def initialize(trace_id:, target:, magnitude:, domain: :general)
17
+ @id = SecureRandom.uuid
18
+ @trace_id = trace_id
19
+ @target = target.to_sym
20
+ @magnitude = magnitude.to_f.clamp(0.0, MAX_INFLUENCE_PER_DOMAIN).round(10)
21
+ @domain = domain.to_sym
22
+ @created_at = Time.now
23
+ end
24
+
25
+ def significant? = @magnitude >= 0.05
26
+ def subtle? = @magnitude < 0.05 && @magnitude > 0.0
27
+
28
+ def to_h
29
+ {
30
+ id: @id,
31
+ trace_id: @trace_id,
32
+ target: @target,
33
+ magnitude: @magnitude,
34
+ domain: @domain,
35
+ created_at: @created_at.iso8601
36
+ }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Subliminal
8
+ module Helpers
9
+ class SubliminalEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @traces = {}
14
+ @influences = []
15
+ end
16
+
17
+ def create_trace(content:, trace_type: :associative, domain: :general, activation: DEFAULT_ACTIVATION,
18
+ influence_target: :attention)
19
+ prune_extinct
20
+ trace = SubliminalTrace.new(content: content, trace_type: trace_type, domain: domain,
21
+ activation: activation, influence_target: influence_target)
22
+ @traces[trace.id] = trace
23
+ trace
24
+ end
25
+
26
+ def boost_trace(trace_id:, amount: ACTIVATION_BOOST)
27
+ trace = @traces[trace_id]
28
+ return nil unless trace
29
+
30
+ trace.boost!(amount: amount)
31
+ trace
32
+ end
33
+
34
+ def process_influences!
35
+ active = active_traces
36
+ events = []
37
+ active.each do |trace|
38
+ mag = trace.exert_influence!
39
+ next if mag <= 0.0
40
+
41
+ event = InfluenceEvent.new(trace_id: trace.id, target: trace.influence_target,
42
+ magnitude: mag, domain: trace.domain)
43
+ events << event
44
+ @influences << event
45
+ end
46
+ prune_influences
47
+ { influences_generated: events.size, events: events.map(&:to_h) }
48
+ end
49
+
50
+ def decay_all!
51
+ @traces.each_value(&:decay!)
52
+ prune_extinct
53
+ { traces_remaining: @traces.size }
54
+ end
55
+
56
+ def active_traces = @traces.values.select(&:active?)
57
+ def near_threshold_traces = @traces.values.select(&:near_threshold?)
58
+ def potent_traces = @traces.values.select(&:potent?)
59
+ def extinct_traces = @traces.values.select(&:extinct?)
60
+
61
+ def traces_by_domain(domain:)
62
+ @traces.values.select { |t| t.domain == domain.to_sym }
63
+ end
64
+
65
+ def traces_by_type(trace_type:)
66
+ @traces.values.select { |t| t.trace_type == trace_type.to_sym }
67
+ end
68
+
69
+ def traces_by_target(target:)
70
+ @traces.values.select { |t| t.influence_target == target.to_sym }
71
+ end
72
+
73
+ def influence_on(target:)
74
+ recent = @influences.last(100).select { |e| e.target == target.to_sym }
75
+ return 0.0 if recent.empty?
76
+
77
+ recent.sum(&:magnitude).clamp(0.0, MAX_TOTAL_INFLUENCE).round(10)
78
+ end
79
+
80
+ def domain_saturation(domain:)
81
+ domain_traces = traces_by_domain(domain: domain)
82
+ return 0.0 if domain_traces.empty?
83
+
84
+ total_activation = domain_traces.sum(&:activation)
85
+ (total_activation / (domain_traces.size * SUBLIMINAL_CEILING)).clamp(0.0, 1.0).round(10)
86
+ end
87
+
88
+ def overall_subliminal_load
89
+ return 0.0 if @traces.empty?
90
+
91
+ active = active_traces
92
+ return 0.0 if active.empty?
93
+
94
+ (active.sum(&:activation) / (active.size * SUBLIMINAL_CEILING)).clamp(0.0, 1.0).round(10)
95
+ end
96
+
97
+ def saturation_label = Constants.label_for(SATURATION_LABELS, overall_subliminal_load)
98
+
99
+ def strongest_traces(limit: 5) = @traces.values.sort_by { |t| -t.activation }.first(limit)
100
+
101
+ def breached_traces
102
+ @traces.values.select(&:breached_threshold?)
103
+ end
104
+
105
+ def subliminal_report
106
+ {
107
+ total_traces: @traces.size,
108
+ active_count: active_traces.size,
109
+ near_threshold: near_threshold_traces.size,
110
+ potent_count: potent_traces.size,
111
+ total_influences: @influences.size,
112
+ subliminal_load: overall_subliminal_load,
113
+ saturation_label: saturation_label,
114
+ breached_count: breached_traces.size,
115
+ strongest: strongest_traces(limit: 3).map(&:to_h)
116
+ }
117
+ end
118
+
119
+ def to_h
120
+ {
121
+ total_traces: @traces.size,
122
+ active: active_traces.size,
123
+ subliminal_load: overall_subliminal_load,
124
+ total_influences: @influences.size
125
+ }
126
+ end
127
+
128
+ private
129
+
130
+ def prune_extinct
131
+ return if @traces.size < MAX_TRACES
132
+
133
+ @traces.reject! { |_, t| t.extinct? }
134
+ return unless @traces.size >= MAX_TRACES
135
+
136
+ weakest = @traces.values.min_by(&:activation)
137
+ @traces.delete(weakest.id) if weakest
138
+ end
139
+
140
+ def prune_influences
141
+ @influences.shift while @influences.size > MAX_INFLUENCES
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Attention
9
+ module Subliminal
10
+ module Helpers
11
+ class SubliminalTrace
12
+ include Constants
13
+
14
+ attr_reader :id, :content, :trace_type, :domain, :original_activation,
15
+ :influence_target, :created_at, :influence_count
16
+ attr_accessor :activation
17
+
18
+ def initialize(content:, trace_type: :associative, domain: :general, activation: DEFAULT_ACTIVATION,
19
+ influence_target: :attention)
20
+ @id = SecureRandom.uuid
21
+ @content = content.to_s
22
+ @trace_type = valid_trace_type(trace_type)
23
+ @domain = domain.to_sym
24
+ @activation = activation.to_f.clamp(SUBLIMINAL_FLOOR, SUBLIMINAL_CEILING).round(10)
25
+ @original_activation = @activation
26
+ @influence_target = valid_influence_target(influence_target)
27
+ @influence_count = 0
28
+ @created_at = Time.now
29
+ end
30
+
31
+ def boost!(amount: ACTIVATION_BOOST)
32
+ @activation = (@activation + amount).clamp(0.0, SUBLIMINAL_CEILING).round(10)
33
+ self
34
+ end
35
+
36
+ def decay!
37
+ @activation = (@activation - ACTIVATION_DECAY).clamp(0.0, 1.0).round(10)
38
+ self
39
+ end
40
+
41
+ def exert_influence!
42
+ @influence_count += 1
43
+ @activation = (@activation - (INFLUENCE_STRENGTH * 0.5)).clamp(0.0, 1.0).round(10)
44
+ influence_magnitude
45
+ end
46
+
47
+ def influence_magnitude
48
+ (@activation * INFLUENCE_STRENGTH).clamp(0.0, MAX_INFLUENCE_PER_DOMAIN).round(10)
49
+ end
50
+
51
+ def near_threshold? = @activation >= 0.3 && @activation < CONSCIOUS_THRESHOLD
52
+ def active? = @activation >= SUBLIMINAL_FLOOR
53
+ def extinct? = @activation < EXTINCTION_THRESHOLD
54
+ def potent? = @activation >= 0.2
55
+
56
+ def breached_threshold?
57
+ @activation >= CONSCIOUS_THRESHOLD
58
+ end
59
+
60
+ def persistence = (@activation / @original_activation).clamp(0.0, 1.0).round(10)
61
+ def activation_label = Constants.label_for(ACTIVATION_LABELS, @activation)
62
+ def influence_label = Constants.label_for(INFLUENCE_LABELS, influence_magnitude)
63
+
64
+ def to_h
65
+ {
66
+ id: @id,
67
+ content: @content,
68
+ trace_type: @trace_type,
69
+ domain: @domain,
70
+ activation: @activation,
71
+ original_activation: @original_activation,
72
+ influence_target: @influence_target,
73
+ influence_count: @influence_count,
74
+ influence_magnitude: influence_magnitude,
75
+ near_threshold: near_threshold?,
76
+ active: active?,
77
+ extinct: extinct?,
78
+ activation_label: activation_label,
79
+ persistence: persistence,
80
+ created_at: @created_at.iso8601
81
+ }
82
+ end
83
+
84
+ private
85
+
86
+ def valid_trace_type(type)
87
+ sym = type.to_sym
88
+ TRACE_TYPES.include?(sym) ? sym : :associative
89
+ end
90
+
91
+ def valid_influence_target(target)
92
+ sym = target.to_sym
93
+ INFLUENCE_TARGETS.include?(sym) ? sym : :attention
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Subliminal
8
+ module Runners
9
+ module Subliminal
10
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
11
+
12
+ def create_subliminal_trace(content:, trace_type: :associative, domain: :general, activation: nil,
13
+ influence_target: :attention, engine: nil, **)
14
+ eng = engine || @default_engine
15
+ trace = eng.create_trace(content: content, trace_type: trace_type, domain: domain,
16
+ activation: activation || Helpers::Constants::DEFAULT_ACTIVATION,
17
+ influence_target: influence_target)
18
+ { success: true, trace: trace.to_h }
19
+ end
20
+
21
+ def boost_trace(trace_id:, amount: nil, engine: nil, **)
22
+ eng = engine || @default_engine
23
+ trace = eng.boost_trace(trace_id: trace_id, amount: amount || Helpers::Constants::ACTIVATION_BOOST)
24
+ return { success: false, error: 'trace not found' } unless trace
25
+
26
+ { success: true, trace: trace.to_h }
27
+ end
28
+
29
+ def process_influences(engine: nil, **)
30
+ eng = engine || @default_engine
31
+ result = eng.process_influences!
32
+ { success: true, **result }
33
+ end
34
+
35
+ def decay_all(engine: nil, **)
36
+ eng = engine || @default_engine
37
+ result = eng.decay_all!
38
+ { success: true, **result }
39
+ end
40
+
41
+ def active_traces(engine: nil, **)
42
+ eng = engine || @default_engine
43
+ traces = eng.active_traces
44
+ { success: true, count: traces.size, traces: traces.map(&:to_h) }
45
+ end
46
+
47
+ def near_threshold(engine: nil, **)
48
+ eng = engine || @default_engine
49
+ traces = eng.near_threshold_traces
50
+ { success: true, count: traces.size, traces: traces.map(&:to_h) }
51
+ end
52
+
53
+ def influence_on(target:, engine: nil, **)
54
+ eng = engine || @default_engine
55
+ level = eng.influence_on(target: target)
56
+ label = Helpers::Constants.label_for(Helpers::Constants::INFLUENCE_LABELS, level)
57
+ { success: true, target: target, influence: level, label: label }
58
+ end
59
+
60
+ def subliminal_status(engine: nil, **)
61
+ eng = engine || @default_engine
62
+ report = eng.subliminal_report
63
+ { success: true, **report }
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ 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 Subliminal
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 'subliminal/version'
4
+ require_relative 'subliminal/helpers/constants'
5
+ require_relative 'subliminal/helpers/subliminal_trace'
6
+ require_relative 'subliminal/helpers/influence_event'
7
+ require_relative 'subliminal/helpers/subliminal_engine'
8
+ require_relative 'subliminal/runners/subliminal'
9
+ require_relative 'subliminal/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Attention
15
+ module Subliminal
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Surprise
8
+ class Client
9
+ include Runners::Surprise
10
+
11
+ attr_reader :store, :habituation_model
12
+
13
+ def initialize(store: nil, habituation_model: nil, **)
14
+ @store = store || Helpers::SurpriseStore.new
15
+ @habituation_model = habituation_model || Helpers::HabituationModel.new
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Surprise
8
+ module Helpers
9
+ module Constants
10
+ SURPRISE_THRESHOLD = 0.4
11
+
12
+ HABITUATION_RATE = 0.05
13
+
14
+ SENSITIZATION_RATE = 0.02
15
+
16
+ SURPRISE_DECAY = 0.1
17
+
18
+ MAX_SURPRISE_HISTORY = 200
19
+
20
+ SURPRISE_ALPHA = 0.15
21
+
22
+ VALENCE_WEIGHTS = { positive: 0.6, negative: 1.0, neutral: 0.3 }.freeze
23
+
24
+ DOMAIN_HABITUATION_FLOOR = 0.1
25
+
26
+ MAX_DOMAINS = 50
27
+
28
+ ORIENTING_COOLDOWN = 3
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Surprise
8
+ module Helpers
9
+ class HabituationModel
10
+ def initialize
11
+ @levels = {}
12
+ end
13
+
14
+ def sensitivity_for(domain)
15
+ @levels.fetch(domain, 1.0)
16
+ end
17
+
18
+ def habituate(domain)
19
+ current = sensitivity_for(domain)
20
+ floor = Constants::DOMAIN_HABITUATION_FLOOR
21
+ updated = [current - Constants::HABITUATION_RATE, floor].max
22
+ @levels[domain] = updated
23
+ enforce_domain_limit
24
+ updated
25
+ end
26
+
27
+ def sensitize(domain)
28
+ current = sensitivity_for(domain)
29
+ updated = [current + Constants::SENSITIZATION_RATE, 1.0].min
30
+ @levels[domain] = updated
31
+ updated
32
+ end
33
+
34
+ def decay_all
35
+ @levels.each_key do |domain|
36
+ current = @levels[domain]
37
+ @levels[domain] = [current + (Constants::SENSITIZATION_RATE * 0.5), 1.0].min
38
+ end
39
+ end
40
+
41
+ def to_h
42
+ {
43
+ domains: @levels.size,
44
+ sensitivities: @levels.transform_values { |v| v.round(4) }
45
+ }
46
+ end
47
+
48
+ private
49
+
50
+ def enforce_domain_limit
51
+ return unless @levels.size > Constants::MAX_DOMAINS
52
+
53
+ oldest_key = @levels.keys.first
54
+ @levels.delete(oldest_key)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Attention
9
+ module Surprise
10
+ module Helpers
11
+ class SurpriseEvent
12
+ attr_reader :id, :domain, :predicted, :actual, :magnitude, :valence, :timestamp, :orienting
13
+
14
+ def initialize(domain:, predicted:, actual:, magnitude:, valence:, orienting: false)
15
+ @id = SecureRandom.uuid
16
+ @domain = domain
17
+ @predicted = predicted
18
+ @actual = actual
19
+ @magnitude = magnitude.clamp(0.0, 1.0)
20
+ @valence = valence
21
+ @orienting = orienting
22
+ @timestamp = Time.now.utc
23
+ end
24
+
25
+ def to_h
26
+ {
27
+ id: @id,
28
+ domain: @domain,
29
+ predicted: @predicted,
30
+ actual: @actual,
31
+ magnitude: @magnitude.round(4),
32
+ valence: @valence,
33
+ orienting: @orienting,
34
+ timestamp: @timestamp
35
+ }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Surprise
8
+ module Helpers
9
+ class SurpriseStore
10
+ attr_reader :events
11
+
12
+ def initialize
13
+ @events = []
14
+ @baselines = {}
15
+ end
16
+
17
+ def record(event)
18
+ @events << event
19
+ update_baseline(event.domain, event.magnitude)
20
+ trim
21
+ event
22
+ end
23
+
24
+ def recent(count = 10)
25
+ @events.last(count)
26
+ end
27
+
28
+ def by_domain(domain)
29
+ @events.select { |e| e.domain == domain }
30
+ end
31
+
32
+ def most_surprising(count = 5)
33
+ @events.sort_by { |e| -e.magnitude }.first(count)
34
+ end
35
+
36
+ def baseline_for(domain)
37
+ @baselines.fetch(domain, 0.0)
38
+ end
39
+
40
+ def to_h
41
+ total = @events.size
42
+ domains = @events.map(&:domain).uniq
43
+ avg_mag = total.positive? ? (@events.sum(&:magnitude) / total).round(4) : 0.0
44
+ top = most_surprising(1).first
45
+
46
+ {
47
+ total_events: total,
48
+ domain_count: domains.size,
49
+ average_magnitude: avg_mag,
50
+ most_surprising_domain: top&.domain,
51
+ baselines: @baselines.transform_values { |v| v.round(4) }
52
+ }
53
+ end
54
+
55
+ private
56
+
57
+ def update_baseline(domain, magnitude)
58
+ prior = @baselines.fetch(domain, magnitude)
59
+ alpha = Constants::SURPRISE_ALPHA
60
+ @baselines[domain] = ((1 - alpha) * prior) + (alpha * magnitude)
61
+ end
62
+
63
+ def trim
64
+ return unless @events.size > Constants::MAX_SURPRISE_HISTORY
65
+
66
+ @events.shift(@events.size - Constants::MAX_SURPRISE_HISTORY)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end