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,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anosognosia
8
+ module Runners
9
+ module Anosognosia
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def register_deficit(domain:, deficit_type:, severity:, acknowledged: false, **)
14
+ deficit = engine.register_deficit(
15
+ domain: domain,
16
+ deficit_type: deficit_type,
17
+ severity: severity,
18
+ acknowledged: acknowledged
19
+ )
20
+ {
21
+ registered: true,
22
+ deficit_id: deficit.id,
23
+ domain: domain,
24
+ deficit_type: deficit_type,
25
+ severity: deficit.severity,
26
+ severity_label: deficit.severity_label,
27
+ acknowledged: deficit.acknowledged,
28
+ awareness_score: engine.awareness_score.round(10)
29
+ }
30
+ end
31
+
32
+ def acknowledge_deficit(deficit_id:, **)
33
+ Legion::Logging.debug "[anosognosia] acknowledge_deficit: id=#{deficit_id}"
34
+ engine.acknowledge_deficit(deficit_id: deficit_id)
35
+ end
36
+
37
+ def reveal_blind_spot(deficit_id:, **)
38
+ Legion::Logging.info "[anosognosia] reveal_blind_spot: id=#{deficit_id}"
39
+ engine.reveal_blind_spot(deficit_id: deficit_id)
40
+ end
41
+
42
+ def awareness_score(**)
43
+ score = engine.awareness_score
44
+ Legion::Logging.debug "[anosognosia] awareness_score: score=#{score.round(2)}"
45
+ {
46
+ awareness_score: score.round(10),
47
+ awareness_gap: engine.awareness_gap,
48
+ awareness_label: awareness_label_for(score)
49
+ }
50
+ end
51
+
52
+ def awareness_gap(**)
53
+ gap = engine.awareness_gap
54
+ Legion::Logging.debug "[anosognosia] awareness_gap: gap=#{gap.round(2)}"
55
+ { awareness_gap: gap, awareness_score: engine.awareness_score.round(10) }
56
+ end
57
+
58
+ def blind_spots(**)
59
+ spots = engine.blind_spots
60
+ Legion::Logging.debug "[anosognosia] blind_spots: count=#{spots.size}"
61
+ { blind_spots: spots.map(&:to_h), count: spots.size }
62
+ end
63
+
64
+ def calibration_report(**)
65
+ Legion::Logging.info '[anosognosia] calibration_report requested'
66
+ engine.calibration_report
67
+ end
68
+
69
+ def decay_awareness(amount: nil, **)
70
+ amt = amount || Helpers::Constants::AWARENESS_DECAY
71
+ score = engine.decay_awareness(amount: amt)
72
+ { awareness_score: score.round(10), awareness_gap: engine.awareness_gap, decayed_by: amt }
73
+ end
74
+
75
+ def anosognosia_status(**)
76
+ { total_deficits: engine.deficits.size, awareness_score: engine.awareness_score.round(10),
77
+ blind_spot_count: engine.blind_spots.size }
78
+ end
79
+
80
+ private
81
+
82
+ def engine
83
+ @engine ||= Helpers::AnosognosiaEngine.new
84
+ end
85
+
86
+ def awareness_label_for(score)
87
+ Helpers::Constants::AWARENESS_LABELS.each do |range, label|
88
+ return label if range.include?(score)
89
+ end
90
+ :anosognosic
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ 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 Anosognosia
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/anosognosia/version'
4
+ require 'legion/extensions/agentic/self/anosognosia/helpers/constants'
5
+ require 'legion/extensions/agentic/self/anosognosia/helpers/cognitive_deficit'
6
+ require 'legion/extensions/agentic/self/anosognosia/helpers/anosognosia_engine'
7
+ require 'legion/extensions/agentic/self/anosognosia/runners/anosognosia'
8
+ require 'legion/extensions/agentic/self/anosognosia/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Self
14
+ module Anosognosia
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Architecture
8
+ class Client
9
+ include Runners::CognitiveArchitecture
10
+
11
+ def initialize(**)
12
+ @engine = Helpers::ArchitectureEngine.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Architecture
8
+ module Helpers
9
+ class ArchitectureEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @subsystems = {}
14
+ @connections = {}
15
+ end
16
+
17
+ def register_subsystem(name:, subsystem_type:, health: Constants::DEFAULT_HEALTH)
18
+ raise ArgumentError, "subsystem '#{name}' already registered" if @subsystems.key?(name.to_sym)
19
+ raise ArgumentError, "max subsystems (#{Constants::MAX_SUBSYSTEMS}) reached" if @subsystems.size >= Constants::MAX_SUBSYSTEMS
20
+
21
+ subsystem = Subsystem.new(name: name, subsystem_type: subsystem_type, health: health)
22
+ @subsystems[subsystem.name] = subsystem
23
+ subsystem
24
+ end
25
+
26
+ def create_connection(source_name:, target_name:, connection_type: :informational, weight: 0.5)
27
+ raise ArgumentError, "max connections (#{Constants::MAX_CONNECTIONS}) reached" if @connections.size >= Constants::MAX_CONNECTIONS
28
+
29
+ source = find_subsystem!(source_name)
30
+ target = find_subsystem!(target_name)
31
+
32
+ conn = Connection.new(
33
+ source_id: source.id,
34
+ target_id: target.id,
35
+ connection_type: connection_type,
36
+ weight: weight
37
+ )
38
+ @connections[conn.id] = conn
39
+ conn
40
+ end
41
+
42
+ def activate_subsystem(name:)
43
+ subsystem = find_subsystem!(name)
44
+ subsystem.activate!
45
+
46
+ excitatory_connections_from(subsystem.id).each do |conn|
47
+ target = subsystem_by_id(conn.target_id)
48
+ target&.activate!
49
+ end
50
+
51
+ { name: subsystem.name, status: subsystem.status, health: subsystem.health }
52
+ end
53
+
54
+ def degrade_subsystem(name:)
55
+ subsystem = find_subsystem!(name)
56
+ subsystem.degrade!
57
+ { name: subsystem.name, status: subsystem.status, health: subsystem.health }
58
+ end
59
+
60
+ def recover_subsystem(name:)
61
+ subsystem = find_subsystem!(name)
62
+ subsystem.recover!
63
+ { name: subsystem.name, status: subsystem.status, health: subsystem.health }
64
+ end
65
+
66
+ def subsystem_status(name:)
67
+ find_subsystem!(name).to_h
68
+ end
69
+
70
+ def active_subsystems
71
+ @subsystems.values.select { |s| s.status == :active }
72
+ end
73
+
74
+ def bottlenecked_subsystems
75
+ @subsystems.values.select(&:bottlenecked?)
76
+ end
77
+
78
+ def connections_for(name:)
79
+ subsystem = find_subsystem!(name)
80
+ @connections.values.select do |c|
81
+ c.source_id == subsystem.id || c.target_id == subsystem.id
82
+ end
83
+ end
84
+
85
+ def downstream(name:, max_depth: 5)
86
+ start = find_subsystem!(name)
87
+ visited = bfs_visited(start.id, max_depth)
88
+ visited.keys.filter_map { |sid| subsystem_by_id(sid) }.reject { |s| s.id == start.id }
89
+ end
90
+
91
+ def architecture_health
92
+ return 0.0 if @subsystems.empty?
93
+
94
+ total = @subsystems.values.sum(&:health)
95
+ total / @subsystems.size
96
+ end
97
+
98
+ def architecture_graph
99
+ {
100
+ nodes: @subsystems.values.map(&:to_h),
101
+ edges: @connections.values.map(&:to_h)
102
+ }
103
+ end
104
+
105
+ def decay_all
106
+ @subsystems.each_value { |s| s.degrade!(Constants::HEALTH_DECAY) }
107
+ { decayed: @subsystems.size }
108
+ end
109
+
110
+ def to_h
111
+ {
112
+ subsystem_count: @subsystems.size,
113
+ connection_count: @connections.size,
114
+ active_count: active_subsystems.size,
115
+ bottlenecked_count: bottlenecked_subsystems.size,
116
+ architecture_health: architecture_health
117
+ }
118
+ end
119
+
120
+ private
121
+
122
+ def find_subsystem!(name)
123
+ @subsystems.fetch(name.to_sym) do
124
+ raise ArgumentError, "subsystem '#{name}' not found"
125
+ end
126
+ end
127
+
128
+ def subsystem_by_id(id)
129
+ @subsystems.values.find { |s| s.id == id }
130
+ end
131
+
132
+ def excitatory_connections_from(source_id)
133
+ @connections.values.select do |c|
134
+ c.source_id == source_id && c.connection_type == :excitatory && c.active
135
+ end
136
+ end
137
+
138
+ def bfs_visited(start_id, max_depth)
139
+ visited = {}
140
+ queue = [[start_id, 0]]
141
+
142
+ until queue.empty?
143
+ current_id, depth = queue.shift
144
+ next if visited.key?(current_id)
145
+
146
+ visited[current_id] = depth
147
+ enqueue_neighbors(current_id, depth, visited, queue) if depth < max_depth
148
+ end
149
+
150
+ visited
151
+ end
152
+
153
+ def enqueue_neighbors(current_id, depth, visited, queue)
154
+ @connections.each_value do |conn|
155
+ next unless conn.source_id == current_id && conn.active
156
+ next if visited.key?(conn.target_id)
157
+
158
+ queue << [conn.target_id, depth + 1]
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module Architecture
10
+ module Helpers
11
+ class Connection
12
+ attr_reader :id, :source_id, :target_id, :connection_type, :created_at
13
+ attr_accessor :weight, :active
14
+
15
+ def initialize(source_id:, target_id:, connection_type: :informational, weight: 0.5)
16
+ @id = SecureRandom.uuid
17
+ @source_id = source_id
18
+ @target_id = target_id
19
+ @connection_type = connection_type.to_sym
20
+ @weight = weight.clamp(0.0, 1.0)
21
+ @active = true
22
+ @created_at = Time.now.utc
23
+ end
24
+
25
+ def strengthen!(amount = 0.05)
26
+ @weight = (@weight + amount).clamp(0.0, 1.0)
27
+ self
28
+ end
29
+
30
+ def weaken!(amount = 0.05)
31
+ @weight = (@weight - amount).clamp(0.0, 1.0)
32
+ self
33
+ end
34
+
35
+ def toggle!
36
+ @active = !@active
37
+ self
38
+ end
39
+
40
+ def to_h
41
+ {
42
+ id: @id,
43
+ source_id: @source_id,
44
+ target_id: @target_id,
45
+ connection_type: @connection_type,
46
+ weight: @weight,
47
+ active: @active,
48
+ created_at: @created_at
49
+ }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Architecture
8
+ module Helpers
9
+ module Constants
10
+ SUBSYSTEM_TYPES = %i[perception cognition memory motivation safety communication introspection coordination].freeze
11
+ CONNECTION_TYPES = %i[excitatory inhibitory modulatory informational].freeze
12
+ STATUS_LEVELS = %i[active idle degraded offline].freeze
13
+
14
+ HEALTH_LABELS = {
15
+ (0.8..) => :excellent,
16
+ (0.6...0.8) => :good,
17
+ (0.4...0.6) => :fair,
18
+ (0.2...0.4) => :degraded,
19
+ (..0.2) => :critical
20
+ }.freeze
21
+
22
+ BOTTLENECK_THRESHOLD = 0.3
23
+
24
+ MAX_SUBSYSTEMS = 200
25
+ MAX_CONNECTIONS = 1000
26
+ MAX_HISTORY = 500
27
+
28
+ DEFAULT_HEALTH = 0.8
29
+ HEALTH_DECAY = 0.01
30
+ HEALTH_BOOST = 0.05
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module Architecture
10
+ module Helpers
11
+ class Subsystem
12
+ include Constants
13
+
14
+ attr_reader :id, :name, :subsystem_type, :activation_count, :last_activated_at, :created_at
15
+ attr_accessor :health, :status, :load
16
+
17
+ def initialize(name:, subsystem_type:, health: Constants::DEFAULT_HEALTH)
18
+ @id = SecureRandom.uuid
19
+ @name = name.to_sym
20
+ @subsystem_type = subsystem_type.to_sym
21
+ @health = health.clamp(0.0, 1.0)
22
+ @status = :active
23
+ @load = 0.0
24
+ @activation_count = 0
25
+ @last_activated_at = nil
26
+ @created_at = Time.now.utc
27
+ end
28
+
29
+ def activate!
30
+ @activation_count += 1
31
+ @last_activated_at = Time.now.utc
32
+ @health = (@health + Constants::HEALTH_BOOST).clamp(0.0, 1.0)
33
+ self
34
+ end
35
+
36
+ def degrade!(amount = Constants::HEALTH_DECAY)
37
+ @health = (@health - amount).clamp(0.0, 1.0)
38
+ @status = :degraded if @health < 0.4
39
+ self
40
+ end
41
+
42
+ def recover!(amount = Constants::HEALTH_BOOST)
43
+ @health = (@health + amount).clamp(0.0, 1.0)
44
+ @status = :active if @health >= 0.4
45
+ self
46
+ end
47
+
48
+ def bottlenecked?
49
+ @load > Constants::BOTTLENECK_THRESHOLD && @health < 0.5
50
+ end
51
+
52
+ def health_label
53
+ Constants::HEALTH_LABELS.each do |range, label|
54
+ return label if range.cover?(@health)
55
+ end
56
+ :critical
57
+ end
58
+
59
+ def to_h
60
+ {
61
+ id: @id,
62
+ name: @name,
63
+ subsystem_type: @subsystem_type,
64
+ health: @health,
65
+ health_label: health_label,
66
+ status: @status,
67
+ load: @load,
68
+ activation_count: @activation_count,
69
+ last_activated_at: @last_activated_at,
70
+ created_at: @created_at,
71
+ bottlenecked: bottlenecked?
72
+ }
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Architecture
8
+ module Runners
9
+ module CognitiveArchitecture
10
+ extend self
11
+
12
+ def register_architecture_subsystem(name:, subsystem_type:, health: Helpers::Constants::DEFAULT_HEALTH, **)
13
+ Legion::Logging.debug "[cognitive_architecture] registering subsystem: #{name} (#{subsystem_type})"
14
+ subsystem = engine.register_subsystem(name: name, subsystem_type: subsystem_type, health: health)
15
+ { status: :registered, subsystem: subsystem.to_h }
16
+ rescue ArgumentError => e
17
+ Legion::Logging.warn "[cognitive_architecture] register_subsystem failed: #{e.message}"
18
+ { status: :error, message: e.message }
19
+ end
20
+
21
+ def create_architecture_connection(source_name:, target_name:,
22
+ connection_type: :informational, weight: 0.5, **)
23
+ Legion::Logging.debug "[cognitive_architecture] creating connection: #{source_name} -> #{target_name} (#{connection_type})"
24
+ conn = engine.create_connection(
25
+ source_name: source_name,
26
+ target_name: target_name,
27
+ connection_type: connection_type,
28
+ weight: weight
29
+ )
30
+ { status: :created, connection: conn.to_h }
31
+ rescue ArgumentError => e
32
+ Legion::Logging.warn "[cognitive_architecture] create_connection failed: #{e.message}"
33
+ { status: :error, message: e.message }
34
+ end
35
+
36
+ def activate_architecture_subsystem(name:, **)
37
+ Legion::Logging.debug "[cognitive_architecture] activating subsystem: #{name}"
38
+ result = engine.activate_subsystem(name: name)
39
+ { status: :activated, name: result[:name], health: result[:health], subsystem_status: result[:status] }
40
+ rescue ArgumentError => e
41
+ Legion::Logging.warn "[cognitive_architecture] activate_subsystem failed: #{e.message}"
42
+ { status: :error, message: e.message }
43
+ end
44
+
45
+ def degrade_architecture_subsystem(name:, **)
46
+ Legion::Logging.debug "[cognitive_architecture] degrading subsystem: #{name}"
47
+ result = engine.degrade_subsystem(name: name)
48
+ { status: :degraded, name: result[:name], health: result[:health], subsystem_status: result[:status] }
49
+ rescue ArgumentError => e
50
+ Legion::Logging.warn "[cognitive_architecture] degrade_subsystem failed: #{e.message}"
51
+ { status: :error, message: e.message }
52
+ end
53
+
54
+ def subsystem_status_report(name:, **)
55
+ Legion::Logging.debug "[cognitive_architecture] status report for: #{name}"
56
+ engine.subsystem_status(name: name)
57
+ rescue ArgumentError => e
58
+ { status: :error, message: e.message }
59
+ end
60
+
61
+ def bottleneck_report(**)
62
+ bottlenecked = engine.bottlenecked_subsystems
63
+ Legion::Logging.debug "[cognitive_architecture] bottleneck_report: #{bottlenecked.size} bottlenecked"
64
+ {
65
+ bottlenecked_count: bottlenecked.size,
66
+ subsystems: bottlenecked.map(&:to_h)
67
+ }
68
+ end
69
+
70
+ def architecture_health_report(**)
71
+ health = engine.architecture_health
72
+ Legion::Logging.debug "[cognitive_architecture] architecture_health: #{health.round(3)}"
73
+ {
74
+ health: health,
75
+ health_label: label_for_health(health),
76
+ active_count: engine.active_subsystems.size
77
+ }
78
+ end
79
+
80
+ def architecture_graph_report(**)
81
+ Legion::Logging.debug '[cognitive_architecture] building architecture_graph'
82
+ engine.architecture_graph
83
+ end
84
+
85
+ def downstream_subsystems(name:, max_depth: 5, **)
86
+ Legion::Logging.debug "[cognitive_architecture] downstream traversal from: #{name} (max_depth=#{max_depth})"
87
+ reachable = engine.downstream(name: name, max_depth: max_depth)
88
+ {
89
+ source: name,
90
+ reachable: reachable.map(&:to_h),
91
+ count: reachable.size
92
+ }
93
+ rescue ArgumentError => e
94
+ { status: :error, message: e.message }
95
+ end
96
+
97
+ def update_cognitive_architecture(**)
98
+ Legion::Logging.debug '[cognitive_architecture] running decay cycle'
99
+ result = engine.decay_all
100
+ { status: :updated, decayed: result[:decayed] }
101
+ end
102
+
103
+ def cognitive_architecture_stats(**)
104
+ engine.to_h
105
+ end
106
+
107
+ private
108
+
109
+ def engine
110
+ @engine ||= Helpers::ArchitectureEngine.new
111
+ end
112
+
113
+ def label_for_health(health)
114
+ Helpers::Constants::HEALTH_LABELS.each do |range, label|
115
+ return label if range.cover?(health)
116
+ end
117
+ :critical
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ 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 Architecture
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/architecture/version'
4
+ require 'legion/extensions/agentic/self/architecture/helpers/constants'
5
+ require 'legion/extensions/agentic/self/architecture/helpers/subsystem'
6
+ require 'legion/extensions/agentic/self/architecture/helpers/connection'
7
+ require 'legion/extensions/agentic/self/architecture/helpers/architecture_engine'
8
+ require 'legion/extensions/agentic/self/architecture/runners/cognitive_architecture'
9
+ require 'legion/extensions/agentic/self/architecture/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Self
15
+ module Architecture
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end