lex-agentic-social 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 (235) 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-social.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/social/apprenticeship/client.rb +28 -0
  8. data/lib/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship.rb +90 -0
  9. data/lib/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_engine.rb +109 -0
  10. data/lib/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_model.rb +93 -0
  11. data/lib/legion/extensions/agentic/social/apprenticeship/runners/cognitive_apprenticeship.rb +112 -0
  12. data/lib/legion/extensions/agentic/social/apprenticeship/version.rb +13 -0
  13. data/lib/legion/extensions/agentic/social/apprenticeship.rb +19 -0
  14. data/lib/legion/extensions/agentic/social/conflict/actors/stale_check.rb +45 -0
  15. data/lib/legion/extensions/agentic/social/conflict/client.rb +27 -0
  16. data/lib/legion/extensions/agentic/social/conflict/helpers/conflict_log.rb +70 -0
  17. data/lib/legion/extensions/agentic/social/conflict/helpers/llm_enhancer.rb +130 -0
  18. data/lib/legion/extensions/agentic/social/conflict/helpers/severity.rb +47 -0
  19. data/lib/legion/extensions/agentic/social/conflict/runners/conflict.rb +112 -0
  20. data/lib/legion/extensions/agentic/social/conflict/version.rb +13 -0
  21. data/lib/legion/extensions/agentic/social/conflict.rb +19 -0
  22. data/lib/legion/extensions/agentic/social/conscience/client.rb +26 -0
  23. data/lib/legion/extensions/agentic/social/conscience/helpers/constants.rb +53 -0
  24. data/lib/legion/extensions/agentic/social/conscience/helpers/moral_evaluator.rb +178 -0
  25. data/lib/legion/extensions/agentic/social/conscience/helpers/moral_store.rb +116 -0
  26. data/lib/legion/extensions/agentic/social/conscience/runners/conscience.rb +117 -0
  27. data/lib/legion/extensions/agentic/social/conscience/version.rb +13 -0
  28. data/lib/legion/extensions/agentic/social/conscience.rb +19 -0
  29. data/lib/legion/extensions/agentic/social/consent/actors/tier_evaluation.rb +45 -0
  30. data/lib/legion/extensions/agentic/social/consent/client.rb +27 -0
  31. data/lib/legion/extensions/agentic/social/consent/helpers/consent_map.rb +199 -0
  32. data/lib/legion/extensions/agentic/social/consent/helpers/tiers.rb +54 -0
  33. data/lib/legion/extensions/agentic/social/consent/local_migrations/20260316000010_create_consent_domains.rb +16 -0
  34. data/lib/legion/extensions/agentic/social/consent/runners/consent.rb +228 -0
  35. data/lib/legion/extensions/agentic/social/consent/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/social/consent.rb +25 -0
  37. data/lib/legion/extensions/agentic/social/entrainment/client.rb +19 -0
  38. data/lib/legion/extensions/agentic/social/entrainment/helpers/constants.rb +40 -0
  39. data/lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb +120 -0
  40. data/lib/legion/extensions/agentic/social/entrainment/helpers/pairing.rb +86 -0
  41. data/lib/legion/extensions/agentic/social/entrainment/runners/cognitive_entrainment.rb +89 -0
  42. data/lib/legion/extensions/agentic/social/entrainment/version.rb +13 -0
  43. data/lib/legion/extensions/agentic/social/entrainment.rb +19 -0
  44. data/lib/legion/extensions/agentic/social/governance/actors/shadow_ai_scan.rb +19 -0
  45. data/lib/legion/extensions/agentic/social/governance/actors/vote_timeout.rb +45 -0
  46. data/lib/legion/extensions/agentic/social/governance/client.rb +27 -0
  47. data/lib/legion/extensions/agentic/social/governance/helpers/layers.rb +40 -0
  48. data/lib/legion/extensions/agentic/social/governance/helpers/proposal.rb +94 -0
  49. data/lib/legion/extensions/agentic/social/governance/runners/governance.rb +87 -0
  50. data/lib/legion/extensions/agentic/social/governance/runners/shadow_ai.rb +93 -0
  51. data/lib/legion/extensions/agentic/social/governance/version.rb +13 -0
  52. data/lib/legion/extensions/agentic/social/governance.rb +20 -0
  53. data/lib/legion/extensions/agentic/social/joint_attention/actors/decay.rb +45 -0
  54. data/lib/legion/extensions/agentic/social/joint_attention/client.rb +28 -0
  55. data/lib/legion/extensions/agentic/social/joint_attention/helpers/attention_target.rb +124 -0
  56. data/lib/legion/extensions/agentic/social/joint_attention/helpers/constants.rb +34 -0
  57. data/lib/legion/extensions/agentic/social/joint_attention/helpers/joint_focus_manager.rb +157 -0
  58. data/lib/legion/extensions/agentic/social/joint_attention/runners/joint_attention.rb +88 -0
  59. data/lib/legion/extensions/agentic/social/joint_attention/version.rb +13 -0
  60. data/lib/legion/extensions/agentic/social/joint_attention.rb +20 -0
  61. data/lib/legion/extensions/agentic/social/mentalizing/actors/decay.rb +45 -0
  62. data/lib/legion/extensions/agentic/social/mentalizing/client.rb +28 -0
  63. data/lib/legion/extensions/agentic/social/mentalizing/helpers/belief_attribution.rb +58 -0
  64. data/lib/legion/extensions/agentic/social/mentalizing/helpers/constants.rb +33 -0
  65. data/lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb +137 -0
  66. data/lib/legion/extensions/agentic/social/mentalizing/runners/mentalizing.rb +93 -0
  67. data/lib/legion/extensions/agentic/social/mentalizing/version.rb +13 -0
  68. data/lib/legion/extensions/agentic/social/mentalizing.rb +20 -0
  69. data/lib/legion/extensions/agentic/social/mirror/client.rb +33 -0
  70. data/lib/legion/extensions/agentic/social/mirror/helpers/constants.rb +65 -0
  71. data/lib/legion/extensions/agentic/social/mirror/helpers/mirror_engine.rb +132 -0
  72. data/lib/legion/extensions/agentic/social/mirror/helpers/mirror_event.rb +46 -0
  73. data/lib/legion/extensions/agentic/social/mirror/helpers/simulation.rb +43 -0
  74. data/lib/legion/extensions/agentic/social/mirror/runners/observe.rb +52 -0
  75. data/lib/legion/extensions/agentic/social/mirror/runners/resonance.rb +79 -0
  76. data/lib/legion/extensions/agentic/social/mirror/runners/simulate.rb +63 -0
  77. data/lib/legion/extensions/agentic/social/mirror/version.rb +13 -0
  78. data/lib/legion/extensions/agentic/social/mirror.rb +22 -0
  79. data/lib/legion/extensions/agentic/social/mirror_system/actors/decay.rb +45 -0
  80. data/lib/legion/extensions/agentic/social/mirror_system/client.rb +28 -0
  81. data/lib/legion/extensions/agentic/social/mirror_system/helpers/constants.rb +62 -0
  82. data/lib/legion/extensions/agentic/social/mirror_system/helpers/mirror_system.rb +162 -0
  83. data/lib/legion/extensions/agentic/social/mirror_system/helpers/observed_behavior.rb +67 -0
  84. data/lib/legion/extensions/agentic/social/mirror_system/runners/mirror.rb +99 -0
  85. data/lib/legion/extensions/agentic/social/mirror_system/version.rb +13 -0
  86. data/lib/legion/extensions/agentic/social/mirror_system.rb +20 -0
  87. data/lib/legion/extensions/agentic/social/moral_reasoning/client.rb +19 -0
  88. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/constants.rb +49 -0
  89. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/dilemma.rb +68 -0
  90. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/llm_enhancer.rb +140 -0
  91. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/moral_engine.rb +239 -0
  92. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/moral_foundation.rb +45 -0
  93. data/lib/legion/extensions/agentic/social/moral_reasoning/runners/moral_reasoning.rb +121 -0
  94. data/lib/legion/extensions/agentic/social/moral_reasoning/version.rb +13 -0
  95. data/lib/legion/extensions/agentic/social/moral_reasoning.rb +21 -0
  96. data/lib/legion/extensions/agentic/social/perspective_shifting/client.rb +29 -0
  97. data/lib/legion/extensions/agentic/social/perspective_shifting/helpers/constants.rb +67 -0
  98. data/lib/legion/extensions/agentic/social/perspective_shifting/helpers/perspective.rb +45 -0
  99. data/lib/legion/extensions/agentic/social/perspective_shifting/helpers/perspective_view.rb +57 -0
  100. data/lib/legion/extensions/agentic/social/perspective_shifting/helpers/shifting_engine.rb +166 -0
  101. data/lib/legion/extensions/agentic/social/perspective_shifting/runners/perspective_shifting.rb +167 -0
  102. data/lib/legion/extensions/agentic/social/perspective_shifting/version.rb +13 -0
  103. data/lib/legion/extensions/agentic/social/perspective_shifting.rb +20 -0
  104. data/lib/legion/extensions/agentic/social/social/client.rb +25 -0
  105. data/lib/legion/extensions/agentic/social/social/helpers/constants.rb +84 -0
  106. data/lib/legion/extensions/agentic/social/social/helpers/social_graph.rb +172 -0
  107. data/lib/legion/extensions/agentic/social/social/runners/social.rb +146 -0
  108. data/lib/legion/extensions/agentic/social/social/version.rb +13 -0
  109. data/lib/legion/extensions/agentic/social/social.rb +18 -0
  110. data/lib/legion/extensions/agentic/social/social_learning/client.rb +25 -0
  111. data/lib/legion/extensions/agentic/social/social_learning/helpers/constants.rb +42 -0
  112. data/lib/legion/extensions/agentic/social/social_learning/helpers/model_agent.rb +82 -0
  113. data/lib/legion/extensions/agentic/social/social_learning/helpers/observed_behavior.rb +61 -0
  114. data/lib/legion/extensions/agentic/social/social_learning/helpers/social_learning_engine.rb +134 -0
  115. data/lib/legion/extensions/agentic/social/social_learning/runners/social_learning.rb +105 -0
  116. data/lib/legion/extensions/agentic/social/social_learning/version.rb +13 -0
  117. data/lib/legion/extensions/agentic/social/social_learning.rb +20 -0
  118. data/lib/legion/extensions/agentic/social/symbiosis/client.rb +23 -0
  119. data/lib/legion/extensions/agentic/social/symbiosis/helpers/constants.rb +50 -0
  120. data/lib/legion/extensions/agentic/social/symbiosis/helpers/ecosystem.rb +113 -0
  121. data/lib/legion/extensions/agentic/social/symbiosis/helpers/symbiosis_engine.rb +104 -0
  122. data/lib/legion/extensions/agentic/social/symbiosis/helpers/symbiotic_bond.rb +112 -0
  123. data/lib/legion/extensions/agentic/social/symbiosis/runners/cognitive_symbiosis.rb +101 -0
  124. data/lib/legion/extensions/agentic/social/symbiosis/version.rb +13 -0
  125. data/lib/legion/extensions/agentic/social/symbiosis.rb +22 -0
  126. data/lib/legion/extensions/agentic/social/theory_of_mind/client.rb +26 -0
  127. data/lib/legion/extensions/agentic/social/theory_of_mind/helpers/agent_model.rb +173 -0
  128. data/lib/legion/extensions/agentic/social/theory_of_mind/helpers/constants.rb +70 -0
  129. data/lib/legion/extensions/agentic/social/theory_of_mind/helpers/mental_state_tracker.rb +169 -0
  130. data/lib/legion/extensions/agentic/social/theory_of_mind/runners/theory_of_mind.rb +159 -0
  131. data/lib/legion/extensions/agentic/social/theory_of_mind/version.rb +13 -0
  132. data/lib/legion/extensions/agentic/social/theory_of_mind.rb +19 -0
  133. data/lib/legion/extensions/agentic/social/trust/actors/decay.rb +45 -0
  134. data/lib/legion/extensions/agentic/social/trust/client.rb +27 -0
  135. data/lib/legion/extensions/agentic/social/trust/helpers/trust_map.rb +160 -0
  136. data/lib/legion/extensions/agentic/social/trust/helpers/trust_model.rb +52 -0
  137. data/lib/legion/extensions/agentic/social/trust/local_migrations/20260316000020_create_trust_entries.rb +23 -0
  138. data/lib/legion/extensions/agentic/social/trust/runners/trust.rb +80 -0
  139. data/lib/legion/extensions/agentic/social/trust/version.rb +13 -0
  140. data/lib/legion/extensions/agentic/social/trust.rb +25 -0
  141. data/lib/legion/extensions/agentic/social/version.rb +11 -0
  142. data/lib/legion/extensions/agentic/social.rb +34 -0
  143. data/spec/legion/extensions/agentic/social/apprenticeship/client_spec.rb +20 -0
  144. data/spec/legion/extensions/agentic/social/apprenticeship/cognitive_apprenticeship_spec.rb +11 -0
  145. data/spec/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_engine_spec.rb +146 -0
  146. data/spec/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_model_spec.rb +124 -0
  147. data/spec/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_spec.rb +136 -0
  148. data/spec/legion/extensions/agentic/social/apprenticeship/runners/cognitive_apprenticeship_spec.rb +154 -0
  149. data/spec/legion/extensions/agentic/social/conflict/actors/stale_check_spec.rb +45 -0
  150. data/spec/legion/extensions/agentic/social/conflict/client_spec.rb +15 -0
  151. data/spec/legion/extensions/agentic/social/conflict/helpers/conflict_log_spec.rb +232 -0
  152. data/spec/legion/extensions/agentic/social/conflict/helpers/llm_enhancer_spec.rb +189 -0
  153. data/spec/legion/extensions/agentic/social/conflict/helpers/severity_spec.rb +215 -0
  154. data/spec/legion/extensions/agentic/social/conflict/runners/conflict_spec.rb +151 -0
  155. data/spec/legion/extensions/agentic/social/conscience/client_spec.rb +58 -0
  156. data/spec/legion/extensions/agentic/social/conscience/helpers/constants_spec.rb +124 -0
  157. data/spec/legion/extensions/agentic/social/conscience/helpers/moral_evaluator_spec.rb +253 -0
  158. data/spec/legion/extensions/agentic/social/conscience/helpers/moral_store_spec.rb +230 -0
  159. data/spec/legion/extensions/agentic/social/conscience/runners/conscience_spec.rb +239 -0
  160. data/spec/legion/extensions/agentic/social/consent/actors/tier_evaluation_spec.rb +46 -0
  161. data/spec/legion/extensions/agentic/social/consent/client_spec.rb +33 -0
  162. data/spec/legion/extensions/agentic/social/consent/helpers/tiers_spec.rb +49 -0
  163. data/spec/legion/extensions/agentic/social/consent/local_persistence_spec.rb +234 -0
  164. data/spec/legion/extensions/agentic/social/consent/runners/consent_spec.rb +224 -0
  165. data/spec/legion/extensions/agentic/social/entrainment/client_spec.rb +21 -0
  166. data/spec/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine_spec.rb +116 -0
  167. data/spec/legion/extensions/agentic/social/entrainment/helpers/pairing_spec.rb +103 -0
  168. data/spec/legion/extensions/agentic/social/entrainment/runners/cognitive_entrainment_spec.rb +87 -0
  169. data/spec/legion/extensions/agentic/social/governance/actors/vote_timeout_spec.rb +45 -0
  170. data/spec/legion/extensions/agentic/social/governance/client_spec.rb +14 -0
  171. data/spec/legion/extensions/agentic/social/governance/helpers/layers_spec.rb +190 -0
  172. data/spec/legion/extensions/agentic/social/governance/helpers/proposal_spec.rb +188 -0
  173. data/spec/legion/extensions/agentic/social/governance/runners/governance_spec.rb +101 -0
  174. data/spec/legion/extensions/agentic/social/governance/runners/shadow_ai_spec.rb +65 -0
  175. data/spec/legion/extensions/agentic/social/joint_attention/client_spec.rb +36 -0
  176. data/spec/legion/extensions/agentic/social/joint_attention/helpers/attention_target_spec.rb +258 -0
  177. data/spec/legion/extensions/agentic/social/joint_attention/helpers/joint_focus_manager_spec.rb +238 -0
  178. data/spec/legion/extensions/agentic/social/joint_attention/runners/joint_attention_spec.rb +228 -0
  179. data/spec/legion/extensions/agentic/social/mentalizing/client_spec.rb +19 -0
  180. data/spec/legion/extensions/agentic/social/mentalizing/helpers/belief_attribution_spec.rb +108 -0
  181. data/spec/legion/extensions/agentic/social/mentalizing/helpers/mental_model_spec.rb +179 -0
  182. data/spec/legion/extensions/agentic/social/mentalizing/runners/mentalizing_spec.rb +162 -0
  183. data/spec/legion/extensions/agentic/social/mirror/client_spec.rb +92 -0
  184. data/spec/legion/extensions/agentic/social/mirror/helpers/constants_spec.rb +123 -0
  185. data/spec/legion/extensions/agentic/social/mirror/helpers/mirror_engine_spec.rb +217 -0
  186. data/spec/legion/extensions/agentic/social/mirror/helpers/mirror_event_spec.rb +102 -0
  187. data/spec/legion/extensions/agentic/social/mirror/helpers/simulation_spec.rb +100 -0
  188. data/spec/legion/extensions/agentic/social/mirror/runners/observe_spec.rb +77 -0
  189. data/spec/legion/extensions/agentic/social/mirror/runners/resonance_spec.rb +123 -0
  190. data/spec/legion/extensions/agentic/social/mirror/runners/simulate_spec.rb +103 -0
  191. data/spec/legion/extensions/agentic/social/mirror_system/client_spec.rb +40 -0
  192. data/spec/legion/extensions/agentic/social/mirror_system/helpers/mirror_system_spec.rb +144 -0
  193. data/spec/legion/extensions/agentic/social/mirror_system/helpers/observed_behavior_spec.rb +98 -0
  194. data/spec/legion/extensions/agentic/social/mirror_system/runners/mirror_spec.rb +122 -0
  195. data/spec/legion/extensions/agentic/social/moral_reasoning/client_spec.rb +34 -0
  196. data/spec/legion/extensions/agentic/social/moral_reasoning/helpers/dilemma_spec.rb +108 -0
  197. data/spec/legion/extensions/agentic/social/moral_reasoning/helpers/llm_enhancer_spec.rb +232 -0
  198. data/spec/legion/extensions/agentic/social/moral_reasoning/helpers/moral_engine_spec.rb +266 -0
  199. data/spec/legion/extensions/agentic/social/moral_reasoning/helpers/moral_foundation_spec.rb +70 -0
  200. data/spec/legion/extensions/agentic/social/moral_reasoning/runners/moral_reasoning_spec.rb +275 -0
  201. data/spec/legion/extensions/agentic/social/perspective_shifting/client_spec.rb +30 -0
  202. data/spec/legion/extensions/agentic/social/perspective_shifting/helpers/constants_spec.rb +99 -0
  203. data/spec/legion/extensions/agentic/social/perspective_shifting/helpers/perspective_spec.rb +77 -0
  204. data/spec/legion/extensions/agentic/social/perspective_shifting/helpers/perspective_view_spec.rb +105 -0
  205. data/spec/legion/extensions/agentic/social/perspective_shifting/helpers/shifting_engine_spec.rb +246 -0
  206. data/spec/legion/extensions/agentic/social/perspective_shifting/runners/perspective_shifting_spec.rb +277 -0
  207. data/spec/legion/extensions/agentic/social/social/client_spec.rb +72 -0
  208. data/spec/legion/extensions/agentic/social/social/helpers/constants_spec.rb +99 -0
  209. data/spec/legion/extensions/agentic/social/social/helpers/social_graph_spec.rb +322 -0
  210. data/spec/legion/extensions/agentic/social/social/runners/social_spec.rb +220 -0
  211. data/spec/legion/extensions/agentic/social/social_learning/client_spec.rb +25 -0
  212. data/spec/legion/extensions/agentic/social/social_learning/helpers/constants_spec.rb +44 -0
  213. data/spec/legion/extensions/agentic/social/social_learning/helpers/model_agent_spec.rb +120 -0
  214. data/spec/legion/extensions/agentic/social/social_learning/helpers/observed_behavior_spec.rb +81 -0
  215. data/spec/legion/extensions/agentic/social/social_learning/helpers/social_learning_engine_spec.rb +196 -0
  216. data/spec/legion/extensions/agentic/social/social_learning/runners/social_learning_spec.rb +150 -0
  217. data/spec/legion/extensions/agentic/social/symbiosis/client_spec.rb +45 -0
  218. data/spec/legion/extensions/agentic/social/symbiosis/helpers/constants_spec.rb +73 -0
  219. data/spec/legion/extensions/agentic/social/symbiosis/helpers/ecosystem_spec.rb +185 -0
  220. data/spec/legion/extensions/agentic/social/symbiosis/helpers/symbiosis_engine_spec.rb +182 -0
  221. data/spec/legion/extensions/agentic/social/symbiosis/helpers/symbiotic_bond_spec.rb +209 -0
  222. data/spec/legion/extensions/agentic/social/symbiosis/runners/cognitive_symbiosis_spec.rb +182 -0
  223. data/spec/legion/extensions/agentic/social/theory_of_mind/client_spec.rb +63 -0
  224. data/spec/legion/extensions/agentic/social/theory_of_mind/helpers/agent_model_spec.rb +244 -0
  225. data/spec/legion/extensions/agentic/social/theory_of_mind/helpers/constants_spec.rb +71 -0
  226. data/spec/legion/extensions/agentic/social/theory_of_mind/helpers/mental_state_tracker_spec.rb +228 -0
  227. data/spec/legion/extensions/agentic/social/theory_of_mind/runners/theory_of_mind_spec.rb +221 -0
  228. data/spec/legion/extensions/agentic/social/trust/actors/decay_spec.rb +62 -0
  229. data/spec/legion/extensions/agentic/social/trust/client_spec.rb +17 -0
  230. data/spec/legion/extensions/agentic/social/trust/helpers/trust_map_spec.rb +299 -0
  231. data/spec/legion/extensions/agentic/social/trust/helpers/trust_model_spec.rb +179 -0
  232. data/spec/legion/extensions/agentic/social/trust/local_persistence_spec.rb +359 -0
  233. data/spec/legion/extensions/agentic/social/trust/runners/trust_spec.rb +84 -0
  234. data/spec/spec_helper.rb +54 -0
  235. metadata +319 -0
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/theory_of_mind/helpers/constants'
4
+ require 'legion/extensions/agentic/social/theory_of_mind/helpers/agent_model'
5
+ require 'legion/extensions/agentic/social/theory_of_mind/helpers/mental_state_tracker'
6
+ require 'legion/extensions/agentic/social/theory_of_mind/runners/theory_of_mind'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Social
12
+ module TheoryOfMind
13
+ class Client
14
+ include Runners::TheoryOfMind
15
+
16
+ attr_reader :tracker
17
+
18
+ def initialize(tracker: nil, **)
19
+ @tracker = tracker || Helpers::MentalStateTracker.new
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,173 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module TheoryOfMind
8
+ module Helpers
9
+ class AgentModel
10
+ attr_reader :agent_id, :beliefs, :desires, :intentions,
11
+ :prediction_accuracy, :interaction_count, :created_at, :updated_at
12
+
13
+ def initialize(agent_id)
14
+ @agent_id = agent_id
15
+ @beliefs = {}
16
+ @desires = []
17
+ @intentions = []
18
+ @prediction_accuracy = 0.5
19
+ @interaction_count = 0
20
+ @created_at = Time.now.utc
21
+ @updated_at = Time.now.utc
22
+ end
23
+
24
+ def update_belief(domain:, content:, confidence:, source: :inference)
25
+ @beliefs[domain] = {
26
+ content: content,
27
+ confidence: confidence.clamp(0.0, 1.0),
28
+ source: source,
29
+ updated_at: Time.now.utc
30
+ }
31
+ trim_beliefs
32
+ touch
33
+ end
34
+
35
+ def update_desire(goal:, priority: :medium)
36
+ existing = @desires.find { |d| d[:goal] == goal }
37
+ if existing
38
+ existing[:priority] = priority
39
+ existing[:observed_at] = Time.now.utc
40
+ else
41
+ @desires << { goal: goal, priority: priority, observed_at: Time.now.utc }
42
+ trim_desires
43
+ end
44
+ touch
45
+ end
46
+
47
+ def update_intention(action:, confidence: :possible)
48
+ existing = @intentions.find { |i| i[:action] == action }
49
+ if existing
50
+ existing[:confidence] = confidence
51
+ existing[:estimated_at] = Time.now.utc
52
+ else
53
+ @intentions << { action: action, confidence: confidence, estimated_at: Time.now.utc }
54
+ trim_intentions
55
+ end
56
+ touch
57
+ end
58
+
59
+ def belief_for(domain)
60
+ @beliefs[domain]
61
+ end
62
+
63
+ def strongest_desire
64
+ @desires.max_by { |d| Constants::DESIRE_PRIORITIES[d[:priority]] || 0 }
65
+ end
66
+
67
+ def most_likely_intention
68
+ @intentions.max_by { |i| Constants::INTENTION_CONFIDENCE_LEVELS[i[:confidence]] || 0 }
69
+ end
70
+
71
+ def false_beliefs(known_truths)
72
+ @beliefs.each_with_object({}) do |(domain, belief), result|
73
+ truth = known_truths[domain]
74
+ next unless truth
75
+ next if truth == belief[:content]
76
+
77
+ result[domain] = {
78
+ agent_believes: belief[:content],
79
+ actual_truth: truth,
80
+ confidence: belief[:confidence]
81
+ }
82
+ end
83
+ end
84
+
85
+ def update_prediction_accuracy(outcome)
86
+ score = case outcome
87
+ when :correct then 1.0
88
+ when :partially_correct then 0.5
89
+ when :incorrect then 0.0
90
+ else return
91
+ end
92
+ alpha = Constants::PREDICTION_ALPHA
93
+ @prediction_accuracy = (@prediction_accuracy * (1.0 - alpha)) + (score * alpha)
94
+ @interaction_count += 1
95
+ touch
96
+ end
97
+
98
+ def decay_beliefs
99
+ @beliefs.each do |domain, belief|
100
+ belief[:confidence] -= Constants::BELIEF_DECAY_RATE
101
+ @beliefs.delete(domain) if belief[:confidence] < Constants::CONFIDENCE_THRESHOLD
102
+ end
103
+ end
104
+
105
+ def perspective
106
+ {
107
+ knowledge: @beliefs.transform_values { |b| b[:content] },
108
+ goals: @desires.map { |d| d[:goal] },
109
+ emotional_state: infer_emotional_state,
110
+ constraints: infer_constraints,
111
+ recent_actions: @intentions.last(5).map { |i| i[:action] }
112
+ }
113
+ end
114
+
115
+ def to_h
116
+ {
117
+ agent_id: @agent_id,
118
+ belief_count: @beliefs.size,
119
+ desire_count: @desires.size,
120
+ intention_count: @intentions.size,
121
+ prediction_accuracy: @prediction_accuracy.round(4),
122
+ interaction_count: @interaction_count,
123
+ strongest_desire: strongest_desire&.dig(:goal),
124
+ likely_action: most_likely_intention&.dig(:action)
125
+ }
126
+ end
127
+
128
+ private
129
+
130
+ def touch
131
+ @updated_at = Time.now.utc
132
+ end
133
+
134
+ def infer_emotional_state
135
+ return :unknown if @beliefs.empty? && @desires.empty?
136
+
137
+ conflict_count = @desires.count { |d| d[:priority] == :critical }
138
+ return :stressed if conflict_count > 1
139
+
140
+ :stable
141
+ end
142
+
143
+ def infer_constraints
144
+ low_confidence = @beliefs.count { |_, b| b[:confidence] < 0.5 }
145
+ { uncertain_domains: low_confidence, total_beliefs: @beliefs.size }
146
+ end
147
+
148
+ def trim_beliefs
149
+ return if @beliefs.size <= Constants::MAX_BELIEFS_PER_AGENT
150
+
151
+ sorted = @beliefs.sort_by { |_, b| b[:confidence] }
152
+ sorted.first(@beliefs.size - Constants::MAX_BELIEFS_PER_AGENT).each { |domain, _| @beliefs.delete(domain) } # rubocop:disable Style/HashEachMethods
153
+ end
154
+
155
+ def trim_desires
156
+ return if @desires.size <= Constants::MAX_DESIRES_PER_AGENT
157
+
158
+ @desires.sort_by! { |d| -(Constants::DESIRE_PRIORITIES[d[:priority]] || 0) }
159
+ @desires.slice!(Constants::MAX_DESIRES_PER_AGENT..)
160
+ end
161
+
162
+ def trim_intentions
163
+ return if @intentions.size <= Constants::MAX_INTENTIONS_PER_AGENT
164
+
165
+ @intentions.shift(@intentions.size - Constants::MAX_INTENTIONS_PER_AGENT)
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module TheoryOfMind
8
+ module Helpers
9
+ module Constants
10
+ MAX_AGENT_MODELS = 100
11
+
12
+ MAX_BELIEFS_PER_AGENT = 50
13
+
14
+ MAX_DESIRES_PER_AGENT = 20
15
+
16
+ MAX_INTENTIONS_PER_AGENT = 10
17
+
18
+ BELIEF_DECAY_RATE = 0.01
19
+
20
+ CONFIDENCE_THRESHOLD = 0.3
21
+
22
+ PREDICTION_ALPHA = 0.15
23
+
24
+ STALE_BELIEF_THRESHOLD = 3600
25
+
26
+ PERSPECTIVE_DIMENSIONS = %i[
27
+ knowledge
28
+ goals
29
+ emotional_state
30
+ constraints
31
+ recent_actions
32
+ ].freeze
33
+
34
+ BELIEF_SOURCES = %i[
35
+ direct_observation
36
+ communication
37
+ inference
38
+ reputation
39
+ behavioral_pattern
40
+ ].freeze
41
+
42
+ INTENTION_CONFIDENCE_LEVELS = {
43
+ certain: 0.9,
44
+ likely: 0.7,
45
+ possible: 0.5,
46
+ unlikely: 0.3,
47
+ unknown: 0.1
48
+ }.freeze
49
+
50
+ DESIRE_PRIORITIES = {
51
+ critical: 1.0,
52
+ high: 0.75,
53
+ medium: 0.5,
54
+ low: 0.25,
55
+ latent: 0.1
56
+ }.freeze
57
+
58
+ PREDICTION_OUTCOMES = %i[
59
+ correct
60
+ partially_correct
61
+ incorrect
62
+ unresolved
63
+ ].freeze
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,169 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module TheoryOfMind
8
+ module Helpers
9
+ class MentalStateTracker
10
+ attr_reader :agent_models, :prediction_log
11
+
12
+ def initialize
13
+ @agent_models = {}
14
+ @prediction_log = []
15
+ end
16
+
17
+ def model_for(agent_id)
18
+ @agent_models[agent_id] ||= AgentModel.new(agent_id)
19
+ trim_models
20
+ @agent_models[agent_id]
21
+ end
22
+
23
+ def update_belief(agent_id:, domain:, content:, confidence:, source: :inference)
24
+ model = model_for(agent_id)
25
+ model.update_belief(domain: domain, content: content, confidence: confidence, source: source)
26
+ end
27
+
28
+ def update_desire(agent_id:, goal:, priority: :medium)
29
+ model = model_for(agent_id)
30
+ model.update_desire(goal: goal, priority: priority)
31
+ end
32
+
33
+ def infer_intention(agent_id:, action:, confidence: :possible)
34
+ model = model_for(agent_id)
35
+ model.update_intention(action: action, confidence: confidence)
36
+ end
37
+
38
+ def predict_behavior(agent_id:, context: {})
39
+ model = @agent_models[agent_id]
40
+ return nil unless model
41
+
42
+ intention = model.most_likely_intention
43
+ desire = model.strongest_desire
44
+
45
+ prediction = {
46
+ agent_id: agent_id,
47
+ predicted_action: intention&.dig(:action),
48
+ action_confidence: intention&.dig(:confidence),
49
+ underlying_desire: desire&.dig(:goal),
50
+ context_considered: context.keys,
51
+ model_accuracy: model.prediction_accuracy.round(4),
52
+ interactions_seen: model.interaction_count
53
+ }
54
+
55
+ @prediction_log << prediction.merge(predicted_at: Time.now.utc)
56
+ trim_prediction_log
57
+
58
+ prediction
59
+ end
60
+
61
+ def record_prediction_outcome(agent_id:, outcome:)
62
+ model = @agent_models[agent_id]
63
+ return nil unless model
64
+
65
+ model.update_prediction_accuracy(outcome)
66
+ end
67
+
68
+ def false_belief_check(agent_id:, known_truths:)
69
+ model = @agent_models[agent_id]
70
+ return nil unless model
71
+
72
+ model.false_beliefs(known_truths)
73
+ end
74
+
75
+ def perspective_take(agent_id:)
76
+ model = @agent_models[agent_id]
77
+ return nil unless model
78
+
79
+ model.perspective
80
+ end
81
+
82
+ def compare_agents(agent_ids:)
83
+ models = agent_ids.filter_map { |id| @agent_models[id] }
84
+ return nil if models.empty?
85
+
86
+ {
87
+ agents: models.map(&:to_h),
88
+ shared_beliefs: find_shared_beliefs(models),
89
+ conflicting_goals: find_conflicting_goals(models),
90
+ interaction_gap: interaction_gap(models)
91
+ }
92
+ end
93
+
94
+ def decay_all
95
+ @agent_models.each_value(&:decay_beliefs)
96
+ @agent_models.reject! { |_, m| m.beliefs.empty? && m.desires.empty? && m.intentions.empty? }
97
+ end
98
+
99
+ def agents_tracked
100
+ @agent_models.size
101
+ end
102
+
103
+ def total_beliefs
104
+ @agent_models.values.sum { |m| m.beliefs.size }
105
+ end
106
+
107
+ def avg_prediction_accuracy
108
+ return 0.0 if @agent_models.empty?
109
+
110
+ total = @agent_models.values.sum(&:prediction_accuracy)
111
+ (total / @agent_models.size).round(4)
112
+ end
113
+
114
+ def to_h
115
+ {
116
+ agents_tracked: agents_tracked,
117
+ total_beliefs: total_beliefs,
118
+ avg_prediction_accuracy: avg_prediction_accuracy,
119
+ prediction_log_size: @prediction_log.size
120
+ }
121
+ end
122
+
123
+ private
124
+
125
+ def find_shared_beliefs(models)
126
+ return [] if models.size < 2
127
+
128
+ domains = models.map { |m| m.beliefs.keys }
129
+ shared = domains.reduce(:&) || []
130
+ shared.map do |domain|
131
+ values = models.map { |m| m.belief_for(domain)[:content] }
132
+ { domain: domain, values: values, consensus: values.uniq.size == 1 }
133
+ end
134
+ end
135
+
136
+ def find_conflicting_goals(models)
137
+ return [] if models.size < 2
138
+
139
+ all_goals = models.flat_map { |m| m.desires.map { |d| { agent: m.agent_id, goal: d[:goal], priority: d[:priority] } } }
140
+ goal_groups = all_goals.group_by { |g| g[:goal] }
141
+ goal_groups.select { |_, entries| entries.size > 1 }.map do |goal, entries|
142
+ { goal: goal, agents: entries.map { |e| e[:agent] } }
143
+ end
144
+ end
145
+
146
+ def interaction_gap(models)
147
+ counts = models.map(&:interaction_count)
148
+ return 0 if counts.empty?
149
+
150
+ counts.max - counts.min
151
+ end
152
+
153
+ def trim_models
154
+ return if @agent_models.size <= Constants::MAX_AGENT_MODELS
155
+
156
+ oldest = @agent_models.sort_by { |_, m| m.updated_at }
157
+ oldest.first(@agent_models.size - Constants::MAX_AGENT_MODELS).each { |id, _| @agent_models.delete(id) } # rubocop:disable Style/HashEachMethods
158
+ end
159
+
160
+ def trim_prediction_log
161
+ @prediction_log.shift while @prediction_log.size > 200
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module TheoryOfMind
8
+ module Runners
9
+ module TheoryOfMind
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def update_theory_of_mind(tick_results: {}, **)
14
+ extract_social_observations(tick_results)
15
+ extract_mesh_observations(tick_results)
16
+ tracker.decay_all
17
+
18
+ Legion::Logging.debug "[tom] agents=#{tracker.agents_tracked} " \
19
+ "beliefs=#{tracker.total_beliefs} accuracy=#{tracker.avg_prediction_accuracy}"
20
+
21
+ tracker.to_h
22
+ end
23
+
24
+ def observe_agent(agent_id:, observations: {}, **)
25
+ apply_belief_observation(agent_id, observations)
26
+ apply_desire_observation(agent_id, observations)
27
+ apply_intention_observation(agent_id, observations)
28
+
29
+ Legion::Logging.debug "[tom] observed agent=#{agent_id}"
30
+ { success: true, model: tracker.model_for(agent_id).to_h }
31
+ end
32
+
33
+ def predict_behavior(agent_id:, context: {}, **)
34
+ prediction = tracker.predict_behavior(agent_id: agent_id, context: context)
35
+ return { error: 'unknown agent' } unless prediction
36
+
37
+ Legion::Logging.debug "[tom] predicted action for #{agent_id}: #{prediction[:predicted_action]}"
38
+ prediction
39
+ end
40
+
41
+ def record_outcome(agent_id:, outcome:, **)
42
+ result = tracker.record_prediction_outcome(agent_id: agent_id, outcome: outcome.to_sym)
43
+ return { error: 'unknown agent' } unless result
44
+
45
+ Legion::Logging.debug "[tom] outcome for #{agent_id}: #{outcome}"
46
+ { success: true, accuracy: tracker.model_for(agent_id).prediction_accuracy.round(4) }
47
+ end
48
+
49
+ def check_false_beliefs(agent_id:, known_truths:, **)
50
+ false_beliefs = tracker.false_belief_check(agent_id: agent_id, known_truths: known_truths)
51
+ return { error: 'unknown agent' } unless false_beliefs
52
+
53
+ Legion::Logging.debug "[tom] false beliefs for #{agent_id}: #{false_beliefs.size}"
54
+ { agent_id: agent_id, false_beliefs: false_beliefs, count: false_beliefs.size }
55
+ end
56
+
57
+ def perspective_take(agent_id:, **)
58
+ perspective = tracker.perspective_take(agent_id: agent_id)
59
+ return { error: 'unknown agent' } unless perspective
60
+
61
+ Legion::Logging.debug "[tom] perspective for #{agent_id}"
62
+ { agent_id: agent_id, perspective: perspective }
63
+ end
64
+
65
+ def compare_agents(agent_ids:, **)
66
+ comparison = tracker.compare_agents(agent_ids: agent_ids)
67
+ return { error: 'no matching agents' } unless comparison
68
+
69
+ Legion::Logging.debug "[tom] comparing #{agent_ids.size} agents"
70
+ comparison
71
+ end
72
+
73
+ def mental_state(agent_id:, **)
74
+ model = tracker.agent_models[agent_id]
75
+ return { error: 'unknown agent' } unless model
76
+
77
+ {
78
+ agent_id: agent_id,
79
+ beliefs: model.beliefs.transform_values { |b| { content: b[:content], confidence: b[:confidence].round(4) } },
80
+ desires: model.desires,
81
+ intentions: model.intentions,
82
+ accuracy: model.prediction_accuracy.round(4),
83
+ perspective: model.perspective
84
+ }
85
+ end
86
+
87
+ def tom_stats(**)
88
+ Legion::Logging.debug '[tom] stats'
89
+ tracker.to_h.merge(
90
+ models: tracker.agent_models.transform_values(&:to_h)
91
+ )
92
+ end
93
+
94
+ private
95
+
96
+ def tracker
97
+ @tracker ||= Helpers::MentalStateTracker.new
98
+ end
99
+
100
+ def apply_belief_observation(agent_id, obs)
101
+ return unless obs[:domain] && obs[:belief]
102
+
103
+ tracker.update_belief(
104
+ agent_id: agent_id,
105
+ domain: obs[:domain],
106
+ content: obs[:belief],
107
+ confidence: obs[:confidence] || 0.5,
108
+ source: obs[:source] || :inference
109
+ )
110
+ end
111
+
112
+ def apply_desire_observation(agent_id, obs)
113
+ return unless obs[:goal]
114
+
115
+ tracker.update_desire(agent_id: agent_id, goal: obs[:goal], priority: obs[:goal_priority] || :medium)
116
+ end
117
+
118
+ def apply_intention_observation(agent_id, obs)
119
+ return unless obs[:action]
120
+
121
+ tracker.infer_intention(agent_id: agent_id, action: obs[:action], confidence: obs[:action_confidence] || :possible)
122
+ end
123
+
124
+ def extract_social_observations(tick_results)
125
+ social = tick_results.dig(:social, :reputation_updates)
126
+ return unless social.is_a?(Array)
127
+
128
+ social.each do |update|
129
+ tracker.update_belief(
130
+ agent_id: update[:agent_id],
131
+ domain: :social_standing,
132
+ content: update[:standing],
133
+ confidence: update[:composite] || 0.5,
134
+ source: :direct_observation
135
+ )
136
+ end
137
+ end
138
+
139
+ def extract_mesh_observations(tick_results)
140
+ messages = tick_results.dig(:mesh_interface, :received_messages)
141
+ return unless messages.is_a?(Array)
142
+
143
+ messages.each do |msg|
144
+ next unless msg[:from]
145
+
146
+ tracker.infer_intention(
147
+ agent_id: msg[:from],
148
+ action: msg[:type] || :communicate,
149
+ confidence: :likely
150
+ )
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module TheoryOfMind
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 'legion/extensions/agentic/social/theory_of_mind/version'
4
+ require 'legion/extensions/agentic/social/theory_of_mind/helpers/constants'
5
+ require 'legion/extensions/agentic/social/theory_of_mind/helpers/agent_model'
6
+ require 'legion/extensions/agentic/social/theory_of_mind/helpers/mental_state_tracker'
7
+ require 'legion/extensions/agentic/social/theory_of_mind/runners/theory_of_mind'
8
+ require 'legion/extensions/agentic/social/theory_of_mind/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Social
14
+ module TheoryOfMind
15
+ end
16
+ end
17
+ end
18
+ end
19
+ 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 Social
9
+ module Trust
10
+ module Actor
11
+ class Decay < Legion::Extensions::Actors::Every
12
+ def runner_class
13
+ Legion::Extensions::Agentic::Social::Trust::Runners::Trust
14
+ end
15
+
16
+ def runner_function
17
+ 'decay_trust'
18
+ end
19
+
20
+ def time
21
+ 300
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