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,238 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::SelfModel::Helpers::SelfModel do
4
+ subject(:sm) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'starts with empty capabilities' do
8
+ expect(sm.capabilities).to be_empty
9
+ end
10
+
11
+ it 'starts with empty knowledge domains' do
12
+ expect(sm.knowledge_domains).to be_empty
13
+ end
14
+
15
+ it 'starts with empty predictions and history' do
16
+ expect(sm.predictions).to be_empty
17
+ expect(sm.history).to be_empty
18
+ end
19
+ end
20
+
21
+ describe '#add_capability' do
22
+ it 'adds and returns a capability' do
23
+ cap = sm.add_capability(name: 'reasoning', domain: :cognitive)
24
+ expect(cap).to be_a(Legion::Extensions::Agentic::Self::SelfModel::Helpers::Capability)
25
+ expect(cap.name).to eq('reasoning')
26
+ end
27
+
28
+ it 'assigns unique symbol ids' do
29
+ a = sm.add_capability(name: 'a')
30
+ b = sm.add_capability(name: 'b')
31
+ expect(a.id).to be_a(Symbol)
32
+ expect(b.id).to be_a(Symbol)
33
+ expect(a.id).not_to eq(b.id)
34
+ end
35
+
36
+ it 'returns nil at capacity limit' do
37
+ Legion::Extensions::Agentic::Self::SelfModel::Helpers::Constants::MAX_CAPABILITIES.times do |i|
38
+ sm.add_capability(name: "cap_#{i}")
39
+ end
40
+ expect(sm.add_capability(name: 'overflow')).to be_nil
41
+ end
42
+ end
43
+
44
+ describe '#add_knowledge_domain' do
45
+ it 'adds and returns a knowledge domain' do
46
+ dom = sm.add_knowledge_domain(name: 'graph theory', depth: 0.6, breadth: 0.4)
47
+ expect(dom).to be_a(Legion::Extensions::Agentic::Self::SelfModel::Helpers::KnowledgeDomain)
48
+ expect(dom.name).to eq('graph theory')
49
+ end
50
+
51
+ it 'assigns unique symbol ids' do
52
+ a = sm.add_knowledge_domain(name: 'a')
53
+ b = sm.add_knowledge_domain(name: 'b')
54
+ expect(a.id).to be_a(Symbol)
55
+ expect(b.id).to be_a(Symbol)
56
+ expect(a.id).not_to eq(b.id)
57
+ end
58
+
59
+ it 'returns nil at capacity limit' do
60
+ Legion::Extensions::Agentic::Self::SelfModel::Helpers::Constants::MAX_KNOWLEDGE_DOMAINS.times do |i|
61
+ sm.add_knowledge_domain(name: "dom_#{i}")
62
+ end
63
+ expect(sm.add_knowledge_domain(name: 'overflow')).to be_nil
64
+ end
65
+ end
66
+
67
+ describe '#predict_success' do
68
+ it 'returns a prediction hash for a known capability' do
69
+ cap = sm.add_capability(name: 'analysis', competence: 0.7)
70
+ pred = sm.predict_success(capability_id: cap.id)
71
+ expect(pred).to include(:capability_id, :predicted_probability, :at)
72
+ expect(pred[:predicted_probability]).to be_within(0.01).of(0.7)
73
+ end
74
+
75
+ it 'returns nil for unknown capability' do
76
+ expect(sm.predict_success(capability_id: :bogus)).to be_nil
77
+ end
78
+
79
+ it 'logs prediction to predictions array' do
80
+ cap = sm.add_capability(name: 'x')
81
+ sm.predict_success(capability_id: cap.id)
82
+ expect(sm.predictions.size).to eq(1)
83
+ end
84
+ end
85
+
86
+ describe '#record_outcome' do
87
+ it 'returns an event for a known capability' do
88
+ cap = sm.add_capability(name: 'writing')
89
+ event = sm.record_outcome(capability_id: cap.id, predicted: true, actual: true)
90
+ expect(event).to include(:type, :capability_id, :predicted, :actual, :at)
91
+ end
92
+
93
+ it 'returns nil for unknown capability' do
94
+ expect(sm.record_outcome(capability_id: :bogus, predicted: true, actual: false)).to be_nil
95
+ end
96
+
97
+ it 'updates capability competence' do
98
+ cap = sm.add_capability(name: 'math', competence: 0.3)
99
+ original = cap.competence
100
+ sm.record_outcome(capability_id: cap.id, predicted: false, actual: true)
101
+ expect(cap.competence).to be > original
102
+ end
103
+
104
+ it 'logs event to history' do
105
+ cap = sm.add_capability(name: 'x')
106
+ sm.record_outcome(capability_id: cap.id, predicted: true, actual: true)
107
+ expect(sm.history.size).to eq(1)
108
+ end
109
+ end
110
+
111
+ describe '#introspect' do
112
+ it 'returns a complete introspection hash' do
113
+ sm.add_capability(name: 'coding', competence: 0.85)
114
+ sm.add_capability(name: 'guessing', competence: 0.15)
115
+ sm.add_knowledge_domain(name: 'ruby', depth: 0.2, breadth: 0.1)
116
+
117
+ result = sm.introspect
118
+ expect(result).to include(:overall_confidence, :strengths, :weaknesses, :blind_spots,
119
+ :knowledge_gaps, :calibration)
120
+ end
121
+ end
122
+
123
+ describe '#strengths' do
124
+ it 'returns capabilities with competence > 0.7' do
125
+ sm.add_capability(name: 'strong', competence: 0.8)
126
+ sm.add_capability(name: 'weak', competence: 0.2)
127
+ expect(sm.strengths.map(&:name)).to include('strong')
128
+ expect(sm.strengths.map(&:name)).not_to include('weak')
129
+ end
130
+ end
131
+
132
+ describe '#weaknesses' do
133
+ it 'returns capabilities with competence < 0.3' do
134
+ sm.add_capability(name: 'strong', competence: 0.8)
135
+ sm.add_capability(name: 'weak', competence: 0.2)
136
+ expect(sm.weaknesses.map(&:name)).to include('weak')
137
+ expect(sm.weaknesses.map(&:name)).not_to include('strong')
138
+ end
139
+ end
140
+
141
+ describe '#blind_spots' do
142
+ it 'returns empty initially' do
143
+ sm.add_capability(name: 'x', competence: 0.7)
144
+ expect(sm.blind_spots).to be_empty
145
+ end
146
+
147
+ it 'returns capabilities that are overconfident after bad predictions' do
148
+ cap = sm.add_capability(name: 'overestimated', competence: 0.9)
149
+ 30.times { sm.record_outcome(capability_id: cap.id, predicted: true, actual: false) }
150
+ expect(sm.blind_spots).not_to be_empty
151
+ end
152
+ end
153
+
154
+ describe '#calibration_report' do
155
+ it 'returns uncalibrated label when no capabilities exist' do
156
+ report = sm.calibration_report
157
+ expect(report[:label]).to eq(:uncalibrated)
158
+ expect(report[:total]).to eq(0)
159
+ end
160
+
161
+ it 'returns a label and mean_error when capabilities exist' do
162
+ sm.add_capability(name: 'x', competence: 0.5)
163
+ report = sm.calibration_report
164
+ expect(report).to include(:label, :mean_error, :calibrated_count, :total)
165
+ end
166
+ end
167
+
168
+ describe '#knowledge_gaps' do
169
+ it 'returns domains with depth < 0.3' do
170
+ sm.add_knowledge_domain(name: 'shallow', depth: 0.1, breadth: 0.5)
171
+ sm.add_knowledge_domain(name: 'deep', depth: 0.8, breadth: 0.5)
172
+ gaps = sm.knowledge_gaps.map(&:name)
173
+ expect(gaps).to include('shallow')
174
+ expect(gaps).not_to include('deep')
175
+ end
176
+ end
177
+
178
+ describe '#can_do?' do
179
+ it 'returns true for high-competence capability by name' do
180
+ sm.add_capability(name: 'fly', competence: 0.8)
181
+ expect(sm.can_do?('fly')).to be true
182
+ end
183
+
184
+ it 'returns false for low-competence capability' do
185
+ sm.add_capability(name: 'swim', competence: 0.2)
186
+ expect(sm.can_do?('swim')).to be false
187
+ end
188
+
189
+ it 'returns false for unknown capability name' do
190
+ expect(sm.can_do?('teleport')).to be false
191
+ end
192
+ end
193
+
194
+ describe '#knows_about?' do
195
+ it 'returns true for high-confidence domain by name' do
196
+ sm.add_knowledge_domain(name: 'physics', depth: 0.7, breadth: 0.6)
197
+ expect(sm.knows_about?('physics')).to be true
198
+ end
199
+
200
+ it 'returns false for low-confidence domain' do
201
+ sm.add_knowledge_domain(name: 'astrology', depth: 0.1, breadth: 0.1)
202
+ expect(sm.knows_about?('astrology')).to be false
203
+ end
204
+
205
+ it 'returns false for unknown domain name' do
206
+ expect(sm.knows_about?('magic')).to be false
207
+ end
208
+ end
209
+
210
+ describe '#overall_confidence' do
211
+ it 'returns DEFAULT_COMPETENCE when no capabilities exist' do
212
+ expect(sm.overall_confidence).to eq(Legion::Extensions::Agentic::Self::SelfModel::Helpers::Constants::DEFAULT_COMPETENCE)
213
+ end
214
+
215
+ it 'returns average competence across capabilities' do
216
+ sm.add_capability(name: 'a', competence: 0.4)
217
+ sm.add_capability(name: 'b', competence: 0.6)
218
+ expect(sm.overall_confidence).to be_within(0.01).of(0.5)
219
+ end
220
+ end
221
+
222
+ describe '#to_h' do
223
+ it 'returns expected keys' do
224
+ h = sm.to_h
225
+ expect(h).to include(:capability_count, :knowledge_domain_count, :overall_confidence,
226
+ :strength_count, :weakness_count, :blind_spot_count,
227
+ :knowledge_gap_count, :prediction_count, :history_size)
228
+ end
229
+
230
+ it 'reflects correct counts' do
231
+ sm.add_capability(name: 'x', competence: 0.8)
232
+ sm.add_knowledge_domain(name: 'y', depth: 0.1, breadth: 0.1)
233
+ h = sm.to_h
234
+ expect(h[:capability_count]).to eq(1)
235
+ expect(h[:knowledge_domain_count]).to eq(1)
236
+ end
237
+ end
238
+ end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::SelfModel::Runners::SelfModel do
4
+ let(:runner) do
5
+ obj = Object.new
6
+ obj.extend(described_class)
7
+ obj
8
+ end
9
+
10
+ describe '#add_self_capability' do
11
+ it 'adds a capability and returns success' do
12
+ result = runner.add_self_capability(name: 'planning', domain: :cognitive)
13
+ expect(result[:success]).to be true
14
+ expect(result[:capability_id]).to be_a(Symbol)
15
+ expect(result[:state]).to be_a(Symbol)
16
+ end
17
+
18
+ it 'returns failure when limit is reached' do
19
+ Legion::Extensions::Agentic::Self::SelfModel::Helpers::Constants::MAX_CAPABILITIES.times do |i|
20
+ runner.add_self_capability(name: "cap_#{i}")
21
+ end
22
+ result = runner.add_self_capability(name: 'overflow')
23
+ expect(result[:success]).to be false
24
+ expect(result[:reason]).to eq(:limit_reached)
25
+ end
26
+ end
27
+
28
+ describe '#add_self_knowledge' do
29
+ it 'adds a knowledge domain and returns success' do
30
+ result = runner.add_self_knowledge(name: 'topology', depth: 0.4, breadth: 0.3)
31
+ expect(result[:success]).to be true
32
+ expect(result[:domain_id]).to be_a(Symbol)
33
+ end
34
+
35
+ it 'returns failure when limit is reached' do
36
+ Legion::Extensions::Agentic::Self::SelfModel::Helpers::Constants::MAX_KNOWLEDGE_DOMAINS.times do |i|
37
+ runner.add_self_knowledge(name: "dom_#{i}")
38
+ end
39
+ result = runner.add_self_knowledge(name: 'overflow')
40
+ expect(result[:success]).to be false
41
+ expect(result[:reason]).to eq(:limit_reached)
42
+ end
43
+ end
44
+
45
+ describe '#predict_own_success' do
46
+ it 'returns prediction for known capability' do
47
+ added = runner.add_self_capability(name: 'analysis', competence: 0.75)
48
+ result = runner.predict_own_success(capability_id: added[:capability_id])
49
+ expect(result[:success]).to be true
50
+ expect(result[:predicted_probability]).to be_a(Float)
51
+ end
52
+
53
+ it 'returns failure for unknown capability' do
54
+ result = runner.predict_own_success(capability_id: :nonexistent)
55
+ expect(result[:success]).to be false
56
+ expect(result[:reason]).to eq(:not_found)
57
+ end
58
+ end
59
+
60
+ describe '#record_self_outcome' do
61
+ it 'records outcome and returns updated competence' do
62
+ added = runner.add_self_capability(name: 'writing', competence: 0.5)
63
+ result = runner.record_self_outcome(
64
+ capability_id: added[:capability_id], predicted: true, actual: true
65
+ )
66
+ expect(result[:success]).to be true
67
+ expect(result[:competence]).to be_a(Float)
68
+ expect(result[:calibration_error]).to be_a(Float)
69
+ end
70
+
71
+ it 'returns failure for unknown capability' do
72
+ result = runner.record_self_outcome(capability_id: :bogus, predicted: true, actual: false)
73
+ expect(result[:success]).to be false
74
+ expect(result[:reason]).to eq(:not_found)
75
+ end
76
+ end
77
+
78
+ describe '#self_introspection' do
79
+ it 'returns introspection hash' do
80
+ runner.add_self_capability(name: 'planning', competence: 0.8)
81
+ result = runner.self_introspection
82
+ expect(result[:success]).to be true
83
+ expect(result).to include(:overall_confidence, :strengths, :weaknesses, :blind_spots)
84
+ end
85
+ end
86
+
87
+ describe '#self_strengths' do
88
+ it 'returns strengths list' do
89
+ runner.add_self_capability(name: 'strong', competence: 0.9)
90
+ result = runner.self_strengths
91
+ expect(result[:success]).to be true
92
+ expect(result[:strengths]).to be_an(Array)
93
+ expect(result[:count]).to eq(1)
94
+ end
95
+
96
+ it 'returns empty list when no strengths' do
97
+ runner.add_self_capability(name: 'weak', competence: 0.2)
98
+ result = runner.self_strengths
99
+ expect(result[:count]).to eq(0)
100
+ end
101
+ end
102
+
103
+ describe '#self_weaknesses' do
104
+ it 'returns weaknesses list' do
105
+ runner.add_self_capability(name: 'weak', competence: 0.1)
106
+ result = runner.self_weaknesses
107
+ expect(result[:success]).to be true
108
+ expect(result[:weaknesses]).to be_an(Array)
109
+ expect(result[:count]).to eq(1)
110
+ end
111
+ end
112
+
113
+ describe '#self_blind_spots' do
114
+ it 'returns empty list initially' do
115
+ runner.add_self_capability(name: 'x', competence: 0.7)
116
+ result = runner.self_blind_spots
117
+ expect(result[:success]).to be true
118
+ expect(result[:count]).to eq(0)
119
+ end
120
+ end
121
+
122
+ describe '#self_calibration_report' do
123
+ it 'returns calibration report' do
124
+ result = runner.self_calibration_report
125
+ expect(result[:success]).to be true
126
+ expect(result).to include(:label, :mean_error)
127
+ end
128
+ end
129
+
130
+ describe '#self_model_stats' do
131
+ it 'returns stats hash' do
132
+ result = runner.self_model_stats
133
+ expect(result[:success]).to be true
134
+ expect(result).to include(:capability_count, :knowledge_domain_count)
135
+ end
136
+
137
+ it 'reflects added capabilities' do
138
+ runner.add_self_capability(name: 'x')
139
+ result = runner.self_model_stats
140
+ expect(result[:capability_count]).to eq(1)
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Actors
6
+ class Every # rubocop:disable Lint/EmptyClass
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ $LOADED_FEATURES << 'legion/extensions/actors/every'
13
+
14
+ require_relative '../../../../../../../lib/legion/extensions/agentic/self/self_talk/actors/volume_decay'
15
+
16
+ RSpec.describe Legion::Extensions::Agentic::Self::SelfTalk::Actor::VolumeDecay do
17
+ subject(:actor) { described_class.new }
18
+
19
+ describe '#runner_class' do
20
+ it { expect(actor.runner_class).to eq Legion::Extensions::Agentic::Self::SelfTalk::Runners::SelfTalk }
21
+ end
22
+
23
+ describe '#runner_function' do
24
+ it { expect(actor.runner_function).to eq 'decay_voices' }
25
+ end
26
+
27
+ describe '#time' do
28
+ it { expect(actor.time).to eq 300 }
29
+ end
30
+
31
+ describe '#run_now?' do
32
+ it { expect(actor.run_now?).to be false }
33
+ end
34
+
35
+ describe '#use_runner?' do
36
+ it { expect(actor.use_runner?).to be false }
37
+ end
38
+
39
+ describe '#check_subtask?' do
40
+ it { expect(actor.check_subtask?).to be false }
41
+ end
42
+
43
+ describe '#generate_task?' do
44
+ it { expect(actor.generate_task?).to be false }
45
+ end
46
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/self_talk/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Self::SelfTalk::Client do
6
+ let(:client) { described_class.new }
7
+
8
+ it 'responds to runner methods' do
9
+ expect(client).to respond_to(:register_voice)
10
+ expect(client).to respond_to(:start_dialogue)
11
+ expect(client).to respond_to(:add_turn)
12
+ expect(client).to respond_to(:conclude_dialogue)
13
+ expect(client).to respond_to(:deadlock_dialogue)
14
+ expect(client).to respond_to(:amplify_voice)
15
+ expect(client).to respond_to(:dampen_voice)
16
+ expect(client).to respond_to(:dialogue_report)
17
+ expect(client).to respond_to(:self_talk_status)
18
+ end
19
+
20
+ it 'each instance has independent state' do
21
+ c1 = described_class.new
22
+ c2 = described_class.new
23
+ c1.register_voice(name: 'Lone Voice', voice_type: :critic)
24
+ expect(c2.self_talk_status[:voice_count]).to eq(0)
25
+ end
26
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::SelfTalk::Helpers::Constants do
4
+ describe 'MAX_VOICES' do
5
+ it 'is 10' do
6
+ expect(described_class::MAX_VOICES).to eq(10)
7
+ end
8
+ end
9
+
10
+ describe 'MAX_DIALOGUES' do
11
+ it 'is 200' do
12
+ expect(described_class::MAX_DIALOGUES).to eq(200)
13
+ end
14
+ end
15
+
16
+ describe 'MAX_TURNS_PER_DIALOGUE' do
17
+ it 'is 50' do
18
+ expect(described_class::MAX_TURNS_PER_DIALOGUE).to eq(50)
19
+ end
20
+ end
21
+
22
+ describe 'DEFAULT_VOLUME' do
23
+ it 'is 0.5' do
24
+ expect(described_class::DEFAULT_VOLUME).to eq(0.5)
25
+ end
26
+ end
27
+
28
+ describe 'VOLUME_BOOST' do
29
+ it 'is 0.1' do
30
+ expect(described_class::VOLUME_BOOST).to eq(0.1)
31
+ end
32
+ end
33
+
34
+ describe 'VOLUME_DECAY' do
35
+ it 'is 0.05' do
36
+ expect(described_class::VOLUME_DECAY).to eq(0.05)
37
+ end
38
+ end
39
+
40
+ describe 'VOICE_TYPES' do
41
+ it 'includes all eight voice types' do
42
+ expect(described_class::VOICE_TYPES).to include(
43
+ :critic, :encourager, :analyst, :devils_advocate,
44
+ :pragmatist, :visionary, :caretaker, :rebel
45
+ )
46
+ end
47
+
48
+ it 'is frozen' do
49
+ expect(described_class::VOICE_TYPES).to be_frozen
50
+ end
51
+ end
52
+
53
+ describe 'DIALOGUE_STATUSES' do
54
+ it 'includes open, concluded, deadlocked, abandoned' do
55
+ expect(described_class::DIALOGUE_STATUSES).to include(:open, :concluded, :deadlocked, :abandoned)
56
+ end
57
+
58
+ it 'is frozen' do
59
+ expect(described_class::DIALOGUE_STATUSES).to be_frozen
60
+ end
61
+ end
62
+
63
+ describe '.dominance_label' do
64
+ it 'returns :commanding for volume >= 0.8' do
65
+ expect(described_class.dominance_label(1.0)).to eq(:commanding)
66
+ expect(described_class.dominance_label(0.8)).to eq(:commanding)
67
+ end
68
+
69
+ it 'returns :assertive for volume in 0.6..0.8' do
70
+ expect(described_class.dominance_label(0.7)).to eq(:assertive)
71
+ end
72
+
73
+ it 'returns :balanced for volume in 0.4..0.6' do
74
+ expect(described_class.dominance_label(0.5)).to eq(:balanced)
75
+ end
76
+
77
+ it 'returns :quiet for volume in 0.2..0.4' do
78
+ expect(described_class.dominance_label(0.3)).to eq(:quiet)
79
+ end
80
+
81
+ it 'returns :silent for volume < 0.2' do
82
+ expect(described_class.dominance_label(0.1)).to eq(:silent)
83
+ expect(described_class.dominance_label(0.0)).to eq(:silent)
84
+ end
85
+ end
86
+
87
+ describe '.consensus_label' do
88
+ it 'returns :unanimous for score >= 0.8' do
89
+ expect(described_class.consensus_label(1.0)).to eq(:unanimous)
90
+ expect(described_class.consensus_label(0.8)).to eq(:unanimous)
91
+ end
92
+
93
+ it 'returns :agreement for score in 0.6..0.8' do
94
+ expect(described_class.consensus_label(0.7)).to eq(:agreement)
95
+ end
96
+
97
+ it 'returns :mixed for score in 0.4..0.6' do
98
+ expect(described_class.consensus_label(0.5)).to eq(:mixed)
99
+ end
100
+
101
+ it 'returns :disagreement for score in 0.2..0.4' do
102
+ expect(described_class.consensus_label(0.3)).to eq(:disagreement)
103
+ end
104
+
105
+ it 'returns :conflict for score < 0.2' do
106
+ expect(described_class.consensus_label(0.1)).to eq(:conflict)
107
+ expect(described_class.consensus_label(0.0)).to eq(:conflict)
108
+ end
109
+ end
110
+ end