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,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Metacognition
8
+ module Helpers
9
+ module SelfModel
10
+ module_function
11
+
12
+ def build(subsystem_states: {}, tick_results: {})
13
+ loaded = discover_loaded_extensions
14
+ capabilities = map_capabilities(loaded)
15
+
16
+ {
17
+ identity: build_identity,
18
+ architecture: build_architecture(loaded),
19
+ capabilities: capabilities,
20
+ subsystems: build_subsystem_states(subsystem_states),
21
+ cognitive: build_cognitive_snapshot(tick_results),
22
+ assembled_at: Time.now.utc
23
+ }
24
+ end
25
+
26
+ def extension_loaded?(ext_sym)
27
+ return true if Legion::Extensions.const_defined?(ext_sym, false)
28
+
29
+ agentic = Legion::Extensions.const_get(:Agentic, false)
30
+ agentic.constants(false).any? do |domain|
31
+ ns = agentic.const_get(domain, false)
32
+ ns.is_a?(Module) && ns.const_defined?(ext_sym, false)
33
+ end
34
+ rescue StandardError
35
+ false
36
+ end
37
+
38
+ def discover_loaded_extensions
39
+ Constants::EXTENSION_CAPABILITIES.each_with_object({}) do |(ext_sym, _cat), acc|
40
+ acc[ext_sym] = { loaded: extension_loaded?(ext_sym) }
41
+ end
42
+ rescue StandardError
43
+ {}
44
+ end
45
+
46
+ def map_capabilities(loaded_map)
47
+ active = loaded_map.select { |_, v| v[:loaded] }
48
+ grouped = active.keys.group_by { |ext| Constants::EXTENSION_CAPABILITIES[ext] || :unknown }
49
+
50
+ Constants::CAPABILITY_CATEGORIES.to_h do |cat|
51
+ extensions = grouped[cat] || []
52
+ [cat, { active: extensions.size.positive?, extensions: extensions }]
53
+ end
54
+ end
55
+
56
+ def build_identity
57
+ {
58
+ framework: 'LegionIO',
59
+ role: :cognitive_agent,
60
+ model: :brain_modeled,
61
+ extensions: Constants::EXTENSION_CAPABILITIES.size
62
+ }
63
+ end
64
+
65
+ def build_architecture(loaded_map)
66
+ total = loaded_map.size
67
+ active = loaded_map.count { |_, v| v[:loaded] }
68
+
69
+ {
70
+ total_extensions: total,
71
+ loaded_count: active,
72
+ unloaded_count: total - active,
73
+ loaded: loaded_map.select { |_, v| v[:loaded] }.keys,
74
+ unloaded: loaded_map.reject { |_, v| v[:loaded] }.keys
75
+ }
76
+ end
77
+
78
+ def build_subsystem_states(states)
79
+ return {} unless states.is_a?(Hash)
80
+
81
+ states.each_with_object({}) do |(key, state), acc|
82
+ acc[key] = normalize_subsystem_state(state)
83
+ end
84
+ end
85
+
86
+ def normalize_subsystem_state(state)
87
+ return { status: :unknown } unless state.is_a?(Hash)
88
+
89
+ state.slice(:health, :status, :mode, :count, :active_count, :score)
90
+ end
91
+
92
+ def build_cognitive_snapshot(tick_results)
93
+ return { status: :no_tick_data } unless tick_results.is_a?(Hash) && !tick_results.empty?
94
+
95
+ {
96
+ mode: extract_mode(tick_results),
97
+ phases_run: tick_results.keys.size,
98
+ has_reflection: tick_results.key?(:post_tick_reflection),
99
+ health: extract_health(tick_results),
100
+ active_drives: extract_drives(tick_results),
101
+ attention: extract_attention(tick_results),
102
+ curiosity: extract_curiosity(tick_results),
103
+ prediction: extract_prediction(tick_results)
104
+ }
105
+ end
106
+
107
+ def extract_mode(tick_results)
108
+ tick_results.dig(:tick_meta, :mode) || :unknown
109
+ end
110
+
111
+ def extract_health(tick_results)
112
+ reflection = tick_results[:post_tick_reflection]
113
+ return nil unless reflection.is_a?(Hash)
114
+
115
+ reflection[:cognitive_health]
116
+ end
117
+
118
+ def extract_drives(tick_results)
119
+ volition = tick_results[:action_selection]
120
+ return [] unless volition.is_a?(Hash) && volition[:intentions].is_a?(Array)
121
+
122
+ volition[:intentions].first(3).map { |i| i[:drive] }.compact
123
+ end
124
+
125
+ def extract_attention(tick_results)
126
+ attention = tick_results[:sensory_processing]
127
+ return nil unless attention.is_a?(Hash)
128
+
129
+ { spotlight: attention[:spotlight_count], total: attention[:total_signals] }
130
+ end
131
+
132
+ def extract_curiosity(tick_results)
133
+ curiosity = tick_results[:working_memory_integration]
134
+ return nil unless curiosity.is_a?(Hash)
135
+
136
+ { intensity: curiosity[:curiosity_intensity], open_wonders: curiosity[:open_wonders] }
137
+ end
138
+
139
+ def extract_prediction(tick_results)
140
+ prediction = tick_results[:prediction_engine]
141
+ return nil unless prediction.is_a?(Hash)
142
+
143
+ { confidence: prediction[:confidence], mode: prediction[:mode] }
144
+ end
145
+
146
+ def health_label(score)
147
+ return :unknown unless score.is_a?(Numeric)
148
+
149
+ Constants::HEALTH_LABELS.each do |range, label|
150
+ return label if range.include?(score)
151
+ end
152
+ :unknown
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ 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 Metacognition
8
+ module Helpers
9
+ class SnapshotStore
10
+ attr_reader :snapshots
11
+
12
+ def initialize
13
+ @snapshots = []
14
+ end
15
+
16
+ def store(model)
17
+ @snapshots << model
18
+ @snapshots = @snapshots.last(Constants::MAX_SNAPSHOTS) if @snapshots.size > Constants::MAX_SNAPSHOTS
19
+ model
20
+ end
21
+
22
+ def latest
23
+ @snapshots.last
24
+ end
25
+
26
+ def stale?
27
+ return true if @snapshots.empty?
28
+
29
+ age = Time.now.utc - (latest[:assembled_at] || Time.at(0))
30
+ age > Constants::SNAPSHOT_TTL
31
+ end
32
+
33
+ def history(limit: 10)
34
+ @snapshots.last(limit)
35
+ end
36
+
37
+ def architecture_changes
38
+ return [] if @snapshots.size < 2
39
+
40
+ changes = []
41
+ @snapshots.each_cons(2) do |prev, curr|
42
+ prev_loaded = prev.dig(:architecture, :loaded) || []
43
+ curr_loaded = curr.dig(:architecture, :loaded) || []
44
+
45
+ added = curr_loaded - prev_loaded
46
+ removed = prev_loaded - curr_loaded
47
+
48
+ next if added.empty? && removed.empty?
49
+
50
+ changes << {
51
+ at: curr[:assembled_at],
52
+ added: added,
53
+ removed: removed
54
+ }
55
+ end
56
+ changes
57
+ end
58
+
59
+ def health_trend(limit: 20)
60
+ recent = @snapshots.last(limit)
61
+ recent.filter_map do |s|
62
+ health = s.dig(:cognitive, :health)
63
+ next unless health
64
+
65
+ { at: s[:assembled_at], health: health }
66
+ end
67
+ end
68
+
69
+ def size
70
+ @snapshots.size
71
+ end
72
+
73
+ def clear
74
+ @snapshots.clear
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Metacognition
8
+ module Runners
9
+ module Metacognition
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def introspect(tick_results: {}, subsystem_states: {}, **)
14
+ model = if snapshot_store.stale?
15
+ fresh = Helpers::SelfModel.build(
16
+ subsystem_states: subsystem_states,
17
+ tick_results: tick_results
18
+ )
19
+ snapshot_store.store(fresh)
20
+ fresh
21
+ else
22
+ snapshot_store.latest
23
+ end
24
+
25
+ Legion::Logging.debug "[metacognition] introspect: #{model.dig(:architecture, :loaded_count)} extensions loaded"
26
+ model
27
+ end
28
+
29
+ def self_narrative(tick_results: {}, subsystem_states: {}, **)
30
+ model = introspect(tick_results: tick_results, subsystem_states: subsystem_states)
31
+ prose = Helpers::NarratorBridge.narrate_self_model(model)
32
+
33
+ {
34
+ prose: prose,
35
+ health: model.dig(:cognitive, :health),
36
+ mode: model.dig(:cognitive, :mode),
37
+ model: model,
38
+ timestamp: Time.now.utc
39
+ }
40
+ end
41
+
42
+ def explain_subsystem(subsystem:, **)
43
+ sym = subsystem.to_sym
44
+ ext_sym = sym.to_s.split('_').map(&:capitalize).join.to_sym
45
+
46
+ loaded = Helpers::SelfModel.extension_loaded?(ext_sym)
47
+ category = Helpers::Constants::EXTENSION_CAPABILITIES[ext_sym] || :unknown
48
+
49
+ latest = snapshot_store.latest
50
+ state = latest&.dig(:subsystems, sym)
51
+
52
+ {
53
+ subsystem: sym,
54
+ extension: ext_sym,
55
+ loaded: loaded,
56
+ category: category,
57
+ state: state || { status: :no_data }
58
+ }
59
+ end
60
+
61
+ def architecture_overview(**)
62
+ model = snapshot_store.latest || Helpers::SelfModel.build
63
+ snapshot_store.store(model) if snapshot_store.stale?
64
+
65
+ {
66
+ identity: model[:identity],
67
+ architecture: model[:architecture],
68
+ capabilities: model[:capabilities],
69
+ assembled_at: model[:assembled_at]
70
+ }
71
+ end
72
+
73
+ def health_trend(limit: 20, **)
74
+ {
75
+ trend: snapshot_store.health_trend(limit: limit),
76
+ snapshots: snapshot_store.size,
77
+ current: snapshot_store.latest&.dig(:cognitive, :health)
78
+ }
79
+ end
80
+
81
+ def architecture_changes(**)
82
+ {
83
+ changes: snapshot_store.architecture_changes,
84
+ snapshots: snapshot_store.size
85
+ }
86
+ end
87
+
88
+ def metacognition_stats(**)
89
+ {
90
+ snapshots_stored: snapshot_store.size,
91
+ latest_stale: snapshot_store.stale?,
92
+ loaded_extensions: snapshot_store.latest&.dig(:architecture, :loaded_count) || 0,
93
+ cognitive_health: snapshot_store.latest&.dig(:cognitive, :health),
94
+ capability_summary: capability_summary
95
+ }
96
+ end
97
+
98
+ private
99
+
100
+ def snapshot_store
101
+ @snapshot_store ||= Helpers::SnapshotStore.new
102
+ end
103
+
104
+ def capability_summary
105
+ latest = snapshot_store.latest
106
+ return {} unless latest&.dig(:capabilities)
107
+
108
+ latest[:capabilities].transform_values { |v| v[:active] }
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,180 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Metacognition
8
+ module Runners
9
+ module Registry
10
+ extend self
11
+
12
+ def register_extension(name:, module_name:, category: 'cognition', **)
13
+ entry = build_entry(name: name, module_name: module_name, category: category, **)
14
+
15
+ if db_available?
16
+ db_register(entry)
17
+ else
18
+ store.register(entry)
19
+ end
20
+
21
+ Legion::Logging.info "[metacognition:registry] registered #{name} (#{category})" if defined?(Legion::Logging)
22
+ { success: true, name: name, category: category }
23
+ rescue ArgumentError => e
24
+ { success: false, error: e.message }
25
+ end
26
+
27
+ def deregister_extension(name:, **)
28
+ if db_available?
29
+ db_deregister(name)
30
+ else
31
+ store.deregister(name)
32
+ end
33
+ { success: true, name: name }
34
+ rescue ArgumentError => e
35
+ { success: false, error: e.message }
36
+ end
37
+
38
+ def list_extensions(status: nil, category: nil, **)
39
+ extensions = if db_available?
40
+ db_list(status: status, category: category)
41
+ else
42
+ store.list(status: status, category: category)
43
+ end
44
+ { success: true, extensions: extensions, count: extensions.size }
45
+ end
46
+
47
+ def extension_status(name:, **)
48
+ ext = if db_available?
49
+ db_get(name)
50
+ else
51
+ store.get(name)
52
+ end
53
+ return { success: false, error: :not_found } unless ext
54
+
55
+ { success: true, extension: ext }
56
+ end
57
+
58
+ def update_extension(name:, attrs: {}, **)
59
+ result = if db_available?
60
+ db_update(name, attrs)
61
+ else
62
+ store.update(name, attrs)
63
+ end
64
+ return { success: false, error: :not_found } unless result
65
+
66
+ { success: true, extension: result }
67
+ end
68
+
69
+ def category_distribution(**)
70
+ dist = if db_available?
71
+ db_category_distribution
72
+ else
73
+ store.category_distribution
74
+ end
75
+
76
+ total = dist.values.sum
77
+ percentages = dist.transform_values { |v| total.positive? ? (v.to_f / total * 100).round(1) : 0.0 }
78
+
79
+ { success: true, distribution: dist, percentages: percentages, total: total }
80
+ end
81
+
82
+ def degraded_extensions(threshold: 0.4, **)
83
+ extensions = if db_available?
84
+ db_by_health(threshold)
85
+ else
86
+ store.by_health(threshold: threshold)
87
+ end
88
+ { success: true, extensions: extensions, count: extensions.size }
89
+ end
90
+
91
+ def seed_from_constants(**)
92
+ capabilities = Helpers::Constants::EXTENSION_CAPABILITIES
93
+ seeded = 0
94
+
95
+ capabilities.each do |mod_name, category|
96
+ snake = mod_name.to_s.gsub(/([A-Z])/, '_\1').sub(/^_/, '').downcase
97
+ lex_name = "lex-#{snake.tr('_', '-')}"
98
+ next if extension_status(name: lex_name)[:success]
99
+
100
+ register_extension(
101
+ name: lex_name,
102
+ module_name: mod_name.to_s,
103
+ category: category.to_s
104
+ )
105
+ seeded += 1
106
+ end
107
+
108
+ { success: true, seeded: seeded, total: capabilities.size }
109
+ end
110
+
111
+ private
112
+
113
+ def build_entry(name:, module_name:, category:, **opts)
114
+ {
115
+ name: name,
116
+ module_name: module_name,
117
+ category: category.to_s,
118
+ description: opts[:description],
119
+ cognitive_concept: opts[:cognitive_concept],
120
+ metaphor_description: opts[:metaphor_description],
121
+ build_batch: opts[:build_batch],
122
+ build_date: Time.now.utc,
123
+ status: 'active',
124
+ spec_count: opts.fetch(:spec_count, 0),
125
+ spec_pass_count: opts.fetch(:spec_pass_count, 0)
126
+ }
127
+ end
128
+
129
+ def store
130
+ @store ||= Helpers::RegistryStore.new
131
+ end
132
+
133
+ def db_available?
134
+ defined?(Legion::Data) && Legion::Data.respond_to?(:connection) && Legion::Data.connection
135
+ rescue StandardError
136
+ false
137
+ end
138
+
139
+ def db_table
140
+ Legion::Data.connection[:extensions_registry]
141
+ end
142
+
143
+ def db_register(entry)
144
+ db_table.insert(entry.merge(created_at: Time.now.utc, updated_at: Time.now.utc))
145
+ end
146
+
147
+ def db_deregister(name)
148
+ db_table.where(name: name).delete
149
+ end
150
+
151
+ def db_get(name)
152
+ db_table.where(name: name).first
153
+ end
154
+
155
+ def db_list(status: nil, category: nil)
156
+ ds = db_table
157
+ ds = ds.where(status: status.to_s) if status
158
+ ds = ds.where(category: category.to_s) if category
159
+ ds.all
160
+ end
161
+
162
+ def db_update(name, attrs)
163
+ db_table.where(name: name).update(attrs.merge(updated_at: Time.now.utc))
164
+ db_get(name)
165
+ end
166
+
167
+ def db_category_distribution
168
+ db_table.group_and_count(:category).all.to_h { |r| [r[:category], r[:count]] }
169
+ end
170
+
171
+ def db_by_health(threshold)
172
+ db_table.where { health_score < threshold }.all
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
180
+ 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 Metacognition
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/metacognition/version'
4
+ require 'legion/extensions/agentic/self/metacognition/helpers/constants'
5
+ require 'legion/extensions/agentic/self/metacognition/helpers/self_model'
6
+ require 'legion/extensions/agentic/self/metacognition/helpers/snapshot_store'
7
+ require 'legion/extensions/agentic/self/metacognition/helpers/narrator_bridge'
8
+ require 'legion/extensions/agentic/self/metacognition/helpers/registry_store'
9
+ require 'legion/extensions/agentic/self/metacognition/runners/metacognition'
10
+ require 'legion/extensions/agentic/self/metacognition/runners/registry'
11
+ require 'legion/extensions/agentic/self/metacognition/client'
12
+
13
+ module Legion
14
+ module Extensions
15
+ module Agentic
16
+ module Self
17
+ module Metacognition
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/metacognitive_monitoring/runners/metacognitive_monitoring'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module MetacognitiveMonitoring
10
+ class Client
11
+ include Runners::MetacognitiveMonitoring
12
+
13
+ def initialize(engine: nil)
14
+ @monitoring_engine = engine || Helpers::MonitoringEngine.new
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :monitoring_engine
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module MetacognitiveMonitoring
8
+ module Helpers
9
+ class CalibrationTracker
10
+ attr_reader :points
11
+
12
+ def initialize
13
+ @points = []
14
+ end
15
+
16
+ def add_point(predicted:, actual:)
17
+ @points << { predicted: predicted.clamp(0.0, 1.0), actual: actual.clamp(0.0, 1.0) }
18
+ @points.shift while @points.size > MAX_CALIBRATION_POINTS
19
+ self
20
+ end
21
+
22
+ def mean_calibration_error
23
+ return 0.0 if @points.empty?
24
+
25
+ errors = @points.map { |p| p[:predicted] - p[:actual] }
26
+ (errors.sum / errors.size).round(10)
27
+ end
28
+
29
+ def calibration_score
30
+ score = (1.0 - mean_calibration_error.abs).clamp(0.0, 1.0)
31
+ score.round(10)
32
+ end
33
+
34
+ def overconfident?
35
+ mean_calibration_error > OVERCONFIDENCE_THRESHOLD
36
+ end
37
+
38
+ def underconfident?
39
+ mean_calibration_error < UNDERCONFIDENCE_THRESHOLD
40
+ end
41
+
42
+ def calibration_label
43
+ score = calibration_score
44
+ CALIBRATION_LABELS.find { |range, _| range.cover?(score) }&.last
45
+ end
46
+
47
+ def calibration_curve(bins: 5)
48
+ return [] if @points.empty?
49
+
50
+ bin_size = 1.0 / bins
51
+ bin_edges = bins.times.map { |i| (i * bin_size).round(10) }
52
+
53
+ bin_edges.map do |edge|
54
+ upper = (edge + bin_size).round(10)
55
+ range = (edge...upper)
56
+ in_bin = @points.select { |p| range.cover?(p[:predicted]) }
57
+
58
+ actual_mean = if in_bin.empty?
59
+ nil
60
+ else
61
+ (in_bin.sum { |p| p[:actual] } / in_bin.size).round(10)
62
+ end
63
+
64
+ {
65
+ predicted_range: range,
66
+ sample_count: in_bin.size,
67
+ actual_accuracy: actual_mean
68
+ }
69
+ end
70
+ end
71
+
72
+ def count
73
+ @points.size
74
+ end
75
+
76
+ def empty?
77
+ @points.empty?
78
+ end
79
+
80
+ def to_h
81
+ {
82
+ count: count,
83
+ mean_calibration_error: mean_calibration_error,
84
+ calibration_score: calibration_score,
85
+ calibration_label: calibration_label,
86
+ overconfident: overconfident?,
87
+ underconfident: underconfident?
88
+ }
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end