lex-agentic-executive 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 (296) 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-executive.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/executive/autopilot/client.rb +19 -0
  8. data/lib/legion/extensions/agentic/executive/autopilot/helpers/autopilot_engine.rb +161 -0
  9. data/lib/legion/extensions/agentic/executive/autopilot/helpers/constants.rb +62 -0
  10. data/lib/legion/extensions/agentic/executive/autopilot/helpers/mode_event.rb +51 -0
  11. data/lib/legion/extensions/agentic/executive/autopilot/helpers/routine.rb +91 -0
  12. data/lib/legion/extensions/agentic/executive/autopilot/runners/cognitive_autopilot.rb +93 -0
  13. data/lib/legion/extensions/agentic/executive/autopilot/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/executive/autopilot.rb +20 -0
  15. data/lib/legion/extensions/agentic/executive/chunking/client.rb +21 -0
  16. data/lib/legion/extensions/agentic/executive/chunking/helpers/chunk.rb +92 -0
  17. data/lib/legion/extensions/agentic/executive/chunking/helpers/chunking_engine.rb +147 -0
  18. data/lib/legion/extensions/agentic/executive/chunking/helpers/constants.rb +56 -0
  19. data/lib/legion/extensions/agentic/executive/chunking/helpers/information_item.rb +51 -0
  20. data/lib/legion/extensions/agentic/executive/chunking/runners/cognitive_chunking.rb +111 -0
  21. data/lib/legion/extensions/agentic/executive/chunking/version.rb +13 -0
  22. data/lib/legion/extensions/agentic/executive/chunking.rb +21 -0
  23. data/lib/legion/extensions/agentic/executive/cognitive_debt/client.rb +28 -0
  24. data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/constants.rb +36 -0
  25. data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_engine.rb +118 -0
  26. data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_item.rb +83 -0
  27. data/lib/legion/extensions/agentic/executive/cognitive_debt/runners/cognitive_debt.rb +84 -0
  28. data/lib/legion/extensions/agentic/executive/cognitive_debt/version.rb +13 -0
  29. data/lib/legion/extensions/agentic/executive/cognitive_debt.rb +19 -0
  30. data/lib/legion/extensions/agentic/executive/compass/client.rb +15 -0
  31. data/lib/legion/extensions/agentic/executive/compass/helpers/bearing.rb +79 -0
  32. data/lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb +108 -0
  33. data/lib/legion/extensions/agentic/executive/compass/helpers/constants.rb +65 -0
  34. data/lib/legion/extensions/agentic/executive/compass/helpers/magnetic_bias.rb +81 -0
  35. data/lib/legion/extensions/agentic/executive/compass/runners/cognitive_compass.rb +76 -0
  36. data/lib/legion/extensions/agentic/executive/compass/version.rb +13 -0
  37. data/lib/legion/extensions/agentic/executive/compass.rb +22 -0
  38. data/lib/legion/extensions/agentic/executive/control/client.rb +19 -0
  39. data/lib/legion/extensions/agentic/executive/control/helpers/constants.rb +45 -0
  40. data/lib/legion/extensions/agentic/executive/control/helpers/control_signal.rb +79 -0
  41. data/lib/legion/extensions/agentic/executive/control/helpers/controller.rb +140 -0
  42. data/lib/legion/extensions/agentic/executive/control/helpers/goal.rb +72 -0
  43. data/lib/legion/extensions/agentic/executive/control/runners/cognitive_control.rb +74 -0
  44. data/lib/legion/extensions/agentic/executive/control/version.rb +13 -0
  45. data/lib/legion/extensions/agentic/executive/control.rb +21 -0
  46. data/lib/legion/extensions/agentic/executive/decision_fatigue/client.rb +28 -0
  47. data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/constants.rb +51 -0
  48. data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/decision_record.rb +50 -0
  49. data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/fatigue_engine.rb +114 -0
  50. data/lib/legion/extensions/agentic/executive/decision_fatigue/runners/decision_fatigue.rb +94 -0
  51. data/lib/legion/extensions/agentic/executive/decision_fatigue/version.rb +13 -0
  52. data/lib/legion/extensions/agentic/executive/decision_fatigue.rb +19 -0
  53. data/lib/legion/extensions/agentic/executive/disengagement/client.rb +24 -0
  54. data/lib/legion/extensions/agentic/executive/disengagement/helpers/constants.rb +48 -0
  55. data/lib/legion/extensions/agentic/executive/disengagement/helpers/disengagement_engine.rb +101 -0
  56. data/lib/legion/extensions/agentic/executive/disengagement/helpers/goal.rb +105 -0
  57. data/lib/legion/extensions/agentic/executive/disengagement/runners/cognitive_disengagement.rb +90 -0
  58. data/lib/legion/extensions/agentic/executive/disengagement/version.rb +13 -0
  59. data/lib/legion/extensions/agentic/executive/disengagement.rb +19 -0
  60. data/lib/legion/extensions/agentic/executive/dissonance_resolution/client.rb +19 -0
  61. data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/constants.rb +38 -0
  62. data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/dissonance_conflict.rb +90 -0
  63. data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb +155 -0
  64. data/lib/legion/extensions/agentic/executive/dissonance_resolution/runners/cognitive_dissonance_resolution.rb +74 -0
  65. data/lib/legion/extensions/agentic/executive/dissonance_resolution/version.rb +13 -0
  66. data/lib/legion/extensions/agentic/executive/dissonance_resolution.rb +19 -0
  67. data/lib/legion/extensions/agentic/executive/dual_process/client.rb +25 -0
  68. data/lib/legion/extensions/agentic/executive/dual_process/helpers/constants.rb +44 -0
  69. data/lib/legion/extensions/agentic/executive/dual_process/helpers/decision.rb +50 -0
  70. data/lib/legion/extensions/agentic/executive/dual_process/helpers/dual_process_engine.rb +200 -0
  71. data/lib/legion/extensions/agentic/executive/dual_process/helpers/heuristic.rb +67 -0
  72. data/lib/legion/extensions/agentic/executive/dual_process/runners/dual_process.rb +87 -0
  73. data/lib/legion/extensions/agentic/executive/dual_process/version.rb +13 -0
  74. data/lib/legion/extensions/agentic/executive/dual_process.rb +20 -0
  75. data/lib/legion/extensions/agentic/executive/dwell/client.rb +19 -0
  76. data/lib/legion/extensions/agentic/executive/dwell/helpers/constants.rb +65 -0
  77. data/lib/legion/extensions/agentic/executive/dwell/helpers/dwell_engine.rb +126 -0
  78. data/lib/legion/extensions/agentic/executive/dwell/helpers/dwell_topic.rb +119 -0
  79. data/lib/legion/extensions/agentic/executive/dwell/runners/cognitive_dwell.rb +87 -0
  80. data/lib/legion/extensions/agentic/executive/dwell/version.rb +13 -0
  81. data/lib/legion/extensions/agentic/executive/dwell.rb +19 -0
  82. data/lib/legion/extensions/agentic/executive/executive_function/actors/recovery.rb +45 -0
  83. data/lib/legion/extensions/agentic/executive/executive_function/client.rb +27 -0
  84. data/lib/legion/extensions/agentic/executive/executive_function/helpers/ef_component.rb +58 -0
  85. data/lib/legion/extensions/agentic/executive/executive_function/helpers/executive_controller.rb +129 -0
  86. data/lib/legion/extensions/agentic/executive/executive_function/runners/executive_function.rb +104 -0
  87. data/lib/legion/extensions/agentic/executive/executive_function/version.rb +13 -0
  88. data/lib/legion/extensions/agentic/executive/executive_function.rb +18 -0
  89. data/lib/legion/extensions/agentic/executive/flexibility/actors/tick.rb +31 -0
  90. data/lib/legion/extensions/agentic/executive/flexibility/client.rb +28 -0
  91. data/lib/legion/extensions/agentic/executive/flexibility/helpers/constants.rb +39 -0
  92. data/lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb +109 -0
  93. data/lib/legion/extensions/agentic/executive/flexibility/helpers/task_set.rb +69 -0
  94. data/lib/legion/extensions/agentic/executive/flexibility/runners/cognitive_flexibility.rb +77 -0
  95. data/lib/legion/extensions/agentic/executive/flexibility/version.rb +13 -0
  96. data/lib/legion/extensions/agentic/executive/flexibility.rb +19 -0
  97. data/lib/legion/extensions/agentic/executive/flexibility_training/client.rb +29 -0
  98. data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/constants.rb +57 -0
  99. data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/flexibility_engine.rb +178 -0
  100. data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/switch_trial.rb +54 -0
  101. data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/training_task.rb +54 -0
  102. data/lib/legion/extensions/agentic/executive/flexibility_training/runners/cognitive_flexibility_training.rb +134 -0
  103. data/lib/legion/extensions/agentic/executive/flexibility_training/version.rb +13 -0
  104. data/lib/legion/extensions/agentic/executive/flexibility_training.rb +20 -0
  105. data/lib/legion/extensions/agentic/executive/goal_management/client.rb +28 -0
  106. data/lib/legion/extensions/agentic/executive/goal_management/helpers/constants.rb +49 -0
  107. data/lib/legion/extensions/agentic/executive/goal_management/helpers/goal.rb +153 -0
  108. data/lib/legion/extensions/agentic/executive/goal_management/helpers/goal_engine.rb +265 -0
  109. data/lib/legion/extensions/agentic/executive/goal_management/runners/goal_management.rb +169 -0
  110. data/lib/legion/extensions/agentic/executive/goal_management/version.rb +13 -0
  111. data/lib/legion/extensions/agentic/executive/goal_management.rb +19 -0
  112. data/lib/legion/extensions/agentic/executive/inertia/client.rb +15 -0
  113. data/lib/legion/extensions/agentic/executive/inertia/helpers/belief.rb +99 -0
  114. data/lib/legion/extensions/agentic/executive/inertia/helpers/constants.rb +45 -0
  115. data/lib/legion/extensions/agentic/executive/inertia/helpers/inertia_engine.rb +111 -0
  116. data/lib/legion/extensions/agentic/executive/inertia/runners/cognitive_inertia.rb +74 -0
  117. data/lib/legion/extensions/agentic/executive/inertia/version.rb +13 -0
  118. data/lib/legion/extensions/agentic/executive/inertia.rb +19 -0
  119. data/lib/legion/extensions/agentic/executive/inhibition/client.rb +27 -0
  120. data/lib/legion/extensions/agentic/executive/inhibition/helpers/constants.rb +36 -0
  121. data/lib/legion/extensions/agentic/executive/inhibition/helpers/impulse.rb +37 -0
  122. data/lib/legion/extensions/agentic/executive/inhibition/helpers/inhibition_model.rb +122 -0
  123. data/lib/legion/extensions/agentic/executive/inhibition/helpers/inhibition_store.rb +72 -0
  124. data/lib/legion/extensions/agentic/executive/inhibition/runners/inhibition.rb +155 -0
  125. data/lib/legion/extensions/agentic/executive/inhibition/version.rb +13 -0
  126. data/lib/legion/extensions/agentic/executive/inhibition.rb +20 -0
  127. data/lib/legion/extensions/agentic/executive/load/client.rb +25 -0
  128. data/lib/legion/extensions/agentic/executive/load/helpers/constants.rb +36 -0
  129. data/lib/legion/extensions/agentic/executive/load/helpers/load_model.rb +146 -0
  130. data/lib/legion/extensions/agentic/executive/load/runners/cognitive_load.rb +120 -0
  131. data/lib/legion/extensions/agentic/executive/load/version.rb +13 -0
  132. data/lib/legion/extensions/agentic/executive/load.rb +18 -0
  133. data/lib/legion/extensions/agentic/executive/load_balancing/client.rb +19 -0
  134. data/lib/legion/extensions/agentic/executive/load_balancing/helpers/constants.rb +44 -0
  135. data/lib/legion/extensions/agentic/executive/load_balancing/helpers/load_balancer.rb +137 -0
  136. data/lib/legion/extensions/agentic/executive/load_balancing/helpers/subsystem.rb +101 -0
  137. data/lib/legion/extensions/agentic/executive/load_balancing/runners/cognitive_load_balancing.rb +69 -0
  138. data/lib/legion/extensions/agentic/executive/load_balancing/version.rb +13 -0
  139. data/lib/legion/extensions/agentic/executive/load_balancing.rb +19 -0
  140. data/lib/legion/extensions/agentic/executive/planning/client.rb +27 -0
  141. data/lib/legion/extensions/agentic/executive/planning/helpers/constants.rb +26 -0
  142. data/lib/legion/extensions/agentic/executive/planning/helpers/plan.rb +110 -0
  143. data/lib/legion/extensions/agentic/executive/planning/helpers/plan_step.rb +82 -0
  144. data/lib/legion/extensions/agentic/executive/planning/helpers/plan_store.rb +161 -0
  145. data/lib/legion/extensions/agentic/executive/planning/runners/planning.rb +123 -0
  146. data/lib/legion/extensions/agentic/executive/planning/version.rb +13 -0
  147. data/lib/legion/extensions/agentic/executive/planning.rb +20 -0
  148. data/lib/legion/extensions/agentic/executive/prospective_memory/client.rb +28 -0
  149. data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/constants.rb +32 -0
  150. data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/intention.rb +94 -0
  151. data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/prospective_engine.rb +157 -0
  152. data/lib/legion/extensions/agentic/executive/prospective_memory/runners/prospective_memory.rb +146 -0
  153. data/lib/legion/extensions/agentic/executive/prospective_memory/version.rb +13 -0
  154. data/lib/legion/extensions/agentic/executive/prospective_memory.rb +19 -0
  155. data/lib/legion/extensions/agentic/executive/triage/client.rb +19 -0
  156. data/lib/legion/extensions/agentic/executive/triage/helpers/constants.rb +70 -0
  157. data/lib/legion/extensions/agentic/executive/triage/helpers/demand.rb +101 -0
  158. data/lib/legion/extensions/agentic/executive/triage/helpers/triage_engine.rb +150 -0
  159. data/lib/legion/extensions/agentic/executive/triage/runners/cognitive_triage.rb +110 -0
  160. data/lib/legion/extensions/agentic/executive/triage/version.rb +13 -0
  161. data/lib/legion/extensions/agentic/executive/triage.rb +19 -0
  162. data/lib/legion/extensions/agentic/executive/version.rb +11 -0
  163. data/lib/legion/extensions/agentic/executive/volition/client.rb +27 -0
  164. data/lib/legion/extensions/agentic/executive/volition/helpers/constants.rb +51 -0
  165. data/lib/legion/extensions/agentic/executive/volition/helpers/drive_synthesizer.rb +158 -0
  166. data/lib/legion/extensions/agentic/executive/volition/helpers/intention.rb +56 -0
  167. data/lib/legion/extensions/agentic/executive/volition/helpers/intention_stack.rb +140 -0
  168. data/lib/legion/extensions/agentic/executive/volition/runners/volition.rb +129 -0
  169. data/lib/legion/extensions/agentic/executive/volition/version.rb +13 -0
  170. data/lib/legion/extensions/agentic/executive/volition.rb +20 -0
  171. data/lib/legion/extensions/agentic/executive/working_memory/client.rb +21 -0
  172. data/lib/legion/extensions/agentic/executive/working_memory/helpers/buffer.rb +124 -0
  173. data/lib/legion/extensions/agentic/executive/working_memory/helpers/buffer_item.rb +72 -0
  174. data/lib/legion/extensions/agentic/executive/working_memory/helpers/constants.rb +47 -0
  175. data/lib/legion/extensions/agentic/executive/working_memory/runners/working_memory.rb +102 -0
  176. data/lib/legion/extensions/agentic/executive/working_memory/version.rb +13 -0
  177. data/lib/legion/extensions/agentic/executive/working_memory.rb +19 -0
  178. data/lib/legion/extensions/agentic/executive.rb +40 -0
  179. data/spec/legion/extensions/agentic/executive/autopilot/client_spec.rb +21 -0
  180. data/spec/legion/extensions/agentic/executive/autopilot/cognitive_autopilot_spec.rb +7 -0
  181. data/spec/legion/extensions/agentic/executive/autopilot/helpers/autopilot_engine_spec.rb +166 -0
  182. data/spec/legion/extensions/agentic/executive/autopilot/helpers/constants_spec.rb +37 -0
  183. data/spec/legion/extensions/agentic/executive/autopilot/helpers/mode_event_spec.rb +30 -0
  184. data/spec/legion/extensions/agentic/executive/autopilot/helpers/routine_spec.rb +133 -0
  185. data/spec/legion/extensions/agentic/executive/autopilot/runners_spec.rb +108 -0
  186. data/spec/legion/extensions/agentic/executive/chunking/client_spec.rb +67 -0
  187. data/spec/legion/extensions/agentic/executive/chunking/helpers/chunk_spec.rb +187 -0
  188. data/spec/legion/extensions/agentic/executive/chunking/helpers/chunking_engine_spec.rb +290 -0
  189. data/spec/legion/extensions/agentic/executive/chunking/helpers/constants_spec.rb +116 -0
  190. data/spec/legion/extensions/agentic/executive/chunking/helpers/information_item_spec.rb +75 -0
  191. data/spec/legion/extensions/agentic/executive/chunking/runners/cognitive_chunking_spec.rb +169 -0
  192. data/spec/legion/extensions/agentic/executive/cognitive_debt/client_spec.rb +73 -0
  193. data/spec/legion/extensions/agentic/executive/cognitive_debt/cognitive_debt_spec.rb +15 -0
  194. data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/constants_spec.rb +78 -0
  195. data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_engine_spec.rb +297 -0
  196. data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_item_spec.rb +233 -0
  197. data/spec/legion/extensions/agentic/executive/cognitive_debt/runners/cognitive_debt_spec.rb +196 -0
  198. data/spec/legion/extensions/agentic/executive/compass/client_spec.rb +16 -0
  199. data/spec/legion/extensions/agentic/executive/compass/helpers/bearing_spec.rb +93 -0
  200. data/spec/legion/extensions/agentic/executive/compass/helpers/compass_engine_spec.rb +113 -0
  201. data/spec/legion/extensions/agentic/executive/compass/helpers/constants_spec.rb +45 -0
  202. data/spec/legion/extensions/agentic/executive/compass/helpers/magnetic_bias_spec.rb +103 -0
  203. data/spec/legion/extensions/agentic/executive/compass/runners/cognitive_compass_spec.rb +80 -0
  204. data/spec/legion/extensions/agentic/executive/control/client_spec.rb +23 -0
  205. data/spec/legion/extensions/agentic/executive/control/helpers/control_signal_spec.rb +118 -0
  206. data/spec/legion/extensions/agentic/executive/control/helpers/controller_spec.rb +167 -0
  207. data/spec/legion/extensions/agentic/executive/control/helpers/goal_spec.rb +99 -0
  208. data/spec/legion/extensions/agentic/executive/control/runners/cognitive_control_spec.rb +107 -0
  209. data/spec/legion/extensions/agentic/executive/decision_fatigue/client_spec.rb +24 -0
  210. data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/constants_spec.rb +93 -0
  211. data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/decision_record_spec.rb +89 -0
  212. data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/fatigue_engine_spec.rb +216 -0
  213. data/spec/legion/extensions/agentic/executive/decision_fatigue/runners/decision_fatigue_spec.rb +180 -0
  214. data/spec/legion/extensions/agentic/executive/disengagement/helpers/constants_spec.rb +81 -0
  215. data/spec/legion/extensions/agentic/executive/disengagement/helpers/disengagement_engine_spec.rb +213 -0
  216. data/spec/legion/extensions/agentic/executive/disengagement/helpers/goal_spec.rb +289 -0
  217. data/spec/legion/extensions/agentic/executive/disengagement/runners/cognitive_disengagement_spec.rb +215 -0
  218. data/spec/legion/extensions/agentic/executive/dissonance_resolution/client_spec.rb +20 -0
  219. data/spec/legion/extensions/agentic/executive/dissonance_resolution/helpers/dissonance_conflict_spec.rb +107 -0
  220. data/spec/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine_spec.rb +122 -0
  221. data/spec/legion/extensions/agentic/executive/dissonance_resolution/runners/cognitive_dissonance_resolution_spec.rb +49 -0
  222. data/spec/legion/extensions/agentic/executive/dual_process/client_spec.rb +74 -0
  223. data/spec/legion/extensions/agentic/executive/dual_process/helpers/constants_spec.rb +55 -0
  224. data/spec/legion/extensions/agentic/executive/dual_process/helpers/decision_spec.rb +76 -0
  225. data/spec/legion/extensions/agentic/executive/dual_process/helpers/dual_process_engine_spec.rb +274 -0
  226. data/spec/legion/extensions/agentic/executive/dual_process/helpers/heuristic_spec.rb +144 -0
  227. data/spec/legion/extensions/agentic/executive/dual_process/runners/dual_process_spec.rb +188 -0
  228. data/spec/legion/extensions/agentic/executive/dwell/cognitive_dwell_spec.rb +7 -0
  229. data/spec/legion/extensions/agentic/executive/dwell/helpers/dwell_engine_spec.rb +136 -0
  230. data/spec/legion/extensions/agentic/executive/dwell/helpers/dwell_topic_spec.rb +152 -0
  231. data/spec/legion/extensions/agentic/executive/executive_function/client_spec.rb +40 -0
  232. data/spec/legion/extensions/agentic/executive/executive_function/helpers/ef_component_spec.rb +108 -0
  233. data/spec/legion/extensions/agentic/executive/executive_function/helpers/executive_controller_spec.rb +136 -0
  234. data/spec/legion/extensions/agentic/executive/executive_function/runners/executive_function_spec.rb +191 -0
  235. data/spec/legion/extensions/agentic/executive/flexibility/client_spec.rb +20 -0
  236. data/spec/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine_spec.rb +119 -0
  237. data/spec/legion/extensions/agentic/executive/flexibility/helpers/task_set_spec.rb +87 -0
  238. data/spec/legion/extensions/agentic/executive/flexibility/runners/cognitive_flexibility_spec.rb +69 -0
  239. data/spec/legion/extensions/agentic/executive/flexibility_training/client_spec.rb +39 -0
  240. data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/constants_spec.rb +67 -0
  241. data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/flexibility_engine_spec.rb +209 -0
  242. data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/switch_trial_spec.rb +77 -0
  243. data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/training_task_spec.rb +97 -0
  244. data/spec/legion/extensions/agentic/executive/flexibility_training/runners/cognitive_flexibility_training_spec.rb +171 -0
  245. data/spec/legion/extensions/agentic/executive/goal_management/client_spec.rb +34 -0
  246. data/spec/legion/extensions/agentic/executive/goal_management/goal_management_spec.rb +11 -0
  247. data/spec/legion/extensions/agentic/executive/goal_management/helpers/constants_spec.rb +94 -0
  248. data/spec/legion/extensions/agentic/executive/goal_management/helpers/goal_engine_spec.rb +358 -0
  249. data/spec/legion/extensions/agentic/executive/goal_management/helpers/goal_spec.rb +283 -0
  250. data/spec/legion/extensions/agentic/executive/goal_management/runners/goal_management_spec.rb +244 -0
  251. data/spec/legion/extensions/agentic/executive/inertia/helpers/belief_spec.rb +128 -0
  252. data/spec/legion/extensions/agentic/executive/inertia/helpers/inertia_engine_spec.rb +104 -0
  253. data/spec/legion/extensions/agentic/executive/inertia/runners/cognitive_inertia_spec.rb +59 -0
  254. data/spec/legion/extensions/agentic/executive/inhibition/client_spec.rb +43 -0
  255. data/spec/legion/extensions/agentic/executive/inhibition/helpers/constants_spec.rb +108 -0
  256. data/spec/legion/extensions/agentic/executive/inhibition/helpers/impulse_spec.rb +101 -0
  257. data/spec/legion/extensions/agentic/executive/inhibition/helpers/inhibition_model_spec.rb +245 -0
  258. data/spec/legion/extensions/agentic/executive/inhibition/helpers/inhibition_store_spec.rb +126 -0
  259. data/spec/legion/extensions/agentic/executive/inhibition/runners/inhibition_spec.rb +242 -0
  260. data/spec/legion/extensions/agentic/executive/load/client_spec.rb +94 -0
  261. data/spec/legion/extensions/agentic/executive/load/helpers/constants_spec.rb +62 -0
  262. data/spec/legion/extensions/agentic/executive/load/helpers/load_model_spec.rb +314 -0
  263. data/spec/legion/extensions/agentic/executive/load/runners/cognitive_load_spec.rb +231 -0
  264. data/spec/legion/extensions/agentic/executive/load_balancing/client_spec.rb +20 -0
  265. data/spec/legion/extensions/agentic/executive/load_balancing/helpers/load_balancer_spec.rb +106 -0
  266. data/spec/legion/extensions/agentic/executive/load_balancing/helpers/subsystem_spec.rb +106 -0
  267. data/spec/legion/extensions/agentic/executive/load_balancing/runners/cognitive_load_balancing_spec.rb +52 -0
  268. data/spec/legion/extensions/agentic/executive/planning/client_spec.rb +91 -0
  269. data/spec/legion/extensions/agentic/executive/planning/helpers/constants_spec.rb +91 -0
  270. data/spec/legion/extensions/agentic/executive/planning/helpers/plan_spec.rb +230 -0
  271. data/spec/legion/extensions/agentic/executive/planning/helpers/plan_step_spec.rb +159 -0
  272. data/spec/legion/extensions/agentic/executive/planning/helpers/plan_store_spec.rb +317 -0
  273. data/spec/legion/extensions/agentic/executive/planning/runners/planning_spec.rb +217 -0
  274. data/spec/legion/extensions/agentic/executive/prospective_memory/client_spec.rb +24 -0
  275. data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/constants_spec.rb +84 -0
  276. data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/intention_spec.rb +194 -0
  277. data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/prospective_engine_spec.rb +255 -0
  278. data/spec/legion/extensions/agentic/executive/prospective_memory/runners/prospective_memory_spec.rb +220 -0
  279. data/spec/legion/extensions/agentic/executive/triage/client_spec.rb +28 -0
  280. data/spec/legion/extensions/agentic/executive/triage/cognitive_triage_spec.rb +7 -0
  281. data/spec/legion/extensions/agentic/executive/triage/helpers/constants_spec.rb +41 -0
  282. data/spec/legion/extensions/agentic/executive/triage/helpers/demand_spec.rb +139 -0
  283. data/spec/legion/extensions/agentic/executive/triage/helpers/triage_engine_spec.rb +183 -0
  284. data/spec/legion/extensions/agentic/executive/triage/runners_spec.rb +127 -0
  285. data/spec/legion/extensions/agentic/executive/volition/client_spec.rb +25 -0
  286. data/spec/legion/extensions/agentic/executive/volition/helpers/drive_synthesizer_spec.rb +99 -0
  287. data/spec/legion/extensions/agentic/executive/volition/helpers/intention_spec.rb +93 -0
  288. data/spec/legion/extensions/agentic/executive/volition/helpers/intention_stack_spec.rb +129 -0
  289. data/spec/legion/extensions/agentic/executive/volition/runners/volition_spec.rb +135 -0
  290. data/spec/legion/extensions/agentic/executive/working_memory/client_spec.rb +93 -0
  291. data/spec/legion/extensions/agentic/executive/working_memory/helpers/buffer_item_spec.rb +185 -0
  292. data/spec/legion/extensions/agentic/executive/working_memory/helpers/buffer_spec.rb +232 -0
  293. data/spec/legion/extensions/agentic/executive/working_memory/helpers/constants_spec.rb +99 -0
  294. data/spec/legion/extensions/agentic/executive/working_memory/runners/working_memory_spec.rb +191 -0
  295. data/spec/spec_helper.rb +46 -0
  296. metadata +380 -0
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Executive
9
+ module Inertia
10
+ module Helpers
11
+ class Belief
12
+ include Constants
13
+
14
+ attr_reader :id, :content, :domain, :conviction, :inertia,
15
+ :challenges_resisted, :challenges_accepted, :created_at
16
+
17
+ def initialize(content:, domain: :factual, conviction: 0.5)
18
+ @id = SecureRandom.uuid
19
+ @content = content
20
+ @domain = domain.to_sym
21
+ @conviction = conviction.to_f.clamp(0.0, 1.0)
22
+ @inertia = DEFAULT_INERTIA
23
+ @challenges_resisted = 0
24
+ @challenges_accepted = 0
25
+ @created_at = Time.now.utc
26
+ end
27
+
28
+ def challenge!(strength: 0.5)
29
+ effective = (strength * (1.0 - @inertia)).round(10)
30
+ if effective > @conviction * 0.5
31
+ @conviction = (@conviction - (effective * 0.3)).clamp(0.0, 1.0).round(10)
32
+ @challenges_accepted += 1
33
+ @inertia = (@inertia - INERTIA_REDUCTION_RATE).clamp(0.0, 1.0).round(10)
34
+ :accepted
35
+ else
36
+ @challenges_resisted += 1
37
+ @inertia = (@inertia + INERTIA_GROWTH_RATE).clamp(0.0, 1.0).round(10)
38
+ :resisted
39
+ end
40
+ end
41
+
42
+ def reinforce!(amount: 0.1)
43
+ @conviction = (@conviction + amount).clamp(0.0, 1.0).round(10)
44
+ @inertia = (@inertia + INERTIA_GROWTH_RATE).clamp(0.0, 1.0).round(10)
45
+ self
46
+ end
47
+
48
+ def entrenched?
49
+ @inertia >= CONVICTION_THRESHOLD
50
+ end
51
+
52
+ def flexible?
53
+ @inertia <= FLEXIBILITY_THRESHOLD
54
+ end
55
+
56
+ def total_challenges
57
+ @challenges_resisted + @challenges_accepted
58
+ end
59
+
60
+ def resistance_rate
61
+ return 0.0 if total_challenges.zero?
62
+
63
+ (@challenges_resisted.to_f / total_challenges).round(4)
64
+ end
65
+
66
+ def inertia_label
67
+ match = INERTIA_LABELS.find { |range, _| range.cover?(@inertia) }
68
+ match ? match.last : :fluid
69
+ end
70
+
71
+ def conviction_label
72
+ match = CONVICTION_LABELS.find { |range, _| range.cover?(@conviction) }
73
+ match ? match.last : :uncertain
74
+ end
75
+
76
+ def to_h
77
+ {
78
+ id: @id,
79
+ content: @content,
80
+ domain: @domain,
81
+ conviction: @conviction,
82
+ conviction_label: conviction_label,
83
+ inertia: @inertia,
84
+ inertia_label: inertia_label,
85
+ entrenched: entrenched?,
86
+ flexible: flexible?,
87
+ challenges_resisted: @challenges_resisted,
88
+ challenges_accepted: @challenges_accepted,
89
+ resistance_rate: resistance_rate,
90
+ created_at: @created_at
91
+ }
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Executive
7
+ module Inertia
8
+ module Helpers
9
+ module Constants
10
+ MAX_BELIEFS = 300
11
+ MAX_CHALLENGES = 500
12
+
13
+ DEFAULT_INERTIA = 0.5
14
+ INERTIA_GROWTH_RATE = 0.03
15
+ INERTIA_REDUCTION_RATE = 0.05
16
+ CONVICTION_THRESHOLD = 0.8
17
+ FLEXIBILITY_THRESHOLD = 0.3
18
+
19
+ INERTIA_LABELS = {
20
+ (0.8..) => :entrenched,
21
+ (0.6...0.8) => :resistant,
22
+ (0.4...0.6) => :moderate,
23
+ (0.2...0.4) => :flexible,
24
+ (..0.2) => :fluid
25
+ }.freeze
26
+
27
+ CONVICTION_LABELS = {
28
+ (0.8..) => :absolute,
29
+ (0.6...0.8) => :strong,
30
+ (0.4...0.6) => :moderate,
31
+ (0.2...0.4) => :tentative,
32
+ (..0.2) => :uncertain
33
+ }.freeze
34
+
35
+ BELIEF_DOMAINS = %i[
36
+ factual causal procedural evaluative
37
+ social predictive normative
38
+ ].freeze
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Executive
7
+ module Inertia
8
+ module Helpers
9
+ class InertiaEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @beliefs = {}
14
+ end
15
+
16
+ def form_belief(content:, domain: :factual, conviction: 0.5)
17
+ prune_if_needed
18
+ belief = Belief.new(content: content, domain: domain, conviction: conviction)
19
+ @beliefs[belief.id] = belief
20
+ belief
21
+ end
22
+
23
+ def challenge_belief(belief_id:, strength: 0.5)
24
+ belief = @beliefs[belief_id]
25
+ return nil unless belief
26
+
27
+ outcome = belief.challenge!(strength: strength)
28
+ { outcome: outcome, belief: belief }
29
+ end
30
+
31
+ def reinforce_belief(belief_id:, amount: 0.1)
32
+ belief = @beliefs[belief_id]
33
+ return nil unless belief
34
+
35
+ belief.reinforce!(amount: amount)
36
+ end
37
+
38
+ def entrenched_beliefs
39
+ @beliefs.values.select(&:entrenched?)
40
+ end
41
+
42
+ def flexible_beliefs
43
+ @beliefs.values.select(&:flexible?)
44
+ end
45
+
46
+ def beliefs_by_domain(domain:)
47
+ d = domain.to_sym
48
+ @beliefs.values.select { |b| b.domain == d }
49
+ end
50
+
51
+ def most_resistant(limit: 5)
52
+ @beliefs.values.sort_by { |b| -b.resistance_rate }.first(limit)
53
+ end
54
+
55
+ def average_inertia
56
+ return DEFAULT_INERTIA if @beliefs.empty?
57
+
58
+ inertias = @beliefs.values.map(&:inertia)
59
+ (inertias.sum / inertias.size).round(10)
60
+ end
61
+
62
+ def average_conviction
63
+ return 0.5 if @beliefs.empty?
64
+
65
+ convictions = @beliefs.values.map(&:conviction)
66
+ (convictions.sum / convictions.size).round(10)
67
+ end
68
+
69
+ def overall_flexibility
70
+ return 0.5 if @beliefs.empty?
71
+
72
+ (1.0 - average_inertia).round(10)
73
+ end
74
+
75
+ def inertia_report
76
+ {
77
+ total_beliefs: @beliefs.size,
78
+ entrenched_count: entrenched_beliefs.size,
79
+ flexible_count: flexible_beliefs.size,
80
+ average_inertia: average_inertia,
81
+ average_conviction: average_conviction,
82
+ overall_flexibility: overall_flexibility,
83
+ most_resistant: most_resistant(limit: 3).map(&:to_h)
84
+ }
85
+ end
86
+
87
+ def to_h
88
+ {
89
+ total_beliefs: @beliefs.size,
90
+ entrenched_count: entrenched_beliefs.size,
91
+ flexible_count: flexible_beliefs.size,
92
+ average_inertia: average_inertia,
93
+ overall_flexibility: overall_flexibility
94
+ }
95
+ end
96
+
97
+ private
98
+
99
+ def prune_if_needed
100
+ return if @beliefs.size < MAX_BELIEFS
101
+
102
+ most_flexible = @beliefs.values.min_by(&:inertia)
103
+ @beliefs.delete(most_flexible.id) if most_flexible
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Executive
7
+ module Inertia
8
+ module Runners
9
+ module CognitiveInertia
10
+ include Helpers::Constants
11
+
12
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
13
+
14
+ def form_belief(content:, engine: nil, domain: :factual, conviction: 0.5, **)
15
+ eng = engine || default_engine
16
+ belief = eng.form_belief(content: content, domain: domain, conviction: conviction)
17
+ { success: true, belief: belief.to_h }
18
+ end
19
+
20
+ def challenge_belief(belief_id:, engine: nil, strength: 0.5, **)
21
+ eng = engine || default_engine
22
+ result = eng.challenge_belief(belief_id: belief_id, strength: strength)
23
+ return { success: false, error: 'belief not found' } unless result
24
+
25
+ { success: true, outcome: result[:outcome], belief: result[:belief].to_h }
26
+ end
27
+
28
+ def reinforce_belief(belief_id:, engine: nil, amount: 0.1, **)
29
+ eng = engine || default_engine
30
+ result = eng.reinforce_belief(belief_id: belief_id, amount: amount)
31
+ return { success: false, error: 'belief not found' } unless result
32
+
33
+ { success: true, belief: result.to_h }
34
+ end
35
+
36
+ def entrenched_beliefs(engine: nil, **)
37
+ eng = engine || default_engine
38
+ beliefs = eng.entrenched_beliefs.map(&:to_h)
39
+ { success: true, beliefs: beliefs, count: beliefs.size }
40
+ end
41
+
42
+ def flexible_beliefs(engine: nil, **)
43
+ eng = engine || default_engine
44
+ beliefs = eng.flexible_beliefs.map(&:to_h)
45
+ { success: true, beliefs: beliefs, count: beliefs.size }
46
+ end
47
+
48
+ def average_inertia(engine: nil, **)
49
+ eng = engine || default_engine
50
+ { success: true, inertia: eng.average_inertia }
51
+ end
52
+
53
+ def overall_flexibility(engine: nil, **)
54
+ eng = engine || default_engine
55
+ { success: true, flexibility: eng.overall_flexibility }
56
+ end
57
+
58
+ def inertia_report(engine: nil, **)
59
+ eng = engine || default_engine
60
+ { success: true, report: eng.inertia_report }
61
+ end
62
+
63
+ private
64
+
65
+ def default_engine
66
+ @default_engine ||= Helpers::InertiaEngine.new
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Executive
7
+ module Inertia
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'inertia/version'
4
+ require_relative 'inertia/helpers/constants'
5
+ require_relative 'inertia/helpers/belief'
6
+ require_relative 'inertia/helpers/inertia_engine'
7
+ require_relative 'inertia/runners/cognitive_inertia'
8
+ require_relative 'inertia/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Executive
14
+ module Inertia
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/executive/inhibition/helpers/constants'
4
+ require 'legion/extensions/agentic/executive/inhibition/helpers/impulse'
5
+ require 'legion/extensions/agentic/executive/inhibition/helpers/inhibition_model'
6
+ require 'legion/extensions/agentic/executive/inhibition/helpers/inhibition_store'
7
+ require 'legion/extensions/agentic/executive/inhibition/runners/inhibition'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Agentic
12
+ module Executive
13
+ module Inhibition
14
+ class Client
15
+ include Runners::Inhibition
16
+
17
+ attr_reader :inhibition_store
18
+
19
+ def initialize(inhibition_store: nil, **)
20
+ @inhibition_store = inhibition_store || Helpers::InhibitionStore.new
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Executive
7
+ module Inhibition
8
+ module Helpers
9
+ module Constants
10
+ IMPULSE_TYPES = %i[reactive habitual emotional social competitive].freeze
11
+
12
+ INHIBITION_STRATEGIES = %i[suppression delay redirect substitute defer].freeze
13
+
14
+ IMPULSE_STRENGTHS = {
15
+ overwhelming: 1.0,
16
+ strong: 0.75,
17
+ moderate: 0.5,
18
+ mild: 0.25,
19
+ negligible: 0.1
20
+ }.freeze
21
+
22
+ INHIBITION_ALPHA = 0.12
23
+ FATIGUE_PER_INHIBITION = 0.05
24
+ FATIGUE_RECOVERY_RATE = 0.02
25
+ MAX_INHIBITION_LOG = 200
26
+ WILLPOWER_THRESHOLD = 0.3
27
+ AUTOMATIC_SUPPRESS_THRESHOLD = 0.2
28
+ DELAY_DISCOUNT_RATE = 0.1
29
+ STROOP_CONFLICT_THRESHOLD = 0.6
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Executive
9
+ module Inhibition
10
+ module Helpers
11
+ class Impulse
12
+ attr_reader :id, :type, :action, :strength, :source, :context, :created_at
13
+
14
+ def initialize(type:, action:, strength:, source: nil, context: {})
15
+ @id = SecureRandom.uuid
16
+ @type = type
17
+ @action = action
18
+ @strength = strength
19
+ @source = source
20
+ @context = context
21
+ @created_at = Time.now.utc
22
+ end
23
+
24
+ def overwhelming?
25
+ @strength >= Constants::IMPULSE_STRENGTHS[:strong]
26
+ end
27
+
28
+ def auto_suppressible?
29
+ @strength <= Constants::AUTOMATIC_SUPPRESS_THRESHOLD
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Executive
7
+ module Inhibition
8
+ module Helpers
9
+ class InhibitionModel
10
+ attr_reader :willpower, :inhibition_log, :suppressed_count, :failed_count, :redirected_count
11
+
12
+ def initialize
13
+ @willpower = 0.8
14
+ @inhibition_log = []
15
+ @suppressed_count = 0
16
+ @failed_count = 0
17
+ @redirected_count = 0
18
+ end
19
+
20
+ def evaluate_impulse(impulse)
21
+ if impulse.auto_suppressible?
22
+ :auto_suppress
23
+ elsif @willpower < Constants::WILLPOWER_THRESHOLD
24
+ :failed
25
+ else
26
+ select_strategy(impulse)
27
+ end
28
+ end
29
+
30
+ def apply_strategy(impulse, strategy)
31
+ deplete_willpower(impulse.strength) unless strategy == :auto_suppress
32
+
33
+ case strategy
34
+ when :failed
35
+ @failed_count += 1
36
+ when :redirect
37
+ @redirected_count += 1
38
+ @suppressed_count += 1
39
+ else
40
+ @suppressed_count += 1
41
+ end
42
+
43
+ entry = {
44
+ impulse_id: impulse.id,
45
+ type: impulse.type,
46
+ action: impulse.action,
47
+ strength: impulse.strength,
48
+ strategy: strategy,
49
+ willpower: @willpower.round(4),
50
+ at: Time.now.utc
51
+ }
52
+
53
+ @inhibition_log << entry
54
+ @inhibition_log.shift while @inhibition_log.size > Constants::MAX_INHIBITION_LOG
55
+
56
+ entry
57
+ end
58
+
59
+ def recover_willpower
60
+ @willpower = [@willpower + Constants::FATIGUE_RECOVERY_RATE, 1.0].min
61
+ end
62
+
63
+ def willpower_status
64
+ if @willpower >= 0.6
65
+ :healthy
66
+ elsif @willpower >= Constants::WILLPOWER_THRESHOLD
67
+ :depleted
68
+ else
69
+ :exhausted
70
+ end
71
+ end
72
+
73
+ def success_rate
74
+ total = @suppressed_count + @failed_count
75
+ return 1.0 if total.zero?
76
+
77
+ @suppressed_count.to_f / total
78
+ end
79
+
80
+ def delay_discount(reward_value, delay_ticks)
81
+ reward_value / (1.0 + (Constants::DELAY_DISCOUNT_RATE * delay_ticks))
82
+ end
83
+
84
+ def stroop_conflict?(automatic_response, controlled_response)
85
+ automatic_response != controlled_response &&
86
+ automatic_strength(automatic_response) >= Constants::STROOP_CONFLICT_THRESHOLD
87
+ end
88
+
89
+ private
90
+
91
+ def select_strategy(impulse)
92
+ case impulse.type
93
+ when :habitual
94
+ :redirect
95
+ when :emotional
96
+ impulse.overwhelming? ? :delay : :suppression
97
+ when :social
98
+ :substitute
99
+ when :competitive
100
+ :defer
101
+ else
102
+ :suppression
103
+ end
104
+ end
105
+
106
+ def deplete_willpower(strength)
107
+ depletion = Constants::FATIGUE_PER_INHIBITION * strength
108
+ @willpower = [@willpower - depletion, 0.0].max
109
+ end
110
+
111
+ def automatic_strength(response)
112
+ return response[:strength] if response.is_a?(Hash) && response.key?(:strength)
113
+
114
+ Constants::STROOP_CONFLICT_THRESHOLD
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Executive
7
+ module Inhibition
8
+ module Helpers
9
+ class InhibitionStore
10
+ attr_reader :model, :impulses
11
+
12
+ def initialize
13
+ @model = InhibitionModel.new
14
+ @impulses = []
15
+ end
16
+
17
+ def create_impulse(type:, action:, strength:, source: nil, context: {})
18
+ resolved_strength = resolve_strength(strength)
19
+
20
+ impulse = Impulse.new(
21
+ type: type,
22
+ action: action,
23
+ strength: resolved_strength,
24
+ source: source,
25
+ context: context
26
+ )
27
+
28
+ @impulses << impulse
29
+ impulse
30
+ end
31
+
32
+ def evaluate_and_apply(impulse)
33
+ strategy = @model.evaluate_impulse(impulse)
34
+ entry = @model.apply_strategy(impulse, strategy)
35
+ { strategy: strategy, log_entry: entry }
36
+ end
37
+
38
+ def recover
39
+ @model.recover_willpower
40
+ end
41
+
42
+ def stats
43
+ {
44
+ willpower: @model.willpower.round(4),
45
+ willpower_status: @model.willpower_status,
46
+ suppressed: @model.suppressed_count,
47
+ failed: @model.failed_count,
48
+ redirected: @model.redirected_count,
49
+ success_rate: @model.success_rate.round(4),
50
+ log_size: @model.inhibition_log.size,
51
+ total_impulses: @impulses.size
52
+ }
53
+ end
54
+
55
+ def recent_log(limit = 20)
56
+ @model.inhibition_log.last(limit)
57
+ end
58
+
59
+ private
60
+
61
+ def resolve_strength(strength)
62
+ return strength if strength.is_a?(Float) || strength.is_a?(Integer)
63
+
64
+ Constants::IMPULSE_STRENGTHS.fetch(strength.to_sym, Constants::IMPULSE_STRENGTHS[:moderate])
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end