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,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Fingerprint
8
+ module Helpers
9
+ module Constants
10
+ MAX_TRAITS = 100
11
+ MAX_SAMPLES = 500
12
+ EMA_ALPHA = 0.15
13
+
14
+ TRAIT_CATEGORIES = %i[
15
+ processing_speed
16
+ accuracy
17
+ creativity
18
+ caution
19
+ thoroughness
20
+ risk_tolerance
21
+ abstraction_preference
22
+ social_orientation
23
+ ].freeze
24
+
25
+ DEVIATION_THRESHOLD = 0.3
26
+
27
+ IDENTITY_CONFIDENCE_LABELS = [
28
+ { range: (0.85..1.0), label: :certain },
29
+ { range: (0.65...0.85), label: :confident },
30
+ { range: (0.40...0.65), label: :developing },
31
+ { range: (0.20...0.40), label: :uncertain },
32
+ { range: (0.0...0.20), label: :unknown }
33
+ ].freeze
34
+
35
+ TRAIT_STRENGTH_LABELS = [
36
+ { range: (0.80..1.0), label: :dominant },
37
+ { range: (0.60...0.80), label: :strong },
38
+ { range: (0.40...0.60), label: :moderate },
39
+ { range: (0.20...0.40), label: :weak },
40
+ { range: (0.0...0.20), label: :absent }
41
+ ].freeze
42
+
43
+ module_function
44
+
45
+ def identity_label_for(confidence)
46
+ entry = IDENTITY_CONFIDENCE_LABELS.find { |e| e[:range].cover?(confidence) }
47
+ entry ? entry[:label] : :unknown
48
+ end
49
+
50
+ def trait_strength_label_for(value)
51
+ entry = TRAIT_STRENGTH_LABELS.find { |e| e[:range].cover?(value) }
52
+ entry ? entry[:label] : :absent
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,169 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Fingerprint
8
+ module Helpers
9
+ class FingerprintEngine
10
+ attr_reader :samples
11
+
12
+ def initialize
13
+ @traits = {}
14
+ @samples = []
15
+ end
16
+
17
+ def record_observation(category:, value:)
18
+ return { status: :invalid_category, category: category } unless Constants::TRAIT_CATEGORIES.include?(category)
19
+
20
+ trait = get_or_create_trait(category)
21
+ trait.record_sample!(value.clamp(0.0, 1.0))
22
+
23
+ @samples << { category: category, value: value.clamp(0.0, 1.0), recorded_at: Time.now.utc }
24
+ @samples.shift while @samples.size > Constants::MAX_SAMPLES
25
+
26
+ {
27
+ status: :recorded,
28
+ category: category,
29
+ baseline: trait.baseline,
30
+ variance: trait.variance,
31
+ samples: trait.sample_count
32
+ }
33
+ end
34
+
35
+ def verify_identity(observations:)
36
+ return { match_score: 0.0, verdict: :insufficient_data } if observations.empty? || @traits.empty?
37
+
38
+ scored = score_observations(observations)
39
+ return { match_score: 0.0, verdict: :insufficient_data } if scored.empty?
40
+
41
+ score = (scored.sum / scored.size).round(10)
42
+ { match_score: score, verdict: score_verdict(score), observations_checked: scored.size }
43
+ end
44
+
45
+ def trait_profile
46
+ @traits.transform_values(&:baseline)
47
+ end
48
+
49
+ def strongest_traits(top_n = 3)
50
+ @traits.values
51
+ .sort_by { |t| -t.baseline }
52
+ .first(top_n)
53
+ .map(&:to_h)
54
+ end
55
+
56
+ def weakest_traits(top_n = 3)
57
+ @traits.values
58
+ .sort_by(&:baseline)
59
+ .first(top_n)
60
+ .map(&:to_h)
61
+ end
62
+
63
+ def identity_confidence
64
+ return 0.0 if @traits.empty?
65
+
66
+ stable_count = @traits.values.count(&:stable?)
67
+ sampled = @traits.values.select { |t| t.sample_count.positive? }
68
+ return 0.0 if sampled.empty?
69
+
70
+ coverage = sampled.size.to_f / Constants::TRAIT_CATEGORIES.size
71
+ stability = stable_count.to_f / @traits.size
72
+
73
+ ((coverage * 0.6) + (stability * 0.4)).round(10).clamp(0.0, 1.0)
74
+ end
75
+
76
+ def identity_label
77
+ Constants.identity_label_for(identity_confidence)
78
+ end
79
+
80
+ def anomaly_check(category:, value:)
81
+ trait = @traits[category]
82
+ return { anomaly: false, reason: :no_baseline } unless trait
83
+
84
+ dev = trait.deviation_from(value.clamp(0.0, 1.0))
85
+ anomaly = dev >= Constants::DEVIATION_THRESHOLD
86
+ {
87
+ anomaly: anomaly,
88
+ category: category,
89
+ value: value.clamp(0.0, 1.0),
90
+ baseline: trait.baseline,
91
+ deviation: dev.round(10),
92
+ threshold: Constants::DEVIATION_THRESHOLD
93
+ }
94
+ end
95
+
96
+ def fingerprint_hash
97
+ return nil if @traits.empty?
98
+
99
+ profile_string = Constants::TRAIT_CATEGORIES.map do |cat|
100
+ t = @traits[cat]
101
+ t ? "#{cat}:#{t.baseline.round(6)}" : "#{cat}:nil"
102
+ end.join('|')
103
+
104
+ require 'digest'
105
+ ::Digest::SHA256.hexdigest(profile_string)[0, 16]
106
+ end
107
+
108
+ def trait_count
109
+ @traits.size
110
+ end
111
+
112
+ def sample_count
113
+ @samples.size
114
+ end
115
+
116
+ def fingerprint_report
117
+ {
118
+ fingerprint_hash: fingerprint_hash,
119
+ identity_confidence: identity_confidence,
120
+ identity_label: identity_label,
121
+ trait_count: trait_count,
122
+ sample_count: @samples.size,
123
+ traits: @traits.transform_values(&:to_h)
124
+ }
125
+ end
126
+
127
+ def to_h
128
+ fingerprint_report
129
+ end
130
+
131
+ private
132
+
133
+ def score_observations(observations)
134
+ observations.filter_map do |obs|
135
+ cat = obs[:category]
136
+ val = obs[:value]
137
+ trait = @traits[cat]
138
+ next unless trait && Constants::TRAIT_CATEGORIES.include?(cat)
139
+
140
+ dev = trait.deviation_from(val.clamp(0.0, 1.0))
141
+ [1.0 - (dev / [Constants::DEVIATION_THRESHOLD, 0.001].max), 0.0].max.clamp(0.0, 1.0)
142
+ end
143
+ end
144
+
145
+ def score_verdict(score)
146
+ if score >= 0.7
147
+ :verified
148
+ elsif score >= 0.4
149
+ :uncertain
150
+ else
151
+ :mismatch
152
+ end
153
+ end
154
+
155
+ def get_or_create_trait(category)
156
+ @traits[category] ||= CognitiveTrait.new(category: category)
157
+ if @traits.size > Constants::MAX_TRAITS
158
+ oldest_key = @traits.min_by { |_, t| t.last_updated }.first
159
+ @traits.delete(oldest_key)
160
+ end
161
+ @traits[category]
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Fingerprint
8
+ module Runners
9
+ module CognitiveFingerprint
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def record_observation(category:, value:, **)
14
+ category = category.to_sym
15
+ result = fingerprint_engine.record_observation(category: category, value: value.to_f)
16
+ Legion::Logging.debug "[cognitive_fingerprint] record category=#{category} " \
17
+ "baseline=#{result[:baseline]&.round(4)} samples=#{result[:samples]}"
18
+ result
19
+ end
20
+
21
+ def verify_identity(observations:, **)
22
+ parsed = Array(observations).map do |obs|
23
+ { category: obs[:category].to_sym, value: obs[:value].to_f }
24
+ end
25
+ result = fingerprint_engine.verify_identity(observations: parsed)
26
+ Legion::Logging.info "[cognitive_fingerprint] verify score=#{result[:match_score]&.round(4)} " \
27
+ "verdict=#{result[:verdict]}"
28
+ result
29
+ end
30
+
31
+ def anomaly_check(category:, value:, **)
32
+ result = fingerprint_engine.anomaly_check(category: category.to_sym, value: value.to_f)
33
+ if result[:anomaly]
34
+ Legion::Logging.warn "[cognitive_fingerprint] anomaly category=#{category} " \
35
+ "deviation=#{result[:deviation]&.round(4)}"
36
+ end
37
+ result
38
+ end
39
+
40
+ def trait_profile(**)
41
+ { profile: fingerprint_engine.trait_profile }
42
+ end
43
+
44
+ def strongest_traits(top_n: 3, **)
45
+ { traits: fingerprint_engine.strongest_traits(top_n.to_i) }
46
+ end
47
+
48
+ def weakest_traits(top_n: 3, **)
49
+ { traits: fingerprint_engine.weakest_traits(top_n.to_i) }
50
+ end
51
+
52
+ def identity_confidence(**)
53
+ confidence = fingerprint_engine.identity_confidence
54
+ label = fingerprint_engine.identity_label
55
+ Legion::Logging.debug "[cognitive_fingerprint] confidence=#{confidence.round(4)} label=#{label}"
56
+ { confidence: confidence, label: label }
57
+ end
58
+
59
+ def fingerprint_hash(**)
60
+ { fingerprint_hash: fingerprint_engine.fingerprint_hash }
61
+ end
62
+
63
+ def fingerprint_report(**)
64
+ fingerprint_engine.fingerprint_report
65
+ end
66
+
67
+ def fingerprint_status(**)
68
+ {
69
+ trait_count: fingerprint_engine.trait_count,
70
+ sample_count: fingerprint_engine.sample_count,
71
+ label: fingerprint_engine.identity_label
72
+ }
73
+ end
74
+
75
+ private
76
+
77
+ def fingerprint_engine
78
+ @fingerprint_engine ||= Helpers::FingerprintEngine.new
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ 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 Fingerprint
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/fingerprint/version'
4
+ require 'legion/extensions/agentic/self/fingerprint/helpers/constants'
5
+ require 'legion/extensions/agentic/self/fingerprint/helpers/cognitive_trait'
6
+ require 'legion/extensions/agentic/self/fingerprint/helpers/fingerprint_engine'
7
+ require 'legion/extensions/agentic/self/fingerprint/runners/cognitive_fingerprint'
8
+ require 'legion/extensions/agentic/self/fingerprint/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Self
14
+ module Fingerprint
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/actors/every'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module Identity
10
+ module Actor
11
+ class CredentialRefresh < Legion::Extensions::Actors::Every
12
+ CREDENTIAL_REFRESH_INTERVAL = 21_600 # 6 hours
13
+
14
+ def runner_class
15
+ Legion::Extensions::Agentic::Self::Identity::Runners::Entra
16
+ end
17
+
18
+ def runner_function
19
+ 'credential_refresh_cycle'
20
+ end
21
+
22
+ def time
23
+ CREDENTIAL_REFRESH_INTERVAL
24
+ end
25
+
26
+ def enabled?
27
+ defined?(Legion::Data) && Legion::Settings[:data][:connected] != false
28
+ rescue StandardError
29
+ false
30
+ end
31
+
32
+ def use_runner?
33
+ false
34
+ end
35
+
36
+ def check_subtask?
37
+ false
38
+ end
39
+
40
+ def generate_task?
41
+ false
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/actors/every'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module Identity
10
+ module Actor
11
+ # Periodic orphan detection: scans active workers for disabled Entra apps
12
+ # or inactive owners. Runs every 4 hours by default.
13
+ # Requires legion-data for worker records.
14
+ class OrphanCheck < Legion::Extensions::Actors::Every
15
+ ORPHAN_CHECK_INTERVAL = 14_400 # 4 hours in seconds
16
+
17
+ def runner_class
18
+ Legion::Extensions::Agentic::Self::Identity::Runners::Entra
19
+ end
20
+
21
+ def runner_function
22
+ 'check_orphans'
23
+ end
24
+
25
+ def time
26
+ ORPHAN_CHECK_INTERVAL
27
+ end
28
+
29
+ def enabled?
30
+ defined?(Legion::Data) && Legion::Settings[:data][:connected] != false
31
+ rescue StandardError
32
+ false
33
+ end
34
+
35
+ def use_runner?
36
+ false
37
+ end
38
+
39
+ def check_subtask?
40
+ false
41
+ end
42
+
43
+ def generate_task?
44
+ false
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/identity/helpers/dimensions'
4
+ require 'legion/extensions/agentic/self/identity/helpers/fingerprint'
5
+ require 'legion/extensions/agentic/self/identity/runners/identity'
6
+
7
+ module Legion
8
+ module Extensions
9
+ module Agentic
10
+ module Self
11
+ module Identity
12
+ class Client
13
+ include Runners::Identity
14
+
15
+ def initialize(**)
16
+ @identity_fingerprint = Helpers::Fingerprint.new
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :identity_fingerprint
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module Identity
8
+ module Helpers
9
+ module Dimensions
10
+ # The 6 behavioral dimensions that constitute identity
11
+ IDENTITY_DIMENSIONS = %i[
12
+ communication_cadence
13
+ vocabulary_patterns
14
+ emotional_response
15
+ decision_patterns
16
+ contextual_consistency
17
+ temporal_patterns
18
+ ].freeze
19
+
20
+ # Entropy thresholds (from tick-loop-spec Phase 4)
21
+ HIGH_ENTROPY_THRESHOLD = 0.70
22
+ LOW_ENTROPY_THRESHOLD = 0.20
23
+ OPTIMAL_ENTROPY_RANGE = (0.20..0.70)
24
+
25
+ # EMA alpha for dimension updates
26
+ OBSERVATION_ALPHA = 0.1
27
+
28
+ module_function
29
+
30
+ def new_identity_model
31
+ IDENTITY_DIMENSIONS.to_h do |dim|
32
+ [dim, { mean: 0.5, variance: 0.1, observations: 0, last_observed: nil }]
33
+ end
34
+ end
35
+
36
+ def compute_entropy(observations, model)
37
+ return 0.5 if observations.empty?
38
+
39
+ divergences = IDENTITY_DIMENSIONS.filter_map do |dim|
40
+ obs = observations[dim]
41
+ next unless obs
42
+
43
+ baseline = model[dim]
44
+ next 0.0 unless baseline && baseline[:observations].positive?
45
+
46
+ # Weighted divergence from established baseline
47
+ (obs - baseline[:mean]).abs / [baseline[:variance].to_f, 0.1].max
48
+ end
49
+
50
+ return 0.5 if divergences.empty?
51
+
52
+ raw = divergences.sum / divergences.size
53
+ clamp(raw / 3.0) # normalize: divergence of 3.0 stddevs = entropy 1.0
54
+ end
55
+
56
+ def classify_entropy(entropy)
57
+ if entropy > HIGH_ENTROPY_THRESHOLD
58
+ :high_entropy
59
+ elsif entropy < LOW_ENTROPY_THRESHOLD
60
+ :low_entropy
61
+ else
62
+ :normal
63
+ end
64
+ end
65
+
66
+ def clamp(value, min = 0.0, max = 1.0)
67
+ value.clamp(min, max)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end