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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +12 -0
- data/Gemfile +5 -0
- data/LICENSE +21 -0
- data/README.md +13 -0
- data/lex-agentic-executive.gemspec +30 -0
- data/lib/legion/extensions/agentic/executive/autopilot/client.rb +19 -0
- data/lib/legion/extensions/agentic/executive/autopilot/helpers/autopilot_engine.rb +161 -0
- data/lib/legion/extensions/agentic/executive/autopilot/helpers/constants.rb +62 -0
- data/lib/legion/extensions/agentic/executive/autopilot/helpers/mode_event.rb +51 -0
- data/lib/legion/extensions/agentic/executive/autopilot/helpers/routine.rb +91 -0
- data/lib/legion/extensions/agentic/executive/autopilot/runners/cognitive_autopilot.rb +93 -0
- data/lib/legion/extensions/agentic/executive/autopilot/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/autopilot.rb +20 -0
- data/lib/legion/extensions/agentic/executive/chunking/client.rb +21 -0
- data/lib/legion/extensions/agentic/executive/chunking/helpers/chunk.rb +92 -0
- data/lib/legion/extensions/agentic/executive/chunking/helpers/chunking_engine.rb +147 -0
- data/lib/legion/extensions/agentic/executive/chunking/helpers/constants.rb +56 -0
- data/lib/legion/extensions/agentic/executive/chunking/helpers/information_item.rb +51 -0
- data/lib/legion/extensions/agentic/executive/chunking/runners/cognitive_chunking.rb +111 -0
- data/lib/legion/extensions/agentic/executive/chunking/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/chunking.rb +21 -0
- data/lib/legion/extensions/agentic/executive/cognitive_debt/client.rb +28 -0
- data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/constants.rb +36 -0
- data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_engine.rb +118 -0
- data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_item.rb +83 -0
- data/lib/legion/extensions/agentic/executive/cognitive_debt/runners/cognitive_debt.rb +84 -0
- data/lib/legion/extensions/agentic/executive/cognitive_debt/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/cognitive_debt.rb +19 -0
- data/lib/legion/extensions/agentic/executive/compass/client.rb +15 -0
- data/lib/legion/extensions/agentic/executive/compass/helpers/bearing.rb +79 -0
- data/lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb +108 -0
- data/lib/legion/extensions/agentic/executive/compass/helpers/constants.rb +65 -0
- data/lib/legion/extensions/agentic/executive/compass/helpers/magnetic_bias.rb +81 -0
- data/lib/legion/extensions/agentic/executive/compass/runners/cognitive_compass.rb +76 -0
- data/lib/legion/extensions/agentic/executive/compass/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/compass.rb +22 -0
- data/lib/legion/extensions/agentic/executive/control/client.rb +19 -0
- data/lib/legion/extensions/agentic/executive/control/helpers/constants.rb +45 -0
- data/lib/legion/extensions/agentic/executive/control/helpers/control_signal.rb +79 -0
- data/lib/legion/extensions/agentic/executive/control/helpers/controller.rb +140 -0
- data/lib/legion/extensions/agentic/executive/control/helpers/goal.rb +72 -0
- data/lib/legion/extensions/agentic/executive/control/runners/cognitive_control.rb +74 -0
- data/lib/legion/extensions/agentic/executive/control/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/control.rb +21 -0
- data/lib/legion/extensions/agentic/executive/decision_fatigue/client.rb +28 -0
- data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/constants.rb +51 -0
- data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/decision_record.rb +50 -0
- data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/fatigue_engine.rb +114 -0
- data/lib/legion/extensions/agentic/executive/decision_fatigue/runners/decision_fatigue.rb +94 -0
- data/lib/legion/extensions/agentic/executive/decision_fatigue/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/decision_fatigue.rb +19 -0
- data/lib/legion/extensions/agentic/executive/disengagement/client.rb +24 -0
- data/lib/legion/extensions/agentic/executive/disengagement/helpers/constants.rb +48 -0
- data/lib/legion/extensions/agentic/executive/disengagement/helpers/disengagement_engine.rb +101 -0
- data/lib/legion/extensions/agentic/executive/disengagement/helpers/goal.rb +105 -0
- data/lib/legion/extensions/agentic/executive/disengagement/runners/cognitive_disengagement.rb +90 -0
- data/lib/legion/extensions/agentic/executive/disengagement/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/disengagement.rb +19 -0
- data/lib/legion/extensions/agentic/executive/dissonance_resolution/client.rb +19 -0
- data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/constants.rb +38 -0
- data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/dissonance_conflict.rb +90 -0
- data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb +155 -0
- data/lib/legion/extensions/agentic/executive/dissonance_resolution/runners/cognitive_dissonance_resolution.rb +74 -0
- data/lib/legion/extensions/agentic/executive/dissonance_resolution/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/dissonance_resolution.rb +19 -0
- data/lib/legion/extensions/agentic/executive/dual_process/client.rb +25 -0
- data/lib/legion/extensions/agentic/executive/dual_process/helpers/constants.rb +44 -0
- data/lib/legion/extensions/agentic/executive/dual_process/helpers/decision.rb +50 -0
- data/lib/legion/extensions/agentic/executive/dual_process/helpers/dual_process_engine.rb +200 -0
- data/lib/legion/extensions/agentic/executive/dual_process/helpers/heuristic.rb +67 -0
- data/lib/legion/extensions/agentic/executive/dual_process/runners/dual_process.rb +87 -0
- data/lib/legion/extensions/agentic/executive/dual_process/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/dual_process.rb +20 -0
- data/lib/legion/extensions/agentic/executive/dwell/client.rb +19 -0
- data/lib/legion/extensions/agentic/executive/dwell/helpers/constants.rb +65 -0
- data/lib/legion/extensions/agentic/executive/dwell/helpers/dwell_engine.rb +126 -0
- data/lib/legion/extensions/agentic/executive/dwell/helpers/dwell_topic.rb +119 -0
- data/lib/legion/extensions/agentic/executive/dwell/runners/cognitive_dwell.rb +87 -0
- data/lib/legion/extensions/agentic/executive/dwell/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/dwell.rb +19 -0
- data/lib/legion/extensions/agentic/executive/executive_function/actors/recovery.rb +45 -0
- data/lib/legion/extensions/agentic/executive/executive_function/client.rb +27 -0
- data/lib/legion/extensions/agentic/executive/executive_function/helpers/ef_component.rb +58 -0
- data/lib/legion/extensions/agentic/executive/executive_function/helpers/executive_controller.rb +129 -0
- data/lib/legion/extensions/agentic/executive/executive_function/runners/executive_function.rb +104 -0
- data/lib/legion/extensions/agentic/executive/executive_function/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/executive_function.rb +18 -0
- data/lib/legion/extensions/agentic/executive/flexibility/actors/tick.rb +31 -0
- data/lib/legion/extensions/agentic/executive/flexibility/client.rb +28 -0
- data/lib/legion/extensions/agentic/executive/flexibility/helpers/constants.rb +39 -0
- data/lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb +109 -0
- data/lib/legion/extensions/agentic/executive/flexibility/helpers/task_set.rb +69 -0
- data/lib/legion/extensions/agentic/executive/flexibility/runners/cognitive_flexibility.rb +77 -0
- data/lib/legion/extensions/agentic/executive/flexibility/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/flexibility.rb +19 -0
- data/lib/legion/extensions/agentic/executive/flexibility_training/client.rb +29 -0
- data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/constants.rb +57 -0
- data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/flexibility_engine.rb +178 -0
- data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/switch_trial.rb +54 -0
- data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/training_task.rb +54 -0
- data/lib/legion/extensions/agentic/executive/flexibility_training/runners/cognitive_flexibility_training.rb +134 -0
- data/lib/legion/extensions/agentic/executive/flexibility_training/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/flexibility_training.rb +20 -0
- data/lib/legion/extensions/agentic/executive/goal_management/client.rb +28 -0
- data/lib/legion/extensions/agentic/executive/goal_management/helpers/constants.rb +49 -0
- data/lib/legion/extensions/agentic/executive/goal_management/helpers/goal.rb +153 -0
- data/lib/legion/extensions/agentic/executive/goal_management/helpers/goal_engine.rb +265 -0
- data/lib/legion/extensions/agentic/executive/goal_management/runners/goal_management.rb +169 -0
- data/lib/legion/extensions/agentic/executive/goal_management/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/goal_management.rb +19 -0
- data/lib/legion/extensions/agentic/executive/inertia/client.rb +15 -0
- data/lib/legion/extensions/agentic/executive/inertia/helpers/belief.rb +99 -0
- data/lib/legion/extensions/agentic/executive/inertia/helpers/constants.rb +45 -0
- data/lib/legion/extensions/agentic/executive/inertia/helpers/inertia_engine.rb +111 -0
- data/lib/legion/extensions/agentic/executive/inertia/runners/cognitive_inertia.rb +74 -0
- data/lib/legion/extensions/agentic/executive/inertia/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/inertia.rb +19 -0
- data/lib/legion/extensions/agentic/executive/inhibition/client.rb +27 -0
- data/lib/legion/extensions/agentic/executive/inhibition/helpers/constants.rb +36 -0
- data/lib/legion/extensions/agentic/executive/inhibition/helpers/impulse.rb +37 -0
- data/lib/legion/extensions/agentic/executive/inhibition/helpers/inhibition_model.rb +122 -0
- data/lib/legion/extensions/agentic/executive/inhibition/helpers/inhibition_store.rb +72 -0
- data/lib/legion/extensions/agentic/executive/inhibition/runners/inhibition.rb +155 -0
- data/lib/legion/extensions/agentic/executive/inhibition/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/inhibition.rb +20 -0
- data/lib/legion/extensions/agentic/executive/load/client.rb +25 -0
- data/lib/legion/extensions/agentic/executive/load/helpers/constants.rb +36 -0
- data/lib/legion/extensions/agentic/executive/load/helpers/load_model.rb +146 -0
- data/lib/legion/extensions/agentic/executive/load/runners/cognitive_load.rb +120 -0
- data/lib/legion/extensions/agentic/executive/load/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/load.rb +18 -0
- data/lib/legion/extensions/agentic/executive/load_balancing/client.rb +19 -0
- data/lib/legion/extensions/agentic/executive/load_balancing/helpers/constants.rb +44 -0
- data/lib/legion/extensions/agentic/executive/load_balancing/helpers/load_balancer.rb +137 -0
- data/lib/legion/extensions/agentic/executive/load_balancing/helpers/subsystem.rb +101 -0
- data/lib/legion/extensions/agentic/executive/load_balancing/runners/cognitive_load_balancing.rb +69 -0
- data/lib/legion/extensions/agentic/executive/load_balancing/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/load_balancing.rb +19 -0
- data/lib/legion/extensions/agentic/executive/planning/client.rb +27 -0
- data/lib/legion/extensions/agentic/executive/planning/helpers/constants.rb +26 -0
- data/lib/legion/extensions/agentic/executive/planning/helpers/plan.rb +110 -0
- data/lib/legion/extensions/agentic/executive/planning/helpers/plan_step.rb +82 -0
- data/lib/legion/extensions/agentic/executive/planning/helpers/plan_store.rb +161 -0
- data/lib/legion/extensions/agentic/executive/planning/runners/planning.rb +123 -0
- data/lib/legion/extensions/agentic/executive/planning/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/planning.rb +20 -0
- data/lib/legion/extensions/agentic/executive/prospective_memory/client.rb +28 -0
- data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/constants.rb +32 -0
- data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/intention.rb +94 -0
- data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/prospective_engine.rb +157 -0
- data/lib/legion/extensions/agentic/executive/prospective_memory/runners/prospective_memory.rb +146 -0
- data/lib/legion/extensions/agentic/executive/prospective_memory/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/prospective_memory.rb +19 -0
- data/lib/legion/extensions/agentic/executive/triage/client.rb +19 -0
- data/lib/legion/extensions/agentic/executive/triage/helpers/constants.rb +70 -0
- data/lib/legion/extensions/agentic/executive/triage/helpers/demand.rb +101 -0
- data/lib/legion/extensions/agentic/executive/triage/helpers/triage_engine.rb +150 -0
- data/lib/legion/extensions/agentic/executive/triage/runners/cognitive_triage.rb +110 -0
- data/lib/legion/extensions/agentic/executive/triage/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/triage.rb +19 -0
- data/lib/legion/extensions/agentic/executive/version.rb +11 -0
- data/lib/legion/extensions/agentic/executive/volition/client.rb +27 -0
- data/lib/legion/extensions/agentic/executive/volition/helpers/constants.rb +51 -0
- data/lib/legion/extensions/agentic/executive/volition/helpers/drive_synthesizer.rb +158 -0
- data/lib/legion/extensions/agentic/executive/volition/helpers/intention.rb +56 -0
- data/lib/legion/extensions/agentic/executive/volition/helpers/intention_stack.rb +140 -0
- data/lib/legion/extensions/agentic/executive/volition/runners/volition.rb +129 -0
- data/lib/legion/extensions/agentic/executive/volition/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/volition.rb +20 -0
- data/lib/legion/extensions/agentic/executive/working_memory/client.rb +21 -0
- data/lib/legion/extensions/agentic/executive/working_memory/helpers/buffer.rb +124 -0
- data/lib/legion/extensions/agentic/executive/working_memory/helpers/buffer_item.rb +72 -0
- data/lib/legion/extensions/agentic/executive/working_memory/helpers/constants.rb +47 -0
- data/lib/legion/extensions/agentic/executive/working_memory/runners/working_memory.rb +102 -0
- data/lib/legion/extensions/agentic/executive/working_memory/version.rb +13 -0
- data/lib/legion/extensions/agentic/executive/working_memory.rb +19 -0
- data/lib/legion/extensions/agentic/executive.rb +40 -0
- data/spec/legion/extensions/agentic/executive/autopilot/client_spec.rb +21 -0
- data/spec/legion/extensions/agentic/executive/autopilot/cognitive_autopilot_spec.rb +7 -0
- data/spec/legion/extensions/agentic/executive/autopilot/helpers/autopilot_engine_spec.rb +166 -0
- data/spec/legion/extensions/agentic/executive/autopilot/helpers/constants_spec.rb +37 -0
- data/spec/legion/extensions/agentic/executive/autopilot/helpers/mode_event_spec.rb +30 -0
- data/spec/legion/extensions/agentic/executive/autopilot/helpers/routine_spec.rb +133 -0
- data/spec/legion/extensions/agentic/executive/autopilot/runners_spec.rb +108 -0
- data/spec/legion/extensions/agentic/executive/chunking/client_spec.rb +67 -0
- data/spec/legion/extensions/agentic/executive/chunking/helpers/chunk_spec.rb +187 -0
- data/spec/legion/extensions/agentic/executive/chunking/helpers/chunking_engine_spec.rb +290 -0
- data/spec/legion/extensions/agentic/executive/chunking/helpers/constants_spec.rb +116 -0
- data/spec/legion/extensions/agentic/executive/chunking/helpers/information_item_spec.rb +75 -0
- data/spec/legion/extensions/agentic/executive/chunking/runners/cognitive_chunking_spec.rb +169 -0
- data/spec/legion/extensions/agentic/executive/cognitive_debt/client_spec.rb +73 -0
- data/spec/legion/extensions/agentic/executive/cognitive_debt/cognitive_debt_spec.rb +15 -0
- data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/constants_spec.rb +78 -0
- data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_engine_spec.rb +297 -0
- data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_item_spec.rb +233 -0
- data/spec/legion/extensions/agentic/executive/cognitive_debt/runners/cognitive_debt_spec.rb +196 -0
- data/spec/legion/extensions/agentic/executive/compass/client_spec.rb +16 -0
- data/spec/legion/extensions/agentic/executive/compass/helpers/bearing_spec.rb +93 -0
- data/spec/legion/extensions/agentic/executive/compass/helpers/compass_engine_spec.rb +113 -0
- data/spec/legion/extensions/agentic/executive/compass/helpers/constants_spec.rb +45 -0
- data/spec/legion/extensions/agentic/executive/compass/helpers/magnetic_bias_spec.rb +103 -0
- data/spec/legion/extensions/agentic/executive/compass/runners/cognitive_compass_spec.rb +80 -0
- data/spec/legion/extensions/agentic/executive/control/client_spec.rb +23 -0
- data/spec/legion/extensions/agentic/executive/control/helpers/control_signal_spec.rb +118 -0
- data/spec/legion/extensions/agentic/executive/control/helpers/controller_spec.rb +167 -0
- data/spec/legion/extensions/agentic/executive/control/helpers/goal_spec.rb +99 -0
- data/spec/legion/extensions/agentic/executive/control/runners/cognitive_control_spec.rb +107 -0
- data/spec/legion/extensions/agentic/executive/decision_fatigue/client_spec.rb +24 -0
- data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/constants_spec.rb +93 -0
- data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/decision_record_spec.rb +89 -0
- data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/fatigue_engine_spec.rb +216 -0
- data/spec/legion/extensions/agentic/executive/decision_fatigue/runners/decision_fatigue_spec.rb +180 -0
- data/spec/legion/extensions/agentic/executive/disengagement/helpers/constants_spec.rb +81 -0
- data/spec/legion/extensions/agentic/executive/disengagement/helpers/disengagement_engine_spec.rb +213 -0
- data/spec/legion/extensions/agentic/executive/disengagement/helpers/goal_spec.rb +289 -0
- data/spec/legion/extensions/agentic/executive/disengagement/runners/cognitive_disengagement_spec.rb +215 -0
- data/spec/legion/extensions/agentic/executive/dissonance_resolution/client_spec.rb +20 -0
- data/spec/legion/extensions/agentic/executive/dissonance_resolution/helpers/dissonance_conflict_spec.rb +107 -0
- data/spec/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine_spec.rb +122 -0
- data/spec/legion/extensions/agentic/executive/dissonance_resolution/runners/cognitive_dissonance_resolution_spec.rb +49 -0
- data/spec/legion/extensions/agentic/executive/dual_process/client_spec.rb +74 -0
- data/spec/legion/extensions/agentic/executive/dual_process/helpers/constants_spec.rb +55 -0
- data/spec/legion/extensions/agentic/executive/dual_process/helpers/decision_spec.rb +76 -0
- data/spec/legion/extensions/agentic/executive/dual_process/helpers/dual_process_engine_spec.rb +274 -0
- data/spec/legion/extensions/agentic/executive/dual_process/helpers/heuristic_spec.rb +144 -0
- data/spec/legion/extensions/agentic/executive/dual_process/runners/dual_process_spec.rb +188 -0
- data/spec/legion/extensions/agentic/executive/dwell/cognitive_dwell_spec.rb +7 -0
- data/spec/legion/extensions/agentic/executive/dwell/helpers/dwell_engine_spec.rb +136 -0
- data/spec/legion/extensions/agentic/executive/dwell/helpers/dwell_topic_spec.rb +152 -0
- data/spec/legion/extensions/agentic/executive/executive_function/client_spec.rb +40 -0
- data/spec/legion/extensions/agentic/executive/executive_function/helpers/ef_component_spec.rb +108 -0
- data/spec/legion/extensions/agentic/executive/executive_function/helpers/executive_controller_spec.rb +136 -0
- data/spec/legion/extensions/agentic/executive/executive_function/runners/executive_function_spec.rb +191 -0
- data/spec/legion/extensions/agentic/executive/flexibility/client_spec.rb +20 -0
- data/spec/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine_spec.rb +119 -0
- data/spec/legion/extensions/agentic/executive/flexibility/helpers/task_set_spec.rb +87 -0
- data/spec/legion/extensions/agentic/executive/flexibility/runners/cognitive_flexibility_spec.rb +69 -0
- data/spec/legion/extensions/agentic/executive/flexibility_training/client_spec.rb +39 -0
- data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/constants_spec.rb +67 -0
- data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/flexibility_engine_spec.rb +209 -0
- data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/switch_trial_spec.rb +77 -0
- data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/training_task_spec.rb +97 -0
- data/spec/legion/extensions/agentic/executive/flexibility_training/runners/cognitive_flexibility_training_spec.rb +171 -0
- data/spec/legion/extensions/agentic/executive/goal_management/client_spec.rb +34 -0
- data/spec/legion/extensions/agentic/executive/goal_management/goal_management_spec.rb +11 -0
- data/spec/legion/extensions/agentic/executive/goal_management/helpers/constants_spec.rb +94 -0
- data/spec/legion/extensions/agentic/executive/goal_management/helpers/goal_engine_spec.rb +358 -0
- data/spec/legion/extensions/agentic/executive/goal_management/helpers/goal_spec.rb +283 -0
- data/spec/legion/extensions/agentic/executive/goal_management/runners/goal_management_spec.rb +244 -0
- data/spec/legion/extensions/agentic/executive/inertia/helpers/belief_spec.rb +128 -0
- data/spec/legion/extensions/agentic/executive/inertia/helpers/inertia_engine_spec.rb +104 -0
- data/spec/legion/extensions/agentic/executive/inertia/runners/cognitive_inertia_spec.rb +59 -0
- data/spec/legion/extensions/agentic/executive/inhibition/client_spec.rb +43 -0
- data/spec/legion/extensions/agentic/executive/inhibition/helpers/constants_spec.rb +108 -0
- data/spec/legion/extensions/agentic/executive/inhibition/helpers/impulse_spec.rb +101 -0
- data/spec/legion/extensions/agentic/executive/inhibition/helpers/inhibition_model_spec.rb +245 -0
- data/spec/legion/extensions/agentic/executive/inhibition/helpers/inhibition_store_spec.rb +126 -0
- data/spec/legion/extensions/agentic/executive/inhibition/runners/inhibition_spec.rb +242 -0
- data/spec/legion/extensions/agentic/executive/load/client_spec.rb +94 -0
- data/spec/legion/extensions/agentic/executive/load/helpers/constants_spec.rb +62 -0
- data/spec/legion/extensions/agentic/executive/load/helpers/load_model_spec.rb +314 -0
- data/spec/legion/extensions/agentic/executive/load/runners/cognitive_load_spec.rb +231 -0
- data/spec/legion/extensions/agentic/executive/load_balancing/client_spec.rb +20 -0
- data/spec/legion/extensions/agentic/executive/load_balancing/helpers/load_balancer_spec.rb +106 -0
- data/spec/legion/extensions/agentic/executive/load_balancing/helpers/subsystem_spec.rb +106 -0
- data/spec/legion/extensions/agentic/executive/load_balancing/runners/cognitive_load_balancing_spec.rb +52 -0
- data/spec/legion/extensions/agentic/executive/planning/client_spec.rb +91 -0
- data/spec/legion/extensions/agentic/executive/planning/helpers/constants_spec.rb +91 -0
- data/spec/legion/extensions/agentic/executive/planning/helpers/plan_spec.rb +230 -0
- data/spec/legion/extensions/agentic/executive/planning/helpers/plan_step_spec.rb +159 -0
- data/spec/legion/extensions/agentic/executive/planning/helpers/plan_store_spec.rb +317 -0
- data/spec/legion/extensions/agentic/executive/planning/runners/planning_spec.rb +217 -0
- data/spec/legion/extensions/agentic/executive/prospective_memory/client_spec.rb +24 -0
- data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/constants_spec.rb +84 -0
- data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/intention_spec.rb +194 -0
- data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/prospective_engine_spec.rb +255 -0
- data/spec/legion/extensions/agentic/executive/prospective_memory/runners/prospective_memory_spec.rb +220 -0
- data/spec/legion/extensions/agentic/executive/triage/client_spec.rb +28 -0
- data/spec/legion/extensions/agentic/executive/triage/cognitive_triage_spec.rb +7 -0
- data/spec/legion/extensions/agentic/executive/triage/helpers/constants_spec.rb +41 -0
- data/spec/legion/extensions/agentic/executive/triage/helpers/demand_spec.rb +139 -0
- data/spec/legion/extensions/agentic/executive/triage/helpers/triage_engine_spec.rb +183 -0
- data/spec/legion/extensions/agentic/executive/triage/runners_spec.rb +127 -0
- data/spec/legion/extensions/agentic/executive/volition/client_spec.rb +25 -0
- data/spec/legion/extensions/agentic/executive/volition/helpers/drive_synthesizer_spec.rb +99 -0
- data/spec/legion/extensions/agentic/executive/volition/helpers/intention_spec.rb +93 -0
- data/spec/legion/extensions/agentic/executive/volition/helpers/intention_stack_spec.rb +129 -0
- data/spec/legion/extensions/agentic/executive/volition/runners/volition_spec.rb +135 -0
- data/spec/legion/extensions/agentic/executive/working_memory/client_spec.rb +93 -0
- data/spec/legion/extensions/agentic/executive/working_memory/helpers/buffer_item_spec.rb +185 -0
- data/spec/legion/extensions/agentic/executive/working_memory/helpers/buffer_spec.rb +232 -0
- data/spec/legion/extensions/agentic/executive/working_memory/helpers/constants_spec.rb +99 -0
- data/spec/legion/extensions/agentic/executive/working_memory/runners/working_memory_spec.rb +191 -0
- data/spec/spec_helper.rb +46 -0
- metadata +380 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'legion/extensions/agentic/executive/volition/helpers/constants'
|
|
4
|
+
require 'legion/extensions/agentic/executive/volition/helpers/intention'
|
|
5
|
+
require 'legion/extensions/agentic/executive/volition/helpers/intention_stack'
|
|
6
|
+
require 'legion/extensions/agentic/executive/volition/helpers/drive_synthesizer'
|
|
7
|
+
require 'legion/extensions/agentic/executive/volition/runners/volition'
|
|
8
|
+
|
|
9
|
+
module Legion
|
|
10
|
+
module Extensions
|
|
11
|
+
module Agentic
|
|
12
|
+
module Executive
|
|
13
|
+
module Volition
|
|
14
|
+
class Client
|
|
15
|
+
include Runners::Volition
|
|
16
|
+
|
|
17
|
+
attr_reader :intention_stack
|
|
18
|
+
|
|
19
|
+
def initialize(stack: nil, **)
|
|
20
|
+
@intention_stack = stack || Helpers::IntentionStack.new
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Executive
|
|
7
|
+
module Volition
|
|
8
|
+
module Helpers
|
|
9
|
+
module Constants
|
|
10
|
+
# Maximum active intentions
|
|
11
|
+
MAX_INTENTIONS = 7
|
|
12
|
+
|
|
13
|
+
# Drive sources and their default weights
|
|
14
|
+
DRIVE_WEIGHTS = {
|
|
15
|
+
curiosity: 0.25, # from lex-curiosity wonder intensity
|
|
16
|
+
corrective: 0.20, # from lex-reflection adaptation recommendations
|
|
17
|
+
urgency: 0.20, # from lex-emotion gut signal + arousal
|
|
18
|
+
epistemic: 0.20, # from lex-prediction confidence gaps
|
|
19
|
+
social: 0.15 # from lex-trust + mesh signals
|
|
20
|
+
}.freeze
|
|
21
|
+
|
|
22
|
+
# Minimum drive strength to generate an intention
|
|
23
|
+
DRIVE_THRESHOLD = 0.15
|
|
24
|
+
|
|
25
|
+
# Intention decay per tick when not reinforced
|
|
26
|
+
INTENTION_DECAY = 0.05
|
|
27
|
+
|
|
28
|
+
# Intention salience floor before removal
|
|
29
|
+
INTENTION_FLOOR = 0.1
|
|
30
|
+
|
|
31
|
+
# Maximum intention age in ticks before forced expiry
|
|
32
|
+
MAX_INTENTION_AGE = 100
|
|
33
|
+
|
|
34
|
+
# Drive labels for narrative output
|
|
35
|
+
DRIVE_LABELS = {
|
|
36
|
+
curiosity: 'knowledge seeking',
|
|
37
|
+
corrective: 'self-improvement',
|
|
38
|
+
urgency: 'urgent response',
|
|
39
|
+
epistemic: 'uncertainty reduction',
|
|
40
|
+
social: 'collaborative engagement'
|
|
41
|
+
}.freeze
|
|
42
|
+
|
|
43
|
+
# Intention states
|
|
44
|
+
STATES = %i[active suspended completed expired].freeze
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Executive
|
|
7
|
+
module Volition
|
|
8
|
+
module Helpers
|
|
9
|
+
module DriveSynthesizer
|
|
10
|
+
module_function
|
|
11
|
+
|
|
12
|
+
def synthesize(tick_results: {}, cognitive_state: {})
|
|
13
|
+
drives = {}
|
|
14
|
+
drives[:curiosity] = compute_curiosity_drive(tick_results, cognitive_state)
|
|
15
|
+
drives[:corrective] = compute_corrective_drive(cognitive_state)
|
|
16
|
+
drives[:urgency] = compute_urgency_drive(tick_results, cognitive_state)
|
|
17
|
+
drives[:epistemic] = compute_epistemic_drive(tick_results, cognitive_state)
|
|
18
|
+
drives[:social] = compute_social_drive(cognitive_state)
|
|
19
|
+
drives
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def weighted_drives(drives)
|
|
23
|
+
drives.each_with_object({}) do |(drive, strength), result|
|
|
24
|
+
weight = Constants::DRIVE_WEIGHTS[drive] || 0.0
|
|
25
|
+
result[drive] = {
|
|
26
|
+
raw: strength,
|
|
27
|
+
weighted: (strength * weight).round(4),
|
|
28
|
+
weight: weight
|
|
29
|
+
}
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def dominant_drive(drives)
|
|
34
|
+
return nil if drives.empty?
|
|
35
|
+
|
|
36
|
+
drives.max_by { |_, strength| strength }&.first
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def generate_intentions(drives, cognitive_state: {})
|
|
40
|
+
intentions = []
|
|
41
|
+
|
|
42
|
+
drives.each do |drive, strength|
|
|
43
|
+
next if strength < Constants::DRIVE_THRESHOLD
|
|
44
|
+
|
|
45
|
+
intention = build_intention_for_drive(drive, strength, cognitive_state)
|
|
46
|
+
intentions << intention if intention
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
intentions.sort_by { |i| -(i[:salience] || 0) }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def compute_curiosity_drive(tick_results, cognitive_state)
|
|
53
|
+
curiosity = cognitive_state[:curiosity] || {}
|
|
54
|
+
wonder_data = tick_results[:working_memory_integration] || {}
|
|
55
|
+
|
|
56
|
+
intensity = curiosity[:intensity] || wonder_data[:curiosity_intensity] || 0.0
|
|
57
|
+
active_count = curiosity[:active_count] || wonder_data[:active_wonders] || 0
|
|
58
|
+
|
|
59
|
+
count_factor = [active_count / 5.0, 1.0].min
|
|
60
|
+
((intensity * 0.7) + (count_factor * 0.3)).clamp(0.0, 1.0)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def compute_corrective_drive(cognitive_state)
|
|
64
|
+
reflection = cognitive_state[:reflection] || {}
|
|
65
|
+
health = reflection[:health] || 1.0
|
|
66
|
+
pending = reflection[:pending_adaptations] || 0
|
|
67
|
+
|
|
68
|
+
health_gap = 1.0 - health
|
|
69
|
+
pending_factor = [pending / 3.0, 1.0].min
|
|
70
|
+
((health_gap * 0.6) + (pending_factor * 0.4)).clamp(0.0, 1.0)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def compute_urgency_drive(tick_results, cognitive_state)
|
|
74
|
+
gut = tick_results[:gut_instinct] || cognitive_state[:gut] || {}
|
|
75
|
+
emotion = tick_results[:emotional_evaluation] || {}
|
|
76
|
+
|
|
77
|
+
arousal = emotion[:arousal] || cognitive_state.dig(:emotion, :arousal) || 0.5
|
|
78
|
+
gut_signal = extract_gut_strength(gut)
|
|
79
|
+
|
|
80
|
+
((arousal * 0.5) + (gut_signal * 0.5)).clamp(0.0, 1.0)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def compute_epistemic_drive(tick_results, cognitive_state)
|
|
84
|
+
pred = tick_results[:prediction_engine] || {}
|
|
85
|
+
pred_state = cognitive_state[:prediction] || {}
|
|
86
|
+
|
|
87
|
+
confidence = pred[:confidence] || pred_state[:confidence] || 0.5
|
|
88
|
+
pending = pred_state[:pending_count] || 0
|
|
89
|
+
|
|
90
|
+
confidence_gap = 1.0 - confidence
|
|
91
|
+
pending_factor = [pending / 10.0, 1.0].min
|
|
92
|
+
((confidence_gap * 0.6) + (pending_factor * 0.4)).clamp(0.0, 1.0)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def compute_social_drive(cognitive_state)
|
|
96
|
+
mesh = cognitive_state[:mesh] || {}
|
|
97
|
+
trust = cognitive_state[:trust] || {}
|
|
98
|
+
|
|
99
|
+
peer_count = mesh[:peer_count] || 0
|
|
100
|
+
trust_level = trust[:avg_composite] || 0.5
|
|
101
|
+
|
|
102
|
+
peer_factor = [peer_count / 5.0, 1.0].min
|
|
103
|
+
((peer_factor * 0.4) + (trust_level * 0.6)).clamp(0.0, 1.0)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def extract_gut_strength(gut)
|
|
107
|
+
signal = gut[:signal]
|
|
108
|
+
return 0.3 unless signal
|
|
109
|
+
|
|
110
|
+
case signal
|
|
111
|
+
when :alarm then 1.0
|
|
112
|
+
when :heightened then 0.7
|
|
113
|
+
when :explore then 0.5
|
|
114
|
+
when :attend then 0.4
|
|
115
|
+
when :calm then 0.1
|
|
116
|
+
else 0.3
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def build_intention_for_drive(drive, strength, cognitive_state)
|
|
121
|
+
case drive
|
|
122
|
+
when :curiosity then build_curiosity_intention(strength, cognitive_state)
|
|
123
|
+
when :corrective then build_corrective_intention(strength, cognitive_state)
|
|
124
|
+
when :urgency then build_urgency_intention(strength, cognitive_state)
|
|
125
|
+
when :epistemic then build_epistemic_intention(strength, cognitive_state)
|
|
126
|
+
when :social then build_social_intention(strength, cognitive_state)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def build_curiosity_intention(strength, cognitive_state)
|
|
131
|
+
question = cognitive_state.dig(:curiosity, :top_question) || 'explore knowledge gaps'
|
|
132
|
+
domain = cognitive_state.dig(:curiosity, :top_domain) || :general
|
|
133
|
+
Intention.new_intention(drive: :curiosity, domain: domain, goal: question, salience: strength)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def build_corrective_intention(strength, cognitive_state)
|
|
137
|
+
severity = cognitive_state.dig(:reflection, :recent_severity) || 'cognitive health'
|
|
138
|
+
Intention.new_intention(drive: :corrective, domain: :self, goal: "address #{severity}", salience: strength)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def build_urgency_intention(strength, _cognitive_state)
|
|
142
|
+
Intention.new_intention(drive: :urgency, domain: :general, goal: 'respond to urgent signal', salience: strength)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def build_epistemic_intention(strength, _cognitive_state)
|
|
146
|
+
Intention.new_intention(drive: :epistemic, domain: :general, goal: 'reduce prediction uncertainty', salience: strength)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def build_social_intention(strength, _cognitive_state)
|
|
150
|
+
Intention.new_intention(drive: :social, domain: :general, goal: 'engage with peer agents', salience: strength)
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'securerandom'
|
|
4
|
+
|
|
5
|
+
module Legion
|
|
6
|
+
module Extensions
|
|
7
|
+
module Agentic
|
|
8
|
+
module Executive
|
|
9
|
+
module Volition
|
|
10
|
+
module Helpers
|
|
11
|
+
module Intention
|
|
12
|
+
module_function
|
|
13
|
+
|
|
14
|
+
def new_intention(drive:, domain:, goal:, salience:, context: {})
|
|
15
|
+
{
|
|
16
|
+
intention_id: SecureRandom.hex(8),
|
|
17
|
+
drive: drive.to_sym,
|
|
18
|
+
domain: domain.to_sym,
|
|
19
|
+
goal: goal,
|
|
20
|
+
salience: salience.clamp(0.0, 1.0),
|
|
21
|
+
state: :active,
|
|
22
|
+
created_at: Time.now.utc,
|
|
23
|
+
age_ticks: 0,
|
|
24
|
+
context: context
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def decay(intention)
|
|
29
|
+
new_salience = [intention[:salience] - Constants::INTENTION_DECAY, 0.0].max
|
|
30
|
+
intention.merge(salience: new_salience, age_ticks: intention[:age_ticks] + 1)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def reinforce(intention, amount: 0.1)
|
|
34
|
+
new_salience = [intention[:salience] + amount, 1.0].min
|
|
35
|
+
intention.merge(salience: new_salience)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def expired?(intention)
|
|
39
|
+
intention[:age_ticks] >= Constants::MAX_INTENTION_AGE ||
|
|
40
|
+
intention[:salience] < Constants::INTENTION_FLOOR
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def active?(intention)
|
|
44
|
+
intention[:state] == :active && !expired?(intention)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def drive_label(drive)
|
|
48
|
+
Constants::DRIVE_LABELS[drive.to_sym] || drive.to_s
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Executive
|
|
7
|
+
module Volition
|
|
8
|
+
module Helpers
|
|
9
|
+
class IntentionStack
|
|
10
|
+
attr_reader :intentions
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
@intentions = []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def push(intention)
|
|
17
|
+
return :duplicate if duplicate?(intention)
|
|
18
|
+
return :capacity_full if @intentions.size >= Constants::MAX_INTENTIONS
|
|
19
|
+
|
|
20
|
+
@intentions << intention
|
|
21
|
+
sort!
|
|
22
|
+
:pushed
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def active
|
|
26
|
+
@intentions.select { |i| Intention.active?(i) }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def top
|
|
30
|
+
active.first
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def by_drive(drive)
|
|
34
|
+
@intentions.select { |i| i[:drive] == drive.to_sym && Intention.active?(i) }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def by_domain(domain)
|
|
38
|
+
@intentions.select { |i| i[:domain] == domain.to_sym && Intention.active?(i) }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def find(intention_id)
|
|
42
|
+
@intentions.find { |i| i[:intention_id] == intention_id }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def complete(intention_id)
|
|
46
|
+
intention = find(intention_id)
|
|
47
|
+
return :not_found unless intention
|
|
48
|
+
|
|
49
|
+
intention[:state] = :completed
|
|
50
|
+
intention[:completed_at] = Time.now.utc
|
|
51
|
+
:completed
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def suspend(intention_id)
|
|
55
|
+
intention = find(intention_id)
|
|
56
|
+
return :not_found unless intention
|
|
57
|
+
|
|
58
|
+
intention[:state] = :suspended
|
|
59
|
+
:suspended
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def resume(intention_id)
|
|
63
|
+
intention = find(intention_id)
|
|
64
|
+
return :not_found unless intention
|
|
65
|
+
return :not_suspended unless intention[:state] == :suspended
|
|
66
|
+
|
|
67
|
+
intention[:state] = :active
|
|
68
|
+
:resumed
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def decay_all
|
|
72
|
+
@intentions.each do |intention|
|
|
73
|
+
next unless Intention.active?(intention)
|
|
74
|
+
|
|
75
|
+
updated = Intention.decay(intention)
|
|
76
|
+
intention.merge!(updated)
|
|
77
|
+
|
|
78
|
+
intention[:state] = :expired if Intention.expired?(intention)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
expired_count = @intentions.count { |i| i[:state] == :expired }
|
|
82
|
+
prune_expired
|
|
83
|
+
expired_count
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def reinforce(intention_id, amount: 0.1)
|
|
87
|
+
intention = find(intention_id)
|
|
88
|
+
return :not_found unless intention
|
|
89
|
+
|
|
90
|
+
updated = Intention.reinforce(intention, amount: amount)
|
|
91
|
+
intention.merge!(updated)
|
|
92
|
+
sort!
|
|
93
|
+
:reinforced
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def size
|
|
97
|
+
@intentions.size
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def active_count
|
|
101
|
+
active.size
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def stats
|
|
105
|
+
by_state = @intentions.each_with_object(Hash.new(0)) { |i, h| h[i[:state]] += 1 }
|
|
106
|
+
by_drive = active.each_with_object(Hash.new(0)) { |i, h| h[i[:drive]] += 1 }
|
|
107
|
+
{
|
|
108
|
+
total: @intentions.size,
|
|
109
|
+
active: active_count,
|
|
110
|
+
by_state: by_state,
|
|
111
|
+
by_drive: by_drive,
|
|
112
|
+
top_intention: top&.slice(:intention_id, :drive, :domain, :goal, :salience)
|
|
113
|
+
}
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
private
|
|
117
|
+
|
|
118
|
+
def sort!
|
|
119
|
+
@intentions.sort_by! { |i| -(i[:salience] || 0) }
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def duplicate?(intention)
|
|
123
|
+
@intentions.any? do |existing|
|
|
124
|
+
Intention.active?(existing) &&
|
|
125
|
+
existing[:drive] == intention[:drive] &&
|
|
126
|
+
existing[:domain] == intention[:domain] &&
|
|
127
|
+
existing[:goal] == intention[:goal]
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def prune_expired
|
|
132
|
+
@intentions.reject! { |i| i[:state] == :expired }
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Executive
|
|
7
|
+
module Volition
|
|
8
|
+
module Runners
|
|
9
|
+
module Volition
|
|
10
|
+
include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
|
|
11
|
+
Legion::Extensions::Helpers.const_defined?(:Lex)
|
|
12
|
+
|
|
13
|
+
def form_intentions(tick_results: {}, cognitive_state: {}, **)
|
|
14
|
+
drives = Helpers::DriveSynthesizer.synthesize(
|
|
15
|
+
tick_results: tick_results,
|
|
16
|
+
cognitive_state: cognitive_state
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
new_intentions = Helpers::DriveSynthesizer.generate_intentions(drives, cognitive_state: cognitive_state)
|
|
20
|
+
pushed = 0
|
|
21
|
+
new_intentions.each do |intention|
|
|
22
|
+
result = intention_stack.push(intention)
|
|
23
|
+
pushed += 1 if result == :pushed
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
expired = intention_stack.decay_all
|
|
27
|
+
dominant = Helpers::DriveSynthesizer.dominant_drive(drives)
|
|
28
|
+
current = intention_stack.top
|
|
29
|
+
|
|
30
|
+
Legion::Logging.debug "[volition] drives=#{format_drives(drives)} pushed=#{pushed} expired=#{expired} " \
|
|
31
|
+
"active=#{intention_stack.active_count} top=#{current&.dig(:goal)}"
|
|
32
|
+
|
|
33
|
+
{
|
|
34
|
+
drives: drives,
|
|
35
|
+
dominant_drive: dominant,
|
|
36
|
+
new_intentions: pushed,
|
|
37
|
+
expired: expired,
|
|
38
|
+
active_intentions: intention_stack.active_count,
|
|
39
|
+
current_intention: format_intention(current)
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def current_intention(**)
|
|
44
|
+
intention = intention_stack.top
|
|
45
|
+
return { intention: nil, has_will: false } unless intention
|
|
46
|
+
|
|
47
|
+
{
|
|
48
|
+
intention: format_intention(intention),
|
|
49
|
+
has_will: true,
|
|
50
|
+
drive: intention[:drive],
|
|
51
|
+
goal: intention[:goal],
|
|
52
|
+
salience: intention[:salience]
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def complete_intention(intention_id:, **)
|
|
57
|
+
result = intention_stack.complete(intention_id)
|
|
58
|
+
Legion::Logging.info "[volition] complete intention=#{intention_id} result=#{result}"
|
|
59
|
+
{ status: result, intention_id: intention_id }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def suspend_intention(intention_id:, **)
|
|
63
|
+
result = intention_stack.suspend(intention_id)
|
|
64
|
+
Legion::Logging.info "[volition] suspend intention=#{intention_id} result=#{result}"
|
|
65
|
+
{ status: result, intention_id: intention_id }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def resume_intention(intention_id:, **)
|
|
69
|
+
result = intention_stack.resume(intention_id)
|
|
70
|
+
Legion::Logging.info "[volition] resume intention=#{intention_id} result=#{result}"
|
|
71
|
+
{ status: result, intention_id: intention_id }
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def reinforce_intention(intention_id:, amount: 0.1, **)
|
|
75
|
+
result = intention_stack.reinforce(intention_id, amount: amount)
|
|
76
|
+
{ status: result, intention_id: intention_id }
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def volition_status(**)
|
|
80
|
+
stats = intention_stack.stats
|
|
81
|
+
drives = Helpers::DriveSynthesizer.synthesize(tick_results: {}, cognitive_state: {})
|
|
82
|
+
|
|
83
|
+
{
|
|
84
|
+
intention_stats: stats,
|
|
85
|
+
current_drives: drives,
|
|
86
|
+
has_will: stats[:active].positive?,
|
|
87
|
+
dominant_drive: Helpers::DriveSynthesizer.dominant_drive(drives)
|
|
88
|
+
}
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def intention_history(limit: 20, **)
|
|
92
|
+
all = intention_stack.intentions.last(limit)
|
|
93
|
+
{
|
|
94
|
+
intentions: all.map { |i| format_intention(i) },
|
|
95
|
+
count: all.size
|
|
96
|
+
}
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def intention_stack
|
|
102
|
+
@intention_stack ||= Helpers::IntentionStack.new
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def format_intention(intention)
|
|
106
|
+
return nil unless intention
|
|
107
|
+
|
|
108
|
+
{
|
|
109
|
+
intention_id: intention[:intention_id],
|
|
110
|
+
drive: intention[:drive],
|
|
111
|
+
drive_label: Helpers::Intention.drive_label(intention[:drive]),
|
|
112
|
+
domain: intention[:domain],
|
|
113
|
+
goal: intention[:goal],
|
|
114
|
+
salience: intention[:salience].round(3),
|
|
115
|
+
state: intention[:state],
|
|
116
|
+
age_ticks: intention[:age_ticks]
|
|
117
|
+
}
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def format_drives(drives)
|
|
121
|
+
drives.map { |k, v| "#{k}=#{v.round(2)}" }.join(' ')
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'legion/extensions/agentic/executive/volition/version'
|
|
4
|
+
require 'legion/extensions/agentic/executive/volition/helpers/constants'
|
|
5
|
+
require 'legion/extensions/agentic/executive/volition/helpers/intention'
|
|
6
|
+
require 'legion/extensions/agentic/executive/volition/helpers/intention_stack'
|
|
7
|
+
require 'legion/extensions/agentic/executive/volition/helpers/drive_synthesizer'
|
|
8
|
+
require 'legion/extensions/agentic/executive/volition/runners/volition'
|
|
9
|
+
require 'legion/extensions/agentic/executive/volition/client'
|
|
10
|
+
|
|
11
|
+
module Legion
|
|
12
|
+
module Extensions
|
|
13
|
+
module Agentic
|
|
14
|
+
module Executive
|
|
15
|
+
module Volition
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Agentic
|
|
6
|
+
module Executive
|
|
7
|
+
module WorkingMemory
|
|
8
|
+
class Client
|
|
9
|
+
include Runners::WorkingMemory
|
|
10
|
+
|
|
11
|
+
attr_reader :buffer
|
|
12
|
+
|
|
13
|
+
def initialize(buffer: nil, **)
|
|
14
|
+
@buffer = buffer || Helpers::Buffer.new
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|