lex-agentic-inference 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 (328) 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-inference.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/inference/abductive/client.rb +25 -0
  8. data/lib/legion/extensions/agentic/inference/abductive/helpers/abduction_engine.rb +164 -0
  9. data/lib/legion/extensions/agentic/inference/abductive/helpers/constants.rb +39 -0
  10. data/lib/legion/extensions/agentic/inference/abductive/helpers/hypothesis.rb +106 -0
  11. data/lib/legion/extensions/agentic/inference/abductive/helpers/observation.rb +39 -0
  12. data/lib/legion/extensions/agentic/inference/abductive/runners/abductive_reasoning.rb +129 -0
  13. data/lib/legion/extensions/agentic/inference/abductive/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/inference/abductive.rb +20 -0
  15. data/lib/legion/extensions/agentic/inference/affordance/actors/scan.rb +31 -0
  16. data/lib/legion/extensions/agentic/inference/affordance/client.rb +28 -0
  17. data/lib/legion/extensions/agentic/inference/affordance/helpers/affordance_field.rb +123 -0
  18. data/lib/legion/extensions/agentic/inference/affordance/helpers/affordance_item.rb +75 -0
  19. data/lib/legion/extensions/agentic/inference/affordance/helpers/constants.rb +42 -0
  20. data/lib/legion/extensions/agentic/inference/affordance/runners/affordance.rb +90 -0
  21. data/lib/legion/extensions/agentic/inference/affordance/version.rb +13 -0
  22. data/lib/legion/extensions/agentic/inference/affordance.rb +19 -0
  23. data/lib/legion/extensions/agentic/inference/analogical/client.rb +28 -0
  24. data/lib/legion/extensions/agentic/inference/analogical/helpers/analogy_engine.rb +209 -0
  25. data/lib/legion/extensions/agentic/inference/analogical/helpers/constants.rb +38 -0
  26. data/lib/legion/extensions/agentic/inference/analogical/helpers/structure_map.rb +113 -0
  27. data/lib/legion/extensions/agentic/inference/analogical/runners/analogical_reasoning.rb +106 -0
  28. data/lib/legion/extensions/agentic/inference/analogical/version.rb +13 -0
  29. data/lib/legion/extensions/agentic/inference/analogical.rb +19 -0
  30. data/lib/legion/extensions/agentic/inference/argument_mapping/client.rb +19 -0
  31. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/argument.rb +102 -0
  32. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/argument_engine.rb +131 -0
  33. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/constants.rb +44 -0
  34. data/lib/legion/extensions/agentic/inference/argument_mapping/runners/argument_mapping.rb +78 -0
  35. data/lib/legion/extensions/agentic/inference/argument_mapping/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/inference/argument_mapping.rb +19 -0
  37. data/lib/legion/extensions/agentic/inference/bayesian/client.rb +28 -0
  38. data/lib/legion/extensions/agentic/inference/bayesian/helpers/belief.rb +96 -0
  39. data/lib/legion/extensions/agentic/inference/bayesian/helpers/belief_network.rb +147 -0
  40. data/lib/legion/extensions/agentic/inference/bayesian/helpers/constants.rb +36 -0
  41. data/lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb +125 -0
  42. data/lib/legion/extensions/agentic/inference/bayesian/version.rb +13 -0
  43. data/lib/legion/extensions/agentic/inference/bayesian.rb +19 -0
  44. data/lib/legion/extensions/agentic/inference/belief_revision/client.rb +19 -0
  45. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/belief.rb +155 -0
  46. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/belief_network.rb +193 -0
  47. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/constants.rb +54 -0
  48. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/evidence.rb +49 -0
  49. data/lib/legion/extensions/agentic/inference/belief_revision/runners/belief_revision.rb +89 -0
  50. data/lib/legion/extensions/agentic/inference/belief_revision/version.rb +13 -0
  51. data/lib/legion/extensions/agentic/inference/belief_revision.rb +21 -0
  52. data/lib/legion/extensions/agentic/inference/causal_attribution/client.rb +27 -0
  53. data/lib/legion/extensions/agentic/inference/causal_attribution/helpers/attribution.rb +92 -0
  54. data/lib/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_engine.rb +159 -0
  55. data/lib/legion/extensions/agentic/inference/causal_attribution/runners/causal_attribution.rb +111 -0
  56. data/lib/legion/extensions/agentic/inference/causal_attribution/version.rb +13 -0
  57. data/lib/legion/extensions/agentic/inference/causal_attribution.rb +18 -0
  58. data/lib/legion/extensions/agentic/inference/causal_reasoning/client.rb +24 -0
  59. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_edge.rb +101 -0
  60. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_graph.rb +184 -0
  61. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/constants.rb +40 -0
  62. data/lib/legion/extensions/agentic/inference/causal_reasoning/runners/causal_reasoning.rb +111 -0
  63. data/lib/legion/extensions/agentic/inference/causal_reasoning/version.rb +13 -0
  64. data/lib/legion/extensions/agentic/inference/causal_reasoning.rb +19 -0
  65. data/lib/legion/extensions/agentic/inference/coherence/client.rb +28 -0
  66. data/lib/legion/extensions/agentic/inference/coherence/helpers/coherence_engine.rb +170 -0
  67. data/lib/legion/extensions/agentic/inference/coherence/helpers/constants.rb +35 -0
  68. data/lib/legion/extensions/agentic/inference/coherence/helpers/proposition.rb +100 -0
  69. data/lib/legion/extensions/agentic/inference/coherence/runners/cognitive_coherence.rb +123 -0
  70. data/lib/legion/extensions/agentic/inference/coherence/version.rb +13 -0
  71. data/lib/legion/extensions/agentic/inference/coherence.rb +19 -0
  72. data/lib/legion/extensions/agentic/inference/counterfactual/client.rb +19 -0
  73. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/constants.rb +40 -0
  74. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/counterfactual_engine.rb +157 -0
  75. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/scenario.rb +98 -0
  76. data/lib/legion/extensions/agentic/inference/counterfactual/runners/counterfactual.rb +106 -0
  77. data/lib/legion/extensions/agentic/inference/counterfactual/version.rb +13 -0
  78. data/lib/legion/extensions/agentic/inference/counterfactual.rb +19 -0
  79. data/lib/legion/extensions/agentic/inference/debugging/client.rb +30 -0
  80. data/lib/legion/extensions/agentic/inference/debugging/helpers/causal_trace.rb +51 -0
  81. data/lib/legion/extensions/agentic/inference/debugging/helpers/constants.rb +58 -0
  82. data/lib/legion/extensions/agentic/inference/debugging/helpers/correction.rb +56 -0
  83. data/lib/legion/extensions/agentic/inference/debugging/helpers/debugging_engine.rb +156 -0
  84. data/lib/legion/extensions/agentic/inference/debugging/helpers/reasoning_error.rb +97 -0
  85. data/lib/legion/extensions/agentic/inference/debugging/runners/cognitive_debugging.rb +178 -0
  86. data/lib/legion/extensions/agentic/inference/debugging/version.rb +13 -0
  87. data/lib/legion/extensions/agentic/inference/debugging.rb +21 -0
  88. data/lib/legion/extensions/agentic/inference/enactive_cognition/client.rb +27 -0
  89. data/lib/legion/extensions/agentic/inference/enactive_cognition/helpers/enaction_engine.rb +120 -0
  90. data/lib/legion/extensions/agentic/inference/enactive_cognition/helpers/sensorimotor_loop.rb +122 -0
  91. data/lib/legion/extensions/agentic/inference/enactive_cognition/runners/enactive_cognition.rb +124 -0
  92. data/lib/legion/extensions/agentic/inference/enactive_cognition/version.rb +13 -0
  93. data/lib/legion/extensions/agentic/inference/enactive_cognition.rb +18 -0
  94. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/client.rb +17 -0
  95. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/constants.rb +47 -0
  96. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/expectation.rb +82 -0
  97. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/violation_engine.rb +126 -0
  98. data/lib/legion/extensions/agentic/inference/expectation_violation/runners/expectation_violation.rb +76 -0
  99. data/lib/legion/extensions/agentic/inference/expectation_violation/version.rb +13 -0
  100. data/lib/legion/extensions/agentic/inference/expectation_violation.rb +19 -0
  101. data/lib/legion/extensions/agentic/inference/free_energy/client.rb +19 -0
  102. data/lib/legion/extensions/agentic/inference/free_energy/helpers/belief.rb +127 -0
  103. data/lib/legion/extensions/agentic/inference/free_energy/helpers/constants.rb +58 -0
  104. data/lib/legion/extensions/agentic/inference/free_energy/helpers/free_energy_engine.rb +156 -0
  105. data/lib/legion/extensions/agentic/inference/free_energy/runners/free_energy.rb +97 -0
  106. data/lib/legion/extensions/agentic/inference/free_energy/version.rb +13 -0
  107. data/lib/legion/extensions/agentic/inference/free_energy.rb +19 -0
  108. data/lib/legion/extensions/agentic/inference/gravity/client.rb +29 -0
  109. data/lib/legion/extensions/agentic/inference/gravity/helpers/attractor.rb +77 -0
  110. data/lib/legion/extensions/agentic/inference/gravity/helpers/constants.rb +76 -0
  111. data/lib/legion/extensions/agentic/inference/gravity/helpers/gravity_engine.rb +164 -0
  112. data/lib/legion/extensions/agentic/inference/gravity/helpers/orbiting_thought.rb +64 -0
  113. data/lib/legion/extensions/agentic/inference/gravity/runners/gravity.rb +132 -0
  114. data/lib/legion/extensions/agentic/inference/gravity/version.rb +13 -0
  115. data/lib/legion/extensions/agentic/inference/gravity.rb +20 -0
  116. data/lib/legion/extensions/agentic/inference/horizon/actors/adjust.rb +45 -0
  117. data/lib/legion/extensions/agentic/inference/horizon/client.rb +28 -0
  118. data/lib/legion/extensions/agentic/inference/horizon/helpers/constants.rb +43 -0
  119. data/lib/legion/extensions/agentic/inference/horizon/helpers/horizon_engine.rb +110 -0
  120. data/lib/legion/extensions/agentic/inference/horizon/helpers/projection.rb +59 -0
  121. data/lib/legion/extensions/agentic/inference/horizon/runners/cognitive_horizon.rb +107 -0
  122. data/lib/legion/extensions/agentic/inference/horizon/version.rb +13 -0
  123. data/lib/legion/extensions/agentic/inference/horizon.rb +19 -0
  124. data/lib/legion/extensions/agentic/inference/hypothesis_testing/client.rb +28 -0
  125. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/constants.rb +37 -0
  126. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis.rb +83 -0
  127. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_engine.rb +97 -0
  128. data/lib/legion/extensions/agentic/inference/hypothesis_testing/runners/hypothesis_testing.rb +115 -0
  129. data/lib/legion/extensions/agentic/inference/hypothesis_testing/version.rb +13 -0
  130. data/lib/legion/extensions/agentic/inference/hypothesis_testing.rb +19 -0
  131. data/lib/legion/extensions/agentic/inference/intuition/client.rb +19 -0
  132. data/lib/legion/extensions/agentic/inference/intuition/helpers/constants.rb +60 -0
  133. data/lib/legion/extensions/agentic/inference/intuition/helpers/heuristic.rb +66 -0
  134. data/lib/legion/extensions/agentic/inference/intuition/helpers/intuition_engine.rb +157 -0
  135. data/lib/legion/extensions/agentic/inference/intuition/helpers/pattern.rb +105 -0
  136. data/lib/legion/extensions/agentic/inference/intuition/runners/intuition.rb +87 -0
  137. data/lib/legion/extensions/agentic/inference/intuition/version.rb +13 -0
  138. data/lib/legion/extensions/agentic/inference/intuition.rb +20 -0
  139. data/lib/legion/extensions/agentic/inference/magnet/client.rb +29 -0
  140. data/lib/legion/extensions/agentic/inference/magnet/helpers/constants.rb +57 -0
  141. data/lib/legion/extensions/agentic/inference/magnet/helpers/field.rb +105 -0
  142. data/lib/legion/extensions/agentic/inference/magnet/helpers/magnet_engine.rb +179 -0
  143. data/lib/legion/extensions/agentic/inference/magnet/helpers/pole.rb +80 -0
  144. data/lib/legion/extensions/agentic/inference/magnet/runners/cognitive_magnet.rb +124 -0
  145. data/lib/legion/extensions/agentic/inference/magnet/version.rb +13 -0
  146. data/lib/legion/extensions/agentic/inference/magnet.rb +21 -0
  147. data/lib/legion/extensions/agentic/inference/momentum/helpers/client.rb +17 -0
  148. data/lib/legion/extensions/agentic/inference/momentum/helpers/constants.rb +65 -0
  149. data/lib/legion/extensions/agentic/inference/momentum/helpers/idea.rb +112 -0
  150. data/lib/legion/extensions/agentic/inference/momentum/helpers/momentum_engine.rb +127 -0
  151. data/lib/legion/extensions/agentic/inference/momentum/runners/cognitive_momentum.rb +101 -0
  152. data/lib/legion/extensions/agentic/inference/momentum/version.rb +13 -0
  153. data/lib/legion/extensions/agentic/inference/momentum.rb +19 -0
  154. data/lib/legion/extensions/agentic/inference/perceptual_inference/client.rb +28 -0
  155. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/constants.rb +34 -0
  156. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_field.rb +154 -0
  157. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_hypothesis.rb +100 -0
  158. data/lib/legion/extensions/agentic/inference/perceptual_inference/runners/perceptual_inference.rb +120 -0
  159. data/lib/legion/extensions/agentic/inference/perceptual_inference/version.rb +13 -0
  160. data/lib/legion/extensions/agentic/inference/perceptual_inference.rb +19 -0
  161. data/lib/legion/extensions/agentic/inference/prediction/actors/expire_predictions.rb +45 -0
  162. data/lib/legion/extensions/agentic/inference/prediction/client.rb +27 -0
  163. data/lib/legion/extensions/agentic/inference/prediction/helpers/modes.rb +28 -0
  164. data/lib/legion/extensions/agentic/inference/prediction/helpers/prediction_store.rb +66 -0
  165. data/lib/legion/extensions/agentic/inference/prediction/runners/prediction.rb +146 -0
  166. data/lib/legion/extensions/agentic/inference/prediction/version.rb +13 -0
  167. data/lib/legion/extensions/agentic/inference/prediction.rb +18 -0
  168. data/lib/legion/extensions/agentic/inference/predictive_coding/actors/decay.rb +45 -0
  169. data/lib/legion/extensions/agentic/inference/predictive_coding/client.rb +28 -0
  170. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/constants.rb +46 -0
  171. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/generative_model.rb +187 -0
  172. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/prediction_error.rb +59 -0
  173. data/lib/legion/extensions/agentic/inference/predictive_coding/runners/predictive_coding.rb +171 -0
  174. data/lib/legion/extensions/agentic/inference/predictive_coding/version.rb +13 -0
  175. data/lib/legion/extensions/agentic/inference/predictive_coding.rb +20 -0
  176. data/lib/legion/extensions/agentic/inference/predictive_processing/client.rb +28 -0
  177. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/constants.rb +35 -0
  178. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/generative_model.rb +142 -0
  179. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/predictive_processor.rb +129 -0
  180. data/lib/legion/extensions/agentic/inference/predictive_processing/runners/predictive_processing.rb +104 -0
  181. data/lib/legion/extensions/agentic/inference/predictive_processing/version.rb +13 -0
  182. data/lib/legion/extensions/agentic/inference/predictive_processing.rb +19 -0
  183. data/lib/legion/extensions/agentic/inference/reality_testing/client.rb +28 -0
  184. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/belief.rb +98 -0
  185. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/constants.rb +41 -0
  186. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/reality_engine.rb +104 -0
  187. data/lib/legion/extensions/agentic/inference/reality_testing/runners/reality_testing.rb +94 -0
  188. data/lib/legion/extensions/agentic/inference/reality_testing/version.rb +13 -0
  189. data/lib/legion/extensions/agentic/inference/reality_testing.rb +19 -0
  190. data/lib/legion/extensions/agentic/inference/schema/client.rb +26 -0
  191. data/lib/legion/extensions/agentic/inference/schema/helpers/causal_relation.rb +70 -0
  192. data/lib/legion/extensions/agentic/inference/schema/helpers/constants.rb +50 -0
  193. data/lib/legion/extensions/agentic/inference/schema/helpers/world_model.rb +173 -0
  194. data/lib/legion/extensions/agentic/inference/schema/runners/schema.rb +101 -0
  195. data/lib/legion/extensions/agentic/inference/schema/version.rb +13 -0
  196. data/lib/legion/extensions/agentic/inference/schema.rb +19 -0
  197. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/client.rb +28 -0
  198. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/constants.rb +42 -0
  199. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/decision.rb +66 -0
  200. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/tolerance_engine.rb +139 -0
  201. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/runners/uncertainty_tolerance.rb +129 -0
  202. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/version.rb +13 -0
  203. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance.rb +19 -0
  204. data/lib/legion/extensions/agentic/inference/version.rb +11 -0
  205. data/lib/legion/extensions/agentic/inference.rb +44 -0
  206. data/spec/legion/extensions/agentic/inference/abductive/client_spec.rb +25 -0
  207. data/spec/legion/extensions/agentic/inference/abductive/runners/abductive_reasoning_spec.rb +349 -0
  208. data/spec/legion/extensions/agentic/inference/affordance/client_spec.rb +26 -0
  209. data/spec/legion/extensions/agentic/inference/affordance/helpers/affordance_field_spec.rb +131 -0
  210. data/spec/legion/extensions/agentic/inference/affordance/helpers/affordance_item_spec.rb +107 -0
  211. data/spec/legion/extensions/agentic/inference/affordance/runners/affordance_spec.rb +78 -0
  212. data/spec/legion/extensions/agentic/inference/analogical/client_spec.rb +31 -0
  213. data/spec/legion/extensions/agentic/inference/analogical/helpers/analogy_engine_spec.rb +276 -0
  214. data/spec/legion/extensions/agentic/inference/analogical/helpers/structure_map_spec.rb +255 -0
  215. data/spec/legion/extensions/agentic/inference/analogical/runners/analogical_reasoning_spec.rb +213 -0
  216. data/spec/legion/extensions/agentic/inference/argument_mapping/client_spec.rb +18 -0
  217. data/spec/legion/extensions/agentic/inference/argument_mapping/helpers/argument_engine_spec.rb +218 -0
  218. data/spec/legion/extensions/agentic/inference/argument_mapping/helpers/argument_spec.rb +231 -0
  219. data/spec/legion/extensions/agentic/inference/argument_mapping/runners/argument_mapping_spec.rb +171 -0
  220. data/spec/legion/extensions/agentic/inference/bayesian/client_spec.rb +20 -0
  221. data/spec/legion/extensions/agentic/inference/bayesian/helpers/belief_network_spec.rb +178 -0
  222. data/spec/legion/extensions/agentic/inference/bayesian/helpers/belief_spec.rb +137 -0
  223. data/spec/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief_spec.rb +176 -0
  224. data/spec/legion/extensions/agentic/inference/belief_revision/client_spec.rb +31 -0
  225. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/belief_network_spec.rb +176 -0
  226. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/belief_spec.rb +153 -0
  227. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/evidence_spec.rb +51 -0
  228. data/spec/legion/extensions/agentic/inference/belief_revision/runners/belief_revision_spec.rb +106 -0
  229. data/spec/legion/extensions/agentic/inference/causal_attribution/client_spec.rb +24 -0
  230. data/spec/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_engine_spec.rb +181 -0
  231. data/spec/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_spec.rb +108 -0
  232. data/spec/legion/extensions/agentic/inference/causal_attribution/runners/causal_attribution_spec.rb +142 -0
  233. data/spec/legion/extensions/agentic/inference/causal_reasoning/client_spec.rb +35 -0
  234. data/spec/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_edge_spec.rb +158 -0
  235. data/spec/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_graph_spec.rb +259 -0
  236. data/spec/legion/extensions/agentic/inference/causal_reasoning/runners/causal_reasoning_spec.rb +161 -0
  237. data/spec/legion/extensions/agentic/inference/coherence/client_spec.rb +17 -0
  238. data/spec/legion/extensions/agentic/inference/coherence/runners/cognitive_coherence_spec.rb +267 -0
  239. data/spec/legion/extensions/agentic/inference/counterfactual/client_spec.rb +48 -0
  240. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/constants_spec.rb +55 -0
  241. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/counterfactual_engine_spec.rb +234 -0
  242. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/scenario_spec.rb +193 -0
  243. data/spec/legion/extensions/agentic/inference/counterfactual/runners/counterfactual_spec.rb +179 -0
  244. data/spec/legion/extensions/agentic/inference/debugging/client_spec.rb +46 -0
  245. data/spec/legion/extensions/agentic/inference/debugging/helpers/causal_trace_spec.rb +84 -0
  246. data/spec/legion/extensions/agentic/inference/debugging/helpers/constants_spec.rb +97 -0
  247. data/spec/legion/extensions/agentic/inference/debugging/helpers/correction_spec.rb +98 -0
  248. data/spec/legion/extensions/agentic/inference/debugging/helpers/debugging_engine_spec.rb +290 -0
  249. data/spec/legion/extensions/agentic/inference/debugging/helpers/reasoning_error_spec.rb +164 -0
  250. data/spec/legion/extensions/agentic/inference/debugging/runners/cognitive_debugging_spec.rb +301 -0
  251. data/spec/legion/extensions/agentic/inference/enactive_cognition/client_spec.rb +19 -0
  252. data/spec/legion/extensions/agentic/inference/enactive_cognition/helpers/enaction_engine_spec.rb +181 -0
  253. data/spec/legion/extensions/agentic/inference/enactive_cognition/helpers/sensorimotor_loop_spec.rb +184 -0
  254. data/spec/legion/extensions/agentic/inference/enactive_cognition/runners/enactive_cognition_spec.rb +214 -0
  255. data/spec/legion/extensions/agentic/inference/expectation_violation/expectation_violation_spec.rb +11 -0
  256. data/spec/legion/extensions/agentic/inference/expectation_violation/helpers/expectation_spec.rb +102 -0
  257. data/spec/legion/extensions/agentic/inference/expectation_violation/helpers/violation_engine_spec.rb +121 -0
  258. data/spec/legion/extensions/agentic/inference/expectation_violation/runners/expectation_violation_spec.rb +59 -0
  259. data/spec/legion/extensions/agentic/inference/free_energy/client_spec.rb +46 -0
  260. data/spec/legion/extensions/agentic/inference/free_energy/helpers/belief_spec.rb +183 -0
  261. data/spec/legion/extensions/agentic/inference/free_energy/helpers/free_energy_engine_spec.rb +211 -0
  262. data/spec/legion/extensions/agentic/inference/free_energy/runners/free_energy_spec.rb +118 -0
  263. data/spec/legion/extensions/agentic/inference/gravity/client_spec.rb +24 -0
  264. data/spec/legion/extensions/agentic/inference/gravity/helpers/attractor_spec.rb +143 -0
  265. data/spec/legion/extensions/agentic/inference/gravity/helpers/constants_spec.rb +107 -0
  266. data/spec/legion/extensions/agentic/inference/gravity/helpers/gravity_engine_spec.rb +193 -0
  267. data/spec/legion/extensions/agentic/inference/gravity/helpers/orbiting_thought_spec.rb +103 -0
  268. data/spec/legion/extensions/agentic/inference/gravity/runners/gravity_spec.rb +159 -0
  269. data/spec/legion/extensions/agentic/inference/horizon/client_spec.rb +58 -0
  270. data/spec/legion/extensions/agentic/inference/horizon/helpers/constants_spec.rb +98 -0
  271. data/spec/legion/extensions/agentic/inference/horizon/helpers/horizon_engine_spec.rb +325 -0
  272. data/spec/legion/extensions/agentic/inference/horizon/helpers/projection_spec.rb +155 -0
  273. data/spec/legion/extensions/agentic/inference/horizon/runners/cognitive_horizon_spec.rb +269 -0
  274. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/constants_spec.rb +38 -0
  275. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_engine_spec.rb +182 -0
  276. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_spec.rb +172 -0
  277. data/spec/legion/extensions/agentic/inference/hypothesis_testing/hypothesis_testing_spec.rb +16 -0
  278. data/spec/legion/extensions/agentic/inference/hypothesis_testing/runners/hypothesis_testing_spec.rb +159 -0
  279. data/spec/legion/extensions/agentic/inference/intuition/client_spec.rb +33 -0
  280. data/spec/legion/extensions/agentic/inference/intuition/helpers/heuristic_spec.rb +82 -0
  281. data/spec/legion/extensions/agentic/inference/intuition/helpers/intuition_engine_spec.rb +163 -0
  282. data/spec/legion/extensions/agentic/inference/intuition/helpers/pattern_spec.rb +160 -0
  283. data/spec/legion/extensions/agentic/inference/intuition/runners/intuition_spec.rb +107 -0
  284. data/spec/legion/extensions/agentic/inference/magnet/client_spec.rb +30 -0
  285. data/spec/legion/extensions/agentic/inference/magnet/helpers/constants_spec.rb +120 -0
  286. data/spec/legion/extensions/agentic/inference/magnet/helpers/field_spec.rb +193 -0
  287. data/spec/legion/extensions/agentic/inference/magnet/helpers/magnet_engine_spec.rb +281 -0
  288. data/spec/legion/extensions/agentic/inference/magnet/helpers/pole_spec.rb +211 -0
  289. data/spec/legion/extensions/agentic/inference/magnet/runners/cognitive_magnet_spec.rb +201 -0
  290. data/spec/legion/extensions/agentic/inference/momentum/cognitive_momentum_spec.rb +11 -0
  291. data/spec/legion/extensions/agentic/inference/momentum/helpers/idea_spec.rb +152 -0
  292. data/spec/legion/extensions/agentic/inference/momentum/helpers/momentum_engine_spec.rb +154 -0
  293. data/spec/legion/extensions/agentic/inference/momentum/runners/cognitive_momentum_spec.rb +97 -0
  294. data/spec/legion/extensions/agentic/inference/perceptual_inference/client_spec.rb +39 -0
  295. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/constants_spec.rb +97 -0
  296. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_field_spec.rb +270 -0
  297. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_hypothesis_spec.rb +206 -0
  298. data/spec/legion/extensions/agentic/inference/perceptual_inference/runners/perceptual_inference_spec.rb +305 -0
  299. data/spec/legion/extensions/agentic/inference/prediction/actors/expire_predictions_spec.rb +46 -0
  300. data/spec/legion/extensions/agentic/inference/prediction/client_spec.rb +14 -0
  301. data/spec/legion/extensions/agentic/inference/prediction/helpers/modes_spec.rb +118 -0
  302. data/spec/legion/extensions/agentic/inference/prediction/helpers/prediction_store_spec.rb +262 -0
  303. data/spec/legion/extensions/agentic/inference/prediction/runners/prediction_spec.rb +116 -0
  304. data/spec/legion/extensions/agentic/inference/predictive_coding/client_spec.rb +74 -0
  305. data/spec/legion/extensions/agentic/inference/predictive_coding/helpers/generative_model_spec.rb +194 -0
  306. data/spec/legion/extensions/agentic/inference/predictive_coding/helpers/prediction_error_spec.rb +109 -0
  307. data/spec/legion/extensions/agentic/inference/predictive_coding/runners/predictive_coding_spec.rb +210 -0
  308. data/spec/legion/extensions/agentic/inference/predictive_processing/client_spec.rb +82 -0
  309. data/spec/legion/extensions/agentic/inference/predictive_processing/helpers/generative_model_spec.rb +220 -0
  310. data/spec/legion/extensions/agentic/inference/predictive_processing/helpers/predictive_processor_spec.rb +206 -0
  311. data/spec/legion/extensions/agentic/inference/predictive_processing/runners/predictive_processing_spec.rb +213 -0
  312. data/spec/legion/extensions/agentic/inference/reality_testing/client_spec.rb +29 -0
  313. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/belief_spec.rb +197 -0
  314. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/constants_spec.rb +78 -0
  315. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/reality_engine_spec.rb +191 -0
  316. data/spec/legion/extensions/agentic/inference/reality_testing/runners/reality_testing_spec.rb +154 -0
  317. data/spec/legion/extensions/agentic/inference/schema/client_spec.rb +53 -0
  318. data/spec/legion/extensions/agentic/inference/schema/helpers/causal_relation_spec.rb +108 -0
  319. data/spec/legion/extensions/agentic/inference/schema/helpers/constants_spec.rb +54 -0
  320. data/spec/legion/extensions/agentic/inference/schema/helpers/world_model_spec.rb +179 -0
  321. data/spec/legion/extensions/agentic/inference/schema/runners/schema_spec.rb +146 -0
  322. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/client_spec.rb +18 -0
  323. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/constants_spec.rb +62 -0
  324. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/decision_spec.rb +125 -0
  325. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/tolerance_engine_spec.rb +184 -0
  326. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/runners/uncertainty_tolerance_spec.rb +157 -0
  327. data/spec/spec_helper.rb +46 -0
  328. metadata +412 -0
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Gravity
8
+ module Helpers
9
+ class GravityEngine
10
+ attr_reader :attractors, :orbiting_thoughts, :capture_events, :escape_events
11
+
12
+ def initialize
13
+ @attractors = {}
14
+ @orbiting_thoughts = {}
15
+ @capture_events = []
16
+ @escape_events = []
17
+ end
18
+
19
+ def add_attractor(content:, domain: :unknown, mass: Constants::DEFAULT_MASS,
20
+ pull_radius: 1.0, decay_rate: 0.01)
21
+ return { error: :capacity_exceeded, max: Constants::MAX_ATTRACTORS } if at_attractor_capacity?
22
+
23
+ attractor = Attractor.new(
24
+ content: content,
25
+ domain: domain,
26
+ mass: mass,
27
+ pull_radius: pull_radius,
28
+ decay_rate: decay_rate
29
+ )
30
+ @attractors[attractor.id] = attractor
31
+ attractor
32
+ end
33
+
34
+ def add_orbiting_thought(content:, attractor_id:, orbital_distance: 1.0, velocity: 0.0)
35
+ return { error: :attractor_not_found } unless @attractors.key?(attractor_id)
36
+ return { error: :capacity_exceeded, max: Constants::MAX_ORBITING } if at_orbiting_capacity?
37
+
38
+ thought = OrbitingThought.new(
39
+ content: content,
40
+ attractor_id: attractor_id,
41
+ orbital_distance: orbital_distance,
42
+ velocity: velocity
43
+ )
44
+ @orbiting_thoughts[thought.id] = thought
45
+ thought
46
+ end
47
+
48
+ def simulate_tick
49
+ captures = []
50
+ escapes = []
51
+
52
+ @attractors.each_value do |attractor|
53
+ next if attractor.collapsed?
54
+
55
+ thoughts_for(attractor.id).each do |thought|
56
+ pull = attractor.pull_strength_at(distance: thought.orbital_distance)
57
+ next unless pull.positive?
58
+
59
+ was_captured = thought.captured?
60
+ was_escaped = thought.escaped?
61
+
62
+ thought.approach!(pull)
63
+
64
+ if !was_captured && thought.captured?
65
+ event = build_event(:capture, attractor, thought)
66
+ captures << event
67
+ @capture_events << event
68
+ end
69
+
70
+ next unless !was_escaped && thought.escaped?
71
+
72
+ event = build_event(:escape, attractor, thought)
73
+ escapes << event
74
+ @escape_events << event
75
+ end
76
+ end
77
+
78
+ { captures: captures, escapes: escapes, tick_processed: true }
79
+ end
80
+
81
+ def accrete_attractor(attractor_id, amount: Constants::MASS_ACCRETION)
82
+ attractor = @attractors[attractor_id]
83
+ return { error: :not_found } unless attractor
84
+
85
+ attractor.accrete!(amount)
86
+ { accreted: true, id: attractor_id, mass: attractor.mass }
87
+ end
88
+
89
+ def erode_attractor(attractor_id, amount: Constants::MASS_EROSION)
90
+ attractor = @attractors[attractor_id]
91
+ return { error: :not_found } unless attractor
92
+
93
+ attractor.erode!(amount)
94
+ { eroded: true, id: attractor_id, mass: attractor.mass, collapsed: attractor.collapsed? }
95
+ end
96
+
97
+ def strongest_attractors(limit: 5)
98
+ @attractors.values
99
+ .reject(&:collapsed?)
100
+ .sort_by { |a| -a.mass }
101
+ .first(limit)
102
+ end
103
+
104
+ def thought_distribution
105
+ @attractors.transform_values { |a| thoughts_for(a.id).size }
106
+ end
107
+
108
+ def cognitive_density_map
109
+ thought_distribution.transform_values do |count|
110
+ Constants.label_for(Constants::DENSITY_LABELS, count)
111
+ end
112
+ end
113
+
114
+ def gravity_report
115
+ collapsed, active = @attractors.values.partition(&:collapsed?)
116
+ supermass = @attractors.values.select(&:supermassive?)
117
+ captured = @orbiting_thoughts.values.select(&:captured?)
118
+ escaped = @orbiting_thoughts.values.select(&:escaped?)
119
+
120
+ {
121
+ total_attractors: @attractors.size,
122
+ active_attractors: active.size,
123
+ collapsed_attractors: collapsed.size,
124
+ supermassive_count: supermass.size,
125
+ total_orbiting: @orbiting_thoughts.size,
126
+ captured_count: captured.size,
127
+ escaped_count: escaped.size,
128
+ total_captures: @capture_events.size,
129
+ total_escapes: @escape_events.size,
130
+ strongest: strongest_attractors(limit: 3).map(&:to_h)
131
+ }
132
+ end
133
+
134
+ private
135
+
136
+ def thoughts_for(attractor_id)
137
+ @orbiting_thoughts.values.select { |t| t.attractor_id == attractor_id }
138
+ end
139
+
140
+ def at_attractor_capacity?
141
+ @attractors.size >= Constants::MAX_ATTRACTORS
142
+ end
143
+
144
+ def at_orbiting_capacity?
145
+ @orbiting_thoughts.size >= Constants::MAX_ORBITING
146
+ end
147
+
148
+ def build_event(type, attractor, thought)
149
+ {
150
+ type: type,
151
+ attractor_id: attractor.id,
152
+ thought_id: thought.id,
153
+ mass: attractor.mass,
154
+ distance: thought.orbital_distance,
155
+ at: Time.now.utc
156
+ }
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Inference
9
+ module Gravity
10
+ module Helpers
11
+ class OrbitingThought
12
+ attr_reader :id, :content, :attractor_id, :orbital_distance, :velocity, :created_at
13
+
14
+ def initialize(content:, attractor_id:, orbital_distance: 1.0, velocity: 0.0)
15
+ @id = SecureRandom.uuid
16
+ @content = content
17
+ @attractor_id = attractor_id
18
+ @orbital_distance = orbital_distance.clamp(0.0, Float::INFINITY).round(10)
19
+ @velocity = velocity.to_f.round(10)
20
+ @created_at = Time.now.utc
21
+ end
22
+
23
+ def approach!(delta)
24
+ @orbital_distance = [(@orbital_distance - delta.abs).round(10), 0.0].max
25
+ self
26
+ end
27
+
28
+ def escape!(delta)
29
+ @orbital_distance = (@orbital_distance + delta.abs).round(10)
30
+ self
31
+ end
32
+
33
+ def captured?
34
+ @orbital_distance < Constants::CAPTURE_RADIUS
35
+ end
36
+
37
+ def escaped?
38
+ @orbital_distance > Constants::ESCAPE_RADIUS
39
+ end
40
+
41
+ def orbit_label
42
+ Constants.label_for(Constants::ORBIT_LABELS, @orbital_distance)
43
+ end
44
+
45
+ def to_h
46
+ {
47
+ id: @id,
48
+ content: @content,
49
+ attractor_id: @attractor_id,
50
+ orbital_distance: @orbital_distance,
51
+ velocity: @velocity,
52
+ captured: captured?,
53
+ escaped: escaped?,
54
+ orbit_label: orbit_label,
55
+ created_at: @created_at
56
+ }
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Gravity
8
+ module Runners
9
+ module Gravity
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def create_attractor(content:, domain: :unknown, mass: Helpers::Constants::DEFAULT_MASS,
14
+ pull_radius: 1.0, decay_rate: 0.01, engine: nil, **)
15
+ eng = engine || gravity_engine
16
+ unless Helpers::Constants.valid_domain?(domain)
17
+ return { success: false, error: :invalid_domain,
18
+ valid_domains: Helpers::Constants::ATTRACTOR_DOMAINS }
19
+ end
20
+
21
+ result = eng.add_attractor(
22
+ content: content,
23
+ domain: domain,
24
+ mass: mass,
25
+ pull_radius: pull_radius,
26
+ decay_rate: decay_rate
27
+ )
28
+
29
+ if result.is_a?(Hash) && result[:error]
30
+ Legion::Logging.warn "[cognitive_gravity] create_attractor failed: #{result[:error]}"
31
+ return { success: false, **result }
32
+ end
33
+
34
+ Legion::Logging.debug "[cognitive_gravity] attractor created id=#{result.id[0..7]} " \
35
+ "domain=#{domain} mass=#{mass}"
36
+ { success: true, attractor: result.to_h }
37
+ end
38
+
39
+ def add_thought(content:, attractor_id:, orbital_distance: 1.0, velocity: 0.0,
40
+ engine: nil, **)
41
+ eng = engine || gravity_engine
42
+ result = eng.add_orbiting_thought(
43
+ content: content,
44
+ attractor_id: attractor_id,
45
+ orbital_distance: orbital_distance,
46
+ velocity: velocity
47
+ )
48
+
49
+ if result.is_a?(Hash) && result[:error]
50
+ Legion::Logging.warn "[cognitive_gravity] add_thought failed: #{result[:error]}"
51
+ return { success: false, **result }
52
+ end
53
+
54
+ Legion::Logging.debug "[cognitive_gravity] thought added id=#{result.id[0..7]} " \
55
+ "attractor=#{attractor_id[0..7]} distance=#{orbital_distance}"
56
+ { success: true, thought: result.to_h }
57
+ end
58
+
59
+ def tick_gravity(engine: nil, **)
60
+ eng = engine || gravity_engine
61
+ result = eng.simulate_tick
62
+ Legion::Logging.debug "[cognitive_gravity] tick: captures=#{result[:captures].size} " \
63
+ "escapes=#{result[:escapes].size}"
64
+ { success: true, **result }
65
+ end
66
+
67
+ def accrete(attractor_id:, amount: Helpers::Constants::MASS_ACCRETION, engine: nil, **)
68
+ eng = engine || gravity_engine
69
+ result = eng.accrete_attractor(attractor_id, amount: amount)
70
+
71
+ if result[:error]
72
+ Legion::Logging.warn "[cognitive_gravity] accrete failed: #{result[:error]}"
73
+ return { success: false, **result }
74
+ end
75
+
76
+ Legion::Logging.debug "[cognitive_gravity] accreted id=#{attractor_id[0..7]} mass=#{result[:mass]}"
77
+ { success: true, **result }
78
+ end
79
+
80
+ def erode(attractor_id:, amount: Helpers::Constants::MASS_EROSION, engine: nil, **)
81
+ eng = engine || gravity_engine
82
+ result = eng.erode_attractor(attractor_id, amount: amount)
83
+
84
+ if result[:error]
85
+ Legion::Logging.warn "[cognitive_gravity] erode failed: #{result[:error]}"
86
+ return { success: false, **result }
87
+ end
88
+
89
+ Legion::Logging.debug "[cognitive_gravity] eroded id=#{attractor_id[0..7]} " \
90
+ "mass=#{result[:mass]} collapsed=#{result[:collapsed]}"
91
+ { success: true, **result }
92
+ end
93
+
94
+ def strongest_attractors(limit: 5, engine: nil, **)
95
+ eng = engine || gravity_engine
96
+ attractors = eng.strongest_attractors(limit: limit)
97
+ Legion::Logging.debug "[cognitive_gravity] strongest_attractors count=#{attractors.size}"
98
+ { success: true, attractors: attractors.map(&:to_h), count: attractors.size }
99
+ end
100
+
101
+ def thought_distribution(engine: nil, **)
102
+ eng = engine || gravity_engine
103
+ distribution = eng.thought_distribution
104
+ { success: true, distribution: distribution }
105
+ end
106
+
107
+ def cognitive_density_map(engine: nil, **)
108
+ eng = engine || gravity_engine
109
+ density_map = eng.cognitive_density_map
110
+ { success: true, density_map: density_map }
111
+ end
112
+
113
+ def gravity_report(engine: nil, **)
114
+ eng = engine || gravity_engine
115
+ report = eng.gravity_report
116
+ Legion::Logging.debug "[cognitive_gravity] report: attractors=#{report[:total_attractors]} " \
117
+ "orbiting=#{report[:total_orbiting]} supermassive=#{report[:supermassive_count]}"
118
+ { success: true, report: report }
119
+ end
120
+
121
+ private
122
+
123
+ def gravity_engine
124
+ @gravity_engine ||= Helpers::GravityEngine.new
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Gravity
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/inference/gravity/version'
4
+ require 'legion/extensions/agentic/inference/gravity/helpers/constants'
5
+ require 'legion/extensions/agentic/inference/gravity/helpers/attractor'
6
+ require 'legion/extensions/agentic/inference/gravity/helpers/orbiting_thought'
7
+ require 'legion/extensions/agentic/inference/gravity/helpers/gravity_engine'
8
+ require 'legion/extensions/agentic/inference/gravity/runners/gravity'
9
+ require 'legion/extensions/agentic/inference/gravity/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Inference
15
+ module Gravity
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/actors/every'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Inference
9
+ module Horizon
10
+ module Actor
11
+ class Adjust < Legion::Extensions::Actors::Every
12
+ def runner_class
13
+ Legion::Extensions::Agentic::Inference::Horizon::Runners::CognitiveHorizon
14
+ end
15
+
16
+ def runner_function
17
+ 'horizon_status'
18
+ end
19
+
20
+ def time
21
+ 60
22
+ end
23
+
24
+ def run_now?
25
+ false
26
+ end
27
+
28
+ def use_runner?
29
+ false
30
+ end
31
+
32
+ def check_subtask?
33
+ false
34
+ end
35
+
36
+ def generate_task?
37
+ false
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/inference/horizon/helpers/constants'
4
+ require 'legion/extensions/agentic/inference/horizon/helpers/projection'
5
+ require 'legion/extensions/agentic/inference/horizon/helpers/horizon_engine'
6
+ require 'legion/extensions/agentic/inference/horizon/runners/cognitive_horizon'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Inference
12
+ module Horizon
13
+ class Client
14
+ include Runners::CognitiveHorizon
15
+
16
+ def initialize(**)
17
+ @horizon_engine = Helpers::HorizonEngine.new
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :horizon_engine
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Horizon
8
+ module Helpers
9
+ module Constants
10
+ # Projection store limit
11
+ MAX_PROJECTIONS = 200
12
+
13
+ # Horizon values (0.0 = immediate, 1.0 = strategic)
14
+ DEFAULT_HORIZON = 0.5
15
+ HORIZON_EXPAND = 0.08
16
+ HORIZON_CONTRACT = 0.1
17
+ MIN_HORIZON = 0.1
18
+ MAX_HORIZON = 1.0
19
+
20
+ # Stress adds additional contraction on top of HORIZON_CONTRACT
21
+ STRESS_CONTRACTION = 0.15
22
+
23
+ # Ordered horizon levels (near -> far)
24
+ HORIZON_LEVELS = %i[immediate near_term medium_term long_term strategic].freeze
25
+
26
+ # Construal labels keyed by range (horizon distance 0..1)
27
+ CONSTRUAL_LABELS = [
28
+ { range: (0.0...0.2), label: :concrete },
29
+ { range: (0.2...0.4), label: :detailed },
30
+ { range: (0.4...0.6), label: :balanced },
31
+ { range: (0.6...0.8), label: :schematic },
32
+ { range: (0.8..1.0), label: :abstract }
33
+ ].freeze
34
+
35
+ # Confidence erodes by this much per step away from current horizon
36
+ CONFIDENCE_DECAY_PER_STEP = 0.1
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Horizon
8
+ module Helpers
9
+ class HorizonEngine
10
+ attr_reader :projections, :current_horizon, :stress_level
11
+
12
+ def initialize(initial_horizon: Constants::DEFAULT_HORIZON)
13
+ @projections = []
14
+ @current_horizon = initial_horizon.clamp(Constants::MIN_HORIZON, Constants::MAX_HORIZON)
15
+ @stress_level = 0.0
16
+ end
17
+
18
+ def add_projection(description:, domain: :general, horizon_distance: nil, confidence: 1.0)
19
+ dist = horizon_distance || @current_horizon
20
+ proj = Projection.new(
21
+ description: description,
22
+ domain: domain,
23
+ horizon_distance: dist,
24
+ confidence: confidence
25
+ )
26
+ @projections << proj
27
+ @projections = @projections.last(Constants::MAX_PROJECTIONS) if @projections.size > Constants::MAX_PROJECTIONS
28
+ proj
29
+ end
30
+
31
+ def expand_horizon!(amount: Constants::HORIZON_EXPAND)
32
+ @current_horizon = (@current_horizon + amount).clamp(Constants::MIN_HORIZON, Constants::MAX_HORIZON)
33
+ @current_horizon
34
+ end
35
+
36
+ def contract_horizon!(amount: Constants::HORIZON_CONTRACT)
37
+ @current_horizon = (@current_horizon - amount).clamp(Constants::MIN_HORIZON, Constants::MAX_HORIZON)
38
+ @current_horizon
39
+ end
40
+
41
+ def apply_stress!(level)
42
+ @stress_level = level.clamp(0.0, 1.0)
43
+ @current_horizon = (@current_horizon - (@stress_level * Constants::STRESS_CONTRACTION))
44
+ .clamp(Constants::MIN_HORIZON, Constants::MAX_HORIZON)
45
+ @current_horizon
46
+ end
47
+
48
+ def relieve_stress!(amount: 0.1)
49
+ @stress_level = (@stress_level - amount).clamp(0.0, 1.0)
50
+ end
51
+
52
+ def effective_horizon
53
+ (@current_horizon - (@stress_level * Constants::STRESS_CONTRACTION))
54
+ .clamp(Constants::MIN_HORIZON, Constants::MAX_HORIZON)
55
+ end
56
+
57
+ def projections_within_horizon
58
+ eh = effective_horizon
59
+ @projections.select { |p| p.horizon_distance <= eh }
60
+ end
61
+
62
+ def beyond_horizon_projections
63
+ eh = effective_horizon
64
+ @projections.select { |p| p.horizon_distance > eh }
65
+ end
66
+
67
+ def nearest_projections(num: 5)
68
+ @projections.sort_by(&:horizon_distance).first(num)
69
+ end
70
+
71
+ def farthest_projections(num: 5)
72
+ @projections.sort_by(&:horizon_distance).last(num).reverse
73
+ end
74
+
75
+ def construal_label
76
+ dist = effective_horizon
77
+ entry = Constants::CONSTRUAL_LABELS.find { |e| e[:range].cover?(dist) }
78
+ entry ? entry[:label] : :balanced
79
+ end
80
+
81
+ def horizon_report
82
+ {
83
+ current_horizon: @current_horizon.round(10),
84
+ stress_level: @stress_level.round(10),
85
+ effective_horizon: effective_horizon.round(10),
86
+ construal_label: construal_label,
87
+ horizon_level: horizon_level,
88
+ total_projections: @projections.size,
89
+ within_horizon: projections_within_horizon.size,
90
+ beyond_horizon: beyond_horizon_projections.size
91
+ }
92
+ end
93
+
94
+ def to_h
95
+ horizon_report.merge(projections: @projections.map(&:to_h))
96
+ end
97
+
98
+ private
99
+
100
+ def horizon_level
101
+ idx = (effective_horizon * (Constants::HORIZON_LEVELS.size - 1)).round
102
+ Constants::HORIZON_LEVELS[idx.clamp(0, Constants::HORIZON_LEVELS.size - 1)]
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Inference
9
+ module Horizon
10
+ module Helpers
11
+ class Projection
12
+ attr_reader :id, :description, :domain, :horizon_distance, :confidence, :construal_level, :created_at
13
+
14
+ def initialize(description:, domain: :general, horizon_distance: Constants::DEFAULT_HORIZON,
15
+ confidence: 1.0, construal_level: nil)
16
+ @id = SecureRandom.uuid
17
+ @description = description
18
+ @domain = domain
19
+ @horizon_distance = horizon_distance.clamp(0.0, 1.0)
20
+ @confidence = confidence.clamp(0.0, 1.0)
21
+ @construal_level = construal_level || derive_construal_level(@horizon_distance)
22
+ @created_at = Time.now.utc
23
+ end
24
+
25
+ def concrete?
26
+ @horizon_distance <= 0.3
27
+ end
28
+
29
+ def abstract?
30
+ @horizon_distance >= 0.7
31
+ end
32
+
33
+ def to_h
34
+ {
35
+ id: @id,
36
+ description: @description,
37
+ domain: @domain,
38
+ horizon_distance: @horizon_distance.round(10),
39
+ confidence: @confidence.round(10),
40
+ construal_level: @construal_level,
41
+ concrete: concrete?,
42
+ abstract: abstract?,
43
+ created_at: @created_at
44
+ }
45
+ end
46
+
47
+ private
48
+
49
+ def derive_construal_level(distance)
50
+ entry = Constants::CONSTRUAL_LABELS.find { |e| e[:range].cover?(distance) }
51
+ entry ? entry[:label] : :balanced
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end