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
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module SelfModel
8
+ module Helpers
9
+ class SelfModel
10
+ include Constants
11
+
12
+ attr_reader :capabilities, :knowledge_domains, :predictions, :history
13
+
14
+ def initialize
15
+ @capabilities = {}
16
+ @knowledge_domains = {}
17
+ @predictions = []
18
+ @history = []
19
+ @cap_counter = 0
20
+ @dom_counter = 0
21
+ end
22
+
23
+ def add_capability(name:, domain: :general, competence: DEFAULT_COMPETENCE)
24
+ return nil if @capabilities.size >= MAX_CAPABILITIES
25
+
26
+ @cap_counter += 1
27
+ cap_id = :"cap_#{@cap_counter}"
28
+ cap = Capability.new(id: cap_id, name: name, domain: domain, competence: competence)
29
+ @capabilities[cap_id] = cap
30
+ cap
31
+ end
32
+
33
+ def add_knowledge_domain(name:, depth: 0.0, breadth: 0.0)
34
+ return nil if @knowledge_domains.size >= MAX_KNOWLEDGE_DOMAINS
35
+
36
+ @dom_counter += 1
37
+ dom_id = :"dom_#{@dom_counter}"
38
+ dom = KnowledgeDomain.new(id: dom_id, name: name, depth: depth, breadth: breadth)
39
+ @knowledge_domains[dom_id] = dom
40
+ dom
41
+ end
42
+
43
+ def predict_success(capability_id:)
44
+ cap = @capabilities[capability_id]
45
+ return nil unless cap
46
+
47
+ prediction = { capability_id: capability_id, predicted_probability: cap.competence.round(4),
48
+ at: Time.now.utc }
49
+ @predictions << prediction
50
+ @predictions.shift while @predictions.size > MAX_HISTORY
51
+ prediction
52
+ end
53
+
54
+ def record_outcome(capability_id:, predicted:, actual:)
55
+ cap = @capabilities[capability_id]
56
+ return nil unless cap
57
+
58
+ cap.record_attempt(predicted_success: predicted, actual_success: actual)
59
+ event = { type: :outcome, capability_id: capability_id, predicted: predicted,
60
+ actual: actual, at: Time.now.utc }
61
+ @history << event
62
+ @history.shift while @history.size > MAX_HISTORY
63
+ event
64
+ end
65
+
66
+ def introspect
67
+ {
68
+ overall_confidence: overall_confidence.round(4),
69
+ strengths: strengths.map(&:to_h),
70
+ weaknesses: weaknesses.map(&:to_h),
71
+ blind_spots: blind_spots.map(&:to_h),
72
+ knowledge_gaps: knowledge_gaps.map(&:to_h),
73
+ calibration: calibration_report
74
+ }
75
+ end
76
+
77
+ def strengths
78
+ @capabilities.values.select { |c| c.competence > 0.7 }
79
+ end
80
+
81
+ def weaknesses
82
+ @capabilities.values.select { |c| c.competence < 0.3 }
83
+ end
84
+
85
+ def blind_spots
86
+ @capabilities.values.select(&:overconfident?)
87
+ end
88
+
89
+ def calibration_report
90
+ caps = @capabilities.values
91
+ return { label: :uncalibrated, mean_error: 0.0, calibrated_count: 0, total: 0 } if caps.empty?
92
+
93
+ errors = caps.map { |c| c.calibration_error.abs }
94
+ mean_error = errors.sum / errors.size.to_f
95
+ calibrated_count = caps.count(&:calibrated?)
96
+
97
+ label = CALIBRATION_LABELS.each do |lbl, threshold|
98
+ break lbl if mean_error <= threshold
99
+ end
100
+ label = :uncalibrated unless label.is_a?(Symbol)
101
+
102
+ { label: label, mean_error: mean_error.round(4), calibrated_count: calibrated_count,
103
+ total: caps.size }
104
+ end
105
+
106
+ def knowledge_gaps
107
+ @knowledge_domains.values.select { |d| d.depth < 0.3 }
108
+ end
109
+
110
+ def can_do?(capability_name)
111
+ cap = @capabilities.values.find { |c| c.name == capability_name }
112
+ return false unless cap
113
+
114
+ cap.competence >= 0.5
115
+ end
116
+
117
+ def knows_about?(domain_name)
118
+ dom = @knowledge_domains.values.find { |d| d.name == domain_name }
119
+ return false unless dom
120
+
121
+ dom.confidence >= 0.5
122
+ end
123
+
124
+ def overall_confidence
125
+ return DEFAULT_COMPETENCE if @capabilities.empty?
126
+
127
+ total = @capabilities.values.sum(&:competence)
128
+ total / @capabilities.size.to_f
129
+ end
130
+
131
+ def to_h
132
+ {
133
+ capability_count: @capabilities.size,
134
+ knowledge_domain_count: @knowledge_domains.size,
135
+ overall_confidence: overall_confidence.round(4),
136
+ strength_count: strengths.size,
137
+ weakness_count: weaknesses.size,
138
+ blind_spot_count: blind_spots.size,
139
+ knowledge_gap_count: knowledge_gaps.size,
140
+ prediction_count: @predictions.size,
141
+ history_size: @history.size
142
+ }
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module SelfModel
8
+ module Runners
9
+ module SelfModel
10
+ include Helpers::Constants
11
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
12
+
13
+ def add_self_capability(name:, domain: :general, competence: DEFAULT_COMPETENCE, **)
14
+ cap = model.add_capability(name: name, domain: domain, competence: competence)
15
+ return { success: false, reason: :limit_reached } unless cap
16
+
17
+ { success: true, capability_id: cap.id, competence: cap.competence.round(4), state: cap.state }
18
+ end
19
+
20
+ def add_self_knowledge(name:, depth: 0.0, breadth: 0.0, **)
21
+ dom = model.add_knowledge_domain(name: name, depth: depth, breadth: breadth)
22
+ return { success: false, reason: :limit_reached } unless dom
23
+
24
+ { success: true, domain_id: dom.id, depth: dom.depth.round(4), breadth: dom.breadth.round(4),
25
+ state: dom.state }
26
+ end
27
+
28
+ def predict_own_success(capability_id:, **)
29
+ prediction = model.predict_success(capability_id: capability_id)
30
+ return { success: false, reason: :not_found } unless prediction
31
+
32
+ { success: true }.merge(prediction)
33
+ end
34
+
35
+ def record_self_outcome(capability_id:, predicted:, actual:, **)
36
+ event = model.record_outcome(capability_id: capability_id, predicted: predicted, actual: actual)
37
+ return { success: false, reason: :not_found } unless event
38
+
39
+ cap = model.capabilities[capability_id]
40
+ { success: true, capability_id: capability_id, competence: cap.competence.round(4),
41
+ calibration_error: cap.calibration_error.round(4) }
42
+ end
43
+
44
+ def self_introspection(**)
45
+ { success: true }.merge(model.introspect)
46
+ end
47
+
48
+ def self_strengths(**)
49
+ strengths = model.strengths.map(&:to_h)
50
+ { success: true, strengths: strengths, count: strengths.size }
51
+ end
52
+
53
+ def self_weaknesses(**)
54
+ weaknesses = model.weaknesses.map(&:to_h)
55
+ { success: true, weaknesses: weaknesses, count: weaknesses.size }
56
+ end
57
+
58
+ def self_blind_spots(**)
59
+ blind_spots = model.blind_spots.map(&:to_h)
60
+ { success: true, blind_spots: blind_spots, count: blind_spots.size }
61
+ end
62
+
63
+ def self_calibration_report(**)
64
+ { success: true }.merge(model.calibration_report)
65
+ end
66
+
67
+ def self_model_stats(**)
68
+ { success: true }.merge(model.to_h)
69
+ end
70
+
71
+ private
72
+
73
+ def model
74
+ @model ||= Helpers::SelfModel.new
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ 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 SelfModel
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'self_model/version'
4
+ require_relative 'self_model/helpers/constants'
5
+ require_relative 'self_model/helpers/capability'
6
+ require_relative 'self_model/helpers/knowledge_domain'
7
+ require_relative 'self_model/helpers/self_model'
8
+ require_relative 'self_model/runners/self_model'
9
+ require_relative 'self_model/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Self
15
+ module SelfModel
16
+ # Sub-module for self-model: stable beliefs about capabilities, limitations, and values
17
+ end
18
+ end
19
+ end
20
+ end
21
+ 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 Self
9
+ module SelfTalk
10
+ module Actor
11
+ class VolumeDecay < Legion::Extensions::Actors::Every
12
+ def runner_class
13
+ Legion::Extensions::Agentic::Self::SelfTalk::Runners::SelfTalk
14
+ end
15
+
16
+ def runner_function
17
+ 'decay_voices'
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
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/self_talk/helpers/constants'
4
+ require 'legion/extensions/agentic/self/self_talk/helpers/inner_voice'
5
+ require 'legion/extensions/agentic/self/self_talk/helpers/dialogue_turn'
6
+ require 'legion/extensions/agentic/self/self_talk/helpers/dialogue'
7
+ require 'legion/extensions/agentic/self/self_talk/helpers/self_talk_engine'
8
+ require 'legion/extensions/agentic/self/self_talk/runners/self_talk'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Self
14
+ module SelfTalk
15
+ class Client
16
+ include Runners::SelfTalk
17
+
18
+ def initialize(**)
19
+ @engine = Helpers::SelfTalkEngine.new
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :engine
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module SelfTalk
8
+ module Helpers
9
+ module Constants
10
+ MAX_VOICES = 10
11
+ MAX_DIALOGUES = 200
12
+ MAX_TURNS_PER_DIALOGUE = 50
13
+ DEFAULT_VOLUME = 0.5
14
+ VOLUME_BOOST = 0.1
15
+ VOLUME_DECAY = 0.05
16
+
17
+ VOICE_TYPES = %i[
18
+ critic
19
+ encourager
20
+ analyst
21
+ devils_advocate
22
+ pragmatist
23
+ visionary
24
+ caretaker
25
+ rebel
26
+ ].freeze
27
+
28
+ DIALOGUE_STATUSES = %i[open concluded deadlocked abandoned].freeze
29
+
30
+ DOMINANCE_LABELS = {
31
+ (0.8..1.0) => :commanding,
32
+ (0.6...0.8) => :assertive,
33
+ (0.4...0.6) => :balanced,
34
+ (0.2...0.4) => :quiet,
35
+ (0.0...0.2) => :silent
36
+ }.freeze
37
+
38
+ CONSENSUS_LABELS = {
39
+ (0.8..1.0) => :unanimous,
40
+ (0.6...0.8) => :agreement,
41
+ (0.4...0.6) => :mixed,
42
+ (0.2...0.4) => :disagreement,
43
+ (0.0...0.2) => :conflict
44
+ }.freeze
45
+
46
+ module_function
47
+
48
+ def dominance_label(volume)
49
+ DOMINANCE_LABELS.each { |range, label| return label if range.cover?(volume) }
50
+ :silent
51
+ end
52
+
53
+ def consensus_label(score)
54
+ CONSENSUS_LABELS.each { |range, label| return label if range.cover?(score) }
55
+ :conflict
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module SelfTalk
10
+ module Helpers
11
+ class Dialogue
12
+ attr_reader :id, :topic, :turns, :status, :conclusion, :created_at
13
+
14
+ def initialize(topic:)
15
+ @id = SecureRandom.uuid
16
+ @topic = topic
17
+ @turns = []
18
+ @status = :open
19
+ @conclusion = nil
20
+ @created_at = Time.now.utc
21
+ end
22
+
23
+ def add_turn!(voice_id:, content:, position: :clarify, strength: 0.5)
24
+ return false if @turns.size >= Constants::MAX_TURNS_PER_DIALOGUE
25
+ return false unless active?
26
+
27
+ turn = DialogueTurn.new(
28
+ dialogue_id: @id,
29
+ voice_id: voice_id,
30
+ content: content,
31
+ position: position,
32
+ strength: strength
33
+ )
34
+ @turns << turn
35
+ turn
36
+ end
37
+
38
+ def conclude!(summary)
39
+ return false unless active?
40
+
41
+ @conclusion = summary
42
+ @status = :concluded
43
+ true
44
+ end
45
+
46
+ def deadlock!
47
+ return false unless active?
48
+
49
+ @status = :deadlocked
50
+ true
51
+ end
52
+
53
+ def abandon!
54
+ return false unless active?
55
+
56
+ @status = :abandoned
57
+ true
58
+ end
59
+
60
+ def active?
61
+ @status == :open
62
+ end
63
+
64
+ def concluded?
65
+ @status == :concluded
66
+ end
67
+
68
+ def turn_count
69
+ @turns.size
70
+ end
71
+
72
+ def voice_positions
73
+ grouped = @turns.group_by(&:voice_id)
74
+ grouped.transform_values do |voice_turns|
75
+ voice_turns.sum(&:strength) / voice_turns.size.to_f
76
+ end
77
+ end
78
+
79
+ def consensus_score
80
+ return 1.0 if @turns.empty?
81
+
82
+ support_strength = @turns.select { |t| t.position == :support }.sum(&:strength)
83
+ oppose_strength = @turns.select { |t| t.position == :oppose }.sum(&:strength)
84
+ total = support_strength + oppose_strength
85
+ return 0.5 if total.zero?
86
+
87
+ stronger = [support_strength, oppose_strength].max
88
+ stronger / total
89
+ end
90
+
91
+ def consensus_label
92
+ Constants.consensus_label(consensus_score)
93
+ end
94
+
95
+ def to_h
96
+ {
97
+ id: @id,
98
+ topic: @topic,
99
+ status: @status,
100
+ conclusion: @conclusion,
101
+ turn_count: turn_count,
102
+ consensus_score: consensus_score.round(10),
103
+ consensus_label: consensus_label,
104
+ created_at: @created_at,
105
+ turns: @turns.map(&:to_h)
106
+ }
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module SelfTalk
10
+ module Helpers
11
+ class DialogueTurn
12
+ POSITIONS = %i[support oppose question clarify].freeze
13
+
14
+ attr_reader :id, :dialogue_id, :voice_id, :content, :position, :strength, :created_at
15
+
16
+ def initialize(dialogue_id:, voice_id:, content:, position: :clarify, strength: 0.5)
17
+ @id = SecureRandom.uuid
18
+ @dialogue_id = dialogue_id
19
+ @voice_id = voice_id
20
+ @content = content
21
+ @position = POSITIONS.include?(position) ? position : :clarify
22
+ @strength = strength.clamp(0.0, 1.0)
23
+ @created_at = Time.now.utc
24
+ end
25
+
26
+ def to_h
27
+ {
28
+ id: @id,
29
+ dialogue_id: @dialogue_id,
30
+ voice_id: @voice_id,
31
+ content: @content,
32
+ position: @position,
33
+ strength: @strength.round(10),
34
+ created_at: @created_at
35
+ }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module SelfTalk
10
+ module Helpers
11
+ class InnerVoice
12
+ attr_reader :id, :name, :voice_type, :bias_direction, :created_at
13
+ attr_accessor :volume, :active
14
+
15
+ def initialize(name:, voice_type:, volume: Constants::DEFAULT_VOLUME, bias_direction: nil, active: true)
16
+ @id = SecureRandom.uuid
17
+ @name = name
18
+ @voice_type = voice_type
19
+ @volume = volume.clamp(0.0, 1.0)
20
+ @bias_direction = bias_direction
21
+ @active = active
22
+ @created_at = Time.now.utc
23
+ end
24
+
25
+ def amplify!(amount = Constants::VOLUME_BOOST)
26
+ @volume = (@volume + amount).clamp(0.0, 1.0)
27
+ self
28
+ end
29
+
30
+ def dampen!(amount = Constants::VOLUME_DECAY)
31
+ @volume = (@volume - amount).clamp(0.0, 1.0)
32
+ self
33
+ end
34
+
35
+ def mute!
36
+ @active = false
37
+ self
38
+ end
39
+
40
+ def unmute!
41
+ @active = true
42
+ self
43
+ end
44
+
45
+ def dominant?
46
+ @volume >= 0.7
47
+ end
48
+
49
+ def quiet?
50
+ @volume <= 0.3
51
+ end
52
+
53
+ def volume_label
54
+ Constants.dominance_label(@volume)
55
+ end
56
+
57
+ def to_h
58
+ {
59
+ id: @id,
60
+ name: @name,
61
+ voice_type: @voice_type,
62
+ volume: @volume.round(10),
63
+ volume_label: volume_label,
64
+ bias_direction: @bias_direction,
65
+ active: @active,
66
+ dominant: dominant?,
67
+ quiet: quiet?,
68
+ created_at: @created_at
69
+ }
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end