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,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module MetacognitiveMonitoring
8
+ module Helpers
9
+ MAX_JUDGMENTS = 500
10
+ MAX_CALIBRATION_POINTS = 200
11
+ JUDGMENT_TYPES = %i[feeling_of_knowing judgment_of_learning confidence_rating effort_estimate
12
+ error_detection].freeze
13
+
14
+ CALIBRATION_LABELS = {
15
+ (0.8..) => :well_calibrated,
16
+ (0.6...0.8) => :slightly_miscalibrated,
17
+ (0.4...0.6) => :miscalibrated,
18
+ (0.2...0.4) => :poorly_calibrated,
19
+ (..0.2) => :uncalibrated
20
+ }.freeze
21
+
22
+ CONFIDENCE_LABELS = {
23
+ (0.8..) => :very_high,
24
+ (0.6...0.8) => :high,
25
+ (0.4...0.6) => :moderate,
26
+ (0.2...0.4) => :low,
27
+ (..0.2) => :very_low
28
+ }.freeze
29
+
30
+ EFFORT_LABELS = {
31
+ (0.8..) => :extreme,
32
+ (0.6...0.8) => :high,
33
+ (0.4...0.6) => :moderate,
34
+ (0.2...0.4) => :low,
35
+ (..0.2) => :minimal
36
+ }.freeze
37
+
38
+ OVERCONFIDENCE_THRESHOLD = 0.2 # predicted - actual > this = overconfident
39
+ UNDERCONFIDENCE_THRESHOLD = -0.2
40
+ DEFAULT_CONFIDENCE = 0.5
41
+ CALIBRATION_WINDOW = 50 # last N judgments for calibration calculation
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module MetacognitiveMonitoring
8
+ module Helpers
9
+ class MonitoringEngine
10
+ attr_reader :judgments, :calibration, :domain_calibrations
11
+
12
+ def initialize
13
+ @judgments = {}
14
+ @calibration = CalibrationTracker.new
15
+ @domain_calibrations = {}
16
+ end
17
+
18
+ def record_judgment(type:, domain:, predicted_confidence: DEFAULT_CONFIDENCE, effort: 0.5)
19
+ judgment = MonitoringJudgment.new(
20
+ judgment_type: type,
21
+ domain: domain,
22
+ predicted_confidence: predicted_confidence,
23
+ effort_level: effort
24
+ )
25
+
26
+ @judgments[judgment.id] = judgment
27
+ prune_judgments
28
+ judgment
29
+ end
30
+
31
+ def resolve_judgment(judgment_id:, actual_outcome:)
32
+ judgment = @judgments[judgment_id]
33
+ return nil unless judgment
34
+
35
+ judgment.resolve!(actual: actual_outcome)
36
+
37
+ @calibration.add_point(predicted: judgment.predicted_confidence, actual: actual_outcome)
38
+
39
+ domain_calibration_for(judgment.domain).add_point(
40
+ predicted: judgment.predicted_confidence,
41
+ actual: actual_outcome
42
+ )
43
+
44
+ judgment
45
+ end
46
+
47
+ def feeling_of_knowing(domain:, query: nil)
48
+ domain_cal = domain_calibration_for(domain)
49
+ base_conf = domain_cal.empty? ? DEFAULT_CONFIDENCE : domain_cal.calibration_score
50
+ richness_mod = query.to_s.split.size * 0.02
51
+ confidence = [(base_conf + richness_mod).clamp(0.0, 1.0), 1.0].min
52
+
53
+ record_judgment(
54
+ type: :feeling_of_knowing,
55
+ domain: domain,
56
+ predicted_confidence: confidence,
57
+ effort: 0.3
58
+ )
59
+ end
60
+
61
+ def judgment_of_learning(domain:, content: nil)
62
+ domain_cal = domain_calibration_for(domain)
63
+ base_conf = domain_cal.empty? ? DEFAULT_CONFIDENCE : domain_cal.calibration_score
64
+ length_mod = [(content.to_s.length * 0.001), 0.1].min
65
+ confidence = (base_conf + length_mod).clamp(0.0, 1.0)
66
+
67
+ record_judgment(
68
+ type: :judgment_of_learning,
69
+ domain: domain,
70
+ predicted_confidence: confidence,
71
+ effort: 0.4
72
+ )
73
+ end
74
+
75
+ def detect_overconfidence
76
+ @judgments.values.select(&:overconfident?)
77
+ end
78
+
79
+ def detect_underconfidence
80
+ @judgments.values.select(&:underconfident?)
81
+ end
82
+
83
+ def average_effort(window: CALIBRATION_WINDOW)
84
+ recent = @judgments.values.last(window)
85
+ return 0.0 if recent.empty?
86
+
87
+ (recent.sum(&:effort_level) / recent.size).round(10)
88
+ end
89
+
90
+ def calibration_report
91
+ domain_reports = @domain_calibrations.transform_values(&:to_h)
92
+ {
93
+ overall: @calibration.to_h,
94
+ by_domain: domain_reports,
95
+ total_resolved: @judgments.values.count(&:resolved)
96
+ }
97
+ end
98
+
99
+ def monitoring_report
100
+ resolved, unresolved = @judgments.values.partition(&:resolved)
101
+
102
+ {
103
+ total_judgments: @judgments.size,
104
+ resolved_count: resolved.size,
105
+ unresolved_count: unresolved.size,
106
+ overconfident_count: detect_overconfidence.size,
107
+ underconfident_count: detect_underconfidence.size,
108
+ average_effort: average_effort,
109
+ calibration: @calibration.to_h,
110
+ domain_count: @domain_calibrations.size
111
+ }
112
+ end
113
+
114
+ def to_h
115
+ {
116
+ judgment_count: @judgments.size,
117
+ calibration: @calibration.to_h,
118
+ domain_count: @domain_calibrations.size,
119
+ average_effort: average_effort
120
+ }
121
+ end
122
+
123
+ private
124
+
125
+ def domain_calibration_for(domain)
126
+ @domain_calibrations[domain] ||= CalibrationTracker.new
127
+ end
128
+
129
+ def prune_judgments
130
+ return unless @judgments.size > MAX_JUDGMENTS
131
+
132
+ oldest_keys = @judgments.keys.first(@judgments.size - MAX_JUDGMENTS)
133
+ oldest_keys.each { |k| @judgments.delete(k) }
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module MetacognitiveMonitoring
10
+ module Helpers
11
+ class MonitoringJudgment
12
+ attr_reader :id, :judgment_type, :domain, :predicted_confidence, :actual_outcome,
13
+ :effort_level, :resolved, :created_at
14
+
15
+ def initialize(judgment_type:, domain:, predicted_confidence: DEFAULT_CONFIDENCE, effort_level: 0.5)
16
+ @id = SecureRandom.uuid
17
+ @judgment_type = judgment_type
18
+ @domain = domain
19
+ @predicted_confidence = predicted_confidence.clamp(0.0, 1.0)
20
+ @effort_level = effort_level.clamp(0.0, 1.0)
21
+ @actual_outcome = nil
22
+ @resolved = false
23
+ @created_at = Time.now.utc
24
+ end
25
+
26
+ def resolve!(actual:)
27
+ @actual_outcome = actual.clamp(0.0, 1.0)
28
+ @resolved = true
29
+ self
30
+ end
31
+
32
+ def calibration_error
33
+ return nil unless resolved
34
+
35
+ (predicted_confidence - actual_outcome).round(10)
36
+ end
37
+
38
+ def overconfident?
39
+ return false unless resolved
40
+
41
+ calibration_error > OVERCONFIDENCE_THRESHOLD
42
+ end
43
+
44
+ def underconfident?
45
+ return false unless resolved
46
+
47
+ calibration_error < UNDERCONFIDENCE_THRESHOLD
48
+ end
49
+
50
+ def confidence_label
51
+ CONFIDENCE_LABELS.find { |range, _| range.cover?(predicted_confidence) }&.last
52
+ end
53
+
54
+ def effort_label
55
+ EFFORT_LABELS.find { |range, _| range.cover?(effort_level) }&.last
56
+ end
57
+
58
+ def to_h
59
+ {
60
+ id: id,
61
+ judgment_type: judgment_type,
62
+ domain: domain,
63
+ predicted_confidence: predicted_confidence,
64
+ actual_outcome: actual_outcome,
65
+ effort_level: effort_level,
66
+ resolved: resolved,
67
+ calibration_error: calibration_error,
68
+ confidence_label: confidence_label,
69
+ effort_label: effort_label,
70
+ created_at: created_at
71
+ }
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module MetacognitiveMonitoring
10
+ module Runners
11
+ module MetacognitiveMonitoring
12
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
13
+ Legion::Extensions::Helpers.const_defined?(:Lex)
14
+
15
+ def record_judgment(type:, domain:, predicted_confidence: Helpers::DEFAULT_CONFIDENCE,
16
+ effort: 0.5, engine: nil, **)
17
+ eng = engine || monitoring_engine
18
+ type_sym = type.to_sym
19
+
20
+ return { success: false, error: :invalid_judgment_type, valid_types: Helpers::JUDGMENT_TYPES } unless Helpers::JUDGMENT_TYPES.include?(type_sym)
21
+
22
+ judgment = eng.record_judgment(
23
+ type: type_sym,
24
+ domain: domain,
25
+ predicted_confidence: predicted_confidence,
26
+ effort: effort
27
+ )
28
+
29
+ Legion::Logging.debug "[metacognitive] record_judgment type=#{type_sym} domain=#{domain} " \
30
+ "confidence=#{judgment.predicted_confidence.round(2)} id=#{judgment.id[0..7]}"
31
+
32
+ { success: true, judgment_id: judgment.id, judgment: judgment.to_h }
33
+ end
34
+
35
+ def resolve_judgment(judgment_id:, actual_outcome:, engine: nil, **)
36
+ eng = engine || monitoring_engine
37
+ judgment = eng.resolve_judgment(judgment_id: judgment_id, actual_outcome: actual_outcome)
38
+
39
+ unless judgment
40
+ Legion::Logging.debug "[metacognitive] resolve_judgment not_found id=#{judgment_id[0..7]}"
41
+ return { success: false, error: :not_found }
42
+ end
43
+
44
+ Legion::Logging.info "[metacognitive] resolved judgment=#{judgment_id[0..7]} " \
45
+ "error=#{judgment.calibration_error&.round(3)}"
46
+
47
+ { success: true, judgment_id: judgment_id, judgment: judgment.to_h }
48
+ end
49
+
50
+ def feeling_of_knowing(domain:, query: nil, engine: nil, **)
51
+ eng = engine || monitoring_engine
52
+ judgment = eng.feeling_of_knowing(domain: domain, query: query)
53
+
54
+ Legion::Logging.debug "[metacognitive] fok domain=#{domain} confidence=#{judgment.predicted_confidence.round(2)}"
55
+
56
+ {
57
+ success: true,
58
+ judgment_id: judgment.id,
59
+ domain: domain,
60
+ predicted_confidence: judgment.predicted_confidence,
61
+ confidence_label: judgment.confidence_label
62
+ }
63
+ end
64
+
65
+ def judgment_of_learning(domain:, content: nil, engine: nil, **)
66
+ eng = engine || monitoring_engine
67
+ judgment = eng.judgment_of_learning(domain: domain, content: content)
68
+
69
+ Legion::Logging.debug "[metacognitive] jol domain=#{domain} confidence=#{judgment.predicted_confidence.round(2)}"
70
+
71
+ {
72
+ success: true,
73
+ judgment_id: judgment.id,
74
+ domain: domain,
75
+ predicted_confidence: judgment.predicted_confidence,
76
+ confidence_label: judgment.confidence_label
77
+ }
78
+ end
79
+
80
+ def detect_overconfidence(engine: nil, **)
81
+ eng = engine || monitoring_engine
82
+ findings = eng.detect_overconfidence
83
+
84
+ Legion::Logging.debug "[metacognitive] overconfidence_scan count=#{findings.size}"
85
+
86
+ {
87
+ success: true,
88
+ count: findings.size,
89
+ findings: findings.map(&:to_h)
90
+ }
91
+ end
92
+
93
+ def detect_underconfidence(engine: nil, **)
94
+ eng = engine || monitoring_engine
95
+ findings = eng.detect_underconfidence
96
+
97
+ Legion::Logging.debug "[metacognitive] underconfidence_scan count=#{findings.size}"
98
+
99
+ {
100
+ success: true,
101
+ count: findings.size,
102
+ findings: findings.map(&:to_h)
103
+ }
104
+ end
105
+
106
+ def calibration_report(engine: nil, **)
107
+ eng = engine || monitoring_engine
108
+ report = eng.calibration_report
109
+
110
+ Legion::Logging.debug "[metacognitive] calibration_report domains=#{report[:by_domain].size}"
111
+
112
+ { success: true, report: report }
113
+ end
114
+
115
+ def monitoring_report(engine: nil, **)
116
+ eng = engine || monitoring_engine
117
+ report = eng.monitoring_report
118
+
119
+ Legion::Logging.debug "[metacognitive] monitoring_report total=#{report[:total_judgments]}"
120
+
121
+ { success: true, report: report }
122
+ end
123
+
124
+ def average_effort(window: Helpers::CALIBRATION_WINDOW, engine: nil, **)
125
+ eng = engine || monitoring_engine
126
+ effort = eng.average_effort(window: window)
127
+
128
+ label = Helpers::EFFORT_LABELS.find { |range, _| range.cover?(effort) }&.last
129
+
130
+ { success: true, average_effort: effort, effort_label: label, window: window }
131
+ end
132
+
133
+ def calibration_curve(bins: 5, engine: nil, **)
134
+ eng = engine || monitoring_engine
135
+ curve = eng.calibration.calibration_curve(bins: bins)
136
+
137
+ { success: true, bins: bins, curve: curve }
138
+ end
139
+
140
+ private
141
+
142
+ def monitoring_engine
143
+ @monitoring_engine ||= Helpers::MonitoringEngine.new
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ 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 MetacognitiveMonitoring
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 'legion/extensions/agentic/self/metacognitive_monitoring/version'
4
+ require 'legion/extensions/agentic/self/metacognitive_monitoring/helpers/constants'
5
+ require 'legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_judgment'
6
+ require 'legion/extensions/agentic/self/metacognitive_monitoring/helpers/calibration_tracker'
7
+ require 'legion/extensions/agentic/self/metacognitive_monitoring/helpers/monitoring_engine'
8
+ require 'legion/extensions/agentic/self/metacognitive_monitoring/runners/metacognitive_monitoring'
9
+ require 'legion/extensions/agentic/self/metacognitive_monitoring/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Self
15
+ module MetacognitiveMonitoring
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/self/narrative_arc/helpers/constants'
4
+ require 'legion/extensions/agentic/self/narrative_arc/helpers/beat_event'
5
+ require 'legion/extensions/agentic/self/narrative_arc/helpers/arc'
6
+ require 'legion/extensions/agentic/self/narrative_arc/helpers/arc_engine'
7
+ require 'legion/extensions/agentic/self/narrative_arc/runners/narrative'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Agentic
12
+ module Self
13
+ module NarrativeArc
14
+ class Client
15
+ include Runners::Narrative
16
+
17
+ def initialize(**)
18
+ @arc_engine = Helpers::ArcEngine.new
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :arc_engine
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module NarrativeArc
10
+ module Helpers
11
+ class Arc
12
+ attr_reader :arc_id, :title, :domain, :beats, :arc_phase, :tension_level,
13
+ :created_at, :resolved_at
14
+
15
+ def initialize(title:, domain: :general, initial_tension: Constants::DEFAULT_TENSION)
16
+ @arc_id = SecureRandom.uuid
17
+ @title = title
18
+ @domain = domain
19
+ @beats = []
20
+ @arc_phase = :building
21
+ @tension_level = initial_tension.clamp(0.0, 1.0)
22
+ @created_at = Time.now.utc
23
+ @resolved_at = nil
24
+ end
25
+
26
+ def add_beat!(beat)
27
+ return false if @beats.size >= Constants::MAX_BEATS_PER_ARC
28
+ return false if complete?
29
+
30
+ @beats << beat
31
+ adjust_tension_for_beat(beat)
32
+ advance_phase!
33
+ true
34
+ end
35
+
36
+ def advance_phase!
37
+ new_phase = detect_phase
38
+ @arc_phase = new_phase if new_phase != @arc_phase
39
+ @resolved_at = Time.now.utc if @arc_phase == :complete
40
+ @arc_phase
41
+ end
42
+
43
+ def tension_rise!(amount = Constants::TENSION_RISE)
44
+ @tension_level = (@tension_level + amount).round(10).clamp(0.0, 1.0)
45
+ end
46
+
47
+ def tension_fall!(amount = Constants::TENSION_FALL)
48
+ @tension_level = (@tension_level - amount).round(10).clamp(0.0, 1.0)
49
+ end
50
+
51
+ def climaxed?
52
+ @tension_level >= Constants::CLIMAX_THRESHOLD || @arc_phase == :peak
53
+ end
54
+
55
+ def resolved?
56
+ @arc_phase == :complete
57
+ end
58
+
59
+ def complete?
60
+ @arc_phase == :complete
61
+ end
62
+
63
+ def dramatic_score
64
+ return 0.0 if @beats.empty?
65
+
66
+ tension_contrib = @tension_level * 0.4
67
+ beat_count_contrib = [@beats.size.to_f / Constants::MAX_BEATS_PER_ARC, 1.0].min * 0.3
68
+ intensity_contrib = average_beat_intensity * 0.3
69
+ (tension_contrib + beat_count_contrib + intensity_contrib).round(10)
70
+ end
71
+
72
+ def tension_label
73
+ Constants.label_for(Constants::TENSION_LABELS, @tension_level)
74
+ end
75
+
76
+ def drama_label
77
+ Constants.label_for(Constants::DRAMA_LABELS, dramatic_score)
78
+ end
79
+
80
+ def to_h
81
+ {
82
+ arc_id: @arc_id,
83
+ title: @title,
84
+ domain: @domain,
85
+ arc_phase: @arc_phase,
86
+ tension_level: @tension_level,
87
+ beat_count: @beats.size,
88
+ dramatic_score: dramatic_score,
89
+ tension_label: tension_label,
90
+ drama_label: drama_label,
91
+ created_at: @created_at,
92
+ resolved_at: @resolved_at
93
+ }
94
+ end
95
+
96
+ private
97
+
98
+ def average_beat_intensity
99
+ return 0.0 if @beats.empty?
100
+
101
+ @beats.sum(&:intensity) / @beats.size.to_f
102
+ end
103
+
104
+ def adjust_tension_for_beat(beat)
105
+ case beat.beat_type
106
+ when :rising_action, :complication, :crisis
107
+ tension_rise!(beat.intensity * Constants::TENSION_RISE)
108
+ when :climax
109
+ @tension_level = [@tension_level, Constants::CLIMAX_THRESHOLD].max.clamp(0.0, 1.0)
110
+ when :falling_action, :resolution, :denouement
111
+ tension_fall!(beat.intensity * Constants::TENSION_FALL)
112
+ end
113
+ end
114
+
115
+ def detect_phase
116
+ return :complete if resolution_beat?
117
+ return :resolving if climax_beat? && @tension_level < Constants::CLIMAX_THRESHOLD
118
+ return :peak if @tension_level >= Constants::CLIMAX_THRESHOLD
119
+ return :building if @tension_level < Constants::CLIMAX_THRESHOLD
120
+
121
+ @arc_phase
122
+ end
123
+
124
+ def climax_beat?
125
+ @beats.any?(&:climactic?)
126
+ end
127
+
128
+ def resolution_beat?
129
+ @beats.any? { |b| %i[resolution denouement].include?(b.beat_type) }
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end