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,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Kaleidoscope::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ it 'includes the runner module' do
7
+ expect(described_class.ancestors).to include(
8
+ Legion::Extensions::Agentic::Attention::Kaleidoscope::Runners::CognitiveKaleidoscope
9
+ )
10
+ end
11
+
12
+ it 'responds to create_facet' do
13
+ expect(client).to respond_to(:create_facet)
14
+ end
15
+
16
+ it 'responds to create_pattern' do
17
+ expect(client).to respond_to(:create_pattern)
18
+ end
19
+
20
+ it 'responds to rotate' do
21
+ expect(client).to respond_to(:rotate)
22
+ end
23
+
24
+ it 'responds to polish' do
25
+ expect(client).to respond_to(:polish)
26
+ end
27
+
28
+ it 'responds to kaleidoscope_status' do
29
+ expect(client).to respond_to(:kaleidoscope_status)
30
+ end
31
+
32
+ it 'can create facet and pattern through client' do
33
+ facet_result = client.create_facet(facet_type: :belief, domain: :test, content: 'x')
34
+ expect(facet_result[:success]).to be true
35
+ pattern_result = client.create_pattern
36
+ expect(pattern_result[:success]).to be true
37
+ end
38
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::Constants do
4
+ described_class = Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::Constants
5
+
6
+ describe 'FACET_TYPES' do
7
+ it 'contains expected types' do
8
+ expect(described_class::FACET_TYPES).to eq(%i[belief experience emotion memory intuition])
9
+ end
10
+
11
+ it 'is frozen' do
12
+ expect(described_class::FACET_TYPES).to be_frozen
13
+ end
14
+ end
15
+
16
+ describe 'SYMMETRY_TYPES' do
17
+ it 'contains expected types' do
18
+ expect(described_class::SYMMETRY_TYPES).to eq(%i[bilateral radial rotational asymmetric])
19
+ end
20
+ end
21
+
22
+ describe 'ROTATION_MODES' do
23
+ it 'contains expected modes' do
24
+ expect(described_class::ROTATION_MODES).to eq(%i[slow steady rapid chaotic])
25
+ end
26
+ end
27
+
28
+ describe 'numeric constants' do
29
+ it 'defines MAX_FACETS' do
30
+ expect(described_class::MAX_FACETS).to eq(500)
31
+ end
32
+
33
+ it 'defines MAX_PATTERNS' do
34
+ expect(described_class::MAX_PATTERNS).to eq(100)
35
+ end
36
+
37
+ it 'defines ROTATION_STEP' do
38
+ expect(described_class::ROTATION_STEP).to eq(0.1)
39
+ end
40
+
41
+ it 'defines DECAY_RATE' do
42
+ expect(described_class::DECAY_RATE).to eq(0.02)
43
+ end
44
+ end
45
+
46
+ describe '.label_for' do
47
+ context 'with BRILLIANCE_LABELS' do
48
+ it 'returns :dazzling for high values' do
49
+ expect(described_class.label_for(described_class::BRILLIANCE_LABELS, 0.9)).to eq(:dazzling)
50
+ end
51
+
52
+ it 'returns :vivid for 0.7' do
53
+ expect(described_class.label_for(described_class::BRILLIANCE_LABELS, 0.7)).to eq(:vivid)
54
+ end
55
+
56
+ it 'returns :moderate for 0.5' do
57
+ expect(described_class.label_for(described_class::BRILLIANCE_LABELS, 0.5)).to eq(:moderate)
58
+ end
59
+
60
+ it 'returns :dim for 0.3' do
61
+ expect(described_class.label_for(described_class::BRILLIANCE_LABELS, 0.3)).to eq(:dim)
62
+ end
63
+
64
+ it 'returns :dark for 0.1' do
65
+ expect(described_class.label_for(described_class::BRILLIANCE_LABELS, 0.1)).to eq(:dark)
66
+ end
67
+ end
68
+
69
+ context 'with COMPLEXITY_LABELS' do
70
+ it 'returns :fractal for 0.9' do
71
+ expect(described_class.label_for(described_class::COMPLEXITY_LABELS, 0.9)).to eq(:fractal)
72
+ end
73
+
74
+ it 'returns :minimal for 0.1' do
75
+ expect(described_class.label_for(described_class::COMPLEXITY_LABELS, 0.1)).to eq(:minimal)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::Facet do
4
+ subject(:facet) do
5
+ described_class.new(facet_type: :belief, domain: :reasoning, content: 'core principle')
6
+ end
7
+
8
+ describe '#initialize' do
9
+ it 'assigns a UUID id' do
10
+ expect(facet.id).to match(/\A[0-9a-f-]{36}\z/)
11
+ end
12
+
13
+ it 'sets facet_type as symbol' do
14
+ expect(facet.facet_type).to eq(:belief)
15
+ end
16
+
17
+ it 'sets domain as symbol' do
18
+ expect(facet.domain).to eq(:reasoning)
19
+ end
20
+
21
+ it 'stores content' do
22
+ expect(facet.content).to eq('core principle')
23
+ end
24
+
25
+ it 'defaults brilliance to 0.7' do
26
+ expect(facet.brilliance).to eq(0.7)
27
+ end
28
+
29
+ it 'defaults transparency to 0.5' do
30
+ expect(facet.transparency).to eq(0.5)
31
+ end
32
+
33
+ it 'defaults angle to 0.0' do
34
+ expect(facet.angle).to eq(0.0)
35
+ end
36
+
37
+ it 'accepts custom brilliance' do
38
+ f = described_class.new(facet_type: :emotion, domain: :test, content: 'x', brilliance: 0.3)
39
+ expect(f.brilliance).to eq(0.3)
40
+ end
41
+
42
+ it 'clamps brilliance to 0..1' do
43
+ f = described_class.new(facet_type: :memory, domain: :test, content: 'x', brilliance: 5.0)
44
+ expect(f.brilliance).to eq(1.0)
45
+ end
46
+
47
+ it 'clamps angle to 0..360' do
48
+ f = described_class.new(facet_type: :intuition, domain: :test, content: 'x', angle: 500.0)
49
+ expect(f.angle).to eq(360.0)
50
+ end
51
+
52
+ it 'raises on unknown facet type' do
53
+ expect do
54
+ described_class.new(facet_type: :plasma, domain: :test, content: 'x')
55
+ end.to raise_error(ArgumentError, /unknown facet type/)
56
+ end
57
+
58
+ it 'sets created_at' do
59
+ expect(facet.created_at).to be_a(Time)
60
+ end
61
+ end
62
+
63
+ describe '#rotate!' do
64
+ it 'increases angle' do
65
+ facet.rotate!(degrees: 45)
66
+ expect(facet.angle).to eq(45.0)
67
+ end
68
+
69
+ it 'wraps around at 360' do
70
+ facet.rotate!(degrees: 400)
71
+ expect(facet.angle).to eq(40.0)
72
+ end
73
+ end
74
+
75
+ describe '#polish!' do
76
+ it 'increases brilliance' do
77
+ initial = facet.brilliance
78
+ facet.polish!(rate: 0.1)
79
+ expect(facet.brilliance).to eq((initial + 0.1).round(10))
80
+ end
81
+
82
+ it 'clamps at 1.0' do
83
+ facet.polish!(rate: 5.0)
84
+ expect(facet.brilliance).to eq(1.0)
85
+ end
86
+ end
87
+
88
+ describe '#tarnish!' do
89
+ it 'decreases brilliance' do
90
+ initial = facet.brilliance
91
+ facet.tarnish!
92
+ expect(facet.brilliance).to be < initial
93
+ end
94
+ end
95
+
96
+ describe '#dazzling?' do
97
+ it 'returns false at default' do
98
+ expect(facet).not_to be_dazzling
99
+ end
100
+
101
+ it 'returns true when brilliance >= 0.8' do
102
+ facet.brilliance = 0.85
103
+ expect(facet).to be_dazzling
104
+ end
105
+ end
106
+
107
+ describe '#dark?' do
108
+ it 'returns false at default' do
109
+ expect(facet).not_to be_dark
110
+ end
111
+
112
+ it 'returns true when brilliance < 0.2' do
113
+ facet.brilliance = 0.1
114
+ expect(facet).to be_dark
115
+ end
116
+ end
117
+
118
+ describe '#opaque?' do
119
+ it 'returns false at default transparency' do
120
+ expect(facet).not_to be_opaque
121
+ end
122
+
123
+ it 'returns true when transparency < 0.2' do
124
+ facet.transparency = 0.1
125
+ expect(facet).to be_opaque
126
+ end
127
+ end
128
+
129
+ describe '#clear?' do
130
+ it 'returns false at default' do
131
+ expect(facet).not_to be_clear
132
+ end
133
+
134
+ it 'returns true when transparency >= 0.8' do
135
+ facet.transparency = 0.9
136
+ expect(facet).to be_clear
137
+ end
138
+ end
139
+
140
+ describe '#brilliance_label' do
141
+ it 'returns :vivid at default' do
142
+ expect(facet.brilliance_label).to eq(:vivid)
143
+ end
144
+ end
145
+
146
+ describe '#to_h' do
147
+ subject(:hash) { facet.to_h }
148
+
149
+ it 'includes all expected keys' do
150
+ expected = %i[id facet_type domain content brilliance transparency
151
+ angle brilliance_label dazzling dark created_at]
152
+ expect(hash.keys).to match_array(expected)
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::KaleidoscopeEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:default_attrs) { { facet_type: :belief, domain: :reasoning, content: 'test facet' } }
7
+
8
+ describe '#create_facet' do
9
+ it 'creates and stores a facet' do
10
+ f = engine.create_facet(**default_attrs)
11
+ expect(f).to be_a(Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::Facet)
12
+ expect(engine.all_facets.size).to eq(1)
13
+ end
14
+
15
+ it 'raises when limit reached' do
16
+ stub_const('Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::Constants::MAX_FACETS', 2)
17
+ engine.create_facet(**default_attrs)
18
+ engine.create_facet(facet_type: :emotion, domain: :test, content: 'x')
19
+ expect do
20
+ engine.create_facet(facet_type: :memory, domain: :test, content: 'y')
21
+ end.to raise_error(ArgumentError, /facet limit/)
22
+ end
23
+ end
24
+
25
+ describe '#create_pattern' do
26
+ it 'creates and stores a pattern' do
27
+ p = engine.create_pattern
28
+ expect(p).to be_a(Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::Pattern)
29
+ expect(engine.all_patterns.size).to eq(1)
30
+ end
31
+
32
+ it 'accepts symmetry parameter' do
33
+ p = engine.create_pattern(symmetry: :bilateral)
34
+ expect(p.symmetry).to eq(:bilateral)
35
+ end
36
+
37
+ it 'raises when limit reached' do
38
+ stub_const('Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::Constants::MAX_PATTERNS', 1)
39
+ engine.create_pattern
40
+ expect { engine.create_pattern }.to raise_error(ArgumentError, /pattern limit/)
41
+ end
42
+ end
43
+
44
+ describe '#add_facet_to_pattern' do
45
+ it 'links a facet to a pattern' do
46
+ f = engine.create_facet(**default_attrs)
47
+ p = engine.create_pattern
48
+ result = engine.add_facet_to_pattern(facet_id: f.id, pattern_id: p.id)
49
+ expect(result).to eq(:added)
50
+ end
51
+
52
+ it 'raises for unknown facet' do
53
+ p = engine.create_pattern
54
+ expect do
55
+ engine.add_facet_to_pattern(facet_id: 'bad', pattern_id: p.id)
56
+ end.to raise_error(ArgumentError, /facet not found/)
57
+ end
58
+
59
+ it 'raises for unknown pattern' do
60
+ f = engine.create_facet(**default_attrs)
61
+ expect do
62
+ engine.add_facet_to_pattern(facet_id: f.id, pattern_id: 'bad')
63
+ end.to raise_error(ArgumentError, /pattern not found/)
64
+ end
65
+ end
66
+
67
+ describe '#rotate_facet' do
68
+ it 'rotates a facet' do
69
+ f = engine.create_facet(**default_attrs)
70
+ engine.rotate_facet(facet_id: f.id, degrees: 90)
71
+ expect(f.angle).to eq(90.0)
72
+ end
73
+ end
74
+
75
+ describe '#polish_facet' do
76
+ it 'increases facet brilliance' do
77
+ f = engine.create_facet(**default_attrs, brilliance: 0.5)
78
+ engine.polish_facet(facet_id: f.id, rate: 0.2)
79
+ expect(f.brilliance).to eq(0.7)
80
+ end
81
+ end
82
+
83
+ describe '#rotate_pattern' do
84
+ it 'rotates all facets in the pattern' do
85
+ f = engine.create_facet(**default_attrs)
86
+ p = engine.create_pattern
87
+ engine.add_facet_to_pattern(facet_id: f.id, pattern_id: p.id)
88
+ engine.rotate_pattern(pattern_id: p.id, degrees: 45)
89
+ expect(f.angle).to eq(45.0)
90
+ end
91
+ end
92
+
93
+ describe '#tarnish_all!' do
94
+ it 'reduces brilliance on all facets' do
95
+ f1 = engine.create_facet(**default_attrs)
96
+ f2 = engine.create_facet(facet_type: :emotion, domain: :test, content: 'y')
97
+ engine.tarnish_all!
98
+ expect(f1.brilliance).to be < 0.7
99
+ expect(f2.brilliance).to be < 0.7
100
+ end
101
+ end
102
+
103
+ describe '#facets_by_type' do
104
+ it 'returns counts per type' do
105
+ engine.create_facet(**default_attrs)
106
+ engine.create_facet(facet_type: :emotion, domain: :test, content: 'x')
107
+ counts = engine.facets_by_type
108
+ expect(counts[:belief]).to eq(1)
109
+ expect(counts[:emotion]).to eq(1)
110
+ expect(counts[:memory]).to eq(0)
111
+ end
112
+ end
113
+
114
+ describe '#brightest' do
115
+ it 'returns facets sorted by brilliance descending' do
116
+ f1 = engine.create_facet(**default_attrs, brilliance: 0.3)
117
+ f2 = engine.create_facet(facet_type: :emotion, domain: :t, content: 'x', brilliance: 0.9)
118
+ expect(engine.brightest(limit: 2).first).to eq(f2)
119
+ expect(engine.brightest(limit: 2).last).to eq(f1)
120
+ end
121
+ end
122
+
123
+ describe '#dimmest' do
124
+ it 'returns facets sorted by brilliance ascending' do
125
+ f1 = engine.create_facet(**default_attrs, brilliance: 0.3)
126
+ engine.create_facet(facet_type: :emotion, domain: :t, content: 'x', brilliance: 0.9)
127
+ expect(engine.dimmest(limit: 1).first).to eq(f1)
128
+ end
129
+ end
130
+
131
+ describe '#dazzling_facets' do
132
+ it 'returns only dazzling facets' do
133
+ engine.create_facet(**default_attrs, brilliance: 0.9)
134
+ engine.create_facet(facet_type: :emotion, domain: :t, content: 'x', brilliance: 0.3)
135
+ expect(engine.dazzling_facets.size).to eq(1)
136
+ end
137
+ end
138
+
139
+ describe '#dark_facets' do
140
+ it 'returns only dark facets' do
141
+ engine.create_facet(**default_attrs, brilliance: 0.1)
142
+ engine.create_facet(facet_type: :emotion, domain: :t, content: 'x', brilliance: 0.7)
143
+ expect(engine.dark_facets.size).to eq(1)
144
+ end
145
+ end
146
+
147
+ describe '#kaleidoscope_report' do
148
+ it 'returns a comprehensive hash' do
149
+ engine.create_facet(**default_attrs)
150
+ engine.create_pattern
151
+ report = engine.kaleidoscope_report
152
+ expect(report).to include(
153
+ :total_facets, :total_patterns, :by_type,
154
+ :dazzling_count, :dark_count, :avg_brilliance, :avg_complexity
155
+ )
156
+ end
157
+
158
+ it 'handles empty engine' do
159
+ report = engine.kaleidoscope_report
160
+ expect(report[:total_facets]).to eq(0)
161
+ expect(report[:avg_brilliance]).to eq(0.0)
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::Pattern do
4
+ subject(:pattern) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID id' do
8
+ expect(pattern.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'defaults symmetry to :radial' do
12
+ expect(pattern.symmetry).to eq(:radial)
13
+ end
14
+
15
+ it 'defaults complexity to 0.5' do
16
+ expect(pattern.complexity).to eq(0.5)
17
+ end
18
+
19
+ it 'defaults stability to 0.7' do
20
+ expect(pattern.stability).to eq(0.7)
21
+ end
22
+
23
+ it 'starts with empty facet_ids' do
24
+ expect(pattern.facet_ids).to be_empty
25
+ end
26
+
27
+ it 'raises on unknown symmetry' do
28
+ expect do
29
+ described_class.new(symmetry: :hexagonal)
30
+ end.to raise_error(ArgumentError, /unknown symmetry/)
31
+ end
32
+
33
+ it 'accepts custom symmetry' do
34
+ p = described_class.new(symmetry: :bilateral)
35
+ expect(p.symmetry).to eq(:bilateral)
36
+ end
37
+ end
38
+
39
+ describe '#add_facet' do
40
+ it 'adds a facet id' do
41
+ result = pattern.add_facet('facet-1')
42
+ expect(result).to eq(:added)
43
+ expect(pattern.facet_ids).to include('facet-1')
44
+ end
45
+
46
+ it 'returns :already_present for duplicates' do
47
+ pattern.add_facet('facet-1')
48
+ expect(pattern.add_facet('facet-1')).to eq(:already_present)
49
+ end
50
+
51
+ it 'recalculates complexity' do
52
+ 20.times { |i| pattern.add_facet("f-#{i}") }
53
+ expect(pattern.complexity).to eq(1.0)
54
+ end
55
+ end
56
+
57
+ describe '#remove_facet' do
58
+ it 'removes a facet id' do
59
+ pattern.add_facet('facet-1')
60
+ expect(pattern.remove_facet('facet-1')).to eq(:removed)
61
+ expect(pattern.facet_ids).not_to include('facet-1')
62
+ end
63
+
64
+ it 'returns :not_found for missing id' do
65
+ expect(pattern.remove_facet('nope')).to eq(:not_found)
66
+ end
67
+ end
68
+
69
+ describe '#rotate_all!' do
70
+ it 'reduces stability slightly' do
71
+ initial = pattern.stability
72
+ pattern.rotate_all!(degrees: 90)
73
+ expect(pattern.stability).to be < initial
74
+ end
75
+ end
76
+
77
+ describe '#stabilize!' do
78
+ it 'increases stability' do
79
+ pattern.stability = 0.5
80
+ pattern.stabilize!(rate: 0.1)
81
+ expect(pattern.stability).to eq(0.6)
82
+ end
83
+ end
84
+
85
+ describe '#destabilize!' do
86
+ it 'decreases stability' do
87
+ initial = pattern.stability
88
+ pattern.destabilize!(rate: 0.1)
89
+ expect(pattern.stability).to eq((initial - 0.1).round(10))
90
+ end
91
+ end
92
+
93
+ describe '#fractal?' do
94
+ it 'returns false at default' do
95
+ expect(pattern).not_to be_fractal
96
+ end
97
+
98
+ it 'returns true when complexity >= 0.8' do
99
+ pattern.complexity = 0.9
100
+ expect(pattern).to be_fractal
101
+ end
102
+ end
103
+
104
+ describe '#minimal?' do
105
+ it 'returns false at default' do
106
+ expect(pattern).not_to be_minimal
107
+ end
108
+
109
+ it 'returns true when complexity < 0.2' do
110
+ pattern.complexity = 0.1
111
+ expect(pattern).to be_minimal
112
+ end
113
+ end
114
+
115
+ describe '#stable?' do
116
+ it 'returns true at default' do
117
+ expect(pattern).to be_stable
118
+ end
119
+ end
120
+
121
+ describe '#chaotic?' do
122
+ it 'returns false at default' do
123
+ expect(pattern).not_to be_chaotic
124
+ end
125
+
126
+ it 'returns true when stability < 0.3' do
127
+ pattern.stability = 0.2
128
+ expect(pattern).to be_chaotic
129
+ end
130
+ end
131
+
132
+ describe '#complexity_label' do
133
+ it 'returns a symbol' do
134
+ expect(pattern.complexity_label).to be_a(Symbol)
135
+ end
136
+ end
137
+
138
+ describe '#facet_count' do
139
+ it 'returns 0 initially' do
140
+ expect(pattern.facet_count).to eq(0)
141
+ end
142
+
143
+ it 'tracks facet additions' do
144
+ pattern.add_facet('f-1')
145
+ pattern.add_facet('f-2')
146
+ expect(pattern.facet_count).to eq(2)
147
+ end
148
+ end
149
+
150
+ describe '#to_h' do
151
+ it 'includes all expected keys' do
152
+ expected = %i[id symmetry complexity stability complexity_label
153
+ facet_count fractal chaotic created_at]
154
+ expect(pattern.to_h.keys).to match_array(expected)
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Kaleidoscope::Runners::CognitiveKaleidoscope do
4
+ let(:runner) do
5
+ obj = Object.new
6
+ obj.extend(described_class)
7
+ obj
8
+ end
9
+
10
+ let(:engine) { Legion::Extensions::Agentic::Attention::Kaleidoscope::Helpers::KaleidoscopeEngine.new }
11
+
12
+ describe '#create_facet' do
13
+ it 'returns success with facet hash' do
14
+ result = runner.create_facet(facet_type: :belief, domain: :reasoning,
15
+ content: 'test', engine: engine)
16
+ expect(result[:success]).to be true
17
+ expect(result[:facet][:facet_type]).to eq(:belief)
18
+ end
19
+
20
+ it 'returns failure for invalid type' do
21
+ result = runner.create_facet(facet_type: :plasma, domain: :test,
22
+ content: 'x', engine: engine)
23
+ expect(result[:success]).to be false
24
+ expect(result[:error]).to match(/unknown facet type/)
25
+ end
26
+ end
27
+
28
+ describe '#create_pattern' do
29
+ it 'returns success with pattern hash' do
30
+ result = runner.create_pattern(engine: engine)
31
+ expect(result[:success]).to be true
32
+ expect(result[:pattern]).to be_a(Hash)
33
+ end
34
+
35
+ it 'accepts symmetry' do
36
+ result = runner.create_pattern(symmetry: :bilateral, engine: engine)
37
+ expect(result[:pattern][:symmetry]).to eq(:bilateral)
38
+ end
39
+ end
40
+
41
+ describe '#add_to_pattern' do
42
+ it 'links facet to pattern' do
43
+ f = engine.create_facet(facet_type: :belief, domain: :t, content: 'x')
44
+ p = engine.create_pattern
45
+ result = runner.add_to_pattern(facet_id: f.id, pattern_id: p.id, engine: engine)
46
+ expect(result[:success]).to be true
47
+ expect(result[:status]).to eq(:added)
48
+ end
49
+
50
+ it 'returns failure for bad ids' do
51
+ result = runner.add_to_pattern(facet_id: 'bad', pattern_id: 'bad', engine: engine)
52
+ expect(result[:success]).to be false
53
+ end
54
+ end
55
+
56
+ describe '#rotate' do
57
+ it 'rotates a facet' do
58
+ f = engine.create_facet(facet_type: :emotion, domain: :t, content: 'x')
59
+ result = runner.rotate(facet_id: f.id, degrees: 90, engine: engine)
60
+ expect(result[:success]).to be true
61
+ expect(result[:facet][:angle]).to eq(90.0)
62
+ end
63
+
64
+ it 'rotates a pattern' do
65
+ p = engine.create_pattern
66
+ result = runner.rotate(pattern_id: p.id, degrees: 45, engine: engine)
67
+ expect(result[:success]).to be true
68
+ expect(result[:pattern]).to be_a(Hash)
69
+ end
70
+
71
+ it 'returns failure when neither given' do
72
+ result = runner.rotate(engine: engine)
73
+ expect(result[:success]).to be false
74
+ expect(result[:error]).to match(/must provide/)
75
+ end
76
+ end
77
+
78
+ describe '#polish' do
79
+ it 'increases facet brilliance' do
80
+ f = engine.create_facet(facet_type: :memory, domain: :t, content: 'x', brilliance: 0.5)
81
+ result = runner.polish(facet_id: f.id, rate: 0.2, engine: engine)
82
+ expect(result[:success]).to be true
83
+ expect(result[:facet][:brilliance]).to eq(0.7)
84
+ end
85
+ end
86
+
87
+ describe '#list_facets' do
88
+ before do
89
+ engine.create_facet(facet_type: :belief, domain: :t, content: 'a')
90
+ engine.create_facet(facet_type: :emotion, domain: :t, content: 'b')
91
+ engine.create_facet(facet_type: :belief, domain: :t, content: 'c')
92
+ end
93
+
94
+ it 'returns all facets' do
95
+ result = runner.list_facets(engine: engine)
96
+ expect(result[:count]).to eq(3)
97
+ end
98
+
99
+ it 'filters by facet_type' do
100
+ result = runner.list_facets(facet_type: :belief, engine: engine)
101
+ expect(result[:count]).to eq(2)
102
+ end
103
+ end
104
+
105
+ describe '#kaleidoscope_status' do
106
+ it 'returns a report' do
107
+ result = runner.kaleidoscope_status(engine: engine)
108
+ expect(result[:success]).to be true
109
+ expect(result[:report]).to include(:total_facets, :avg_brilliance)
110
+ end
111
+ end
112
+ end