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,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module NarrativeArc
8
+ module Helpers
9
+ class ArcEngine
10
+ attr_reader :arcs
11
+
12
+ def initialize
13
+ @arcs = {}
14
+ end
15
+
16
+ def create_arc(title:, domain: :general, initial_tension: Constants::DEFAULT_TENSION)
17
+ return nil if @arcs.size >= Constants::MAX_ARCS
18
+
19
+ arc = Arc.new(title: title, domain: domain, initial_tension: initial_tension)
20
+ @arcs[arc.arc_id] = arc
21
+ arc
22
+ end
23
+
24
+ def add_beat(arc_id:, content:, intensity: 0.5, beat_type: :rising_action,
25
+ domain: :general, emotional_charge: 0.0)
26
+ arc = @arcs[arc_id]
27
+ return { success: false, reason: :arc_not_found } unless arc
28
+
29
+ beat = BeatEvent.new(
30
+ content: content,
31
+ intensity: intensity,
32
+ beat_type: beat_type,
33
+ domain: domain,
34
+ emotional_charge: emotional_charge
35
+ )
36
+
37
+ added = arc.add_beat!(beat)
38
+ return { success: false, reason: :arc_full_or_complete } unless added
39
+
40
+ { success: true, beat_id: beat.beat_id, arc_phase: arc.arc_phase,
41
+ tension_level: arc.tension_level }
42
+ end
43
+
44
+ def get_arc(arc_id)
45
+ @arcs[arc_id]
46
+ end
47
+
48
+ def active_arcs
49
+ @arcs.values.reject(&:complete?)
50
+ end
51
+
52
+ def completed_arcs
53
+ @arcs.values.select(&:complete?)
54
+ end
55
+
56
+ def most_dramatic_arc
57
+ return nil if @arcs.empty?
58
+
59
+ @arcs.values.max_by(&:dramatic_score)
60
+ end
61
+
62
+ def tension_distribution
63
+ return {} if @arcs.empty?
64
+
65
+ counts = Hash.new(0)
66
+ @arcs.each_value do |arc|
67
+ label = arc.tension_label
68
+ counts[label] += 1
69
+ end
70
+ counts
71
+ end
72
+
73
+ def detect_narrative_patterns
74
+ return [] if @arcs.size < 2
75
+
76
+ patterns = []
77
+ patterns << :recurring_crisis if recurring_beat_pattern?(:crisis)
78
+ patterns << :recurring_climax if recurring_beat_pattern?(:climax)
79
+ patterns << :unresolved_tension if unresolved_high_tension?
80
+ patterns << :rapid_resolution if rapid_resolution_pattern?
81
+ patterns
82
+ end
83
+
84
+ def arc_report
85
+ {
86
+ total_arcs: @arcs.size,
87
+ active: active_arcs.size,
88
+ completed: completed_arcs.size,
89
+ patterns: detect_narrative_patterns,
90
+ tension_dist: tension_distribution,
91
+ most_dramatic: most_dramatic_arc&.to_h
92
+ }
93
+ end
94
+
95
+ private
96
+
97
+ def recurring_beat_pattern?(beat_type)
98
+ arc_with_beat_type_count = @arcs.values.count do |arc|
99
+ arc.beats.any? { |b| b.beat_type == beat_type }
100
+ end
101
+ arc_with_beat_type_count >= 2
102
+ end
103
+
104
+ def unresolved_high_tension?
105
+ active_arcs.any? { |arc| arc.tension_level >= Constants::CLIMAX_THRESHOLD }
106
+ end
107
+
108
+ def rapid_resolution_pattern?
109
+ @arcs.values.any? do |arc|
110
+ arc.complete? && arc.beats.size <= 3
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,59 @@
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 BeatEvent
12
+ attr_reader :beat_id, :content, :intensity, :beat_type, :domain,
13
+ :emotional_charge, :created_at
14
+
15
+ def initialize(content:, intensity: 0.5, beat_type: :rising_action,
16
+ domain: :general, emotional_charge: 0.0)
17
+ @beat_id = SecureRandom.uuid
18
+ @content = content
19
+ @intensity = intensity.clamp(0.0, 1.0)
20
+ @beat_type = validate_beat_type(beat_type)
21
+ @domain = domain
22
+ @emotional_charge = emotional_charge.clamp(-1.0, 1.0)
23
+ @created_at = Time.now.utc
24
+ end
25
+
26
+ def to_h
27
+ {
28
+ beat_id: @beat_id,
29
+ content: @content,
30
+ intensity: @intensity,
31
+ beat_type: @beat_type,
32
+ domain: @domain,
33
+ emotional_charge: @emotional_charge,
34
+ created_at: @created_at
35
+ }
36
+ end
37
+
38
+ def climactic?
39
+ @beat_type == :climax || @intensity >= Constants::CLIMAX_THRESHOLD
40
+ end
41
+
42
+ def resolving?
43
+ %i[falling_action resolution denouement].include?(@beat_type)
44
+ end
45
+
46
+ private
47
+
48
+ def validate_beat_type(type)
49
+ return type if Constants::BEAT_TYPES.include?(type)
50
+
51
+ Constants::BEAT_TYPES.first
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module NarrativeArc
8
+ module Helpers
9
+ module Constants
10
+ MAX_ARCS = 100
11
+ MAX_BEATS_PER_ARC = 50
12
+ DEFAULT_TENSION = 0.3
13
+ TENSION_RISE = 0.1
14
+ TENSION_FALL = 0.08
15
+ CLIMAX_THRESHOLD = 0.8
16
+ RESOLUTION_THRESHOLD = 0.2
17
+
18
+ BEAT_TYPES = %i[
19
+ exposition
20
+ rising_action
21
+ complication
22
+ crisis
23
+ climax
24
+ falling_action
25
+ resolution
26
+ denouement
27
+ ].freeze
28
+
29
+ ARC_PHASES = %i[building peak resolving complete].freeze
30
+
31
+ TENSION_LABELS = {
32
+ (0.0..0.2) => :calm,
33
+ (0.2..0.5) => :developing,
34
+ (0.5..0.8) => :tense,
35
+ (0.8..1.0) => :critical
36
+ }.freeze
37
+
38
+ DRAMA_LABELS = {
39
+ (0.0..0.25) => :mundane,
40
+ (0.25..0.5) => :engaging,
41
+ (0.5..0.75) => :compelling,
42
+ (0.75..1.0) => :gripping
43
+ }.freeze
44
+
45
+ PHASE_LABELS = {
46
+ building: 'Rising action building toward climax',
47
+ peak: 'At or near peak tension — climax active',
48
+ resolving: 'Falling action moving toward resolution',
49
+ complete: 'Arc resolved and closed'
50
+ }.freeze
51
+
52
+ module_function
53
+
54
+ def label_for(labels_hash, value)
55
+ labels_hash.each do |range, label|
56
+ return label if range.cover?(value)
57
+ end
58
+ labels_hash.values.last
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module NarrativeArc
8
+ module Runners
9
+ module Narrative
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def create_arc(title:, domain: :general, initial_tension: Helpers::Constants::DEFAULT_TENSION,
14
+ engine: nil, **)
15
+ eng = engine || arc_engine
16
+ arc = eng.create_arc(title: title, domain: domain, initial_tension: initial_tension)
17
+
18
+ unless arc
19
+ Legion::Logging.warn "[narrative_arc] create_arc failed: engine at capacity (#{Helpers::Constants::MAX_ARCS})"
20
+ return { success: false, reason: :engine_at_capacity }
21
+ end
22
+
23
+ Legion::Logging.debug "[narrative_arc] arc created: #{arc.arc_id[0..7]} title=#{title} domain=#{domain}"
24
+ { success: true, arc_id: arc.arc_id, title: arc.title, arc_phase: arc.arc_phase,
25
+ tension_level: arc.tension_level }
26
+ end
27
+
28
+ def add_beat(arc_id:, content:, intensity: 0.5, beat_type: :rising_action,
29
+ domain: :general, emotional_charge: 0.0, engine: nil, **)
30
+ eng = engine || arc_engine
31
+ result = eng.add_beat(
32
+ arc_id: arc_id,
33
+ content: content,
34
+ intensity: intensity,
35
+ beat_type: beat_type,
36
+ domain: domain,
37
+ emotional_charge: emotional_charge
38
+ )
39
+
40
+ if result[:success]
41
+ arc = eng.get_arc(arc_id)
42
+ Legion::Logging.debug "[narrative_arc] beat added: arc=#{arc_id[0..7]} type=#{beat_type} " \
43
+ "phase=#{result[:arc_phase]} tension=#{result[:tension_level].round(2)}"
44
+ result[:dramatic_score] = arc.dramatic_score if arc
45
+ else
46
+ Legion::Logging.debug "[narrative_arc] add_beat failed: #{result[:reason]} arc=#{arc_id[0..7]}"
47
+ end
48
+
49
+ result
50
+ end
51
+
52
+ def get_arc(arc_id:, engine: nil, **)
53
+ eng = engine || arc_engine
54
+ arc = eng.get_arc(arc_id)
55
+ return { found: false, arc_id: arc_id } unless arc
56
+
57
+ { found: true, arc: arc.to_h, beats: arc.beats.map(&:to_h) }
58
+ end
59
+
60
+ def active_arcs(engine: nil, **)
61
+ eng = engine || arc_engine
62
+ arcs = eng.active_arcs
63
+ Legion::Logging.debug "[narrative_arc] active arcs count=#{arcs.size}"
64
+ { arcs: arcs.map(&:to_h), count: arcs.size }
65
+ end
66
+
67
+ def completed_arcs(engine: nil, **)
68
+ eng = engine || arc_engine
69
+ arcs = eng.completed_arcs
70
+ Legion::Logging.debug "[narrative_arc] completed arcs count=#{arcs.size}"
71
+ { arcs: arcs.map(&:to_h), count: arcs.size }
72
+ end
73
+
74
+ def most_dramatic_arc(engine: nil, **)
75
+ eng = engine || arc_engine
76
+ arc = eng.most_dramatic_arc
77
+ return { found: false } unless arc
78
+
79
+ Legion::Logging.debug "[narrative_arc] most dramatic: #{arc.arc_id[0..7]} score=#{arc.dramatic_score.round(2)}"
80
+ { found: true, arc: arc.to_h }
81
+ end
82
+
83
+ def arc_report(engine: nil, **)
84
+ eng = engine || arc_engine
85
+ report = eng.arc_report
86
+ Legion::Logging.debug "[narrative_arc] arc_report total=#{report[:total_arcs]} patterns=#{report[:patterns].inspect}"
87
+ { success: true, report: report }
88
+ end
89
+
90
+ private
91
+
92
+ def arc_engine
93
+ @arc_engine ||= Helpers::ArcEngine.new
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ 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 NarrativeArc
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/narrative_arc/version'
4
+ require 'legion/extensions/agentic/self/narrative_arc/helpers/constants'
5
+ require 'legion/extensions/agentic/self/narrative_arc/helpers/beat_event'
6
+ require 'legion/extensions/agentic/self/narrative_arc/helpers/arc'
7
+ require 'legion/extensions/agentic/self/narrative_arc/helpers/arc_engine'
8
+ require 'legion/extensions/agentic/self/narrative_arc/runners/narrative'
9
+ require 'legion/extensions/agentic/self/narrative_arc/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Self
15
+ module NarrativeArc
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -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 NarrativeIdentity
10
+ module Actor
11
+ class NarrativeDecay < Legion::Extensions::Actors::Every
12
+ def runner_class
13
+ Legion::Extensions::Agentic::Self::NarrativeIdentity::Runners::NarrativeIdentity
14
+ end
15
+
16
+ def runner_function
17
+ 'decay_themes'
18
+ end
19
+
20
+ def time
21
+ 600
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,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module NarrativeIdentity
8
+ class Client
9
+ include Runners::NarrativeIdentity
10
+
11
+ attr_reader :engine
12
+
13
+ def initialize(engine: nil)
14
+ @engine = engine || Helpers::NarrativeEngine.new
15
+ @default_engine = @engine
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module NarrativeIdentity
10
+ module Helpers
11
+ class Chapter
12
+ attr_reader :id, :title, :label, :episode_ids, :start_time
13
+ attr_accessor :end_time
14
+
15
+ def initialize(title:, label:, episode_ids: nil, start_time: nil, end_time: nil, id: nil)
16
+ @id = id || SecureRandom.uuid
17
+ @title = title
18
+ @label = label
19
+ @episode_ids = episode_ids || []
20
+ @start_time = start_time || Time.now.utc
21
+ @end_time = end_time
22
+ end
23
+
24
+ def current?
25
+ @end_time.nil?
26
+ end
27
+
28
+ def episode_count
29
+ @episode_ids.size
30
+ end
31
+
32
+ def to_h
33
+ {
34
+ id: @id,
35
+ title: @title,
36
+ label: @label,
37
+ episode_ids: @episode_ids.dup,
38
+ start_time: @start_time,
39
+ end_time: @end_time
40
+ }
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Self
7
+ module NarrativeIdentity
8
+ module Helpers
9
+ module Constants
10
+ MAX_EPISODES = 500
11
+ MAX_THEMES = 50
12
+ MAX_CHAPTERS = 20
13
+
14
+ EPISODE_TYPES = %i[
15
+ achievement
16
+ failure
17
+ discovery
18
+ relationship
19
+ challenge
20
+ transformation
21
+ routine
22
+ ].freeze
23
+
24
+ THEME_TYPES = %i[
25
+ growth
26
+ agency
27
+ communion
28
+ redemption
29
+ contamination
30
+ stability
31
+ exploration
32
+ ].freeze
33
+
34
+ EMOTIONAL_VALENCE_WEIGHT = 0.4
35
+ SIGNIFICANCE_WEIGHT = 0.3
36
+ RECENCY_WEIGHT = 0.3
37
+ COHERENCE_DECAY = 0.01
38
+
39
+ SIGNIFICANCE_LABELS = [
40
+ { (0.8..1.0) => :defining },
41
+ { (0.6...0.8) => :major },
42
+ { (0.4...0.6) => :notable },
43
+ { (0.2...0.4) => :minor },
44
+ { (0.0...0.2) => :trivial }
45
+ ].freeze
46
+
47
+ COHERENCE_LABELS = [
48
+ { (0.8..1.0) => :unified },
49
+ { (0.6...0.8) => :coherent },
50
+ { (0.4...0.6) => :developing },
51
+ { (0.2...0.4) => :fragmented },
52
+ { (0.0...0.2) => :absent }
53
+ ].freeze
54
+
55
+ CHAPTER_LABELS = %i[origin early_learning growth mastery current].freeze
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Self
9
+ module NarrativeIdentity
10
+ module Helpers
11
+ class Episode
12
+ attr_reader :id, :content, :episode_type, :emotional_valence,
13
+ :significance, :domain, :themes, :created_at
14
+ attr_accessor :chapter_id
15
+
16
+ def initialize(content:, episode_type:, emotional_valence:, significance:, domain:, **)
17
+ @id = SecureRandom.uuid
18
+ @content = content
19
+ @episode_type = episode_type
20
+ @emotional_valence = emotional_valence.clamp(-1.0, 1.0)
21
+ @significance = significance.clamp(0.0, 1.0)
22
+ @domain = domain
23
+ @chapter_id = nil
24
+ @themes = []
25
+ @created_at = Time.now.utc
26
+ end
27
+
28
+ def positive?
29
+ @emotional_valence.positive?
30
+ end
31
+
32
+ def negative?
33
+ @emotional_valence.negative?
34
+ end
35
+
36
+ def defining?
37
+ @significance >= 0.8
38
+ end
39
+
40
+ def significance_label
41
+ Constants::SIGNIFICANCE_LABELS.each do |entry|
42
+ range, label = entry.first
43
+ return label if range.cover?(@significance)
44
+ end
45
+ :trivial
46
+ end
47
+
48
+ def to_h
49
+ {
50
+ id: @id,
51
+ content: @content,
52
+ episode_type: @episode_type,
53
+ emotional_valence: @emotional_valence,
54
+ significance: @significance,
55
+ domain: @domain,
56
+ chapter_id: @chapter_id,
57
+ themes: @themes.dup,
58
+ created_at: @created_at
59
+ }
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end