lex-agentic-self 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE +21 -0
  5. data/README.md +13 -0
  6. data/lex-agentic-self.gemspec +31 -0
  7. data/lib/legion/extensions/agentic/self/agency/client.rb +21 -0
  8. data/lib/legion/extensions/agentic/self/agency/helpers/constants.rb +77 -0
  9. data/lib/legion/extensions/agentic/self/agency/helpers/efficacy_model.rb +136 -0
  10. data/lib/legion/extensions/agentic/self/agency/helpers/outcome_event.rb +52 -0
  11. data/lib/legion/extensions/agentic/self/agency/runners/agency.rb +117 -0
  12. data/lib/legion/extensions/agentic/self/agency/version.rb +13 -0
  13. data/lib/legion/extensions/agentic/self/agency.rb +19 -0
  14. data/lib/legion/extensions/agentic/self/anchor/client.rb +15 -0
  15. data/lib/legion/extensions/agentic/self/anchor/helpers/anchor.rb +92 -0
  16. data/lib/legion/extensions/agentic/self/anchor/helpers/anchor_engine.rb +123 -0
  17. data/lib/legion/extensions/agentic/self/anchor/helpers/chain.rb +93 -0
  18. data/lib/legion/extensions/agentic/self/anchor/helpers/constants.rb +46 -0
  19. data/lib/legion/extensions/agentic/self/anchor/runners/cognitive_anchor.rb +70 -0
  20. data/lib/legion/extensions/agentic/self/anchor/version.rb +13 -0
  21. data/lib/legion/extensions/agentic/self/anchor.rb +22 -0
  22. data/lib/legion/extensions/agentic/self/anosognosia/client.rb +28 -0
  23. data/lib/legion/extensions/agentic/self/anosognosia/helpers/anosognosia_engine.rb +153 -0
  24. data/lib/legion/extensions/agentic/self/anosognosia/helpers/cognitive_deficit.rb +71 -0
  25. data/lib/legion/extensions/agentic/self/anosognosia/helpers/constants.rb +29 -0
  26. data/lib/legion/extensions/agentic/self/anosognosia/runners/anosognosia.rb +98 -0
  27. data/lib/legion/extensions/agentic/self/anosognosia/version.rb +13 -0
  28. data/lib/legion/extensions/agentic/self/anosognosia.rb +19 -0
  29. data/lib/legion/extensions/agentic/self/architecture/client.rb +19 -0
  30. data/lib/legion/extensions/agentic/self/architecture/helpers/architecture_engine.rb +167 -0
  31. data/lib/legion/extensions/agentic/self/architecture/helpers/connection.rb +57 -0
  32. data/lib/legion/extensions/agentic/self/architecture/helpers/constants.rb +37 -0
  33. data/lib/legion/extensions/agentic/self/architecture/helpers/subsystem.rb +80 -0
  34. data/lib/legion/extensions/agentic/self/architecture/runners/cognitive_architecture.rb +125 -0
  35. data/lib/legion/extensions/agentic/self/architecture/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/self/architecture.rb +20 -0
  37. data/lib/legion/extensions/agentic/self/default_mode_network/actors/idle.rb +45 -0
  38. data/lib/legion/extensions/agentic/self/default_mode_network/client.rb +28 -0
  39. data/lib/legion/extensions/agentic/self/default_mode_network/helpers/constants.rb +53 -0
  40. data/lib/legion/extensions/agentic/self/default_mode_network/helpers/dmn_engine.rb +221 -0
  41. data/lib/legion/extensions/agentic/self/default_mode_network/helpers/wandering_thought.rb +60 -0
  42. data/lib/legion/extensions/agentic/self/default_mode_network/runners/default_mode_network.rb +122 -0
  43. data/lib/legion/extensions/agentic/self/default_mode_network/version.rb +13 -0
  44. data/lib/legion/extensions/agentic/self/default_mode_network.rb +20 -0
  45. data/lib/legion/extensions/agentic/self/fingerprint/client.rb +28 -0
  46. data/lib/legion/extensions/agentic/self/fingerprint/helpers/cognitive_trait.rb +73 -0
  47. data/lib/legion/extensions/agentic/self/fingerprint/helpers/constants.rb +60 -0
  48. data/lib/legion/extensions/agentic/self/fingerprint/helpers/fingerprint_engine.rb +169 -0
  49. data/lib/legion/extensions/agentic/self/fingerprint/runners/cognitive_fingerprint.rb +86 -0
  50. data/lib/legion/extensions/agentic/self/fingerprint/version.rb +13 -0
  51. data/lib/legion/extensions/agentic/self/fingerprint.rb +19 -0
  52. data/lib/legion/extensions/agentic/self/identity/actors/credential_refresh.rb +49 -0
  53. data/lib/legion/extensions/agentic/self/identity/actors/orphan_check.rb +52 -0
  54. data/lib/legion/extensions/agentic/self/identity/client.rb +27 -0
  55. data/lib/legion/extensions/agentic/self/identity/helpers/dimensions.rb +75 -0
  56. data/lib/legion/extensions/agentic/self/identity/helpers/fingerprint.rb +170 -0
  57. data/lib/legion/extensions/agentic/self/identity/helpers/graph_client.rb +29 -0
  58. data/lib/legion/extensions/agentic/self/identity/helpers/graph_token.rb +36 -0
  59. data/lib/legion/extensions/agentic/self/identity/helpers/token_cache.rb +59 -0
  60. data/lib/legion/extensions/agentic/self/identity/helpers/vault_secrets.rb +80 -0
  61. data/lib/legion/extensions/agentic/self/identity/local_migrations/20260316000030_create_fingerprint.rb +20 -0
  62. data/lib/legion/extensions/agentic/self/identity/runners/entra.rb +402 -0
  63. data/lib/legion/extensions/agentic/self/identity/runners/identity.rb +90 -0
  64. data/lib/legion/extensions/agentic/self/identity/version.rb +13 -0
  65. data/lib/legion/extensions/agentic/self/identity.rb +28 -0
  66. data/lib/legion/extensions/agentic/self/metacognition/client.rb +27 -0
  67. data/lib/legion/extensions/agentic/self/metacognition/helpers/constants.rb +377 -0
  68. data/lib/legion/extensions/agentic/self/metacognition/helpers/narrator_bridge.rb +85 -0
  69. data/lib/legion/extensions/agentic/self/metacognition/helpers/registry_store.rb +70 -0
  70. data/lib/legion/extensions/agentic/self/metacognition/helpers/self_model.rb +160 -0
  71. data/lib/legion/extensions/agentic/self/metacognition/helpers/snapshot_store.rb +82 -0
  72. data/lib/legion/extensions/agentic/self/metacognition/runners/metacognition.rb +116 -0
  73. data/lib/legion/extensions/agentic/self/metacognition/runners/registry.rb +180 -0
  74. data/lib/legion/extensions/agentic/self/metacognition/version.rb +13 -0
  75. data/lib/legion/extensions/agentic/self/metacognition.rb +22 -0
  76. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/client.rb +25 -0
  77. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/helpers/calibration_tracker.rb +96 -0
  78. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/helpers/constants.rb +47 -0
  79. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_engine.rb +141 -0
  80. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_judgment.rb +79 -0
  81. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/runners/metacognitive_monitoring.rb +151 -0
  82. data/lib/legion/extensions/agentic/self/metacognitive_monitoring/version.rb +13 -0
  83. data/lib/legion/extensions/agentic/self/metacognitive_monitoring.rb +20 -0
  84. data/lib/legion/extensions/agentic/self/narrative_arc/client.rb +29 -0
  85. data/lib/legion/extensions/agentic/self/narrative_arc/helpers/arc.rb +137 -0
  86. data/lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb +119 -0
  87. data/lib/legion/extensions/agentic/self/narrative_arc/helpers/beat_event.rb +59 -0
  88. data/lib/legion/extensions/agentic/self/narrative_arc/helpers/constants.rb +66 -0
  89. data/lib/legion/extensions/agentic/self/narrative_arc/runners/narrative.rb +101 -0
  90. data/lib/legion/extensions/agentic/self/narrative_arc/version.rb +13 -0
  91. data/lib/legion/extensions/agentic/self/narrative_arc.rb +20 -0
  92. data/lib/legion/extensions/agentic/self/narrative_identity/actors/narrative_decay.rb +45 -0
  93. data/lib/legion/extensions/agentic/self/narrative_identity/client.rb +22 -0
  94. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/chapter.rb +48 -0
  95. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/constants.rb +62 -0
  96. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/episode.rb +67 -0
  97. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/narrative_engine.rb +187 -0
  98. data/lib/legion/extensions/agentic/self/narrative_identity/helpers/theme.rb +50 -0
  99. data/lib/legion/extensions/agentic/self/narrative_identity/runners/narrative_identity.rb +158 -0
  100. data/lib/legion/extensions/agentic/self/narrative_identity/version.rb +13 -0
  101. data/lib/legion/extensions/agentic/self/narrative_identity.rb +21 -0
  102. data/lib/legion/extensions/agentic/self/narrative_self/client.rb +27 -0
  103. data/lib/legion/extensions/agentic/self/narrative_self/helpers/autobiography.rb +187 -0
  104. data/lib/legion/extensions/agentic/self/narrative_self/helpers/constants.rb +42 -0
  105. data/lib/legion/extensions/agentic/self/narrative_self/helpers/episode.rb +81 -0
  106. data/lib/legion/extensions/agentic/self/narrative_self/helpers/narrative_thread.rb +65 -0
  107. data/lib/legion/extensions/agentic/self/narrative_self/runners/narrative_self.rb +86 -0
  108. data/lib/legion/extensions/agentic/self/narrative_self/version.rb +13 -0
  109. data/lib/legion/extensions/agentic/self/narrative_self.rb +20 -0
  110. data/lib/legion/extensions/agentic/self/personality/client.rb +21 -0
  111. data/lib/legion/extensions/agentic/self/personality/helpers/constants.rb +84 -0
  112. data/lib/legion/extensions/agentic/self/personality/helpers/personality_store.rb +126 -0
  113. data/lib/legion/extensions/agentic/self/personality/helpers/trait_model.rb +147 -0
  114. data/lib/legion/extensions/agentic/self/personality/runners/personality.rb +102 -0
  115. data/lib/legion/extensions/agentic/self/personality/version.rb +13 -0
  116. data/lib/legion/extensions/agentic/self/personality.rb +19 -0
  117. data/lib/legion/extensions/agentic/self/reflection/client.rb +27 -0
  118. data/lib/legion/extensions/agentic/self/reflection/helpers/constants.rb +66 -0
  119. data/lib/legion/extensions/agentic/self/reflection/helpers/llm_enhancer.rb +166 -0
  120. data/lib/legion/extensions/agentic/self/reflection/helpers/monitors.rb +186 -0
  121. data/lib/legion/extensions/agentic/self/reflection/helpers/reflection.rb +54 -0
  122. data/lib/legion/extensions/agentic/self/reflection/helpers/reflection_store.rb +99 -0
  123. data/lib/legion/extensions/agentic/self/reflection/runners/reflection.rb +199 -0
  124. data/lib/legion/extensions/agentic/self/reflection/version.rb +13 -0
  125. data/lib/legion/extensions/agentic/self/reflection.rb +21 -0
  126. data/lib/legion/extensions/agentic/self/self_model/client.rb +19 -0
  127. data/lib/legion/extensions/agentic/self/self_model/helpers/capability.rb +93 -0
  128. data/lib/legion/extensions/agentic/self/self_model/helpers/constants.rb +46 -0
  129. data/lib/legion/extensions/agentic/self/self_model/helpers/knowledge_domain.rb +82 -0
  130. data/lib/legion/extensions/agentic/self/self_model/helpers/self_model.rb +150 -0
  131. data/lib/legion/extensions/agentic/self/self_model/runners/self_model.rb +82 -0
  132. data/lib/legion/extensions/agentic/self/self_model/version.rb +13 -0
  133. data/lib/legion/extensions/agentic/self/self_model.rb +21 -0
  134. data/lib/legion/extensions/agentic/self/self_talk/actors/volume_decay.rb +45 -0
  135. data/lib/legion/extensions/agentic/self/self_talk/client.rb +30 -0
  136. data/lib/legion/extensions/agentic/self/self_talk/helpers/constants.rb +63 -0
  137. data/lib/legion/extensions/agentic/self/self_talk/helpers/dialogue.rb +114 -0
  138. data/lib/legion/extensions/agentic/self/self_talk/helpers/dialogue_turn.rb +43 -0
  139. data/lib/legion/extensions/agentic/self/self_talk/helpers/inner_voice.rb +77 -0
  140. data/lib/legion/extensions/agentic/self/self_talk/helpers/llm_enhancer.rb +135 -0
  141. data/lib/legion/extensions/agentic/self/self_talk/helpers/self_talk_engine.rb +160 -0
  142. data/lib/legion/extensions/agentic/self/self_talk/runners/self_talk.rb +172 -0
  143. data/lib/legion/extensions/agentic/self/self_talk/version.rb +13 -0
  144. data/lib/legion/extensions/agentic/self/self_talk.rb +22 -0
  145. data/lib/legion/extensions/agentic/self/version.rb +11 -0
  146. data/lib/legion/extensions/agentic/self.rb +33 -0
  147. data/spec/legion/extensions/agentic/self/agency/client_spec.rb +67 -0
  148. data/spec/legion/extensions/agentic/self/agency/helpers/constants_spec.rb +73 -0
  149. data/spec/legion/extensions/agentic/self/agency/helpers/efficacy_model_spec.rb +190 -0
  150. data/spec/legion/extensions/agentic/self/agency/helpers/outcome_event_spec.rb +85 -0
  151. data/spec/legion/extensions/agentic/self/agency/runners/agency_spec.rb +132 -0
  152. data/spec/legion/extensions/agentic/self/anchor/client_spec.rb +30 -0
  153. data/spec/legion/extensions/agentic/self/anchor/helpers/anchor_engine_spec.rb +109 -0
  154. data/spec/legion/extensions/agentic/self/anchor/helpers/anchor_spec.rb +124 -0
  155. data/spec/legion/extensions/agentic/self/anchor/helpers/chain_spec.rb +106 -0
  156. data/spec/legion/extensions/agentic/self/anchor/helpers/constants_spec.rb +53 -0
  157. data/spec/legion/extensions/agentic/self/anchor/runners/cognitive_anchor_spec.rb +70 -0
  158. data/spec/legion/extensions/agentic/self/anosognosia/anosognosia_spec.rb +15 -0
  159. data/spec/legion/extensions/agentic/self/anosognosia/client_spec.rb +50 -0
  160. data/spec/legion/extensions/agentic/self/anosognosia/helpers/anosognosia_engine_spec.rb +266 -0
  161. data/spec/legion/extensions/agentic/self/anosognosia/helpers/cognitive_deficit_spec.rb +150 -0
  162. data/spec/legion/extensions/agentic/self/anosognosia/helpers/constants_spec.rb +58 -0
  163. data/spec/legion/extensions/agentic/self/anosognosia/runners/anosognosia_spec.rb +225 -0
  164. data/spec/legion/extensions/agentic/self/architecture/client_spec.rb +51 -0
  165. data/spec/legion/extensions/agentic/self/architecture/helpers/architecture_engine_spec.rb +321 -0
  166. data/spec/legion/extensions/agentic/self/architecture/helpers/connection_spec.rb +118 -0
  167. data/spec/legion/extensions/agentic/self/architecture/helpers/subsystem_spec.rb +189 -0
  168. data/spec/legion/extensions/agentic/self/architecture/runners/cognitive_architecture_spec.rb +181 -0
  169. data/spec/legion/extensions/agentic/self/default_mode_network/client_spec.rb +69 -0
  170. data/spec/legion/extensions/agentic/self/default_mode_network/helpers/constants_spec.rb +76 -0
  171. data/spec/legion/extensions/agentic/self/default_mode_network/helpers/dmn_engine_spec.rb +321 -0
  172. data/spec/legion/extensions/agentic/self/default_mode_network/helpers/wandering_thought_spec.rb +145 -0
  173. data/spec/legion/extensions/agentic/self/default_mode_network/runners/default_mode_network_spec.rb +269 -0
  174. data/spec/legion/extensions/agentic/self/fingerprint/client_spec.rb +54 -0
  175. data/spec/legion/extensions/agentic/self/fingerprint/helpers/cognitive_trait_spec.rb +180 -0
  176. data/spec/legion/extensions/agentic/self/fingerprint/helpers/constants_spec.rb +108 -0
  177. data/spec/legion/extensions/agentic/self/fingerprint/helpers/fingerprint_engine_spec.rb +318 -0
  178. data/spec/legion/extensions/agentic/self/fingerprint/runners/cognitive_fingerprint_spec.rb +232 -0
  179. data/spec/legion/extensions/agentic/self/identity/actors/orphan_check_spec.rb +104 -0
  180. data/spec/legion/extensions/agentic/self/identity/client_spec.rb +32 -0
  181. data/spec/legion/extensions/agentic/self/identity/helpers/dimensions_spec.rb +51 -0
  182. data/spec/legion/extensions/agentic/self/identity/helpers/fingerprint_spec.rb +66 -0
  183. data/spec/legion/extensions/agentic/self/identity/helpers/graph_client_spec.rb +19 -0
  184. data/spec/legion/extensions/agentic/self/identity/helpers/graph_token_spec.rb +31 -0
  185. data/spec/legion/extensions/agentic/self/identity/helpers/token_cache_spec.rb +50 -0
  186. data/spec/legion/extensions/agentic/self/identity/local_persistence_spec.rb +329 -0
  187. data/spec/legion/extensions/agentic/self/identity/runners/entra_spec.rb +655 -0
  188. data/spec/legion/extensions/agentic/self/identity/runners/identity_spec.rb +61 -0
  189. data/spec/legion/extensions/agentic/self/metacognition/client_spec.rb +20 -0
  190. data/spec/legion/extensions/agentic/self/metacognition/helpers/constants_spec.rb +31 -0
  191. data/spec/legion/extensions/agentic/self/metacognition/helpers/narrator_bridge_spec.rb +102 -0
  192. data/spec/legion/extensions/agentic/self/metacognition/helpers/registry_store_spec.rb +227 -0
  193. data/spec/legion/extensions/agentic/self/metacognition/helpers/self_model_spec.rb +117 -0
  194. data/spec/legion/extensions/agentic/self/metacognition/helpers/snapshot_store_spec.rb +128 -0
  195. data/spec/legion/extensions/agentic/self/metacognition/runners/metacognition_spec.rb +110 -0
  196. data/spec/legion/extensions/agentic/self/metacognition/runners/registry_spec.rb +281 -0
  197. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/client_spec.rb +59 -0
  198. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/helpers/calibration_tracker_spec.rb +143 -0
  199. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/helpers/constants_spec.rb +91 -0
  200. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_engine_spec.rb +198 -0
  201. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_judgment_spec.rb +172 -0
  202. data/spec/legion/extensions/agentic/self/metacognitive_monitoring/runners/metacognitive_monitoring_spec.rb +244 -0
  203. data/spec/legion/extensions/agentic/self/narrative_arc/client_spec.rb +22 -0
  204. data/spec/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine_spec.rb +183 -0
  205. data/spec/legion/extensions/agentic/self/narrative_arc/helpers/arc_spec.rb +177 -0
  206. data/spec/legion/extensions/agentic/self/narrative_arc/helpers/beat_event_spec.rb +96 -0
  207. data/spec/legion/extensions/agentic/self/narrative_arc/helpers/constants_spec.rb +75 -0
  208. data/spec/legion/extensions/agentic/self/narrative_arc/runners/narrative_spec.rb +142 -0
  209. data/spec/legion/extensions/agentic/self/narrative_identity/client_spec.rb +69 -0
  210. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/chapter_spec.rb +85 -0
  211. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/constants_spec.rb +83 -0
  212. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/episode_spec.rb +180 -0
  213. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/narrative_engine_spec.rb +307 -0
  214. data/spec/legion/extensions/agentic/self/narrative_identity/helpers/theme_spec.rb +107 -0
  215. data/spec/legion/extensions/agentic/self/narrative_identity/runners/narrative_identity_spec.rb +240 -0
  216. data/spec/legion/extensions/agentic/self/narrative_self/client_spec.rb +67 -0
  217. data/spec/legion/extensions/agentic/self/narrative_self/helpers/autobiography_spec.rb +155 -0
  218. data/spec/legion/extensions/agentic/self/narrative_self/helpers/constants_spec.rb +28 -0
  219. data/spec/legion/extensions/agentic/self/narrative_self/helpers/episode_spec.rb +144 -0
  220. data/spec/legion/extensions/agentic/self/narrative_self/helpers/narrative_thread_spec.rb +87 -0
  221. data/spec/legion/extensions/agentic/self/narrative_self/runners/narrative_self_spec.rb +118 -0
  222. data/spec/legion/extensions/agentic/self/personality/client_spec.rb +20 -0
  223. data/spec/legion/extensions/agentic/self/personality/helpers/constants_spec.rb +41 -0
  224. data/spec/legion/extensions/agentic/self/personality/helpers/personality_store_spec.rb +66 -0
  225. data/spec/legion/extensions/agentic/self/personality/helpers/trait_model_spec.rb +148 -0
  226. data/spec/legion/extensions/agentic/self/personality/runners/personality_spec.rb +67 -0
  227. data/spec/legion/extensions/agentic/self/reflection/client_spec.rb +24 -0
  228. data/spec/legion/extensions/agentic/self/reflection/helpers/llm_enhancer_spec.rb +191 -0
  229. data/spec/legion/extensions/agentic/self/reflection/helpers/monitors_spec.rb +120 -0
  230. data/spec/legion/extensions/agentic/self/reflection/helpers/reflection_spec.rb +49 -0
  231. data/spec/legion/extensions/agentic/self/reflection/helpers/reflection_store_spec.rb +93 -0
  232. data/spec/legion/extensions/agentic/self/reflection/runners/reflection_spec.rb +204 -0
  233. data/spec/legion/extensions/agentic/self/self_model/client_spec.rb +55 -0
  234. data/spec/legion/extensions/agentic/self/self_model/helpers/capability_spec.rb +160 -0
  235. data/spec/legion/extensions/agentic/self/self_model/helpers/knowledge_domain_spec.rb +128 -0
  236. data/spec/legion/extensions/agentic/self/self_model/helpers/self_model_spec.rb +238 -0
  237. data/spec/legion/extensions/agentic/self/self_model/runners/self_model_spec.rb +143 -0
  238. data/spec/legion/extensions/agentic/self/self_talk/actors/volume_decay_spec.rb +46 -0
  239. data/spec/legion/extensions/agentic/self/self_talk/client_spec.rb +26 -0
  240. data/spec/legion/extensions/agentic/self/self_talk/helpers/constants_spec.rb +110 -0
  241. data/spec/legion/extensions/agentic/self/self_talk/helpers/dialogue_spec.rb +191 -0
  242. data/spec/legion/extensions/agentic/self/self_talk/helpers/dialogue_turn_spec.rb +78 -0
  243. data/spec/legion/extensions/agentic/self/self_talk/helpers/inner_voice_spec.rb +172 -0
  244. data/spec/legion/extensions/agentic/self/self_talk/helpers/llm_enhancer_spec.rb +206 -0
  245. data/spec/legion/extensions/agentic/self/self_talk/helpers/self_talk_engine_spec.rb +239 -0
  246. data/spec/legion/extensions/agentic/self/self_talk/runners/self_talk_llm_spec.rb +169 -0
  247. data/spec/legion/extensions/agentic/self/self_talk/runners/self_talk_spec.rb +196 -0
  248. data/spec/spec_helper.rb +46 -0
  249. metadata +347 -0
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::Anosognosia::Helpers::CognitiveDeficit do
4
+ subject(:deficit) do
5
+ described_class.new(domain: :language, deficit_type: :knowledge, severity: 0.6)
6
+ end
7
+
8
+ describe '#initialize' do
9
+ it 'assigns a uuid id' do
10
+ expect(deficit.id).to match(/\A[0-9a-f-]{36}\z/)
11
+ end
12
+
13
+ it 'assigns domain' do
14
+ expect(deficit.domain).to eq(:language)
15
+ end
16
+
17
+ it 'assigns deficit_type' do
18
+ expect(deficit.deficit_type).to eq(:knowledge)
19
+ end
20
+
21
+ it 'assigns severity' do
22
+ expect(deficit.severity).to eq(0.6)
23
+ end
24
+
25
+ it 'defaults acknowledged to false' do
26
+ expect(deficit.acknowledged).to be false
27
+ end
28
+
29
+ it 'assigns discovered_at' do
30
+ expect(deficit.discovered_at).to be_a(Time)
31
+ end
32
+
33
+ it 'leaves acknowledged_at nil' do
34
+ expect(deficit.acknowledged_at).to be_nil
35
+ end
36
+
37
+ it 'clamps severity above 1.0 to 1.0' do
38
+ d = described_class.new(domain: :test, deficit_type: :reasoning, severity: 1.5)
39
+ expect(d.severity).to eq(1.0)
40
+ end
41
+
42
+ it 'clamps severity below 0.0 to 0.0' do
43
+ d = described_class.new(domain: :test, deficit_type: :reasoning, severity: -0.5)
44
+ expect(d.severity).to eq(0.0)
45
+ end
46
+
47
+ it 'raises ArgumentError for invalid deficit_type' do
48
+ expect do
49
+ described_class.new(domain: :test, deficit_type: :invalid_type, severity: 0.5)
50
+ end.to raise_error(ArgumentError, /Invalid deficit_type/)
51
+ end
52
+
53
+ it 'accepts acknowledged: true' do
54
+ d = described_class.new(domain: :test, deficit_type: :memory, severity: 0.3, acknowledged: true)
55
+ expect(d.acknowledged).to be true
56
+ end
57
+ end
58
+
59
+ describe '#acknowledge!' do
60
+ it 'sets acknowledged to true' do
61
+ deficit.acknowledge!
62
+ expect(deficit.acknowledged).to be true
63
+ end
64
+
65
+ it 'sets acknowledged_at timestamp' do
66
+ deficit.acknowledge!
67
+ expect(deficit.acknowledged_at).to be_a(Time)
68
+ end
69
+
70
+ it 'returns true when newly acknowledged' do
71
+ expect(deficit.acknowledge!).to be true
72
+ end
73
+
74
+ it 'returns false when already acknowledged' do
75
+ deficit.acknowledge!
76
+ expect(deficit.acknowledge!).to be false
77
+ end
78
+
79
+ it 'does not update acknowledged_at on second call' do
80
+ deficit.acknowledge!
81
+ first_time = deficit.acknowledged_at
82
+ sleep(0.001)
83
+ deficit.acknowledge!
84
+ expect(deficit.acknowledged_at).to eq(first_time)
85
+ end
86
+ end
87
+
88
+ describe '#severity_label' do
89
+ it 'returns :severe for severity >= 0.8' do
90
+ d = described_class.new(domain: :t, deficit_type: :attention, severity: 0.9)
91
+ expect(d.severity_label).to eq(:severe)
92
+ end
93
+
94
+ it 'returns :high for severity in 0.6..0.8' do
95
+ d = described_class.new(domain: :t, deficit_type: :attention, severity: 0.7)
96
+ expect(d.severity_label).to eq(:high)
97
+ end
98
+
99
+ it 'returns :moderate for severity in 0.4..0.6' do
100
+ d = described_class.new(domain: :t, deficit_type: :attention, severity: 0.5)
101
+ expect(d.severity_label).to eq(:moderate)
102
+ end
103
+
104
+ it 'returns :low for severity in 0.2..0.4' do
105
+ d = described_class.new(domain: :t, deficit_type: :attention, severity: 0.3)
106
+ expect(d.severity_label).to eq(:low)
107
+ end
108
+
109
+ it 'returns :minimal for severity < 0.2' do
110
+ d = described_class.new(domain: :t, deficit_type: :attention, severity: 0.1)
111
+ expect(d.severity_label).to eq(:minimal)
112
+ end
113
+ end
114
+
115
+ describe '#to_h' do
116
+ let(:h) { deficit.to_h }
117
+
118
+ it 'includes id' do
119
+ expect(h[:id]).to eq(deficit.id)
120
+ end
121
+
122
+ it 'includes domain' do
123
+ expect(h[:domain]).to eq(:language)
124
+ end
125
+
126
+ it 'includes deficit_type' do
127
+ expect(h[:deficit_type]).to eq(:knowledge)
128
+ end
129
+
130
+ it 'includes severity rounded to 10 places' do
131
+ expect(h[:severity]).to eq(0.6.round(10))
132
+ end
133
+
134
+ it 'includes severity_label' do
135
+ expect(h[:severity_label]).to eq(:high)
136
+ end
137
+
138
+ it 'includes acknowledged' do
139
+ expect(h[:acknowledged]).to be false
140
+ end
141
+
142
+ it 'includes discovered_at' do
143
+ expect(h[:discovered_at]).to be_a(Time)
144
+ end
145
+
146
+ it 'includes acknowledged_at' do
147
+ expect(h).to have_key(:acknowledged_at)
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::Anosognosia::Helpers::Constants do
4
+ describe 'MAX_DEFICITS' do
5
+ it 'is 200' do
6
+ expect(described_class::MAX_DEFICITS).to eq(200)
7
+ end
8
+ end
9
+
10
+ describe 'AWARENESS_DECAY' do
11
+ it 'is 0.02' do
12
+ expect(described_class::AWARENESS_DECAY).to eq(0.02)
13
+ end
14
+ end
15
+
16
+ describe 'AWARENESS_BOOST' do
17
+ it 'is 0.1' do
18
+ expect(described_class::AWARENESS_BOOST).to eq(0.1)
19
+ end
20
+ end
21
+
22
+ describe 'AWARENESS_LABELS' do
23
+ it 'includes all expected labels' do
24
+ labels = described_class::AWARENESS_LABELS.values
25
+ expect(labels).to include(:calibrated, :mostly_aware, :partially_blind, :largely_blind, :anosognosic)
26
+ end
27
+
28
+ it 'has 5 labels' do
29
+ expect(described_class::AWARENESS_LABELS.size).to eq(5)
30
+ end
31
+
32
+ it 'maps 1.0 to calibrated' do
33
+ label = described_class::AWARENESS_LABELS.find { |range, _| range.include?(1.0) }&.last
34
+ expect(label).to eq(:calibrated)
35
+ end
36
+
37
+ it 'maps 0.0 to anosognosic' do
38
+ label = described_class::AWARENESS_LABELS.find { |range, _| range.include?(0.0) }&.last
39
+ expect(label).to eq(:anosognosic)
40
+ end
41
+ end
42
+
43
+ describe 'DEFICIT_TYPES' do
44
+ it 'includes all six deficit types' do
45
+ expect(described_class::DEFICIT_TYPES).to include(
46
+ :knowledge, :reasoning, :memory, :perception, :attention, :judgment
47
+ )
48
+ end
49
+
50
+ it 'has exactly six types' do
51
+ expect(described_class::DEFICIT_TYPES.size).to eq(6)
52
+ end
53
+
54
+ it 'is frozen' do
55
+ expect(described_class::DEFICIT_TYPES).to be_frozen
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,225 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/anosognosia/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Self::Anosognosia::Runners::Anosognosia do
6
+ let(:client) { Legion::Extensions::Agentic::Self::Anosognosia::Client.new }
7
+
8
+ def register(client, domain: :language, deficit_type: :knowledge, severity: 0.5)
9
+ client.register_deficit(domain: domain, deficit_type: deficit_type, severity: severity)
10
+ end
11
+
12
+ describe '#register_deficit' do
13
+ it 'returns registered: true' do
14
+ result = register(client)
15
+ expect(result[:registered]).to be true
16
+ end
17
+
18
+ it 'returns a deficit_id' do
19
+ result = register(client)
20
+ expect(result[:deficit_id]).to match(/\A[0-9a-f-]{36}\z/)
21
+ end
22
+
23
+ it 'includes severity in result' do
24
+ result = register(client, severity: 0.7)
25
+ expect(result[:severity]).to eq(0.7)
26
+ end
27
+
28
+ it 'includes severity_label' do
29
+ result = register(client, severity: 0.7)
30
+ expect(result[:severity_label]).to eq(:high)
31
+ end
32
+
33
+ it 'includes acknowledged: false by default' do
34
+ result = register(client)
35
+ expect(result[:acknowledged]).to be false
36
+ end
37
+
38
+ it 'includes awareness_score' do
39
+ result = register(client)
40
+ expect(result).to have_key(:awareness_score)
41
+ end
42
+ end
43
+
44
+ describe '#acknowledge_deficit' do
45
+ let(:deficit_id) { register(client)[:deficit_id] }
46
+
47
+ it 'acknowledges an existing deficit' do
48
+ result = client.acknowledge_deficit(deficit_id: deficit_id)
49
+ expect(result[:found]).to be true
50
+ expect(result[:changed]).to be true
51
+ end
52
+
53
+ it 'returns found: false for unknown id' do
54
+ result = client.acknowledge_deficit(deficit_id: 'no-such-id')
55
+ expect(result[:found]).to be false
56
+ end
57
+
58
+ it 'returns changed: false when already acknowledged' do
59
+ client.acknowledge_deficit(deficit_id: deficit_id)
60
+ result = client.acknowledge_deficit(deficit_id: deficit_id)
61
+ expect(result[:changed]).to be false
62
+ end
63
+ end
64
+
65
+ describe '#reveal_blind_spot' do
66
+ let(:deficit_id) { register(client)[:deficit_id] }
67
+
68
+ it 'returns found: true and already_known: false for a blind spot' do
69
+ result = client.reveal_blind_spot(deficit_id: deficit_id)
70
+ expect(result[:found]).to be true
71
+ expect(result[:already_known]).to be false
72
+ end
73
+
74
+ it 'returns already_known: true if already acknowledged' do
75
+ client.acknowledge_deficit(deficit_id: deficit_id)
76
+ result = client.reveal_blind_spot(deficit_id: deficit_id)
77
+ expect(result[:already_known]).to be true
78
+ end
79
+
80
+ it 'returns found: false for unknown id' do
81
+ result = client.reveal_blind_spot(deficit_id: 'no-such-id')
82
+ expect(result[:found]).to be false
83
+ end
84
+
85
+ it 'includes awareness_score for newly revealed spot' do
86
+ result = client.reveal_blind_spot(deficit_id: deficit_id)
87
+ expect(result).to have_key(:awareness_score)
88
+ end
89
+
90
+ it 'includes awareness_label for newly revealed spot' do
91
+ result = client.reveal_blind_spot(deficit_id: deficit_id)
92
+ expect(result).to have_key(:awareness_label)
93
+ end
94
+ end
95
+
96
+ describe '#awareness_score' do
97
+ it 'returns awareness_score hash' do
98
+ result = client.awareness_score
99
+ expect(result).to have_key(:awareness_score)
100
+ end
101
+
102
+ it 'includes awareness_gap' do
103
+ result = client.awareness_score
104
+ expect(result).to have_key(:awareness_gap)
105
+ end
106
+
107
+ it 'includes awareness_label' do
108
+ result = client.awareness_score
109
+ expect(result).to have_key(:awareness_label)
110
+ end
111
+
112
+ it 'starts at 1.0 (fully calibrated) with no deficits' do
113
+ result = client.awareness_score
114
+ expect(result[:awareness_score]).to eq(1.0)
115
+ end
116
+ end
117
+
118
+ describe '#awareness_gap' do
119
+ it 'returns awareness_gap hash' do
120
+ result = client.awareness_gap
121
+ expect(result).to have_key(:awareness_gap)
122
+ end
123
+
124
+ it 'includes awareness_score' do
125
+ result = client.awareness_gap
126
+ expect(result).to have_key(:awareness_score)
127
+ end
128
+ end
129
+
130
+ describe '#blind_spots' do
131
+ it 'returns empty array when no deficits registered' do
132
+ result = client.blind_spots
133
+ expect(result[:blind_spots]).to be_empty
134
+ expect(result[:count]).to eq(0)
135
+ end
136
+
137
+ it 'returns unacknowledged deficits' do
138
+ id1 = register(client, domain: :a)[:deficit_id]
139
+ register(client, domain: :b)
140
+ client.acknowledge_deficit(deficit_id: id1)
141
+ result = client.blind_spots
142
+ expect(result[:count]).to eq(1)
143
+ end
144
+ end
145
+
146
+ describe '#calibration_report' do
147
+ before do
148
+ id1 = register(client, domain: :a)[:deficit_id]
149
+ register(client, domain: :b)
150
+ client.acknowledge_deficit(deficit_id: id1)
151
+ end
152
+
153
+ let(:report) { client.calibration_report }
154
+
155
+ it 'returns a calibration report hash' do
156
+ expect(report).to be_a(Hash)
157
+ end
158
+
159
+ it 'includes total_deficits' do
160
+ expect(report[:total_deficits]).to eq(2)
161
+ end
162
+
163
+ it 'includes acknowledged_deficits' do
164
+ expect(report[:acknowledged_deficits]).to eq(1)
165
+ end
166
+
167
+ it 'includes unacknowledged_deficits' do
168
+ expect(report[:unacknowledged_deficits]).to eq(1)
169
+ end
170
+
171
+ it 'includes awareness_label' do
172
+ expect(report).to have_key(:awareness_label)
173
+ end
174
+
175
+ it 'includes deficit_breakdown with all types' do
176
+ breakdown = report[:deficit_breakdown]
177
+ Legion::Extensions::Agentic::Self::Anosognosia::Helpers::Constants::DEFICIT_TYPES.each do |type|
178
+ expect(breakdown).to have_key(type)
179
+ end
180
+ end
181
+ end
182
+
183
+ describe '#decay_awareness' do
184
+ it 'reduces awareness_score' do
185
+ before = client.awareness_score[:awareness_score]
186
+ client.decay_awareness
187
+ after = client.awareness_score[:awareness_score]
188
+ expect(after).to be < before
189
+ end
190
+
191
+ it 'accepts custom amount' do
192
+ result = client.decay_awareness(amount: 0.5)
193
+ expect(result[:decayed_by]).to eq(0.5)
194
+ end
195
+
196
+ it 'includes awareness_score in result' do
197
+ result = client.decay_awareness
198
+ expect(result).to have_key(:awareness_score)
199
+ end
200
+
201
+ it 'includes awareness_gap in result' do
202
+ result = client.decay_awareness
203
+ expect(result).to have_key(:awareness_gap)
204
+ end
205
+ end
206
+
207
+ describe '#anosognosia_status' do
208
+ it 'returns total_deficits' do
209
+ register(client)
210
+ result = client.anosognosia_status
211
+ expect(result[:total_deficits]).to eq(1)
212
+ end
213
+
214
+ it 'returns awareness_score' do
215
+ result = client.anosognosia_status
216
+ expect(result).to have_key(:awareness_score)
217
+ end
218
+
219
+ it 'returns blind_spot_count' do
220
+ register(client)
221
+ result = client.anosognosia_status
222
+ expect(result[:blind_spot_count]).to eq(1)
223
+ end
224
+ end
225
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::Architecture::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ it 'can register a subsystem' do
7
+ result = client.register_architecture_subsystem(name: :test_system, subsystem_type: :cognition)
8
+ expect(result[:status]).to eq(:registered)
9
+ end
10
+
11
+ it 'maintains isolated engine state per instance' do
12
+ client2 = described_class.new
13
+ client.register_architecture_subsystem(name: :isolated_a, subsystem_type: :cognition)
14
+ client2.register_architecture_subsystem(name: :isolated_b, subsystem_type: :memory)
15
+
16
+ stats_a = client.cognitive_architecture_stats
17
+ stats_b = client2.cognitive_architecture_stats
18
+
19
+ expect(stats_a[:subsystem_count]).to eq(1)
20
+ expect(stats_b[:subsystem_count]).to eq(1)
21
+ end
22
+
23
+ it 'supports full registration + connection + activation workflow' do
24
+ client.register_architecture_subsystem(name: :sensor, subsystem_type: :perception)
25
+ client.register_architecture_subsystem(name: :processor, subsystem_type: :cognition)
26
+ client.create_architecture_connection(
27
+ source_name: :sensor, target_name: :processor, connection_type: :excitatory
28
+ )
29
+ result = client.activate_architecture_subsystem(name: :sensor)
30
+ expect(result[:status]).to eq(:activated)
31
+
32
+ processor_status = client.subsystem_status_report(name: :processor)
33
+ expect(processor_status[:activation_count]).to eq(1)
34
+ end
35
+
36
+ it 'reports architecture health after degradation' do
37
+ client.register_architecture_subsystem(name: :health_sub, subsystem_type: :safety)
38
+ client.degrade_architecture_subsystem(name: :health_sub)
39
+ report = client.architecture_health_report
40
+ expect(report[:health]).to be < Legion::Extensions::Agentic::Self::Architecture::Helpers::Constants::DEFAULT_HEALTH
41
+ end
42
+
43
+ it 'detects bottlenecks' do
44
+ client.register_architecture_subsystem(name: :stressed, subsystem_type: :communication)
45
+ sub = client.architecture_graph_report[:nodes].find { |n| n[:name] == :stressed }
46
+ real_sub = Object.new
47
+ allow(real_sub).to receive_messages(name: :stressed, status: :active, bottlenecked?: true, to_h: sub)
48
+ report = client.bottleneck_report
49
+ expect(report).to include(:bottlenecked_count, :subsystems)
50
+ end
51
+ end