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,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Regulation::Runners::AttentionRegulation do
4
+ let(:runner) do
5
+ obj = Object.new
6
+ obj.extend(described_class)
7
+ obj
8
+ end
9
+
10
+ describe '#add_attention_target' do
11
+ it 'creates a target and returns success' do
12
+ result = runner.add_attention_target(name: 'email', domain: :work, salience: 0.4)
13
+ expect(result[:success]).to be true
14
+ expect(result[:target_id]).to be_a(Symbol)
15
+ expect(result[:name]).to eq('email')
16
+ end
17
+
18
+ it 'returns failure when limit is reached' do
19
+ 30.times { |i| runner.add_attention_target(name: "target #{i}", salience: 0.3) }
20
+ result = runner.add_attention_target(name: 'overflow', salience: 0.5)
21
+ expect(result[:success]).to be false
22
+ expect(result[:reason]).to eq(:limit_reached)
23
+ end
24
+ end
25
+
26
+ describe '#focus_attention' do
27
+ it 'focuses on a known target' do
28
+ created = runner.add_attention_target(name: 'task', salience: 0.5)
29
+ result = runner.focus_attention(target_id: created[:target_id])
30
+ expect(result[:success]).to be true
31
+ expect(result[:mode]).to eq(:focused)
32
+ end
33
+
34
+ it 'returns failure for unknown target' do
35
+ result = runner.focus_attention(target_id: :bogus)
36
+ expect(result[:success]).to be false
37
+ expect(result[:reason]).to eq(:not_found)
38
+ end
39
+ end
40
+
41
+ describe '#defocus_attention' do
42
+ it 'defocuses and returns success' do
43
+ result = runner.defocus_attention
44
+ expect(result[:success]).to be true
45
+ expect(result[:mode]).to eq(:diffuse)
46
+ end
47
+ end
48
+
49
+ describe '#scan_attention' do
50
+ it 'returns success with scanning mode when nothing captures' do
51
+ runner.add_attention_target(name: 'low', salience: 0.2)
52
+ result = runner.scan_attention
53
+ expect(result[:success]).to be true
54
+ expect(result[:mode]).to eq(:scanning)
55
+ end
56
+
57
+ it 'includes captured_target_id when a target is captured' do
58
+ runner.add_attention_target(name: 'urgent', salience: 0.9)
59
+ result = runner.scan_attention
60
+ expect(result[:success]).to be true
61
+ expect(result[:captured_target_id]).to be_a(Symbol)
62
+ end
63
+ end
64
+
65
+ describe '#rest_attention' do
66
+ it 'returns success with resting mode' do
67
+ result = runner.rest_attention
68
+ expect(result[:success]).to be true
69
+ expect(result[:mode]).to eq(:resting)
70
+ end
71
+ end
72
+
73
+ describe '#zoom_attention_in' do
74
+ it 'increases zoom and returns success' do
75
+ result = runner.zoom_attention_in(amount: 0.1)
76
+ expect(result[:success]).to be true
77
+ expect(result[:zoom]).to be > 0.5
78
+ end
79
+
80
+ it 'uses default amount' do
81
+ result = runner.zoom_attention_in
82
+ expect(result[:success]).to be true
83
+ end
84
+ end
85
+
86
+ describe '#zoom_attention_out' do
87
+ it 'decreases zoom and returns success' do
88
+ result = runner.zoom_attention_out(amount: 0.1)
89
+ expect(result[:success]).to be true
90
+ expect(result[:zoom]).to be < 0.5
91
+ end
92
+
93
+ it 'uses default amount' do
94
+ result = runner.zoom_attention_out
95
+ expect(result[:success]).to be true
96
+ end
97
+ end
98
+
99
+ describe '#current_attention_target' do
100
+ it 'returns target: nil when not focused' do
101
+ result = runner.current_attention_target
102
+ expect(result[:success]).to be true
103
+ expect(result[:target]).to be_nil
104
+ end
105
+
106
+ it 'returns current target when focused' do
107
+ created = runner.add_attention_target(name: 'active', salience: 0.5)
108
+ runner.focus_attention(target_id: created[:target_id])
109
+ result = runner.current_attention_target
110
+ expect(result[:success]).to be true
111
+ expect(result[:target]).to be_a(Hash)
112
+ expect(result[:target][:name]).to eq('active')
113
+ end
114
+ end
115
+
116
+ describe '#most_salient_target' do
117
+ it 'returns target: nil when no targets' do
118
+ result = runner.most_salient_target
119
+ expect(result[:success]).to be true
120
+ expect(result[:target]).to be_nil
121
+ end
122
+
123
+ it 'returns the most salient target' do
124
+ runner.add_attention_target(name: 'low', salience: 0.2)
125
+ runner.add_attention_target(name: 'high', salience: 0.8)
126
+ result = runner.most_salient_target
127
+ expect(result[:success]).to be true
128
+ expect(result[:target][:name]).to eq('high')
129
+ end
130
+ end
131
+
132
+ describe '#update_attention' do
133
+ it 'ticks and returns stats' do
134
+ result = runner.update_attention
135
+ expect(result[:success]).to be true
136
+ expect(result).to include(:mode, :zoom, :resource, :resource_label)
137
+ end
138
+ end
139
+
140
+ describe '#attention_regulation_stats' do
141
+ it 'returns stats hash' do
142
+ result = runner.attention_regulation_stats
143
+ expect(result[:success]).to be true
144
+ expect(result).to include(:mode, :target_count)
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::RelevanceTheory::Helpers::CognitiveInput do
4
+ subject(:input) do
5
+ described_class.new(content: 'test input', input_type: :assertion, context: :general)
6
+ end
7
+
8
+ describe '#initialize' do
9
+ it 'creates with defaults' do
10
+ expect(input.content).to eq('test input')
11
+ expect(input.input_type).to eq(:assertion)
12
+ expect(input.context).to eq(:general)
13
+ expect(input.cognitive_effect).to eq(0.5)
14
+ expect(input.processing_effort).to eq(0.5)
15
+ end
16
+
17
+ it 'generates a uuid' do
18
+ expect(input.id).to match(/\A[0-9a-f-]{36}\z/)
19
+ end
20
+
21
+ it 'clamps effect and effort' do
22
+ clamped = described_class.new(content: 'x', input_type: :assertion, context: :c,
23
+ cognitive_effect: 5.0, processing_effort: -1.0)
24
+ expect(clamped.cognitive_effect).to eq(1.0)
25
+ expect(clamped.processing_effort).to eq(0.01)
26
+ end
27
+ end
28
+
29
+ describe '#relevance' do
30
+ it 'returns effect / effort' do
31
+ expect(input.relevance).to eq(1.0)
32
+ end
33
+
34
+ it 'is higher when effect is high and effort is low' do
35
+ high_rel = described_class.new(content: 'x', input_type: :assertion, context: :c,
36
+ cognitive_effect: 0.9, processing_effort: 0.1)
37
+ expect(high_rel.relevance).to eq(9.0)
38
+ end
39
+ end
40
+
41
+ describe '#normalized_relevance' do
42
+ it 'clamps to 0..1' do
43
+ high = described_class.new(content: 'x', input_type: :assertion, context: :c,
44
+ cognitive_effect: 0.9, processing_effort: 0.1)
45
+ expect(high.normalized_relevance).to eq(1.0)
46
+ end
47
+ end
48
+
49
+ describe '#relevance_label' do
50
+ it 'returns a symbol' do
51
+ expect(input.relevance_label).to be_a(Symbol)
52
+ end
53
+
54
+ it 'returns :maximally_relevant for high relevance' do
55
+ high = described_class.new(content: 'x', input_type: :assertion, context: :c,
56
+ cognitive_effect: 0.9, processing_effort: 0.1)
57
+ expect(high.relevance_label).to eq(:maximally_relevant)
58
+ end
59
+
60
+ it 'returns :irrelevant for low relevance' do
61
+ low = described_class.new(content: 'x', input_type: :assertion, context: :c,
62
+ cognitive_effect: 0.05, processing_effort: 0.9)
63
+ expect(low.relevance_label).to eq(:irrelevant)
64
+ end
65
+ end
66
+
67
+ describe '#worth_processing?' do
68
+ it 'is true when normalized_relevance >= threshold' do
69
+ expect(input.worth_processing?).to be true
70
+ end
71
+
72
+ it 'is false when relevance is too low' do
73
+ low = described_class.new(content: 'x', input_type: :assertion, context: :c,
74
+ cognitive_effect: 0.05, processing_effort: 0.9)
75
+ expect(low.worth_processing?).to be false
76
+ end
77
+ end
78
+
79
+ describe '#strengthen!' do
80
+ it 'increases cognitive effect' do
81
+ old_effect = input.cognitive_effect
82
+ input.strengthen!(amount: 0.1)
83
+ expect(input.cognitive_effect).to be > old_effect
84
+ end
85
+ end
86
+
87
+ describe '#weaken!' do
88
+ it 'decreases cognitive effect' do
89
+ old_effect = input.cognitive_effect
90
+ input.weaken!(amount: 0.1)
91
+ expect(input.cognitive_effect).to be < old_effect
92
+ end
93
+ end
94
+
95
+ describe '#increase_effort!' do
96
+ it 'increases processing effort' do
97
+ old_effort = input.processing_effort
98
+ input.increase_effort!(amount: 0.1)
99
+ expect(input.processing_effort).to be > old_effort
100
+ end
101
+ end
102
+
103
+ describe '#decay!' do
104
+ it 'reduces effect and increases effort' do
105
+ old_effect = input.cognitive_effect
106
+ old_effort = input.processing_effort
107
+ input.decay!
108
+ expect(input.cognitive_effect).to be < old_effect
109
+ expect(input.processing_effort).to be > old_effort
110
+ end
111
+ end
112
+
113
+ describe '#to_h' do
114
+ it 'returns a complete hash' do
115
+ hash = input.to_h
116
+ expect(hash).to include(:id, :content, :input_type, :context, :cognitive_effect,
117
+ :processing_effort, :relevance, :normalized, :relevance_label,
118
+ :worth_processing, :effect_type)
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::RelevanceTheory::Helpers::RelevanceEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:input) { engine.submit_input(content: 'test', input_type: :assertion, context: :general) }
7
+
8
+ describe '#submit_input' do
9
+ it 'creates and stores an input' do
10
+ result = engine.submit_input(content: 'hello', input_type: :observation, context: :work)
11
+ expect(result).to be_a(Legion::Extensions::Agentic::Attention::RelevanceTheory::Helpers::CognitiveInput)
12
+ expect(result.content).to eq('hello')
13
+ end
14
+
15
+ it 'records history' do
16
+ engine.submit_input(content: 'x', input_type: :assertion, context: :c)
17
+ expect(engine.history.last[:event]).to eq(:submitted)
18
+ end
19
+ end
20
+
21
+ describe '#assess_relevance' do
22
+ it 'assesses an existing input' do
23
+ result = engine.assess_relevance(input_id: input.id)
24
+ expect(result[:success]).to be true
25
+ expect(result[:relevance]).to be_a(Float)
26
+ expect(result[:label]).to be_a(Symbol)
27
+ end
28
+
29
+ it 'returns not_found for missing input' do
30
+ result = engine.assess_relevance(input_id: 'missing')
31
+ expect(result[:success]).to be false
32
+ end
33
+ end
34
+
35
+ describe '#strengthen_input' do
36
+ it 'strengthens an existing input' do
37
+ old_relevance = input.normalized_relevance
38
+ result = engine.strengthen_input(input_id: input.id, amount: 0.2)
39
+ expect(result[:success]).to be true
40
+ expect(result[:relevance]).to be >= old_relevance
41
+ end
42
+ end
43
+
44
+ describe '#weaken_input' do
45
+ it 'weakens an existing input' do
46
+ result = engine.weaken_input(input_id: input.id, amount: 0.2)
47
+ expect(result[:success]).to be true
48
+ end
49
+ end
50
+
51
+ describe '#worth_processing' do
52
+ it 'returns inputs above attention threshold' do
53
+ engine.submit_input(content: 'high', input_type: :assertion, context: :c,
54
+ cognitive_effect: 0.9, processing_effort: 0.1)
55
+ engine.submit_input(content: 'low', input_type: :assertion, context: :c,
56
+ cognitive_effect: 0.01, processing_effort: 0.9)
57
+ expect(engine.worth_processing.size).to eq(1)
58
+ end
59
+ end
60
+
61
+ describe '#irrelevant_inputs' do
62
+ it 'returns inputs below attention threshold' do
63
+ engine.submit_input(content: 'low', input_type: :assertion, context: :c,
64
+ cognitive_effect: 0.01, processing_effort: 0.9)
65
+ expect(engine.irrelevant_inputs.size).to eq(1)
66
+ end
67
+ end
68
+
69
+ describe '#most_relevant' do
70
+ it 'returns inputs sorted by relevance desc' do
71
+ engine.submit_input(content: 'low', input_type: :assertion, context: :c,
72
+ cognitive_effect: 0.2, processing_effort: 0.8)
73
+ high = engine.submit_input(content: 'high', input_type: :assertion, context: :c,
74
+ cognitive_effect: 0.9, processing_effort: 0.1)
75
+ result = engine.most_relevant(limit: 2)
76
+ expect(result.first).to eq(high)
77
+ end
78
+ end
79
+
80
+ describe '#by_context' do
81
+ it 'filters by context' do
82
+ engine.submit_input(content: 'a', input_type: :assertion, context: :work)
83
+ engine.submit_input(content: 'b', input_type: :assertion, context: :play)
84
+ expect(engine.by_context(context: :work).size).to eq(1)
85
+ end
86
+ end
87
+
88
+ describe '#by_effect_type' do
89
+ it 'filters by effect type' do
90
+ engine.submit_input(content: 'a', input_type: :assertion, context: :c,
91
+ effect_type: :strengthening)
92
+ engine.submit_input(content: 'b', input_type: :assertion, context: :c,
93
+ effect_type: :contradiction)
94
+ expect(engine.by_effect_type(effect_type: :strengthening).size).to eq(1)
95
+ end
96
+ end
97
+
98
+ describe '#context_relevance' do
99
+ it 'returns average relevance for context' do
100
+ engine.submit_input(content: 'a', input_type: :assertion, context: :work,
101
+ cognitive_effect: 0.8, processing_effort: 0.2)
102
+ score = engine.context_relevance(context: :work)
103
+ expect(score).to be > 0
104
+ end
105
+
106
+ it 'returns 0.0 for empty context' do
107
+ expect(engine.context_relevance(context: :nonexistent)).to eq(0.0)
108
+ end
109
+ end
110
+
111
+ describe '#attention_budget' do
112
+ it 'returns budget stats' do
113
+ engine.submit_input(content: 'x', input_type: :assertion, context: :c)
114
+ budget = engine.attention_budget
115
+ expect(budget).to include(:total_inputs, :worth_processing, :filtered_out,
116
+ :processing_ratio, :avg_relevance)
117
+ end
118
+ end
119
+
120
+ describe '#decay_all' do
121
+ it 'reduces relevance of all inputs' do
122
+ input
123
+ old_relevance = input.normalized_relevance
124
+ engine.decay_all
125
+ expect(input.normalized_relevance).to be <= old_relevance
126
+ end
127
+ end
128
+
129
+ describe '#prune_irrelevant' do
130
+ it 'removes very low relevance inputs' do
131
+ engine.submit_input(content: 'low', input_type: :assertion, context: :c,
132
+ cognitive_effect: 0.01, processing_effort: 0.9)
133
+ expect(engine.prune_irrelevant).to eq(1)
134
+ end
135
+
136
+ it 'does not prune relevant inputs' do
137
+ input
138
+ expect(engine.prune_irrelevant).to eq(0)
139
+ end
140
+ end
141
+
142
+ describe '#to_h' do
143
+ it 'returns stats hash' do
144
+ input
145
+ stats = engine.to_h
146
+ expect(stats).to include(:total_inputs, :processable, :avg_relevance, :history_count)
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::RelevanceTheory do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::Agentic::Attention::RelevanceTheory::VERSION).not_to be_nil
6
+ end
7
+
8
+ it 'has a version that is a string' do
9
+ expect(Legion::Extensions::Agentic::Attention::RelevanceTheory::VERSION).to be_a(String)
10
+ end
11
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::RelevanceTheory::Runners::RelevanceTheory do
4
+ let(:client) { Legion::Extensions::Agentic::Attention::RelevanceTheory::Helpers::Client.new }
5
+
6
+ describe '#submit_relevance_input' do
7
+ it 'submits an input' do
8
+ result = client.submit_relevance_input(content: 'test', input_type: :assertion, context: :work)
9
+ expect(result[:success]).to be true
10
+ expect(result[:input][:content]).to eq('test')
11
+ end
12
+ end
13
+
14
+ describe '#assess_input_relevance' do
15
+ it 'assesses an input' do
16
+ created = client.submit_relevance_input(content: 'x', input_type: :assertion, context: :c)
17
+ result = client.assess_input_relevance(input_id: created[:input][:id])
18
+ expect(result[:success]).to be true
19
+ expect(result[:label]).to be_a(Symbol)
20
+ end
21
+ end
22
+
23
+ describe '#strengthen_relevance' do
24
+ it 'strengthens an input' do
25
+ created = client.submit_relevance_input(content: 'x', input_type: :assertion, context: :c)
26
+ result = client.strengthen_relevance(input_id: created[:input][:id])
27
+ expect(result[:success]).to be true
28
+ end
29
+ end
30
+
31
+ describe '#weaken_relevance' do
32
+ it 'weakens an input' do
33
+ created = client.submit_relevance_input(content: 'x', input_type: :assertion, context: :c)
34
+ result = client.weaken_relevance(input_id: created[:input][:id])
35
+ expect(result[:success]).to be true
36
+ end
37
+ end
38
+
39
+ describe '#worth_processing_report' do
40
+ it 'returns processable inputs' do
41
+ result = client.worth_processing_report
42
+ expect(result[:success]).to be true
43
+ end
44
+ end
45
+
46
+ describe '#most_relevant_inputs' do
47
+ it 'returns top relevant inputs' do
48
+ client.submit_relevance_input(content: 'a', input_type: :assertion, context: :c)
49
+ result = client.most_relevant_inputs(limit: 3)
50
+ expect(result[:success]).to be true
51
+ end
52
+ end
53
+
54
+ describe '#context_relevance_report' do
55
+ it 'returns context relevance score' do
56
+ client.submit_relevance_input(content: 'a', input_type: :assertion, context: :work)
57
+ result = client.context_relevance_report(context: :work)
58
+ expect(result[:success]).to be true
59
+ expect(result[:relevance]).to be_a(Float)
60
+ end
61
+ end
62
+
63
+ describe '#attention_budget_report' do
64
+ it 'returns attention budget stats' do
65
+ result = client.attention_budget_report
66
+ expect(result[:success]).to be true
67
+ expect(result).to include(:total_inputs, :processing_ratio)
68
+ end
69
+ end
70
+
71
+ describe '#update_relevance_theory' do
72
+ it 'decays and prunes' do
73
+ result = client.update_relevance_theory
74
+ expect(result[:success]).to be true
75
+ expect(result).to have_key(:pruned)
76
+ end
77
+ end
78
+
79
+ describe '#relevance_theory_stats' do
80
+ it 'returns stats' do
81
+ result = client.relevance_theory_stats
82
+ expect(result[:success]).to be true
83
+ expect(result).to include(:total_inputs, :processable)
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Salience::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'creates a default SalienceMap' do
8
+ expect(client.salience_map).to be_a(Legion::Extensions::Agentic::Attention::Salience::Helpers::SalienceMap)
9
+ end
10
+
11
+ it 'accepts an injected salience_map' do
12
+ custom_map = Legion::Extensions::Agentic::Attention::Salience::Helpers::SalienceMap.new
13
+ injected = described_class.new(salience_map: custom_map)
14
+ expect(injected.salience_map).to be(custom_map)
15
+ end
16
+ end
17
+
18
+ describe 'runner method delegation' do
19
+ it 'responds to compute_salience' do
20
+ expect(client).to respond_to(:compute_salience)
21
+ end
22
+
23
+ it 'responds to salience_status' do
24
+ expect(client).to respond_to(:salience_status)
25
+ end
26
+
27
+ it 'responds to salience_for' do
28
+ expect(client).to respond_to(:salience_for)
29
+ end
30
+
31
+ it 'responds to salience_history' do
32
+ expect(client).to respond_to(:salience_history)
33
+ end
34
+
35
+ it 'responds to salience_stats' do
36
+ expect(client).to respond_to(:salience_stats)
37
+ end
38
+ end
39
+
40
+ describe 'stateful behavior' do
41
+ it 'accumulates history across multiple calls' do
42
+ client.compute_salience(tick_results: {})
43
+ client.compute_salience(tick_results: { emotion: { arousal: 0.5 } })
44
+ expect(client.salience_map.history.size).to eq(2)
45
+ end
46
+
47
+ it 'uses the same salience_map instance across calls' do
48
+ map_before = client.salience_map
49
+ client.compute_salience(tick_results: {})
50
+ expect(client.salience_map).to be(map_before)
51
+ end
52
+
53
+ it 'two clients have independent state' do
54
+ client1 = described_class.new
55
+ client2 = described_class.new
56
+ client1.compute_salience(tick_results: { emotion: { arousal: 0.9 } })
57
+ expect(client2.salience_map.history.size).to eq(0)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Salience::Helpers::Constants do
4
+ describe 'SALIENCE_SOURCES' do
5
+ it 'defines exactly 8 sources' do
6
+ expect(described_class::SALIENCE_SOURCES.size).to eq(8)
7
+ end
8
+
9
+ it 'includes all expected sources' do
10
+ %i[emotion mood attention curiosity homeostasis trust empathy volition].each do |source|
11
+ expect(described_class::SALIENCE_SOURCES).to include(source)
12
+ end
13
+ end
14
+
15
+ it 'is frozen' do
16
+ expect(described_class::SALIENCE_SOURCES).to be_frozen
17
+ end
18
+ end
19
+
20
+ describe 'SOURCE_WEIGHTS' do
21
+ it 'has a weight for every source' do
22
+ described_class::SALIENCE_SOURCES.each do |source|
23
+ expect(described_class::SOURCE_WEIGHTS).to have_key(source)
24
+ end
25
+ end
26
+
27
+ it 'weights sum to 1.0' do
28
+ total = described_class::SOURCE_WEIGHTS.values.sum
29
+ expect(total).to be_within(0.001).of(1.0)
30
+ end
31
+
32
+ it 'assigns emotion the highest weight' do
33
+ expect(described_class::SOURCE_WEIGHTS[:emotion]).to eq(0.20)
34
+ end
35
+
36
+ it 'is frozen' do
37
+ expect(described_class::SOURCE_WEIGHTS).to be_frozen
38
+ end
39
+ end
40
+
41
+ describe 'URGENCY_LEVELS' do
42
+ it 'defines exactly 5 levels' do
43
+ expect(described_class::URGENCY_LEVELS.size).to eq(5)
44
+ end
45
+
46
+ it 'includes critical, high, moderate, low, background' do
47
+ %i[critical high moderate low background].each do |level|
48
+ expect(described_class::URGENCY_LEVELS).to include(level)
49
+ end
50
+ end
51
+
52
+ it 'is frozen' do
53
+ expect(described_class::URGENCY_LEVELS).to be_frozen
54
+ end
55
+ end
56
+
57
+ describe 'URGENCY_THRESHOLDS' do
58
+ it 'has a threshold for every urgency level' do
59
+ described_class::URGENCY_LEVELS.each do |level|
60
+ expect(described_class::URGENCY_THRESHOLDS).to have_key(level)
61
+ end
62
+ end
63
+
64
+ it 'covers the full range from 0 to 1' do
65
+ thresholds = described_class::URGENCY_THRESHOLDS.values
66
+ expect(thresholds.min).to eq(0.0)
67
+ expect(thresholds.max).to eq(0.9)
68
+ end
69
+
70
+ it 'sets critical at 0.9' do
71
+ expect(described_class::URGENCY_THRESHOLDS[:critical]).to eq(0.9)
72
+ end
73
+
74
+ it 'sets background at 0.0' do
75
+ expect(described_class::URGENCY_THRESHOLDS[:background]).to eq(0.0)
76
+ end
77
+ end
78
+
79
+ describe 'numeric constants' do
80
+ it 'defines MAX_SALIENCE_ITEMS as 10' do
81
+ expect(described_class::MAX_SALIENCE_ITEMS).to eq(10)
82
+ end
83
+
84
+ it 'defines SALIENCE_DECAY_RATE as 0.05' do
85
+ expect(described_class::SALIENCE_DECAY_RATE).to eq(0.05)
86
+ end
87
+
88
+ it 'defines INTEGRATION_ALPHA as 0.3' do
89
+ expect(described_class::INTEGRATION_ALPHA).to eq(0.3)
90
+ end
91
+
92
+ it 'defines NOVELTY_BOOST as 0.2' do
93
+ expect(described_class::NOVELTY_BOOST).to eq(0.2)
94
+ end
95
+
96
+ it 'defines CONFLICT_AMPLIFIER as 1.5' do
97
+ expect(described_class::CONFLICT_AMPLIFIER).to eq(1.5)
98
+ end
99
+ end
100
+ end