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,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Focus
8
+ module Helpers
9
+ class Habituation
10
+ def initialize
11
+ @domain_exposure = Hash.new(0.0)
12
+ @domain_last_seen = {}
13
+ end
14
+
15
+ def record(domain)
16
+ domain = domain.to_sym
17
+ @domain_exposure[domain] = [
18
+ @domain_exposure[domain] + Constants::HABITUATION_RATE,
19
+ Constants::HABITUATION_CEILING
20
+ ].min
21
+ @domain_last_seen[domain] = Time.now.utc
22
+ end
23
+
24
+ def level(domain)
25
+ domain = domain.to_sym
26
+ @domain_exposure[domain]
27
+ end
28
+
29
+ def apply_novelty_reset(domain, novelty: 0.5)
30
+ domain = domain.to_sym
31
+ return unless novelty > 0.5
32
+
33
+ reduction = (novelty - 0.5) * Constants::NOVELTY_RESET_FACTOR
34
+ @domain_exposure[domain] = [@domain_exposure[domain] - reduction, 0.0].max
35
+ end
36
+
37
+ def decay_all
38
+ @domain_exposure.each_key do |domain|
39
+ @domain_exposure[domain] = [
40
+ @domain_exposure[domain] - Constants::HABITUATION_DECAY,
41
+ 0.0
42
+ ].max
43
+ end
44
+
45
+ @domain_exposure.delete_if { |_, v| v <= 0.0 }
46
+ end
47
+
48
+ def stats
49
+ @domain_exposure.transform_values { |v| v.round(3) }
50
+ end
51
+
52
+ def habituated_domains(threshold: 0.5)
53
+ @domain_exposure.select { |_, v| v >= threshold }.keys
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Focus
8
+ module Runners
9
+ module Attention
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def filter_signals(signals: [], active_wonders: [], **)
14
+ return { filtered: [], spotlight: 0, peripheral: 0, background: 0, dropped: 0 } if signals.empty?
15
+
16
+ unique = Helpers::Focus.deduplicate(signals)
17
+ scored = score_all(unique, active_wonders)
18
+ categorized = categorize(scored)
19
+
20
+ habituation_model.decay_all
21
+
22
+ Legion::Logging.debug "[attention] filtered #{signals.size}->#{categorized[:spotlight].size + categorized[:peripheral].size} " \
23
+ "(spotlight=#{categorized[:spotlight].size} peripheral=#{categorized[:peripheral].size} " \
24
+ "background=#{categorized[:background].size} dropped=#{categorized[:dropped]})"
25
+
26
+ {
27
+ filtered: categorized[:spotlight] + categorized[:peripheral],
28
+ spotlight: categorized[:spotlight].size,
29
+ peripheral: categorized[:peripheral].size,
30
+ background: categorized[:background].size,
31
+ dropped: categorized[:dropped]
32
+ }
33
+ end
34
+
35
+ def attention_status(**)
36
+ {
37
+ manual_focus: focus_manager.manual_focus,
38
+ habituated_domains: habituation_model.habituated_domains,
39
+ habituation_stats: habituation_model.stats,
40
+ capacity: Helpers::Constants::ATTENTIONAL_CAPACITY,
41
+ focus_count: focus_manager.manual_focus.size
42
+ }
43
+ end
44
+
45
+ def focus_on(domain:, reason: nil, **)
46
+ result = focus_manager.focus_on(domain, reason: reason)
47
+ Legion::Logging.info "[attention] focus_on #{domain}: #{result}"
48
+ { status: result, domain: domain }
49
+ end
50
+
51
+ def release_focus(domain:, **)
52
+ result = focus_manager.release(domain)
53
+ Legion::Logging.info "[attention] release_focus #{domain}: #{result}"
54
+ { status: result, domain: domain }
55
+ end
56
+
57
+ def habituation_stats(**)
58
+ { domains: habituation_model.stats, habituated: habituation_model.habituated_domains }
59
+ end
60
+
61
+ private
62
+
63
+ def focus_manager
64
+ @focus_manager ||= Helpers::FocusManager.new
65
+ end
66
+
67
+ def habituation_model
68
+ @habituation_model ||= Helpers::Habituation.new
69
+ end
70
+
71
+ def score_all(signals, active_wonders)
72
+ signals.map do |signal|
73
+ domain = Helpers::Focus.extract_domain(signal)
74
+ habituation_model.record(domain)
75
+
76
+ novelty = Helpers::Focus.extract_novelty(signal)
77
+ habituation_model.apply_novelty_reset(domain, novelty: novelty)
78
+
79
+ goal_rel = focus_manager.goal_relevance(signal, active_wonders: active_wonders)
80
+ hab_level = habituation_model.level(domain)
81
+ score = Helpers::Focus.score_signal(signal, habituation_level: hab_level, goal_relevance: goal_rel)
82
+ tier = Helpers::Focus.attention_tier(score)
83
+
84
+ Helpers::Focus.tag_signal(signal, attention_score: score, attention_tier: tier)
85
+ end
86
+ end
87
+
88
+ def categorize(scored_signals)
89
+ result = { spotlight: [], peripheral: [], background: [], dropped: 0 }
90
+
91
+ scored_signals.each do |signal|
92
+ case signal[:attention_tier]
93
+ when :spotlight then result[:spotlight] << signal
94
+ when :peripheral then result[:peripheral] << signal
95
+ when :background then result[:background] << signal
96
+ else result[:dropped] += 1
97
+ end
98
+ end
99
+
100
+ enforce_capacity(result)
101
+ end
102
+
103
+ def enforce_capacity(categorized)
104
+ capacity = Helpers::Constants::ATTENTIONAL_CAPACITY
105
+ spotlight = categorized[:spotlight].sort_by { |s| -(s[:attention_score] || 0) }
106
+
107
+ if spotlight.size > capacity
108
+ overflow = spotlight[capacity..]
109
+ categorized[:spotlight] = spotlight.first(capacity)
110
+ categorized[:peripheral].concat(overflow)
111
+ end
112
+
113
+ categorized
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Focus
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/focus/version'
4
+ require 'legion/extensions/agentic/attention/focus/helpers/constants'
5
+ require 'legion/extensions/agentic/attention/focus/helpers/focus'
6
+ require 'legion/extensions/agentic/attention/focus/helpers/focus_manager'
7
+ require 'legion/extensions/agentic/attention/focus/helpers/habituation'
8
+ require 'legion/extensions/agentic/attention/focus/runners/attention'
9
+ require 'legion/extensions/agentic/attention/focus/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Attention
15
+ module Focus
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Kaleidoscope
8
+ class Client
9
+ include Runners::CognitiveKaleidoscope
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Kaleidoscope
8
+ module Helpers
9
+ module Constants
10
+ FACET_TYPES = %i[belief experience emotion memory intuition].freeze
11
+
12
+ ROTATION_MODES = %i[slow steady rapid chaotic].freeze
13
+
14
+ SYMMETRY_TYPES = %i[bilateral radial rotational asymmetric].freeze
15
+
16
+ MAX_FACETS = 500
17
+ MAX_PATTERNS = 100
18
+ ROTATION_STEP = 0.1
19
+ DECAY_RATE = 0.02
20
+ BRILLIANCE_THRESHOLD = 0.8
21
+
22
+ BRILLIANCE_LABELS = [
23
+ [(0.8..), :dazzling],
24
+ [(0.6...0.8), :vivid],
25
+ [(0.4...0.6), :moderate],
26
+ [(0.2...0.4), :dim],
27
+ [(..0.2), :dark]
28
+ ].freeze
29
+
30
+ COMPLEXITY_LABELS = [
31
+ [(0.8..), :fractal],
32
+ [(0.6...0.8), :intricate],
33
+ [(0.4...0.6), :balanced],
34
+ [(0.2...0.4), :simple],
35
+ [(..0.2), :minimal]
36
+ ].freeze
37
+
38
+ def self.label_for(table, value)
39
+ table.each { |range, label| return label if range.cover?(value) }
40
+ table.last.last
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Kaleidoscope
8
+ module Helpers
9
+ class Facet
10
+ attr_reader :id, :facet_type, :domain, :content,
11
+ :angle, :created_at
12
+ attr_accessor :brilliance, :transparency
13
+
14
+ def initialize(facet_type:, domain:, content:,
15
+ brilliance: nil, transparency: nil, angle: nil)
16
+ validate_facet_type!(facet_type)
17
+ @id = SecureRandom.uuid
18
+ @facet_type = facet_type.to_sym
19
+ @domain = domain.to_sym
20
+ @content = content.to_s
21
+ @brilliance = (brilliance || 0.7).to_f.clamp(0.0, 1.0).round(10)
22
+ @transparency = (transparency || 0.5).to_f.clamp(0.0, 1.0).round(10)
23
+ @angle = (angle || 0.0).to_f.clamp(0.0, 360.0).round(10)
24
+ @created_at = Time.now.utc
25
+ end
26
+
27
+ def rotate!(degrees: Constants::ROTATION_STEP * 360)
28
+ @angle = ((@angle + degrees.abs) % 360.0).round(10)
29
+ end
30
+
31
+ def polish!(rate: 0.1)
32
+ @brilliance = (@brilliance + rate.abs).clamp(0.0, 1.0).round(10)
33
+ end
34
+
35
+ def tarnish!(rate: Constants::DECAY_RATE)
36
+ @brilliance = (@brilliance - rate.abs).clamp(0.0, 1.0).round(10)
37
+ end
38
+
39
+ def dazzling?
40
+ @brilliance >= Constants::BRILLIANCE_THRESHOLD
41
+ end
42
+
43
+ def dark?
44
+ @brilliance < 0.2
45
+ end
46
+
47
+ def opaque?
48
+ @transparency < 0.2
49
+ end
50
+
51
+ def clear?
52
+ @transparency >= 0.8
53
+ end
54
+
55
+ def brilliance_label
56
+ Constants.label_for(Constants::BRILLIANCE_LABELS, @brilliance)
57
+ end
58
+
59
+ def to_h
60
+ {
61
+ id: @id,
62
+ facet_type: @facet_type,
63
+ domain: @domain,
64
+ content: @content,
65
+ brilliance: @brilliance,
66
+ transparency: @transparency,
67
+ angle: @angle,
68
+ brilliance_label: brilliance_label,
69
+ dazzling: dazzling?,
70
+ dark: dark?,
71
+ created_at: @created_at
72
+ }
73
+ end
74
+
75
+ private
76
+
77
+ def validate_facet_type!(val)
78
+ return if Constants::FACET_TYPES.include?(val.to_sym)
79
+
80
+ raise ArgumentError,
81
+ "unknown facet type: #{val.inspect}; " \
82
+ "must be one of #{Constants::FACET_TYPES.inspect}"
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Kaleidoscope
8
+ module Helpers
9
+ class KaleidoscopeEngine
10
+ def initialize
11
+ @facets = {}
12
+ @patterns = {}
13
+ end
14
+
15
+ def create_facet(facet_type:, domain:, content:, brilliance: nil, transparency: nil, angle: nil)
16
+ raise ArgumentError, 'facet limit reached' if @facets.size >= Constants::MAX_FACETS
17
+
18
+ f = Facet.new(facet_type: facet_type, domain: domain, content: content,
19
+ brilliance: brilliance, transparency: transparency, angle: angle)
20
+ @facets[f.id] = f
21
+ f
22
+ end
23
+
24
+ def create_pattern(symmetry: :radial, complexity: nil, stability: nil)
25
+ raise ArgumentError, 'pattern limit reached' if @patterns.size >= Constants::MAX_PATTERNS
26
+
27
+ p = Pattern.new(symmetry: symmetry, complexity: complexity, stability: stability)
28
+ @patterns[p.id] = p
29
+ p
30
+ end
31
+
32
+ def add_facet_to_pattern(facet_id:, pattern_id:)
33
+ fetch_facet(facet_id)
34
+ pattern = fetch_pattern(pattern_id)
35
+ pattern.add_facet(facet_id)
36
+ end
37
+
38
+ def rotate_facet(facet_id:, degrees: Constants::ROTATION_STEP * 360)
39
+ facet = fetch_facet(facet_id)
40
+ facet.rotate!(degrees: degrees)
41
+ facet
42
+ end
43
+
44
+ def polish_facet(facet_id:, rate: 0.1)
45
+ facet = fetch_facet(facet_id)
46
+ facet.polish!(rate: rate)
47
+ facet
48
+ end
49
+
50
+ def rotate_pattern(pattern_id:, degrees: Constants::ROTATION_STEP * 360)
51
+ pattern = fetch_pattern(pattern_id)
52
+ pattern.rotate_all!(degrees: degrees)
53
+ resolve_facets(pattern).each { |f| f.rotate!(degrees: degrees) }
54
+ pattern
55
+ end
56
+
57
+ def tarnish_all!
58
+ @facets.each_value(&:tarnish!)
59
+ end
60
+
61
+ def facets_by_type
62
+ counts = Constants::FACET_TYPES.to_h { |t| [t, 0] }
63
+ @facets.each_value { |f| counts[f.facet_type] += 1 }
64
+ counts
65
+ end
66
+
67
+ def brightest(limit: 5)
68
+ @facets.values.sort_by { |f| -f.brilliance }.first(limit)
69
+ end
70
+
71
+ def dimmest(limit: 5)
72
+ @facets.values.sort_by(&:brilliance).first(limit)
73
+ end
74
+
75
+ def most_complex_patterns(limit: 5)
76
+ @patterns.values.sort_by { |p| -p.complexity }.first(limit)
77
+ end
78
+
79
+ def most_stable_patterns(limit: 5)
80
+ @patterns.values.sort_by { |p| -p.stability }.first(limit)
81
+ end
82
+
83
+ def dazzling_facets
84
+ @facets.values.select(&:dazzling?)
85
+ end
86
+
87
+ def dark_facets
88
+ @facets.values.select(&:dark?)
89
+ end
90
+
91
+ def avg_brilliance
92
+ return 0.0 if @facets.empty?
93
+
94
+ (@facets.values.sum(&:brilliance) / @facets.size).round(10)
95
+ end
96
+
97
+ def avg_complexity
98
+ return 0.0 if @patterns.empty?
99
+
100
+ (@patterns.values.sum(&:complexity) / @patterns.size).round(10)
101
+ end
102
+
103
+ def kaleidoscope_report
104
+ {
105
+ total_facets: @facets.size,
106
+ total_patterns: @patterns.size,
107
+ by_type: facets_by_type,
108
+ dazzling_count: dazzling_facets.size,
109
+ dark_count: dark_facets.size,
110
+ avg_brilliance: avg_brilliance,
111
+ avg_complexity: avg_complexity
112
+ }
113
+ end
114
+
115
+ def all_facets
116
+ @facets.values
117
+ end
118
+
119
+ def all_patterns
120
+ @patterns.values
121
+ end
122
+
123
+ private
124
+
125
+ def fetch_facet(id)
126
+ @facets.fetch(id) { raise ArgumentError, "facet not found: #{id}" }
127
+ end
128
+
129
+ def fetch_pattern(id)
130
+ @patterns.fetch(id) { raise ArgumentError, "pattern not found: #{id}" }
131
+ end
132
+
133
+ def resolve_facets(pattern)
134
+ pattern.facet_ids.filter_map { |fid| @facets[fid] }
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Attention
7
+ module Kaleidoscope
8
+ module Helpers
9
+ class Pattern
10
+ attr_reader :id, :symmetry, :facet_ids, :created_at
11
+ attr_accessor :complexity, :stability
12
+
13
+ def initialize(symmetry: :radial, complexity: nil, stability: nil)
14
+ validate_symmetry!(symmetry)
15
+ @id = SecureRandom.uuid
16
+ @symmetry = symmetry.to_sym
17
+ @complexity = (complexity || 0.5).to_f.clamp(0.0, 1.0).round(10)
18
+ @stability = (stability || 0.7).to_f.clamp(0.0, 1.0).round(10)
19
+ @facet_ids = []
20
+ @created_at = Time.now.utc
21
+ end
22
+
23
+ def add_facet(facet_id)
24
+ return :already_present if @facet_ids.include?(facet_id)
25
+
26
+ @facet_ids << facet_id
27
+ recalculate_complexity!
28
+ :added
29
+ end
30
+
31
+ def remove_facet(facet_id)
32
+ return :not_found unless @facet_ids.include?(facet_id)
33
+
34
+ @facet_ids.delete(facet_id)
35
+ recalculate_complexity!
36
+ :removed
37
+ end
38
+
39
+ def rotate_all!(degrees: Constants::ROTATION_STEP * 360)
40
+ @stability = (@stability - (degrees.abs / 3600.0)).clamp(0.0, 1.0).round(10)
41
+ degrees
42
+ end
43
+
44
+ def stabilize!(rate: 0.1)
45
+ @stability = (@stability + rate.abs).clamp(0.0, 1.0).round(10)
46
+ end
47
+
48
+ def destabilize!(rate: 0.05)
49
+ @stability = (@stability - rate.abs).clamp(0.0, 1.0).round(10)
50
+ end
51
+
52
+ def fractal?
53
+ @complexity >= 0.8
54
+ end
55
+
56
+ def minimal?
57
+ @complexity < 0.2
58
+ end
59
+
60
+ def stable?
61
+ @stability >= 0.7
62
+ end
63
+
64
+ def chaotic?
65
+ @stability < 0.3
66
+ end
67
+
68
+ def complexity_label
69
+ Constants.label_for(Constants::COMPLEXITY_LABELS, @complexity)
70
+ end
71
+
72
+ def facet_count
73
+ @facet_ids.size
74
+ end
75
+
76
+ def to_h
77
+ {
78
+ id: @id,
79
+ symmetry: @symmetry,
80
+ complexity: @complexity,
81
+ stability: @stability,
82
+ complexity_label: complexity_label,
83
+ facet_count: facet_count,
84
+ fractal: fractal?,
85
+ chaotic: chaotic?,
86
+ created_at: @created_at
87
+ }
88
+ end
89
+
90
+ private
91
+
92
+ def validate_symmetry!(val)
93
+ return if Constants::SYMMETRY_TYPES.include?(val.to_sym)
94
+
95
+ raise ArgumentError,
96
+ "unknown symmetry: #{val.inspect}; " \
97
+ "must be one of #{Constants::SYMMETRY_TYPES.inspect}"
98
+ end
99
+
100
+ def recalculate_complexity!
101
+ base = (@facet_ids.size / 20.0).clamp(0.0, 1.0)
102
+ @complexity = base.round(10)
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end