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,45 @@
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 DefaultModeNetwork
10
+ module Actor
11
+ class Idle < Legion::Extensions::Actors::Every
12
+ def runner_class
13
+ Legion::Extensions::Agentic::Self::DefaultModeNetwork::Runners::DefaultModeNetwork
14
+ end
15
+
16
+ def runner_function
17
+ 'update_dmn'
18
+ end
19
+
20
+ def time
21
+ 30
22
+ end
23
+
24
+ def run_now?
25
+ false
26
+ end
27
+
28
+ def use_runner?
29
+ false
30
+ end
31
+
32
+ def check_subtask?
33
+ false
34
+ end
35
+
36
+ def generate_task?
37
+ false
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/default_mode_network/helpers/constants'
4
+ require 'legion/extensions/agentic/self/default_mode_network/helpers/wandering_thought'
5
+ require 'legion/extensions/agentic/self/default_mode_network/helpers/dmn_engine'
6
+ require 'legion/extensions/agentic/self/default_mode_network/runners/default_mode_network'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Self
12
+ module DefaultModeNetwork
13
+ class Client
14
+ include Runners::DefaultModeNetwork
15
+
16
+ def initialize(dmn_engine: nil, **)
17
+ @dmn_engine = dmn_engine || Helpers::DmnEngine.new
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :dmn_engine
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module DefaultModeNetwork
8
+ module Helpers
9
+ module Constants
10
+ # Idle time thresholds
11
+ IDLE_THRESHOLD = 30 # seconds before DMN activates
12
+ DEEP_IDLE_THRESHOLD = 300 # seconds before deep idle mode
13
+
14
+ # Thought storage limits
15
+ MAX_WANDERING_THOUGHTS = 100
16
+ MAX_THOUGHT_HISTORY = 200
17
+ MAX_ASSOCIATION_CHAIN = 5 # max hops in a wandering chain
18
+
19
+ # Salience parameters
20
+ THOUGHT_SALIENCE_FLOOR = 0.05
21
+ THOUGHT_DECAY = 0.01
22
+ DEFAULT_SALIENCE = 0.3
23
+ SALIENCE_ALPHA = 0.1
24
+
25
+ # Probabilistic thought-type selection (must sum to <= 1.0)
26
+ SELF_REFERENTIAL_PROBABILITY = 0.3
27
+ SOCIAL_REPLAY_PROBABILITY = 0.2
28
+ PLANNING_PROBABILITY = 0.2
29
+ WANDERING_PROBABILITY = 0.3
30
+
31
+ # Activity mode labels
32
+ ACTIVITY_LABELS = {
33
+ active: :task_focused,
34
+ transitioning: :shifting,
35
+ idle: :daydreaming,
36
+ deep_idle: :deep_reflection
37
+ }.freeze
38
+
39
+ # Salience quality labels — range-keyed hash
40
+ SALIENCE_LABELS = {
41
+ (0.8..) => :breakthrough,
42
+ (0.6...0.8) => :significant,
43
+ (0.4...0.6) => :notable,
44
+ (0.2...0.4) => :passing,
45
+ (..0.2) => :fleeting
46
+ }.freeze
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,221 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module DefaultModeNetwork
8
+ module Helpers
9
+ class DmnEngine
10
+ include Constants
11
+
12
+ attr_reader :mode, :last_stimulus_at, :thoughts, :thought_history, :wandering_seeds
13
+
14
+ def initialize
15
+ @mode = :active
16
+ @last_stimulus_at = Time.now.utc
17
+ @thoughts = []
18
+ @thought_history = []
19
+ @wandering_seeds = []
20
+ end
21
+
22
+ # --- Stimulus / Mode ---
23
+
24
+ def register_stimulus(source: nil)
25
+ @last_stimulus_at = Time.now.utc
26
+ previous = @mode
27
+ @mode = :active
28
+ { previous_mode: previous, current_mode: @mode, source: source, at: @last_stimulus_at }
29
+ end
30
+
31
+ def tick_mode
32
+ elapsed = idle_duration
33
+ previous = @mode
34
+
35
+ @mode = if elapsed >= Constants::DEEP_IDLE_THRESHOLD
36
+ :deep_idle
37
+ elsif elapsed >= Constants::IDLE_THRESHOLD
38
+ :idle
39
+ elsif @mode == :active && elapsed.positive?
40
+ :transitioning
41
+ else
42
+ @mode
43
+ end
44
+
45
+ { previous_mode: previous, current_mode: @mode, idle_duration: elapsed.round(2) }
46
+ end
47
+
48
+ def idle_duration
49
+ Time.now.utc - @last_stimulus_at
50
+ end
51
+
52
+ # --- Thought Generation ---
53
+
54
+ def generate_thought
55
+ roll = rand
56
+ thought = if roll < Constants::SELF_REFERENTIAL_PROBABILITY
57
+ self_reflect
58
+ elsif roll < Constants::SELF_REFERENTIAL_PROBABILITY + Constants::SOCIAL_REPLAY_PROBABILITY
59
+ social_replay(interaction: random_seed(:social))
60
+ elsif roll < Constants::SELF_REFERENTIAL_PROBABILITY +
61
+ Constants::SOCIAL_REPLAY_PROBABILITY +
62
+ Constants::PLANNING_PROBABILITY
63
+ plan_spontaneously(goal: random_seed(:goal))
64
+ else
65
+ wander(seed: random_seed(:concept))
66
+ end
67
+ store_thought(thought)
68
+ thought
69
+ end
70
+
71
+ def self_reflect(topic: nil)
72
+ topics = %i[identity values goals capabilities limitations purpose growth]
73
+ chosen_topic = topic || topics.sample
74
+ chain = build_association_chain(chosen_topic, Constants::MAX_ASSOCIATION_CHAIN)
75
+
76
+ WanderingThought.new(
77
+ seed: chosen_topic,
78
+ association_chain: chain,
79
+ domain: :self,
80
+ thought_type: :self_referential,
81
+ salience: rand(0.3..0.7)
82
+ )
83
+ end
84
+
85
+ def social_replay(interaction: nil)
86
+ seed = interaction || :recent_interaction
87
+ chain = build_association_chain(seed, Constants::MAX_ASSOCIATION_CHAIN)
88
+
89
+ WanderingThought.new(
90
+ seed: seed,
91
+ association_chain: chain,
92
+ domain: :social,
93
+ thought_type: :social_replay,
94
+ salience: rand(0.2..0.6)
95
+ )
96
+ end
97
+
98
+ def plan_spontaneously(goal: nil)
99
+ seed = goal || :unresolved_objective
100
+ chain = build_association_chain(seed, Constants::MAX_ASSOCIATION_CHAIN)
101
+
102
+ WanderingThought.new(
103
+ seed: seed,
104
+ association_chain: chain,
105
+ domain: :planning,
106
+ thought_type: :spontaneous_plan,
107
+ salience: rand(0.3..0.8)
108
+ )
109
+ end
110
+
111
+ def wander(seed: nil)
112
+ anchor = seed || random_seed(:concept)
113
+ chain = build_association_chain(anchor, Constants::MAX_ASSOCIATION_CHAIN)
114
+
115
+ WanderingThought.new(
116
+ seed: anchor,
117
+ association_chain: chain,
118
+ domain: :associative,
119
+ thought_type: :wandering,
120
+ salience: rand(0.1..0.5)
121
+ )
122
+ end
123
+
124
+ # --- Retrieval ---
125
+
126
+ def salient_thoughts(count: 5)
127
+ @thoughts.sort_by { |t| -t.salience }.first(count)
128
+ end
129
+
130
+ def thoughts_of_type(type:)
131
+ @thoughts.select { |t| t.thought_type == type.to_sym }
132
+ end
133
+
134
+ # --- Lifecycle ---
135
+
136
+ def decay_all
137
+ @thoughts.each(&:decay)
138
+ faded = @thoughts.select(&:faded?)
139
+ faded.each { |t| archive_thought(t) }
140
+ @thoughts.reject!(&:faded?)
141
+ faded.size
142
+ end
143
+
144
+ def thought_count
145
+ @thoughts.size
146
+ end
147
+
148
+ def to_h
149
+ {
150
+ mode: @mode,
151
+ mode_label: Constants::ACTIVITY_LABELS[@mode],
152
+ idle_duration: idle_duration.round(2),
153
+ thought_count: @thoughts.size,
154
+ history_count: @thought_history.size,
155
+ last_stimulus_at: @last_stimulus_at
156
+ }
157
+ end
158
+
159
+ private
160
+
161
+ def store_thought(thought)
162
+ @thoughts << thought
163
+ prune_thoughts if @thoughts.size > Constants::MAX_WANDERING_THOUGHTS
164
+ thought
165
+ end
166
+
167
+ def archive_thought(thought)
168
+ @thought_history << thought.to_h
169
+ @thought_history.shift while @thought_history.size > Constants::MAX_THOUGHT_HISTORY
170
+ end
171
+
172
+ def prune_thoughts
173
+ @thoughts.sort_by! { |t| -t.salience }
174
+ @thoughts.pop while @thoughts.size > Constants::MAX_WANDERING_THOUGHTS
175
+ end
176
+
177
+ def build_association_chain(seed, max_hops)
178
+ chain = [seed]
179
+ max_hops.times do
180
+ next_concept = derive_association(chain.last)
181
+ break if chain.include?(next_concept)
182
+
183
+ chain << next_concept
184
+ end
185
+ chain
186
+ end
187
+
188
+ # Lightweight deterministic-ish association for standalone use
189
+ def derive_association(concept)
190
+ associations = {
191
+ identity: :values,
192
+ values: :purpose,
193
+ purpose: :goals,
194
+ goals: :capabilities,
195
+ capabilities: :limitations,
196
+ limitations: :growth,
197
+ growth: :identity,
198
+ social: :empathy,
199
+ empathy: :trust,
200
+ trust: :collaboration,
201
+ collaboration: :outcome,
202
+ outcome: :reflection
203
+ }
204
+ associations.fetch(concept.to_sym, :"#{concept}_context")
205
+ end
206
+
207
+ def random_seed(category)
208
+ pools = {
209
+ social: %i[recent_conversation last_request team_interaction feedback_given feedback_received],
210
+ goal: %i[pending_task unresolved_objective upcoming_deadline open_question improvement_opportunity],
211
+ concept: %i[efficiency creativity curiosity uncertainty possibility connection meaning pattern]
212
+ }
213
+ pools.fetch(category, pools[:concept]).sample
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module DefaultModeNetwork
8
+ module Helpers
9
+ class WanderingThought
10
+ include Constants
11
+
12
+ attr_reader :id, :seed, :association_chain, :domain, :thought_type, :created_at
13
+ attr_accessor :salience
14
+
15
+ def initialize(seed:, association_chain:, domain:, thought_type:, salience: Constants::DEFAULT_SALIENCE)
16
+ @id = SecureRandom.uuid
17
+ @seed = seed
18
+ @association_chain = Array(association_chain)
19
+ @domain = domain
20
+ @thought_type = thought_type.to_sym
21
+ @salience = salience.to_f.clamp(0.0, 1.0)
22
+ @created_at = Time.now.utc
23
+ end
24
+
25
+ def boost_salience(amount = Constants::SALIENCE_ALPHA)
26
+ @salience = [@salience + amount.to_f, 1.0].min
27
+ end
28
+
29
+ def decay
30
+ @salience = [@salience - Constants::THOUGHT_DECAY, Constants::THOUGHT_SALIENCE_FLOOR].max
31
+ end
32
+
33
+ def faded?
34
+ @salience <= Constants::THOUGHT_SALIENCE_FLOOR
35
+ end
36
+
37
+ def label
38
+ Constants::SALIENCE_LABELS.each { |range, lbl| return lbl if range.cover?(@salience) }
39
+ :fleeting
40
+ end
41
+
42
+ def to_h
43
+ {
44
+ id: @id,
45
+ seed: @seed,
46
+ association_chain: @association_chain,
47
+ domain: @domain,
48
+ thought_type: @thought_type,
49
+ salience: @salience.round(4),
50
+ label: label,
51
+ created_at: @created_at
52
+ }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module DefaultModeNetwork
8
+ module Runners
9
+ module DefaultModeNetwork
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def register_external_stimulus(source: nil, **)
14
+ Legion::Logging.debug "[dmn] register_stimulus: source=#{source}"
15
+ result = dmn_engine.register_stimulus(source: source)
16
+ {
17
+ success: true,
18
+ previous_mode: result[:previous_mode],
19
+ current_mode: result[:current_mode],
20
+ source: result[:source]
21
+ }
22
+ end
23
+
24
+ def generate_idle_thought(**)
25
+ Legion::Logging.debug "[dmn] generate_idle_thought: mode=#{dmn_engine.mode}"
26
+ thought = dmn_engine.generate_thought
27
+ Legion::Logging.debug "[dmn] thought_generated: type=#{thought.thought_type} salience=#{thought.salience.round(2)} label=#{thought.label}"
28
+ { success: true, thought: thought.to_h }
29
+ end
30
+
31
+ def trigger_self_reflection(**)
32
+ Legion::Logging.debug '[dmn] trigger_self_reflection'
33
+ thought = dmn_engine.self_reflect
34
+ dmn_engine.send(:store_thought, thought)
35
+ Legion::Logging.debug "[dmn] self_reflect: topic=#{thought.seed} salience=#{thought.salience.round(2)}"
36
+ { success: true, thought: thought.to_h }
37
+ end
38
+
39
+ def trigger_social_replay(interaction: nil, **)
40
+ Legion::Logging.debug "[dmn] trigger_social_replay: interaction=#{interaction}"
41
+ thought = dmn_engine.social_replay(interaction: interaction)
42
+ dmn_engine.send(:store_thought, thought)
43
+ Legion::Logging.debug "[dmn] social_replay: seed=#{thought.seed} salience=#{thought.salience.round(2)}"
44
+ { success: true, thought: thought.to_h }
45
+ end
46
+
47
+ def trigger_spontaneous_plan(goal: nil, **)
48
+ Legion::Logging.debug "[dmn] trigger_spontaneous_plan: goal=#{goal}"
49
+ thought = dmn_engine.plan_spontaneously(goal: goal)
50
+ dmn_engine.send(:store_thought, thought)
51
+ Legion::Logging.debug "[dmn] spontaneous_plan: goal=#{thought.seed} salience=#{thought.salience.round(2)}"
52
+ { success: true, thought: thought.to_h }
53
+ end
54
+
55
+ def trigger_wandering(seed: nil, **)
56
+ Legion::Logging.debug "[dmn] trigger_wandering: seed=#{seed}"
57
+ thought = dmn_engine.wander(seed: seed)
58
+ dmn_engine.send(:store_thought, thought)
59
+ Legion::Logging.debug "[dmn] wandering: seed=#{thought.seed} chain_length=#{thought.association_chain.size}"
60
+ { success: true, thought: thought.to_h }
61
+ end
62
+
63
+ def salient_thoughts(count: 5, **)
64
+ count = count.to_i
65
+ Legion::Logging.debug "[dmn] salient_thoughts: count=#{count}"
66
+ thoughts = dmn_engine.salient_thoughts(count: count)
67
+ { success: true, thoughts: thoughts.map(&:to_h), count: thoughts.size }
68
+ end
69
+
70
+ def dmn_mode_status(**)
71
+ Legion::Logging.debug "[dmn] dmn_mode_status: mode=#{dmn_engine.mode}"
72
+ mode = dmn_engine.mode
73
+ mode_label = Helpers::Constants::ACTIVITY_LABELS[mode]
74
+ idle_secs = dmn_engine.idle_duration.round(2)
75
+ {
76
+ success: true,
77
+ mode: mode,
78
+ mode_label: mode_label,
79
+ idle_duration: idle_secs,
80
+ thought_count: dmn_engine.thought_count
81
+ }
82
+ end
83
+
84
+ def update_dmn(**)
85
+ Legion::Logging.debug '[dmn] update_dmn: tick'
86
+ tick_result = dmn_engine.tick_mode
87
+ faded_count = dmn_engine.decay_all
88
+ thought = nil
89
+
90
+ if %i[idle deep_idle].include?(dmn_engine.mode)
91
+ thought = dmn_engine.generate_thought
92
+ Legion::Logging.debug "[dmn] idle_thought: type=#{thought.thought_type} salience=#{thought.salience.round(2)}"
93
+ end
94
+
95
+ Legion::Logging.debug "[dmn] update_dmn: mode=#{tick_result[:current_mode]} faded=#{faded_count} thoughts=#{dmn_engine.thought_count}"
96
+ {
97
+ success: true,
98
+ mode: tick_result[:current_mode],
99
+ previous_mode: tick_result[:previous_mode],
100
+ faded_count: faded_count,
101
+ thought_count: dmn_engine.thought_count,
102
+ new_thought: thought&.to_h
103
+ }
104
+ end
105
+
106
+ def dmn_stats(**)
107
+ Legion::Logging.debug '[dmn] dmn_stats'
108
+ { success: true, stats: dmn_engine.to_h }
109
+ end
110
+
111
+ private
112
+
113
+ def dmn_engine
114
+ @dmn_engine ||= Helpers::DmnEngine.new
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ 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 DefaultModeNetwork
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require 'legion/extensions/agentic/self/default_mode_network/version'
5
+ require 'legion/extensions/agentic/self/default_mode_network/helpers/constants'
6
+ require 'legion/extensions/agentic/self/default_mode_network/helpers/wandering_thought'
7
+ require 'legion/extensions/agentic/self/default_mode_network/helpers/dmn_engine'
8
+ require 'legion/extensions/agentic/self/default_mode_network/runners/default_mode_network'
9
+ require 'legion/extensions/agentic/self/default_mode_network/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Self
15
+ module DefaultModeNetwork
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/fingerprint/helpers/constants'
4
+ require 'legion/extensions/agentic/self/fingerprint/helpers/cognitive_trait'
5
+ require 'legion/extensions/agentic/self/fingerprint/helpers/fingerprint_engine'
6
+ require 'legion/extensions/agentic/self/fingerprint/runners/cognitive_fingerprint'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Self
12
+ module Fingerprint
13
+ class Client
14
+ include Runners::CognitiveFingerprint
15
+
16
+ def initialize(**)
17
+ @fingerprint_engine = Helpers::FingerprintEngine.new
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :fingerprint_engine
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module Fingerprint
10
+ module Helpers
11
+ class CognitiveTrait
12
+ attr_reader :id, :category, :baseline, :variance, :sample_count, :last_updated
13
+
14
+ def initialize(category:)
15
+ raise ArgumentError, "unknown category: #{category}" unless Constants::TRAIT_CATEGORIES.include?(category)
16
+
17
+ @id = SecureRandom.uuid
18
+ @category = category
19
+ @baseline = 0.5
20
+ @variance = 0.0
21
+ @sample_count = 0
22
+ @last_updated = Time.now.utc
23
+ end
24
+
25
+ def record_sample!(value)
26
+ clamped = value.clamp(0.0, 1.0)
27
+ old_baseline = @baseline
28
+ @baseline = ((Constants::EMA_ALPHA * clamped) + ((1.0 - Constants::EMA_ALPHA) * old_baseline)).round(10)
29
+
30
+ deviation = (clamped - @baseline).abs
31
+ @variance = ((Constants::EMA_ALPHA * deviation) + ((1.0 - Constants::EMA_ALPHA) * @variance)).round(10)
32
+
33
+ @sample_count = [@sample_count + 1, Constants::MAX_SAMPLES].min
34
+ @last_updated = Time.now.utc
35
+ self
36
+ end
37
+
38
+ def deviation_from(value)
39
+ (value.clamp(0.0, 1.0) - @baseline).abs.round(10)
40
+ end
41
+
42
+ def stable?
43
+ @variance <= 0.1
44
+ end
45
+
46
+ def volatile?
47
+ @variance >= 0.3
48
+ end
49
+
50
+ def strength_label
51
+ Constants.trait_strength_label_for(@baseline)
52
+ end
53
+
54
+ def to_h
55
+ {
56
+ id: @id,
57
+ category: @category,
58
+ baseline: @baseline,
59
+ variance: @variance,
60
+ sample_count: @sample_count,
61
+ stable: stable?,
62
+ volatile: volatile?,
63
+ strength: strength_label,
64
+ last_updated: @last_updated
65
+ }
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end