lex-agentic-self 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 (249) 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-self.gemspec +31 -0
  7. data/lib/legion/extensions/agentic/self/agency/client.rb +21 -0
  8. data/lib/legion/extensions/agentic/self/agency/helpers/constants.rb +77 -0
  9. data/lib/legion/extensions/agentic/self/agency/helpers/efficacy_model.rb +136 -0
  10. data/lib/legion/extensions/agentic/self/agency/helpers/outcome_event.rb +52 -0
  11. data/lib/legion/extensions/agentic/self/agency/runners/agency.rb +117 -0
  12. data/lib/legion/extensions/agentic/self/agency/version.rb +13 -0
  13. data/lib/legion/extensions/agentic/self/agency.rb +19 -0
  14. data/lib/legion/extensions/agentic/self/anchor/client.rb +15 -0
  15. data/lib/legion/extensions/agentic/self/anchor/helpers/anchor.rb +92 -0
  16. data/lib/legion/extensions/agentic/self/anchor/helpers/anchor_engine.rb +123 -0
  17. data/lib/legion/extensions/agentic/self/anchor/helpers/chain.rb +93 -0
  18. data/lib/legion/extensions/agentic/self/anchor/helpers/constants.rb +46 -0
  19. data/lib/legion/extensions/agentic/self/anchor/runners/cognitive_anchor.rb +70 -0
  20. data/lib/legion/extensions/agentic/self/anchor/version.rb +13 -0
  21. data/lib/legion/extensions/agentic/self/anchor.rb +22 -0
  22. data/lib/legion/extensions/agentic/self/anosognosia/client.rb +28 -0
  23. data/lib/legion/extensions/agentic/self/anosognosia/helpers/anosognosia_engine.rb +153 -0
  24. data/lib/legion/extensions/agentic/self/anosognosia/helpers/cognitive_deficit.rb +71 -0
  25. data/lib/legion/extensions/agentic/self/anosognosia/helpers/constants.rb +29 -0
  26. data/lib/legion/extensions/agentic/self/anosognosia/runners/anosognosia.rb +98 -0
  27. data/lib/legion/extensions/agentic/self/anosognosia/version.rb +13 -0
  28. data/lib/legion/extensions/agentic/self/anosognosia.rb +19 -0
  29. data/lib/legion/extensions/agentic/self/architecture/client.rb +19 -0
  30. data/lib/legion/extensions/agentic/self/architecture/helpers/architecture_engine.rb +167 -0
  31. data/lib/legion/extensions/agentic/self/architecture/helpers/connection.rb +57 -0
  32. data/lib/legion/extensions/agentic/self/architecture/helpers/constants.rb +37 -0
  33. data/lib/legion/extensions/agentic/self/architecture/helpers/subsystem.rb +80 -0
  34. data/lib/legion/extensions/agentic/self/architecture/runners/cognitive_architecture.rb +125 -0
  35. data/lib/legion/extensions/agentic/self/architecture/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/self/architecture.rb +20 -0
  37. data/lib/legion/extensions/agentic/self/default_mode_network/actors/idle.rb +45 -0
  38. data/lib/legion/extensions/agentic/self/default_mode_network/client.rb +28 -0
  39. data/lib/legion/extensions/agentic/self/default_mode_network/helpers/constants.rb +53 -0
  40. data/lib/legion/extensions/agentic/self/default_mode_network/helpers/dmn_engine.rb +221 -0
  41. data/lib/legion/extensions/agentic/self/default_mode_network/helpers/wandering_thought.rb +60 -0
  42. data/lib/legion/extensions/agentic/self/default_mode_network/runners/default_mode_network.rb +122 -0
  43. data/lib/legion/extensions/agentic/self/default_mode_network/version.rb +13 -0
  44. data/lib/legion/extensions/agentic/self/default_mode_network.rb +20 -0
  45. data/lib/legion/extensions/agentic/self/fingerprint/client.rb +28 -0
  46. data/lib/legion/extensions/agentic/self/fingerprint/helpers/cognitive_trait.rb +73 -0
  47. data/lib/legion/extensions/agentic/self/fingerprint/helpers/constants.rb +60 -0
  48. data/lib/legion/extensions/agentic/self/fingerprint/helpers/fingerprint_engine.rb +169 -0
  49. data/lib/legion/extensions/agentic/self/fingerprint/runners/cognitive_fingerprint.rb +86 -0
  50. data/lib/legion/extensions/agentic/self/fingerprint/version.rb +13 -0
  51. data/lib/legion/extensions/agentic/self/fingerprint.rb +19 -0
  52. data/lib/legion/extensions/agentic/self/identity/actors/credential_refresh.rb +49 -0
  53. data/lib/legion/extensions/agentic/self/identity/actors/orphan_check.rb +52 -0
  54. data/lib/legion/extensions/agentic/self/identity/client.rb +27 -0
  55. data/lib/legion/extensions/agentic/self/identity/helpers/dimensions.rb +75 -0
  56. data/lib/legion/extensions/agentic/self/identity/helpers/fingerprint.rb +170 -0
  57. data/lib/legion/extensions/agentic/self/identity/helpers/graph_client.rb +29 -0
  58. data/lib/legion/extensions/agentic/self/identity/helpers/graph_token.rb +36 -0
  59. data/lib/legion/extensions/agentic/self/identity/helpers/token_cache.rb +59 -0
  60. data/lib/legion/extensions/agentic/self/identity/helpers/vault_secrets.rb +80 -0
  61. data/lib/legion/extensions/agentic/self/identity/local_migrations/20260316000030_create_fingerprint.rb +20 -0
  62. data/lib/legion/extensions/agentic/self/identity/runners/entra.rb +402 -0
  63. data/lib/legion/extensions/agentic/self/identity/runners/identity.rb +90 -0
  64. data/lib/legion/extensions/agentic/self/identity/version.rb +13 -0
  65. data/lib/legion/extensions/agentic/self/identity.rb +28 -0
  66. data/lib/legion/extensions/agentic/self/metacognition/client.rb +27 -0
  67. data/lib/legion/extensions/agentic/self/metacognition/helpers/constants.rb +377 -0
  68. data/lib/legion/extensions/agentic/self/metacognition/helpers/narrator_bridge.rb +85 -0
  69. data/lib/legion/extensions/agentic/self/metacognition/helpers/registry_store.rb +70 -0
  70. data/lib/legion/extensions/agentic/self/metacognition/helpers/self_model.rb +160 -0
  71. data/lib/legion/extensions/agentic/self/metacognition/helpers/snapshot_store.rb +82 -0
  72. data/lib/legion/extensions/agentic/self/metacognition/runners/metacognition.rb +116 -0
  73. data/lib/legion/extensions/agentic/self/metacognition/runners/registry.rb +180 -0
  74. data/lib/legion/extensions/agentic/self/metacognition/version.rb +13 -0
  75. data/lib/legion/extensions/agentic/self/metacognition.rb +22 -0
  76. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/client.rb +25 -0
  77. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/helpers/calibration_tracker.rb +96 -0
  78. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/helpers/constants.rb +47 -0
  79. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_engine.rb +141 -0
  80. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_judgment.rb +79 -0
  81. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/runners/metacognitive_monitoring.rb +151 -0
  82. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/version.rb +13 -0
  83. data/lib/legion/extensions/agentic/self/metacognitive_monitoring.rb +20 -0
  84. data/lib/legion/extensions/agentic/self/narrative_arc/client.rb +29 -0
  85. data/lib/legion/extensions/agentic/self/narrative_arc/helpers/arc.rb +137 -0
  86. data/lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb +119 -0
  87. data/lib/legion/extensions/agentic/self/narrative_arc/helpers/beat_event.rb +59 -0
  88. data/lib/legion/extensions/agentic/self/narrative_arc/helpers/constants.rb +66 -0
  89. data/lib/legion/extensions/agentic/self/narrative_arc/runners/narrative.rb +101 -0
  90. data/lib/legion/extensions/agentic/self/narrative_arc/version.rb +13 -0
  91. data/lib/legion/extensions/agentic/self/narrative_arc.rb +20 -0
  92. data/lib/legion/extensions/agentic/self/narrative_identity/actors/narrative_decay.rb +45 -0
  93. data/lib/legion/extensions/agentic/self/narrative_identity/client.rb +22 -0
  94. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/chapter.rb +48 -0
  95. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/constants.rb +62 -0
  96. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/episode.rb +67 -0
  97. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/narrative_engine.rb +187 -0
  98. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/theme.rb +50 -0
  99. data/lib/legion/extensions/agentic/self/narrative_identity/runners/narrative_identity.rb +158 -0
  100. data/lib/legion/extensions/agentic/self/narrative_identity/version.rb +13 -0
  101. data/lib/legion/extensions/agentic/self/narrative_identity.rb +21 -0
  102. data/lib/legion/extensions/agentic/self/narrative_self/client.rb +27 -0
  103. data/lib/legion/extensions/agentic/self/narrative_self/helpers/autobiography.rb +187 -0
  104. data/lib/legion/extensions/agentic/self/narrative_self/helpers/constants.rb +42 -0
  105. data/lib/legion/extensions/agentic/self/narrative_self/helpers/episode.rb +81 -0
  106. data/lib/legion/extensions/agentic/self/narrative_self/helpers/narrative_thread.rb +65 -0
  107. data/lib/legion/extensions/agentic/self/narrative_self/runners/narrative_self.rb +86 -0
  108. data/lib/legion/extensions/agentic/self/narrative_self/version.rb +13 -0
  109. data/lib/legion/extensions/agentic/self/narrative_self.rb +20 -0
  110. data/lib/legion/extensions/agentic/self/personality/client.rb +21 -0
  111. data/lib/legion/extensions/agentic/self/personality/helpers/constants.rb +84 -0
  112. data/lib/legion/extensions/agentic/self/personality/helpers/personality_store.rb +126 -0
  113. data/lib/legion/extensions/agentic/self/personality/helpers/trait_model.rb +147 -0
  114. data/lib/legion/extensions/agentic/self/personality/runners/personality.rb +102 -0
  115. data/lib/legion/extensions/agentic/self/personality/version.rb +13 -0
  116. data/lib/legion/extensions/agentic/self/personality.rb +19 -0
  117. data/lib/legion/extensions/agentic/self/reflection/client.rb +27 -0
  118. data/lib/legion/extensions/agentic/self/reflection/helpers/constants.rb +66 -0
  119. data/lib/legion/extensions/agentic/self/reflection/helpers/llm_enhancer.rb +166 -0
  120. data/lib/legion/extensions/agentic/self/reflection/helpers/monitors.rb +186 -0
  121. data/lib/legion/extensions/agentic/self/reflection/helpers/reflection.rb +54 -0
  122. data/lib/legion/extensions/agentic/self/reflection/helpers/reflection_store.rb +99 -0
  123. data/lib/legion/extensions/agentic/self/reflection/runners/reflection.rb +199 -0
  124. data/lib/legion/extensions/agentic/self/reflection/version.rb +13 -0
  125. data/lib/legion/extensions/agentic/self/reflection.rb +21 -0
  126. data/lib/legion/extensions/agentic/self/self_model/client.rb +19 -0
  127. data/lib/legion/extensions/agentic/self/self_model/helpers/capability.rb +93 -0
  128. data/lib/legion/extensions/agentic/self/self_model/helpers/constants.rb +46 -0
  129. data/lib/legion/extensions/agentic/self/self_model/helpers/knowledge_domain.rb +82 -0
  130. data/lib/legion/extensions/agentic/self/self_model/helpers/self_model.rb +150 -0
  131. data/lib/legion/extensions/agentic/self/self_model/runners/self_model.rb +82 -0
  132. data/lib/legion/extensions/agentic/self/self_model/version.rb +13 -0
  133. data/lib/legion/extensions/agentic/self/self_model.rb +21 -0
  134. data/lib/legion/extensions/agentic/self/self_talk/actors/volume_decay.rb +45 -0
  135. data/lib/legion/extensions/agentic/self/self_talk/client.rb +30 -0
  136. data/lib/legion/extensions/agentic/self/self_talk/helpers/constants.rb +63 -0
  137. data/lib/legion/extensions/agentic/self/self_talk/helpers/dialogue.rb +114 -0
  138. data/lib/legion/extensions/agentic/self/self_talk/helpers/dialogue_turn.rb +43 -0
  139. data/lib/legion/extensions/agentic/self/self_talk/helpers/inner_voice.rb +77 -0
  140. data/lib/legion/extensions/agentic/self/self_talk/helpers/llm_enhancer.rb +135 -0
  141. data/lib/legion/extensions/agentic/self/self_talk/helpers/self_talk_engine.rb +160 -0
  142. data/lib/legion/extensions/agentic/self/self_talk/runners/self_talk.rb +172 -0
  143. data/lib/legion/extensions/agentic/self/self_talk/version.rb +13 -0
  144. data/lib/legion/extensions/agentic/self/self_talk.rb +22 -0
  145. data/lib/legion/extensions/agentic/self/version.rb +11 -0
  146. data/lib/legion/extensions/agentic/self.rb +33 -0
  147. data/spec/legion/extensions/agentic/self/agency/client_spec.rb +67 -0
  148. data/spec/legion/extensions/agentic/self/agency/helpers/constants_spec.rb +73 -0
  149. data/spec/legion/extensions/agentic/self/agency/helpers/efficacy_model_spec.rb +190 -0
  150. data/spec/legion/extensions/agentic/self/agency/helpers/outcome_event_spec.rb +85 -0
  151. data/spec/legion/extensions/agentic/self/agency/runners/agency_spec.rb +132 -0
  152. data/spec/legion/extensions/agentic/self/anchor/client_spec.rb +30 -0
  153. data/spec/legion/extensions/agentic/self/anchor/helpers/anchor_engine_spec.rb +109 -0
  154. data/spec/legion/extensions/agentic/self/anchor/helpers/anchor_spec.rb +124 -0
  155. data/spec/legion/extensions/agentic/self/anchor/helpers/chain_spec.rb +106 -0
  156. data/spec/legion/extensions/agentic/self/anchor/helpers/constants_spec.rb +53 -0
  157. data/spec/legion/extensions/agentic/self/anchor/runners/cognitive_anchor_spec.rb +70 -0
  158. data/spec/legion/extensions/agentic/self/anosognosia/anosognosia_spec.rb +15 -0
  159. data/spec/legion/extensions/agentic/self/anosognosia/client_spec.rb +50 -0
  160. data/spec/legion/extensions/agentic/self/anosognosia/helpers/anosognosia_engine_spec.rb +266 -0
  161. data/spec/legion/extensions/agentic/self/anosognosia/helpers/cognitive_deficit_spec.rb +150 -0
  162. data/spec/legion/extensions/agentic/self/anosognosia/helpers/constants_spec.rb +58 -0
  163. data/spec/legion/extensions/agentic/self/anosognosia/runners/anosognosia_spec.rb +225 -0
  164. data/spec/legion/extensions/agentic/self/architecture/client_spec.rb +51 -0
  165. data/spec/legion/extensions/agentic/self/architecture/helpers/architecture_engine_spec.rb +321 -0
  166. data/spec/legion/extensions/agentic/self/architecture/helpers/connection_spec.rb +118 -0
  167. data/spec/legion/extensions/agentic/self/architecture/helpers/subsystem_spec.rb +189 -0
  168. data/spec/legion/extensions/agentic/self/architecture/runners/cognitive_architecture_spec.rb +181 -0
  169. data/spec/legion/extensions/agentic/self/default_mode_network/client_spec.rb +69 -0
  170. data/spec/legion/extensions/agentic/self/default_mode_network/helpers/constants_spec.rb +76 -0
  171. data/spec/legion/extensions/agentic/self/default_mode_network/helpers/dmn_engine_spec.rb +321 -0
  172. data/spec/legion/extensions/agentic/self/default_mode_network/helpers/wandering_thought_spec.rb +145 -0
  173. data/spec/legion/extensions/agentic/self/default_mode_network/runners/default_mode_network_spec.rb +269 -0
  174. data/spec/legion/extensions/agentic/self/fingerprint/client_spec.rb +54 -0
  175. data/spec/legion/extensions/agentic/self/fingerprint/helpers/cognitive_trait_spec.rb +180 -0
  176. data/spec/legion/extensions/agentic/self/fingerprint/helpers/constants_spec.rb +108 -0
  177. data/spec/legion/extensions/agentic/self/fingerprint/helpers/fingerprint_engine_spec.rb +318 -0
  178. data/spec/legion/extensions/agentic/self/fingerprint/runners/cognitive_fingerprint_spec.rb +232 -0
  179. data/spec/legion/extensions/agentic/self/identity/actors/orphan_check_spec.rb +104 -0
  180. data/spec/legion/extensions/agentic/self/identity/client_spec.rb +32 -0
  181. data/spec/legion/extensions/agentic/self/identity/helpers/dimensions_spec.rb +51 -0
  182. data/spec/legion/extensions/agentic/self/identity/helpers/fingerprint_spec.rb +66 -0
  183. data/spec/legion/extensions/agentic/self/identity/helpers/graph_client_spec.rb +19 -0
  184. data/spec/legion/extensions/agentic/self/identity/helpers/graph_token_spec.rb +31 -0
  185. data/spec/legion/extensions/agentic/self/identity/helpers/token_cache_spec.rb +50 -0
  186. data/spec/legion/extensions/agentic/self/identity/local_persistence_spec.rb +329 -0
  187. data/spec/legion/extensions/agentic/self/identity/runners/entra_spec.rb +655 -0
  188. data/spec/legion/extensions/agentic/self/identity/runners/identity_spec.rb +61 -0
  189. data/spec/legion/extensions/agentic/self/metacognition/client_spec.rb +20 -0
  190. data/spec/legion/extensions/agentic/self/metacognition/helpers/constants_spec.rb +31 -0
  191. data/spec/legion/extensions/agentic/self/metacognition/helpers/narrator_bridge_spec.rb +102 -0
  192. data/spec/legion/extensions/agentic/self/metacognition/helpers/registry_store_spec.rb +227 -0
  193. data/spec/legion/extensions/agentic/self/metacognition/helpers/self_model_spec.rb +117 -0
  194. data/spec/legion/extensions/agentic/self/metacognition/helpers/snapshot_store_spec.rb +128 -0
  195. data/spec/legion/extensions/agentic/self/metacognition/runners/metacognition_spec.rb +110 -0
  196. data/spec/legion/extensions/agentic/self/metacognition/runners/registry_spec.rb +281 -0
  197. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/client_spec.rb +59 -0
  198. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/helpers/calibration_tracker_spec.rb +143 -0
  199. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/helpers/constants_spec.rb +91 -0
  200. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_engine_spec.rb +198 -0
  201. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_judgment_spec.rb +172 -0
  202. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/runners/metacognitive_monitoring_spec.rb +244 -0
  203. data/spec/legion/extensions/agentic/self/narrative_arc/client_spec.rb +22 -0
  204. data/spec/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine_spec.rb +183 -0
  205. data/spec/legion/extensions/agentic/self/narrative_arc/helpers/arc_spec.rb +177 -0
  206. data/spec/legion/extensions/agentic/self/narrative_arc/helpers/beat_event_spec.rb +96 -0
  207. data/spec/legion/extensions/agentic/self/narrative_arc/helpers/constants_spec.rb +75 -0
  208. data/spec/legion/extensions/agentic/self/narrative_arc/runners/narrative_spec.rb +142 -0
  209. data/spec/legion/extensions/agentic/self/narrative_identity/client_spec.rb +69 -0
  210. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/chapter_spec.rb +85 -0
  211. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/constants_spec.rb +83 -0
  212. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/episode_spec.rb +180 -0
  213. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/narrative_engine_spec.rb +307 -0
  214. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/theme_spec.rb +107 -0
  215. data/spec/legion/extensions/agentic/self/narrative_identity/runners/narrative_identity_spec.rb +240 -0
  216. data/spec/legion/extensions/agentic/self/narrative_self/client_spec.rb +67 -0
  217. data/spec/legion/extensions/agentic/self/narrative_self/helpers/autobiography_spec.rb +155 -0
  218. data/spec/legion/extensions/agentic/self/narrative_self/helpers/constants_spec.rb +28 -0
  219. data/spec/legion/extensions/agentic/self/narrative_self/helpers/episode_spec.rb +144 -0
  220. data/spec/legion/extensions/agentic/self/narrative_self/helpers/narrative_thread_spec.rb +87 -0
  221. data/spec/legion/extensions/agentic/self/narrative_self/runners/narrative_self_spec.rb +118 -0
  222. data/spec/legion/extensions/agentic/self/personality/client_spec.rb +20 -0
  223. data/spec/legion/extensions/agentic/self/personality/helpers/constants_spec.rb +41 -0
  224. data/spec/legion/extensions/agentic/self/personality/helpers/personality_store_spec.rb +66 -0
  225. data/spec/legion/extensions/agentic/self/personality/helpers/trait_model_spec.rb +148 -0
  226. data/spec/legion/extensions/agentic/self/personality/runners/personality_spec.rb +67 -0
  227. data/spec/legion/extensions/agentic/self/reflection/client_spec.rb +24 -0
  228. data/spec/legion/extensions/agentic/self/reflection/helpers/llm_enhancer_spec.rb +191 -0
  229. data/spec/legion/extensions/agentic/self/reflection/helpers/monitors_spec.rb +120 -0
  230. data/spec/legion/extensions/agentic/self/reflection/helpers/reflection_spec.rb +49 -0
  231. data/spec/legion/extensions/agentic/self/reflection/helpers/reflection_store_spec.rb +93 -0
  232. data/spec/legion/extensions/agentic/self/reflection/runners/reflection_spec.rb +204 -0
  233. data/spec/legion/extensions/agentic/self/self_model/client_spec.rb +55 -0
  234. data/spec/legion/extensions/agentic/self/self_model/helpers/capability_spec.rb +160 -0
  235. data/spec/legion/extensions/agentic/self/self_model/helpers/knowledge_domain_spec.rb +128 -0
  236. data/spec/legion/extensions/agentic/self/self_model/helpers/self_model_spec.rb +238 -0
  237. data/spec/legion/extensions/agentic/self/self_model/runners/self_model_spec.rb +143 -0
  238. data/spec/legion/extensions/agentic/self/self_talk/actors/volume_decay_spec.rb +46 -0
  239. data/spec/legion/extensions/agentic/self/self_talk/client_spec.rb +26 -0
  240. data/spec/legion/extensions/agentic/self/self_talk/helpers/constants_spec.rb +110 -0
  241. data/spec/legion/extensions/agentic/self/self_talk/helpers/dialogue_spec.rb +191 -0
  242. data/spec/legion/extensions/agentic/self/self_talk/helpers/dialogue_turn_spec.rb +78 -0
  243. data/spec/legion/extensions/agentic/self/self_talk/helpers/inner_voice_spec.rb +172 -0
  244. data/spec/legion/extensions/agentic/self/self_talk/helpers/llm_enhancer_spec.rb +206 -0
  245. data/spec/legion/extensions/agentic/self/self_talk/helpers/self_talk_engine_spec.rb +239 -0
  246. data/spec/legion/extensions/agentic/self/self_talk/runners/self_talk_llm_spec.rb +169 -0
  247. data/spec/legion/extensions/agentic/self/self_talk/runners/self_talk_spec.rb +196 -0
  248. data/spec/spec_helper.rb +46 -0
  249. metadata +347 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6d78221dc914c624a359465f1b3eda8dd9e0cb6e89be19f1455e979b087ad4ae
4
+ data.tar.gz: 076c649303e81e8ab5396ef6bef33c1fe9bda3606df9c3ba533b249ab0d9b903
5
+ SHA512:
6
+ metadata.gz: fa086ec76865a2b2f24057b110b88d1fc38f350ca540d6e2e2592ee64c1ced65eccd0735bdd4667a1f9b151adea39f3cfe56385cba4fb9bd0e712085951a067b
7
+ data.tar.gz: 40c44ecdd2afaa40586e85e8201d4ddf7fac5500b152316e070536f88484fb2dbfd1c4f982ead5fcda8b13ad98bb1c2ca162cc9f1debe15e369698bd8830a3e2
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased]
4
+
5
+ ## [0.1.0] - 2026-03-18
6
+
7
+ ### Added
8
+ - Initial release as domain consolidation gem
9
+ - Consolidated source extensions into unified domain gem under `Legion::Extensions::Agentic::<Domain>`
10
+ - All sub-modules loaded from single entry point
11
+ - Full spec suite with zero failures
12
+ - RuboCop compliance across all files
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Matthew Iverson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # lex-agentic-self
2
+
3
+ LEX agentic self domain: identity, metacognition, self-model
4
+
5
+ ## Sub-modules
6
+
7
+ *(populated as extensions are consolidated)*
8
+
9
+ ## Installation
10
+
11
+ ```ruby
12
+ gem 'lex-agentic-self'
13
+ ```
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/legion/extensions/agentic/self/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'lex-agentic-self'
7
+ spec.version = Legion::Extensions::Agentic::Self::VERSION
8
+ spec.authors = ['Esity']
9
+ spec.email = ['matthewdiverson@gmail.com']
10
+
11
+ spec.summary = 'LEX Agentic Self'
12
+ spec.description = 'LEX agentic self domain: identity, metacognition, self-model'
13
+ spec.homepage = 'https://github.com/LegionIO/lex-agentic-self'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 3.4'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = spec.homepage
19
+ spec.metadata['changelog_uri'] = "#{spec.homepage}/blob/main/CHANGELOG.md"
20
+ spec.metadata['rubygems_mfa_required'] = 'true'
21
+
22
+ spec.files = Dir.chdir(__dir__) do
23
+ Dir.glob('{lib,spec}/**/*.rb') + %w[lex-agentic-self.gemspec Gemfile LICENSE README.md CHANGELOG.md]
24
+ end
25
+ spec.require_paths = ['lib']
26
+
27
+ spec.add_development_dependency 'faraday', '~> 2.0'
28
+ spec.add_development_dependency 'rspec', '~> 3.13'
29
+ spec.add_development_dependency 'rubocop', '~> 1.60'
30
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.26'
31
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Agency
8
+ class Client
9
+ include Runners::Agency
10
+
11
+ attr_reader :efficacy_model
12
+
13
+ def initialize(efficacy_model: nil, **)
14
+ @efficacy_model = efficacy_model || Helpers::EfficacyModel.new
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Agency
8
+ module Helpers
9
+ module Constants
10
+ # Initial self-efficacy for new domains (moderate confidence)
11
+ DEFAULT_EFFICACY = 0.5
12
+
13
+ # EMA alpha for efficacy updates (slow adaptation)
14
+ EFFICACY_ALPHA = 0.12
15
+
16
+ # How much mastery success boosts efficacy
17
+ MASTERY_BOOST = 0.15
18
+
19
+ # How much failure reduces efficacy (asymmetric — failures hit harder)
20
+ FAILURE_PENALTY = 0.20
21
+
22
+ # Vicarious learning multiplier (learning from others' outcomes)
23
+ VICARIOUS_MULTIPLIER = 0.4
24
+
25
+ # Verbal persuasion multiplier (being told you can/can't do something)
26
+ PERSUASION_MULTIPLIER = 0.25
27
+
28
+ # Physiological state influence on efficacy
29
+ PHYSIOLOGICAL_MULTIPLIER = 0.15
30
+
31
+ # Minimum efficacy (never zero — always some belief in possibility)
32
+ EFFICACY_FLOOR = 0.05
33
+
34
+ # Maximum efficacy (never perfectly certain)
35
+ EFFICACY_CEILING = 0.98
36
+
37
+ # Domain decay rate per tick (unused domains slowly regress toward default)
38
+ DECAY_RATE = 0.002
39
+
40
+ # Maximum tracked domains
41
+ MAX_DOMAINS = 100
42
+
43
+ # Maximum outcome history per domain
44
+ MAX_HISTORY_PER_DOMAIN = 50
45
+
46
+ # Maximum total outcome events
47
+ MAX_TOTAL_HISTORY = 500
48
+
49
+ # Sources of efficacy information (Bandura's four sources)
50
+ EFFICACY_SOURCES = %i[mastery vicarious persuasion physiological].freeze
51
+
52
+ # Agency attribution levels
53
+ ATTRIBUTION_LEVELS = {
54
+ full_agency: 0.8,
55
+ partial_agency: 0.5,
56
+ low_agency: 0.3,
57
+ no_agency: 0.0
58
+ }.freeze
59
+
60
+ # Outcome types
61
+ OUTCOME_TYPES = %i[success failure partial_success unexpected].freeze
62
+
63
+ # Efficacy level labels
64
+ EFFICACY_LABELS = {
65
+ (0.8..) => :highly_capable,
66
+ (0.6...0.8) => :capable,
67
+ (0.4...0.6) => :uncertain,
68
+ (0.2...0.4) => :doubtful,
69
+ (..0.2) => :helpless
70
+ }.freeze
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Agency
8
+ module Helpers
9
+ class EfficacyModel
10
+ attr_reader :domains, :history
11
+
12
+ def initialize
13
+ @domains = {}
14
+ @history = []
15
+ end
16
+
17
+ def efficacy_for(domain)
18
+ @domains[domain] ||= Constants::DEFAULT_EFFICACY
19
+ @domains[domain]
20
+ end
21
+
22
+ def efficacy_label(domain)
23
+ value = efficacy_for(domain)
24
+ Constants::EFFICACY_LABELS.each do |range, label|
25
+ return label if range.cover?(value)
26
+ end
27
+ :uncertain
28
+ end
29
+
30
+ def record_outcome(event)
31
+ @history << event
32
+ update_efficacy(event)
33
+ trim_history
34
+ event
35
+ end
36
+
37
+ def decay_all
38
+ @domains.each_key do |domain|
39
+ current = @domains[domain]
40
+ diff = Constants::DEFAULT_EFFICACY - current
41
+ @domains[domain] = (current + (diff * Constants::DECAY_RATE)).clamp(
42
+ Constants::EFFICACY_FLOOR, Constants::EFFICACY_CEILING
43
+ )
44
+ end
45
+ trim_domains
46
+ end
47
+
48
+ def domain_history(domain)
49
+ @history.select { |e| e.domain == domain }
50
+ end
51
+
52
+ def success_rate(domain)
53
+ events = domain_history(domain)
54
+ return 0.0 if events.empty?
55
+
56
+ successes = events.count(&:success?)
57
+ successes.to_f / events.size
58
+ end
59
+
60
+ def strongest_domains(count = 5)
61
+ @domains.sort_by { |_, v| -v }.first(count).to_h
62
+ end
63
+
64
+ def weakest_domains(count = 5)
65
+ @domains.sort_by { |_, v| v }.first(count).to_h
66
+ end
67
+
68
+ def overall_efficacy
69
+ return Constants::DEFAULT_EFFICACY if @domains.empty?
70
+
71
+ @domains.values.sum / @domains.size
72
+ end
73
+
74
+ def domain_count
75
+ @domains.size
76
+ end
77
+
78
+ def to_h
79
+ {
80
+ domain_count: @domains.size,
81
+ overall_efficacy: overall_efficacy.round(4),
82
+ history_size: @history.size,
83
+ domains: @domains.transform_values { |v| v.round(4) }
84
+ }
85
+ end
86
+
87
+ private
88
+
89
+ def update_efficacy(event)
90
+ domain = event.domain
91
+ current = efficacy_for(domain)
92
+ delta = compute_delta(event)
93
+
94
+ new_value = current + (Constants::EFFICACY_ALPHA * delta)
95
+ @domains[domain] = new_value.clamp(Constants::EFFICACY_FLOOR, Constants::EFFICACY_CEILING)
96
+ end
97
+
98
+ def compute_delta(event)
99
+ base = event.attributed_magnitude
100
+ multiplier = source_multiplier(event.source)
101
+
102
+ if event.success?
103
+ base * multiplier * Constants::MASTERY_BOOST / Constants::EFFICACY_ALPHA
104
+ else
105
+ -base * multiplier * Constants::FAILURE_PENALTY / Constants::EFFICACY_ALPHA
106
+ end
107
+ end
108
+
109
+ def source_multiplier(source)
110
+ case source
111
+ when :mastery then 1.0
112
+ when :vicarious then Constants::VICARIOUS_MULTIPLIER
113
+ when :persuasion then Constants::PERSUASION_MULTIPLIER
114
+ when :physiological then Constants::PHYSIOLOGICAL_MULTIPLIER
115
+ else 0.5
116
+ end
117
+ end
118
+
119
+ def trim_history
120
+ @history.shift(@history.size - Constants::MAX_TOTAL_HISTORY) if @history.size > Constants::MAX_TOTAL_HISTORY
121
+ end
122
+
123
+ def trim_domains
124
+ return unless @domains.size > Constants::MAX_DOMAINS
125
+
126
+ sorted = @domains.sort_by { |_, v| (v - Constants::DEFAULT_EFFICACY).abs }
127
+ excess = @domains.size - Constants::MAX_DOMAINS
128
+ sorted.first(excess).each { |domain, _| @domains.delete(domain) } # rubocop:disable Style/HashEachMethods
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module Agency
10
+ module Helpers
11
+ class OutcomeEvent
12
+ attr_reader :id, :domain, :outcome_type, :source, :magnitude, :attribution, :timestamp
13
+
14
+ def initialize(domain:, outcome_type:, source: :mastery, magnitude: 1.0, attribution: :full_agency)
15
+ @id = SecureRandom.uuid
16
+ @domain = domain
17
+ @outcome_type = outcome_type
18
+ @source = source
19
+ @magnitude = magnitude.clamp(0.0, 1.0)
20
+ @attribution = attribution
21
+ @timestamp = Time.now.utc
22
+ end
23
+
24
+ def success?
25
+ %i[success partial_success].include?(@outcome_type)
26
+ end
27
+
28
+ def attributed_magnitude
29
+ level = Constants::ATTRIBUTION_LEVELS[@attribution] || 0.5
30
+ @magnitude * level
31
+ end
32
+
33
+ def to_h
34
+ {
35
+ id: @id,
36
+ domain: @domain,
37
+ outcome_type: @outcome_type,
38
+ source: @source,
39
+ magnitude: @magnitude,
40
+ attribution: @attribution,
41
+ success: success?,
42
+ attributed_magnitude: attributed_magnitude.round(4),
43
+ timestamp: @timestamp
44
+ }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Agency
8
+ module Runners
9
+ module Agency
10
+ include Legion::Extensions::Helpers::Lex
11
+
12
+ def efficacy_model
13
+ @efficacy_model ||= Helpers::EfficacyModel.new
14
+ end
15
+
16
+ def record_mastery(domain:, outcome_type:, magnitude: 1.0, attribution: :full_agency, **)
17
+ event = Helpers::OutcomeEvent.new(
18
+ domain: domain, outcome_type: outcome_type, source: :mastery,
19
+ magnitude: magnitude, attribution: attribution
20
+ )
21
+ efficacy_model.record_outcome(event)
22
+ Legion::Logging.debug "[agency] mastery #{outcome_type} in #{domain} " \
23
+ "efficacy=#{efficacy_model.efficacy_for(domain).round(4)}"
24
+ { success: true, event: event.to_h, efficacy: efficacy_model.efficacy_for(domain).round(4) }
25
+ end
26
+
27
+ def record_vicarious(domain:, outcome_type:, magnitude: 1.0, **)
28
+ event = Helpers::OutcomeEvent.new(
29
+ domain: domain, outcome_type: outcome_type, source: :vicarious,
30
+ magnitude: magnitude, attribution: :partial_agency
31
+ )
32
+ efficacy_model.record_outcome(event)
33
+ Legion::Logging.debug "[agency] vicarious #{outcome_type} in #{domain}"
34
+ { success: true, event: event.to_h, efficacy: efficacy_model.efficacy_for(domain).round(4) }
35
+ end
36
+
37
+ def record_persuasion(domain:, positive: true, magnitude: 0.5, **)
38
+ outcome = positive ? :success : :failure
39
+ event = Helpers::OutcomeEvent.new(
40
+ domain: domain, outcome_type: outcome, source: :persuasion,
41
+ magnitude: magnitude, attribution: :partial_agency
42
+ )
43
+ efficacy_model.record_outcome(event)
44
+ Legion::Logging.debug "[agency] persuasion #{positive ? 'positive' : 'negative'} in #{domain}"
45
+ { success: true, event: event.to_h, efficacy: efficacy_model.efficacy_for(domain).round(4) }
46
+ end
47
+
48
+ def record_physiological(domain:, state: :energized, **)
49
+ outcome = %i[energized calm focused].include?(state) ? :success : :failure
50
+ magnitude = %i[energized calm focused].include?(state) ? 0.6 : 0.4
51
+ event = Helpers::OutcomeEvent.new(
52
+ domain: domain, outcome_type: outcome, source: :physiological,
53
+ magnitude: magnitude, attribution: :low_agency
54
+ )
55
+ efficacy_model.record_outcome(event)
56
+ Legion::Logging.debug "[agency] physiological #{state} in #{domain}"
57
+ { success: true, event: event.to_h, efficacy: efficacy_model.efficacy_for(domain).round(4) }
58
+ end
59
+
60
+ def update_agency(**)
61
+ efficacy_model.decay_all
62
+ Legion::Logging.debug "[agency] tick: domains=#{efficacy_model.domain_count} " \
63
+ "overall=#{efficacy_model.overall_efficacy.round(4)}"
64
+ { success: true, stats: efficacy_model.to_h }
65
+ end
66
+
67
+ def check_efficacy(domain:, **)
68
+ {
69
+ success: true,
70
+ domain: domain,
71
+ efficacy: efficacy_model.efficacy_for(domain).round(4),
72
+ label: efficacy_model.efficacy_label(domain),
73
+ success_rate: efficacy_model.success_rate(domain).round(4),
74
+ history_count: efficacy_model.domain_history(domain).size
75
+ }
76
+ end
77
+
78
+ def should_attempt?(domain:, threshold: 0.3, **)
79
+ efficacy = efficacy_model.efficacy_for(domain)
80
+ {
81
+ success: true,
82
+ domain: domain,
83
+ efficacy: efficacy.round(4),
84
+ threshold: threshold,
85
+ should_attempt: efficacy >= threshold,
86
+ label: efficacy_model.efficacy_label(domain)
87
+ }
88
+ end
89
+
90
+ def strongest_domains(count: 5, **)
91
+ domains = efficacy_model.strongest_domains(count)
92
+ {
93
+ success: true,
94
+ domains: domains.transform_values { |v| v.round(4) },
95
+ count: domains.size
96
+ }
97
+ end
98
+
99
+ def weakest_domains(count: 5, **)
100
+ domains = efficacy_model.weakest_domains(count)
101
+ {
102
+ success: true,
103
+ domains: domains.transform_values { |v| v.round(4) },
104
+ count: domains.size
105
+ }
106
+ end
107
+
108
+ def agency_stats(**)
109
+ { success: true, stats: efficacy_model.to_h }
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Agency
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 'agency/version'
4
+ require_relative 'agency/helpers/constants'
5
+ require_relative 'agency/helpers/outcome_event'
6
+ require_relative 'agency/helpers/efficacy_model'
7
+ require_relative 'agency/runners/agency'
8
+ require_relative 'agency/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Self
14
+ module Agency
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anchor
8
+ class Client
9
+ include Runners::CognitiveAnchor
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anchor
8
+ module Helpers
9
+ class Anchor
10
+ attr_reader :id, :anchor_type, :domain, :content,
11
+ :reference_value, :created_at
12
+ attr_accessor :grip, :weight
13
+
14
+ def initialize(anchor_type:, domain:, content:,
15
+ reference_value: nil, grip: nil, weight: nil)
16
+ validate_anchor_type!(anchor_type)
17
+ @id = SecureRandom.uuid
18
+ @anchor_type = anchor_type.to_sym
19
+ @domain = domain.to_sym
20
+ @content = content.to_s
21
+ @reference_value = (reference_value || 0.5).to_f.clamp(0.0, 1.0).round(10)
22
+ @grip = (grip || 0.7).to_f.clamp(0.0, 1.0).round(10)
23
+ @weight = (weight || 0.5).to_f.clamp(0.0, 1.0).round(10)
24
+ @created_at = Time.now.utc
25
+ end
26
+
27
+ def drag!(rate: Constants::DRAG_RATE)
28
+ @grip = (@grip + rate.abs).clamp(0.0, 1.0).round(10)
29
+ end
30
+
31
+ def drift!(rate: Constants::DRIFT_RATE)
32
+ @grip = (@grip - rate.abs).clamp(0.0, 1.0).round(10)
33
+ end
34
+
35
+ def bias_pull(new_value)
36
+ pull_strength = @grip * @weight
37
+ adjusted = new_value + ((reference_value - new_value) * pull_strength)
38
+ adjusted.clamp(0.0, 1.0).round(10)
39
+ end
40
+
41
+ def ironclad?
42
+ @grip >= 0.8
43
+ end
44
+
45
+ def drifting?
46
+ @grip < 0.2
47
+ end
48
+
49
+ def heavy?
50
+ @weight >= 0.7
51
+ end
52
+
53
+ def light?
54
+ @weight < 0.3
55
+ end
56
+
57
+ def grip_label
58
+ Constants.label_for(Constants::GRIP_LABELS, @grip)
59
+ end
60
+
61
+ def to_h
62
+ {
63
+ id: @id,
64
+ anchor_type: @anchor_type,
65
+ domain: @domain,
66
+ content: @content,
67
+ reference_value: @reference_value,
68
+ grip: @grip,
69
+ weight: @weight,
70
+ grip_label: grip_label,
71
+ ironclad: ironclad?,
72
+ drifting: drifting?,
73
+ created_at: @created_at
74
+ }
75
+ end
76
+
77
+ private
78
+
79
+ def validate_anchor_type!(val)
80
+ return if Constants::ANCHOR_TYPES.include?(val.to_sym)
81
+
82
+ raise ArgumentError,
83
+ "unknown anchor type: #{val.inspect}; " \
84
+ "must be one of #{Constants::ANCHOR_TYPES.inspect}"
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end