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,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::Anchor::Helpers::Chain do
4
+ subject(:chain) { described_class.new(anchor_id: 'a-123') }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID' do
8
+ expect(chain.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'stores anchor_id' do
12
+ expect(chain.anchor_id).to eq('a-123')
13
+ end
14
+
15
+ it 'defaults material to :steel' do
16
+ expect(chain.material).to eq(:steel)
17
+ end
18
+
19
+ it 'defaults length to 0.5' do
20
+ expect(chain.length).to eq(0.5)
21
+ end
22
+
23
+ it 'sets flexibility based on material' do
24
+ steel = described_class.new(anchor_id: 'x', material: :steel)
25
+ thread = described_class.new(anchor_id: 'x', material: :thread)
26
+ expect(thread.flexibility).to be > steel.flexibility
27
+ end
28
+
29
+ it 'raises on unknown material' do
30
+ expect do
31
+ described_class.new(anchor_id: 'x', material: :diamond)
32
+ end.to raise_error(ArgumentError, /unknown material/)
33
+ end
34
+ end
35
+
36
+ describe '#extend!' do
37
+ it 'increases length' do
38
+ initial = chain.length
39
+ chain.extend!(amount: 0.1)
40
+ expect(chain.length).to eq((initial + 0.1).round(10))
41
+ end
42
+ end
43
+
44
+ describe '#shorten!' do
45
+ it 'decreases length' do
46
+ initial = chain.length
47
+ chain.shorten!(amount: 0.1)
48
+ expect(chain.length).to eq((initial - 0.1).round(10))
49
+ end
50
+ end
51
+
52
+ describe '#wear!' do
53
+ it 'decreases flexibility' do
54
+ initial = chain.flexibility
55
+ chain.wear!
56
+ expect(chain.flexibility).to be < initial
57
+ end
58
+ end
59
+
60
+ describe '#broken?' do
61
+ it 'returns false initially' do
62
+ expect(chain).not_to be_broken
63
+ end
64
+
65
+ it 'returns true when flexibility below threshold' do
66
+ chain.flexibility = 0.05
67
+ expect(chain).to be_broken
68
+ end
69
+ end
70
+
71
+ describe '#elastic?' do
72
+ it 'returns false for steel' do
73
+ expect(chain).not_to be_elastic
74
+ end
75
+
76
+ it 'returns true for cobweb' do
77
+ c = described_class.new(anchor_id: 'x', material: :cobweb)
78
+ expect(c).to be_elastic
79
+ end
80
+ end
81
+
82
+ describe '#short?' do
83
+ it 'returns false at default' do
84
+ expect(chain).not_to be_short
85
+ end
86
+
87
+ it 'returns true below 0.3' do
88
+ chain.length = 0.2
89
+ expect(chain).to be_short
90
+ end
91
+ end
92
+
93
+ describe '#flexibility_label' do
94
+ it 'returns a symbol' do
95
+ expect(chain.flexibility_label).to be_a(Symbol)
96
+ end
97
+ end
98
+
99
+ describe '#to_h' do
100
+ it 'includes all expected keys' do
101
+ expected = %i[id anchor_id material length flexibility
102
+ flexibility_label broken elastic created_at]
103
+ expect(chain.to_h.keys).to match_array(expected)
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::Anchor::Helpers::Constants do
4
+ described_class = Legion::Extensions::Agentic::Self::Anchor::Helpers::Constants
5
+
6
+ describe 'ANCHOR_TYPES' do
7
+ it 'contains expected types' do
8
+ expect(described_class::ANCHOR_TYPES).to eq(%i[belief assumption experience authority number])
9
+ end
10
+
11
+ it 'is frozen' do
12
+ expect(described_class::ANCHOR_TYPES).to be_frozen
13
+ end
14
+ end
15
+
16
+ describe 'CHAIN_MATERIALS' do
17
+ it 'contains expected materials' do
18
+ expect(described_class::CHAIN_MATERIALS).to eq(%i[steel rope wire thread cobweb])
19
+ end
20
+ end
21
+
22
+ describe 'numeric constants' do
23
+ it 'defines MAX_ANCHORS' do
24
+ expect(described_class::MAX_ANCHORS).to eq(200)
25
+ end
26
+
27
+ it 'defines DRAG_RATE' do
28
+ expect(described_class::DRAG_RATE).to eq(0.06)
29
+ end
30
+
31
+ it 'defines BREAK_THRESHOLD' do
32
+ expect(described_class::BREAK_THRESHOLD).to eq(0.1)
33
+ end
34
+ end
35
+
36
+ describe '.label_for' do
37
+ it 'returns :ironclad for high grip' do
38
+ expect(described_class.label_for(described_class::GRIP_LABELS, 0.9)).to eq(:ironclad)
39
+ end
40
+
41
+ it 'returns :drifting for low grip' do
42
+ expect(described_class.label_for(described_class::GRIP_LABELS, 0.1)).to eq(:drifting)
43
+ end
44
+
45
+ it 'returns :elastic for high flexibility' do
46
+ expect(described_class.label_for(described_class::FLEXIBILITY_LABELS, 0.9)).to eq(:elastic)
47
+ end
48
+
49
+ it 'returns :brittle for low flexibility' do
50
+ expect(described_class.label_for(described_class::FLEXIBILITY_LABELS, 0.1)).to eq(:brittle)
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::Anchor::Runners::CognitiveAnchor do
4
+ let(:runner) do
5
+ obj = Object.new
6
+ obj.extend(described_class)
7
+ obj
8
+ end
9
+
10
+ let(:engine) { Legion::Extensions::Agentic::Self::Anchor::Helpers::AnchorEngine.new }
11
+
12
+ describe '#create_anchor' do
13
+ it 'returns success' do
14
+ result = runner.create_anchor(anchor_type: :belief, domain: :reasoning,
15
+ content: 'test', engine: engine)
16
+ expect(result[:success]).to be true
17
+ expect(result[:anchor][:anchor_type]).to eq(:belief)
18
+ end
19
+
20
+ it 'returns failure for invalid type' do
21
+ result = runner.create_anchor(anchor_type: :magic, domain: :t,
22
+ content: 'x', engine: engine)
23
+ expect(result[:success]).to be false
24
+ end
25
+ end
26
+
27
+ describe '#create_chain' do
28
+ it 'returns success' do
29
+ a = engine.create_anchor(anchor_type: :belief, domain: :t, content: 'x')
30
+ result = runner.create_chain(anchor_id: a.id, engine: engine)
31
+ expect(result[:success]).to be true
32
+ expect(result[:chain]).to be_a(Hash)
33
+ end
34
+ end
35
+
36
+ describe '#apply_bias' do
37
+ it 'returns bias result' do
38
+ a = engine.create_anchor(anchor_type: :number, domain: :t, content: 'x',
39
+ reference_value: 0.3, grip: 0.8)
40
+ result = runner.apply_bias(anchor_id: a.id, new_value: 0.9, engine: engine)
41
+ expect(result[:success]).to be true
42
+ expect(result[:biased]).to be < 0.9
43
+ end
44
+ end
45
+
46
+ describe '#list_anchors' do
47
+ before do
48
+ engine.create_anchor(anchor_type: :belief, domain: :t, content: 'a')
49
+ engine.create_anchor(anchor_type: :number, domain: :t, content: 'b')
50
+ end
51
+
52
+ it 'returns all anchors' do
53
+ result = runner.list_anchors(engine: engine)
54
+ expect(result[:count]).to eq(2)
55
+ end
56
+
57
+ it 'filters by type' do
58
+ result = runner.list_anchors(anchor_type: :belief, engine: engine)
59
+ expect(result[:count]).to eq(1)
60
+ end
61
+ end
62
+
63
+ describe '#anchor_status' do
64
+ it 'returns report' do
65
+ result = runner.anchor_status(engine: engine)
66
+ expect(result[:success]).to be true
67
+ expect(result[:report]).to include(:total_anchors)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::Anosognosia do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::Agentic::Self::Anosognosia::VERSION).not_to be_nil
6
+ end
7
+
8
+ it 'has a version that is a string' do
9
+ expect(Legion::Extensions::Agentic::Self::Anosognosia::VERSION).to be_a(String)
10
+ end
11
+
12
+ it 'has the correct version' do
13
+ expect(Legion::Extensions::Agentic::Self::Anosognosia::VERSION).to eq('0.1.0')
14
+ end
15
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/anosognosia/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Self::Anosognosia::Client do
6
+ let(:client) { described_class.new }
7
+
8
+ it 'responds to register_deficit' do
9
+ expect(client).to respond_to(:register_deficit)
10
+ end
11
+
12
+ it 'responds to acknowledge_deficit' do
13
+ expect(client).to respond_to(:acknowledge_deficit)
14
+ end
15
+
16
+ it 'responds to reveal_blind_spot' do
17
+ expect(client).to respond_to(:reveal_blind_spot)
18
+ end
19
+
20
+ it 'responds to awareness_score' do
21
+ expect(client).to respond_to(:awareness_score)
22
+ end
23
+
24
+ it 'responds to awareness_gap' do
25
+ expect(client).to respond_to(:awareness_gap)
26
+ end
27
+
28
+ it 'responds to blind_spots' do
29
+ expect(client).to respond_to(:blind_spots)
30
+ end
31
+
32
+ it 'responds to calibration_report' do
33
+ expect(client).to respond_to(:calibration_report)
34
+ end
35
+
36
+ it 'responds to decay_awareness' do
37
+ expect(client).to respond_to(:decay_awareness)
38
+ end
39
+
40
+ it 'responds to anosognosia_status' do
41
+ expect(client).to respond_to(:anosognosia_status)
42
+ end
43
+
44
+ it 'maintains isolated state per instance' do
45
+ client_a = described_class.new
46
+ client_b = described_class.new
47
+ client_a.register_deficit(domain: :a, deficit_type: :knowledge, severity: 0.5)
48
+ expect(client_b.anosognosia_status[:total_deficits]).to eq(0)
49
+ end
50
+ end
@@ -0,0 +1,266 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Self::Anosognosia::Helpers::AnosognosiaEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ def register_deficit(engine, domain: :language, deficit_type: :knowledge, severity: 0.6, acknowledged: false)
7
+ engine.register_deficit(domain: domain, deficit_type: deficit_type, severity: severity, acknowledged: acknowledged)
8
+ end
9
+
10
+ describe '#initialize' do
11
+ it 'starts with empty deficits' do
12
+ expect(engine.deficits).to be_empty
13
+ end
14
+
15
+ it 'starts with awareness_score of 1.0' do
16
+ expect(engine.awareness_score).to eq(1.0)
17
+ end
18
+ end
19
+
20
+ describe '#register_deficit' do
21
+ it 'adds a deficit to the store' do
22
+ register_deficit(engine)
23
+ expect(engine.deficits.size).to eq(1)
24
+ end
25
+
26
+ it 'returns a CognitiveDeficit instance' do
27
+ result = register_deficit(engine)
28
+ expect(result).to be_a(Legion::Extensions::Agentic::Self::Anosognosia::Helpers::CognitiveDeficit)
29
+ end
30
+
31
+ it 'stores deficit by id' do
32
+ deficit = register_deficit(engine)
33
+ expect(engine.deficits[deficit.id]).to eq(deficit)
34
+ end
35
+
36
+ it 'registers acknowledged deficit' do
37
+ deficit = register_deficit(engine, acknowledged: true)
38
+ expect(deficit.acknowledged).to be true
39
+ end
40
+
41
+ it 'registers multiple deficits' do
42
+ 3.times { |i| register_deficit(engine, domain: :"domain_#{i}") }
43
+ expect(engine.deficits.size).to eq(3)
44
+ end
45
+ end
46
+
47
+ describe '#acknowledge_deficit' do
48
+ let(:deficit) { register_deficit(engine) }
49
+
50
+ it 'returns found: false for unknown deficit' do
51
+ result = engine.acknowledge_deficit(deficit_id: 'unknown-id')
52
+ expect(result[:found]).to be false
53
+ end
54
+
55
+ it 'returns found: true for known deficit' do
56
+ result = engine.acknowledge_deficit(deficit_id: deficit.id)
57
+ expect(result[:found]).to be true
58
+ end
59
+
60
+ it 'sets changed: true when first acknowledging' do
61
+ result = engine.acknowledge_deficit(deficit_id: deficit.id)
62
+ expect(result[:changed]).to be true
63
+ end
64
+
65
+ it 'sets changed: false when already acknowledged' do
66
+ engine.acknowledge_deficit(deficit_id: deficit.id)
67
+ result = engine.acknowledge_deficit(deficit_id: deficit.id)
68
+ expect(result[:changed]).to be false
69
+ end
70
+
71
+ it 'recalculates awareness_score after acknowledgement' do
72
+ register_deficit(engine, domain: :a)
73
+ d2 = register_deficit(engine, domain: :b)
74
+ engine.acknowledge_deficit(deficit_id: d2.id)
75
+ expect(engine.awareness_score).to be > 0.0
76
+ end
77
+
78
+ it 'includes updated awareness_score in result' do
79
+ result = engine.acknowledge_deficit(deficit_id: deficit.id)
80
+ expect(result).to have_key(:awareness_score)
81
+ end
82
+ end
83
+
84
+ describe '#reveal_blind_spot' do
85
+ let(:deficit) { register_deficit(engine) }
86
+
87
+ it 'returns found: false for unknown deficit' do
88
+ result = engine.reveal_blind_spot(deficit_id: 'unknown-id')
89
+ expect(result[:found]).to be false
90
+ end
91
+
92
+ it 'returns already_known: true if already acknowledged' do
93
+ engine.acknowledge_deficit(deficit_id: deficit.id)
94
+ result = engine.reveal_blind_spot(deficit_id: deficit.id)
95
+ expect(result[:already_known]).to be true
96
+ end
97
+
98
+ it 'acknowledges the deficit' do
99
+ engine.reveal_blind_spot(deficit_id: deficit.id)
100
+ expect(engine.deficits[deficit.id].acknowledged).to be true
101
+ end
102
+
103
+ it 'boosts awareness_score above its pre-reveal value' do
104
+ register_deficit(engine, domain: :a)
105
+ register_deficit(engine, domain: :b)
106
+ blind = register_deficit(engine, domain: :c)
107
+ # decay so we have room to boost
108
+ engine.decay_awareness(amount: 0.5)
109
+ before = engine.awareness_score
110
+ engine.reveal_blind_spot(deficit_id: blind.id)
111
+ expect(engine.awareness_score).to be > before
112
+ end
113
+
114
+ it 'includes awareness_label in result' do
115
+ result = engine.reveal_blind_spot(deficit_id: deficit.id)
116
+ expect(result).to have_key(:awareness_label)
117
+ end
118
+
119
+ it 'returns found: true, already_known: false for blind spot' do
120
+ result = engine.reveal_blind_spot(deficit_id: deficit.id)
121
+ expect(result[:found]).to be true
122
+ expect(result[:already_known]).to be false
123
+ end
124
+ end
125
+
126
+ describe '#awareness_gap' do
127
+ it 'returns 0.0 when no deficits' do
128
+ expect(engine.awareness_gap).to eq(0.0)
129
+ end
130
+
131
+ it 'returns 1.0 when all deficits are blind spots' do
132
+ register_deficit(engine)
133
+ # Single unacknowledged deficit: awareness_score recalc not called, stays 1.0
134
+ # but gap = 1 - score. After adding unacknowledged deficit and recalculating:
135
+ engine.send(:recalculate_awareness)
136
+ expect(engine.awareness_gap).to be > 0.0
137
+ end
138
+
139
+ it 'is complement of awareness_score' do
140
+ register_deficit(engine)
141
+ engine.send(:recalculate_awareness)
142
+ expect((engine.awareness_score + engine.awareness_gap).round(10)).to eq(1.0)
143
+ end
144
+ end
145
+
146
+ describe '#blind_spots' do
147
+ it 'returns empty array when no deficits' do
148
+ expect(engine.blind_spots).to be_empty
149
+ end
150
+
151
+ it 'returns unacknowledged deficits' do
152
+ d1 = register_deficit(engine, domain: :a)
153
+ d2 = register_deficit(engine, domain: :b)
154
+ engine.acknowledge_deficit(deficit_id: d1.id)
155
+ spots = engine.blind_spots
156
+ expect(spots.map(&:id)).to contain_exactly(d2.id)
157
+ end
158
+
159
+ it 'returns all deficits when none acknowledged' do
160
+ 2.times { |i| register_deficit(engine, domain: :"d#{i}") }
161
+ expect(engine.blind_spots.size).to eq(2)
162
+ end
163
+ end
164
+
165
+ describe '#calibration_report' do
166
+ before do
167
+ d1 = register_deficit(engine, domain: :a)
168
+ register_deficit(engine, domain: :b)
169
+ engine.acknowledge_deficit(deficit_id: d1.id)
170
+ end
171
+
172
+ let(:report) { engine.calibration_report }
173
+
174
+ it 'includes total_deficits' do
175
+ expect(report[:total_deficits]).to eq(2)
176
+ end
177
+
178
+ it 'includes acknowledged_deficits count' do
179
+ expect(report[:acknowledged_deficits]).to eq(1)
180
+ end
181
+
182
+ it 'includes unacknowledged_deficits count' do
183
+ expect(report[:unacknowledged_deficits]).to eq(1)
184
+ end
185
+
186
+ it 'includes awareness_score' do
187
+ expect(report).to have_key(:awareness_score)
188
+ end
189
+
190
+ it 'includes awareness_gap' do
191
+ expect(report).to have_key(:awareness_gap)
192
+ end
193
+
194
+ it 'includes awareness_label' do
195
+ expect(report).to have_key(:awareness_label)
196
+ end
197
+
198
+ it 'includes blind_spots array' do
199
+ expect(report[:blind_spots]).to be_an(Array)
200
+ expect(report[:blind_spots].size).to eq(1)
201
+ end
202
+
203
+ it 'includes deficit_breakdown' do
204
+ expect(report[:deficit_breakdown]).to be_a(Hash)
205
+ expect(report[:deficit_breakdown]).to have_key(:knowledge)
206
+ end
207
+ end
208
+
209
+ describe '#decay_awareness' do
210
+ it 'decrements awareness_score by AWARENESS_DECAY by default' do
211
+ before = engine.awareness_score
212
+ engine.decay_awareness
213
+ expect(engine.awareness_score).to be < before
214
+ end
215
+
216
+ it 'decrements by custom amount' do
217
+ engine.decay_awareness(amount: 0.3)
218
+ expect(engine.awareness_score).to eq(0.7)
219
+ end
220
+
221
+ it 'clamps at 0.0' do
222
+ engine.decay_awareness(amount: 2.0)
223
+ expect(engine.awareness_score).to eq(0.0)
224
+ end
225
+ end
226
+
227
+ describe '#to_h' do
228
+ before { register_deficit(engine) }
229
+
230
+ let(:h) { engine.to_h }
231
+
232
+ it 'includes deficits hash' do
233
+ expect(h[:deficits]).to be_a(Hash)
234
+ end
235
+
236
+ it 'includes awareness_score' do
237
+ expect(h).to have_key(:awareness_score)
238
+ end
239
+
240
+ it 'includes awareness_gap' do
241
+ expect(h).to have_key(:awareness_gap)
242
+ end
243
+
244
+ it 'includes awareness_label' do
245
+ expect(h).to have_key(:awareness_label)
246
+ end
247
+
248
+ it 'includes total_deficits' do
249
+ expect(h[:total_deficits]).to eq(1)
250
+ end
251
+
252
+ it 'includes blind_spot_count' do
253
+ expect(h).to have_key(:blind_spot_count)
254
+ end
255
+ end
256
+
257
+ describe 'capacity management' do
258
+ it 'prunes oldest unacknowledged when at MAX_DEFICITS' do
259
+ stub_const('Legion::Extensions::Agentic::Self::Anosognosia::Helpers::Constants::MAX_DEFICITS', 3)
260
+ 3.times { |i| register_deficit(engine, domain: :"d#{i}") }
261
+ expect(engine.deficits.size).to eq(3)
262
+ register_deficit(engine, domain: :overflow)
263
+ expect(engine.deficits.size).to eq(3)
264
+ end
265
+ end
266
+ end