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,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anchor
8
+ module Helpers
9
+ class AnchorEngine
10
+ def initialize
11
+ @anchors = {}
12
+ @chains = {}
13
+ end
14
+
15
+ def create_anchor(anchor_type:, domain:, content:,
16
+ reference_value: nil, grip: nil, weight: nil)
17
+ raise ArgumentError, 'anchor limit reached' if @anchors.size >= Constants::MAX_ANCHORS
18
+
19
+ a = Anchor.new(anchor_type: anchor_type, domain: domain, content: content,
20
+ reference_value: reference_value, grip: grip, weight: weight)
21
+ @anchors[a.id] = a
22
+ a
23
+ end
24
+
25
+ def create_chain(anchor_id:, material: :steel, length: nil, flexibility: nil)
26
+ raise ArgumentError, 'chain limit reached' if @chains.size >= Constants::MAX_CHAINS
27
+
28
+ fetch_anchor(anchor_id)
29
+ c = Chain.new(anchor_id: anchor_id, material: material,
30
+ length: length, flexibility: flexibility)
31
+ @chains[c.id] = c
32
+ c
33
+ end
34
+
35
+ def apply_bias(anchor_id:, new_value:)
36
+ anchor = fetch_anchor(anchor_id)
37
+ pulled = anchor.bias_pull(new_value.to_f)
38
+ { anchor: anchor, original: new_value.to_f, biased: pulled,
39
+ shift: (pulled - new_value.to_f).abs.round(10) }
40
+ end
41
+
42
+ def drag_anchor(anchor_id:, rate: Constants::DRAG_RATE)
43
+ anchor = fetch_anchor(anchor_id)
44
+ anchor.drag!(rate: rate)
45
+ anchor
46
+ end
47
+
48
+ def drift_all!
49
+ @anchors.each_value(&:drift!)
50
+ end
51
+
52
+ def wear_all_chains!
53
+ @chains.each_value(&:wear!)
54
+ end
55
+
56
+ def broken_chains
57
+ @chains.values.select(&:broken?)
58
+ end
59
+
60
+ def anchors_by_type
61
+ counts = Constants::ANCHOR_TYPES.to_h { |t| [t, 0] }
62
+ @anchors.each_value { |a| counts[a.anchor_type] += 1 }
63
+ counts
64
+ end
65
+
66
+ def strongest_anchors(limit: 5)
67
+ @anchors.values.sort_by { |a| -a.grip }.first(limit)
68
+ end
69
+
70
+ def weakest_anchors(limit: 5)
71
+ @anchors.values.sort_by(&:grip).first(limit)
72
+ end
73
+
74
+ def ironclad_anchors
75
+ @anchors.values.select(&:ironclad?)
76
+ end
77
+
78
+ def drifting_anchors
79
+ @anchors.values.select(&:drifting?)
80
+ end
81
+
82
+ def chains_for(anchor_id)
83
+ @chains.values.select { |c| c.anchor_id == anchor_id }
84
+ end
85
+
86
+ def avg_grip
87
+ return 0.0 if @anchors.empty?
88
+
89
+ (@anchors.values.sum(&:grip) / @anchors.size).round(10)
90
+ end
91
+
92
+ def anchor_report
93
+ {
94
+ total_anchors: @anchors.size,
95
+ total_chains: @chains.size,
96
+ by_type: anchors_by_type,
97
+ ironclad_count: ironclad_anchors.size,
98
+ drifting_count: drifting_anchors.size,
99
+ broken_chains: broken_chains.size,
100
+ avg_grip: avg_grip
101
+ }
102
+ end
103
+
104
+ def all_anchors
105
+ @anchors.values
106
+ end
107
+
108
+ def all_chains
109
+ @chains.values
110
+ end
111
+
112
+ private
113
+
114
+ def fetch_anchor(id)
115
+ @anchors.fetch(id) { raise ArgumentError, "anchor not found: #{id}" }
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anchor
8
+ module Helpers
9
+ class Chain
10
+ attr_reader :id, :anchor_id, :material, :created_at
11
+ attr_accessor :length, :flexibility
12
+
13
+ def initialize(anchor_id:, material: :steel, length: nil, flexibility: nil)
14
+ validate_material!(material)
15
+ @id = SecureRandom.uuid
16
+ @anchor_id = anchor_id
17
+ @material = material.to_sym
18
+ @length = (length || 0.5).to_f.clamp(0.0, 1.0).round(10)
19
+ @flexibility = (flexibility || material_flexibility).to_f.clamp(0.0, 1.0).round(10)
20
+ @created_at = Time.now.utc
21
+ end
22
+
23
+ def extend!(amount: 0.1)
24
+ @length = (@length + amount.abs).clamp(0.0, 1.0).round(10)
25
+ end
26
+
27
+ def shorten!(amount: 0.1)
28
+ @length = (@length - amount.abs).clamp(0.0, 1.0).round(10)
29
+ end
30
+
31
+ def wear!(rate: 0.05)
32
+ @flexibility = (@flexibility - rate.abs).clamp(0.0, 1.0).round(10)
33
+ end
34
+
35
+ def broken?
36
+ @flexibility < Constants::BREAK_THRESHOLD
37
+ end
38
+
39
+ def elastic?
40
+ @flexibility >= 0.8
41
+ end
42
+
43
+ def rigid?
44
+ @flexibility < 0.2
45
+ end
46
+
47
+ def short?
48
+ @length < 0.3
49
+ end
50
+
51
+ def long?
52
+ @length >= 0.7
53
+ end
54
+
55
+ def flexibility_label
56
+ Constants.label_for(Constants::FLEXIBILITY_LABELS, @flexibility)
57
+ end
58
+
59
+ def to_h
60
+ {
61
+ id: @id,
62
+ anchor_id: @anchor_id,
63
+ material: @material,
64
+ length: @length,
65
+ flexibility: @flexibility,
66
+ flexibility_label: flexibility_label,
67
+ broken: broken?,
68
+ elastic: elastic?,
69
+ created_at: @created_at
70
+ }
71
+ end
72
+
73
+ private
74
+
75
+ def validate_material!(val)
76
+ return if Constants::CHAIN_MATERIALS.include?(val.to_sym)
77
+
78
+ raise ArgumentError,
79
+ "unknown material: #{val.inspect}; " \
80
+ "must be one of #{Constants::CHAIN_MATERIALS.inspect}"
81
+ end
82
+
83
+ def material_flexibility
84
+ { steel: 0.3, rope: 0.6, wire: 0.4, thread: 0.8, cobweb: 0.9 }
85
+ .fetch(@material, 0.5)
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anchor
8
+ module Helpers
9
+ module Constants
10
+ ANCHOR_TYPES = %i[belief assumption experience authority number].freeze
11
+
12
+ CHAIN_MATERIALS = %i[steel rope wire thread cobweb].freeze
13
+
14
+ MAX_ANCHORS = 200
15
+ MAX_CHAINS = 100
16
+ DRAG_RATE = 0.06
17
+ DRIFT_RATE = 0.03
18
+ BREAK_THRESHOLD = 0.1
19
+
20
+ GRIP_LABELS = [
21
+ [(0.8..), :ironclad],
22
+ [(0.6...0.8), :firm],
23
+ [(0.4...0.6), :moderate],
24
+ [(0.2...0.4), :loose],
25
+ [(..0.2), :drifting]
26
+ ].freeze
27
+
28
+ FLEXIBILITY_LABELS = [
29
+ [(0.8..), :elastic],
30
+ [(0.6...0.8), :flexible],
31
+ [(0.4...0.6), :moderate],
32
+ [(0.2...0.4), :rigid],
33
+ [(..0.2), :brittle]
34
+ ].freeze
35
+
36
+ def self.label_for(table, value)
37
+ table.each { |range, label| return label if range.cover?(value) }
38
+ table.last.last
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anchor
8
+ module Runners
9
+ module CognitiveAnchor
10
+ extend self
11
+
12
+ def create_anchor(anchor_type:, domain:, content:,
13
+ reference_value: nil, grip: nil, weight: nil, engine: nil, **)
14
+ eng = resolve_engine(engine)
15
+ a = eng.create_anchor(anchor_type: anchor_type, domain: domain, content: content,
16
+ reference_value: reference_value, grip: grip, weight: weight)
17
+ { success: true, anchor: a.to_h }
18
+ rescue ArgumentError => e
19
+ { success: false, error: e.message }
20
+ end
21
+
22
+ def create_chain(anchor_id:, material: :steel, length: nil,
23
+ flexibility: nil, engine: nil, **)
24
+ eng = resolve_engine(engine)
25
+ c = eng.create_chain(anchor_id: anchor_id, material: material,
26
+ length: length, flexibility: flexibility)
27
+ { success: true, chain: c.to_h }
28
+ rescue ArgumentError => e
29
+ { success: false, error: e.message }
30
+ end
31
+
32
+ def apply_bias(anchor_id:, new_value:, engine: nil, **)
33
+ eng = resolve_engine(engine)
34
+ result = eng.apply_bias(anchor_id: anchor_id, new_value: new_value)
35
+ { success: true, anchor: result[:anchor].to_h,
36
+ original: result[:original], biased: result[:biased], shift: result[:shift] }
37
+ rescue ArgumentError => e
38
+ { success: false, error: e.message }
39
+ end
40
+
41
+ def list_anchors(engine: nil, anchor_type: nil, **)
42
+ eng = resolve_engine(engine)
43
+ results = eng.all_anchors
44
+ results = results.select { |a| a.anchor_type == anchor_type.to_sym } if anchor_type
45
+ { success: true, anchors: results.map(&:to_h), count: results.size }
46
+ end
47
+
48
+ def anchor_status(engine: nil, **)
49
+ eng = resolve_engine(engine)
50
+ { success: true, report: eng.anchor_report }
51
+ end
52
+
53
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
54
+
55
+ private
56
+
57
+ def resolve_engine(engine)
58
+ engine || default_engine
59
+ end
60
+
61
+ def default_engine
62
+ @default_engine ||= Helpers::AnchorEngine.new
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ 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 Anchor
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ require_relative 'anchor/version'
6
+ require_relative 'anchor/helpers/constants'
7
+ require_relative 'anchor/helpers/anchor'
8
+ require_relative 'anchor/helpers/chain'
9
+ require_relative 'anchor/helpers/anchor_engine'
10
+ require_relative 'anchor/runners/cognitive_anchor'
11
+ require_relative 'anchor/client'
12
+
13
+ module Legion
14
+ module Extensions
15
+ module Agentic
16
+ module Self
17
+ module Anchor
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/anosognosia/helpers/constants'
4
+ require 'legion/extensions/agentic/self/anosognosia/helpers/cognitive_deficit'
5
+ require 'legion/extensions/agentic/self/anosognosia/helpers/anosognosia_engine'
6
+ require 'legion/extensions/agentic/self/anosognosia/runners/anosognosia'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Self
12
+ module Anosognosia
13
+ class Client
14
+ include Runners::Anosognosia
15
+
16
+ def initialize(**)
17
+ @engine = Helpers::AnosognosiaEngine.new
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :engine
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anosognosia
8
+ module Helpers
9
+ class AnosognosiaEngine
10
+ attr_reader :deficits, :awareness_score
11
+
12
+ def initialize
13
+ @deficits = {} # id => CognitiveDeficit
14
+ @awareness_score = 1.0
15
+ end
16
+
17
+ def register_deficit(domain:, deficit_type:, severity:, acknowledged: false)
18
+ prune_if_at_capacity
19
+
20
+ deficit = CognitiveDeficit.new(
21
+ domain: domain,
22
+ deficit_type: deficit_type,
23
+ severity: severity,
24
+ acknowledged: acknowledged
25
+ )
26
+ @deficits[deficit.id] = deficit
27
+
28
+ Legion::Logging.info "[anosognosia] register_deficit: id=#{deficit.id} domain=#{domain} " \
29
+ "type=#{deficit_type} severity=#{deficit.severity.round(2)} acknowledged=#{acknowledged}"
30
+
31
+ deficit
32
+ end
33
+
34
+ def acknowledge_deficit(deficit_id:)
35
+ deficit = @deficits[deficit_id]
36
+ return { found: false, deficit_id: deficit_id } unless deficit
37
+
38
+ already = deficit.acknowledged
39
+ changed = deficit.acknowledge!
40
+
41
+ Legion::Logging.debug "[anosognosia] acknowledge_deficit: id=#{deficit_id} " \
42
+ "already_acknowledged=#{already} changed=#{changed}"
43
+
44
+ recalculate_awareness
45
+ { found: true, deficit_id: deficit_id, changed: changed, awareness_score: @awareness_score.round(10) }
46
+ end
47
+
48
+ def reveal_blind_spot(deficit_id:)
49
+ deficit = @deficits[deficit_id]
50
+ return { found: false, deficit_id: deficit_id } unless deficit
51
+ return { found: true, deficit_id: deficit_id, already_known: true } if deficit.acknowledged
52
+
53
+ deficit.acknowledge!
54
+ boost_awareness
55
+
56
+ Legion::Logging.info "[anosognosia] blind_spot_revealed: id=#{deficit_id} domain=#{deficit.domain} " \
57
+ "type=#{deficit.deficit_type} awareness_score=#{@awareness_score.round(2)}"
58
+
59
+ {
60
+ found: true,
61
+ deficit_id: deficit_id,
62
+ already_known: false,
63
+ awareness_score: @awareness_score.round(10),
64
+ awareness_label: awareness_label
65
+ }
66
+ end
67
+
68
+ def awareness_gap
69
+ (1.0 - @awareness_score).clamp(0.0, 1.0).round(10)
70
+ end
71
+
72
+ def blind_spots
73
+ @deficits.values.reject(&:acknowledged)
74
+ end
75
+
76
+ def calibration_report
77
+ total = @deficits.size
78
+ acknowledged = @deficits.values.count(&:acknowledged)
79
+ unacknowledged = total - acknowledged
80
+
81
+ {
82
+ total_deficits: total,
83
+ acknowledged_deficits: acknowledged,
84
+ unacknowledged_deficits: unacknowledged,
85
+ awareness_score: @awareness_score.round(10),
86
+ awareness_gap: awareness_gap,
87
+ awareness_label: awareness_label,
88
+ blind_spots: blind_spots.map(&:to_h),
89
+ deficit_breakdown: deficit_type_breakdown
90
+ }
91
+ end
92
+
93
+ def decay_awareness(amount: Constants::AWARENESS_DECAY)
94
+ @awareness_score = (@awareness_score - amount).clamp(0.0, 1.0)
95
+ Legion::Logging.debug "[anosognosia] decay_awareness: score=#{@awareness_score.round(2)}"
96
+ @awareness_score
97
+ end
98
+
99
+ def to_h
100
+ {
101
+ deficits: @deficits.transform_values(&:to_h),
102
+ awareness_score: @awareness_score.round(10),
103
+ awareness_gap: awareness_gap,
104
+ awareness_label: awareness_label,
105
+ total_deficits: @deficits.size,
106
+ blind_spot_count: blind_spots.size
107
+ }
108
+ end
109
+
110
+ private
111
+
112
+ def boost_awareness(amount: Constants::AWARENESS_BOOST)
113
+ @awareness_score = (@awareness_score + amount).clamp(0.0, 1.0)
114
+ end
115
+
116
+ def recalculate_awareness
117
+ return if @deficits.empty?
118
+
119
+ total = @deficits.size.to_f
120
+ acknowledged = @deficits.values.count(&:acknowledged).to_f
121
+ @awareness_score = (acknowledged / total).clamp(0.0, 1.0)
122
+ end
123
+
124
+ def awareness_label
125
+ Constants::AWARENESS_LABELS.each do |range, label|
126
+ return label if range.include?(@awareness_score)
127
+ end
128
+ :anosognosic
129
+ end
130
+
131
+ def deficit_type_breakdown
132
+ Constants::DEFICIT_TYPES.to_h do |type|
133
+ matching = @deficits.values.select { |d| d.deficit_type == type }
134
+ [type, { count: matching.size, acknowledged: matching.count(&:acknowledged) }]
135
+ end
136
+ end
137
+
138
+ def prune_if_at_capacity
139
+ return unless @deficits.size >= Constants::MAX_DEFICITS
140
+
141
+ oldest = @deficits.values
142
+ .reject(&:acknowledged)
143
+ .min_by(&:discovered_at)
144
+ oldest ||= @deficits.values.min_by(&:discovered_at)
145
+ @deficits.delete(oldest.id) if oldest
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module Anosognosia
10
+ module Helpers
11
+ class CognitiveDeficit
12
+ attr_reader :id, :domain, :deficit_type, :severity, :acknowledged,
13
+ :discovered_at, :acknowledged_at
14
+
15
+ def initialize(domain:, deficit_type:, severity:, acknowledged: false)
16
+ validate_deficit_type!(deficit_type)
17
+
18
+ @id = SecureRandom.uuid
19
+ @domain = domain
20
+ @deficit_type = deficit_type
21
+ @severity = severity.clamp(0.0, 1.0)
22
+ @acknowledged = acknowledged
23
+ @discovered_at = Time.now.utc
24
+ @acknowledged_at = nil
25
+ end
26
+
27
+ def acknowledge!
28
+ return false if @acknowledged
29
+
30
+ @acknowledged = true
31
+ @acknowledged_at = Time.now.utc
32
+ true
33
+ end
34
+
35
+ def severity_label
36
+ case @severity
37
+ when (0.8..1.0) then :severe
38
+ when (0.6...0.8) then :high
39
+ when (0.4...0.6) then :moderate
40
+ when (0.2...0.4) then :low
41
+ else :minimal
42
+ end
43
+ end
44
+
45
+ def to_h
46
+ {
47
+ id: @id,
48
+ domain: @domain,
49
+ deficit_type: @deficit_type,
50
+ severity: @severity.round(10),
51
+ severity_label: severity_label,
52
+ acknowledged: @acknowledged,
53
+ discovered_at: @discovered_at,
54
+ acknowledged_at: @acknowledged_at
55
+ }
56
+ end
57
+
58
+ private
59
+
60
+ def validate_deficit_type!(deficit_type)
61
+ return if Constants::DEFICIT_TYPES.include?(deficit_type)
62
+
63
+ raise ArgumentError, "Invalid deficit_type: #{deficit_type.inspect}. Must be one of #{Constants::DEFICIT_TYPES.inspect}"
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Anosognosia
8
+ module Helpers
9
+ module Constants
10
+ MAX_DEFICITS = 200
11
+ AWARENESS_DECAY = 0.02
12
+ AWARENESS_BOOST = 0.1
13
+
14
+ AWARENESS_LABELS = {
15
+ (0.8..1.0) => :calibrated,
16
+ (0.6...0.8) => :mostly_aware,
17
+ (0.4...0.6) => :partially_blind,
18
+ (0.2...0.4) => :largely_blind,
19
+ (0.0...0.2) => :anosognosic
20
+ }.freeze
21
+
22
+ DEFICIT_TYPES = %i[knowledge reasoning memory perception attention judgment].freeze
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end