lex-agentic-defense 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 (219) 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-defense.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/defense/avalanche/client.rb +22 -0
  8. data/lib/legion/extensions/agentic/defense/avalanche/helpers/avalanche_engine.rb +132 -0
  9. data/lib/legion/extensions/agentic/defense/avalanche/helpers/cascade.rb +76 -0
  10. data/lib/legion/extensions/agentic/defense/avalanche/helpers/constants.rb +44 -0
  11. data/lib/legion/extensions/agentic/defense/avalanche/helpers/snowpack.rb +86 -0
  12. data/lib/legion/extensions/agentic/defense/avalanche/runners/cognitive_avalanche.rb +75 -0
  13. data/lib/legion/extensions/agentic/defense/avalanche/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/defense/avalanche.rb +22 -0
  15. data/lib/legion/extensions/agentic/defense/bias/actors/update.rb +45 -0
  16. data/lib/legion/extensions/agentic/defense/bias/client.rb +30 -0
  17. data/lib/legion/extensions/agentic/defense/bias/helpers/bias_detector.rb +107 -0
  18. data/lib/legion/extensions/agentic/defense/bias/helpers/bias_event.rb +44 -0
  19. data/lib/legion/extensions/agentic/defense/bias/helpers/bias_store.rb +84 -0
  20. data/lib/legion/extensions/agentic/defense/bias/helpers/constants.rb +28 -0
  21. data/lib/legion/extensions/agentic/defense/bias/runners/bias.rb +151 -0
  22. data/lib/legion/extensions/agentic/defense/bias/version.rb +13 -0
  23. data/lib/legion/extensions/agentic/defense/bias.rb +20 -0
  24. data/lib/legion/extensions/agentic/defense/confabulation/actors/decay.rb +45 -0
  25. data/lib/legion/extensions/agentic/defense/confabulation/client.rb +28 -0
  26. data/lib/legion/extensions/agentic/defense/confabulation/helpers/claim.rb +67 -0
  27. data/lib/legion/extensions/agentic/defense/confabulation/helpers/confabulation_engine.rb +120 -0
  28. data/lib/legion/extensions/agentic/defense/confabulation/helpers/constants.rb +29 -0
  29. data/lib/legion/extensions/agentic/defense/confabulation/runners/confabulation.rb +74 -0
  30. data/lib/legion/extensions/agentic/defense/confabulation/version.rb +13 -0
  31. data/lib/legion/extensions/agentic/defense/confabulation.rb +19 -0
  32. data/lib/legion/extensions/agentic/defense/dissonance/client.rb +32 -0
  33. data/lib/legion/extensions/agentic/defense/dissonance/helpers/belief.rb +46 -0
  34. data/lib/legion/extensions/agentic/defense/dissonance/helpers/constants.rb +27 -0
  35. data/lib/legion/extensions/agentic/defense/dissonance/helpers/dissonance_event.rb +52 -0
  36. data/lib/legion/extensions/agentic/defense/dissonance/helpers/dissonance_model.rb +159 -0
  37. data/lib/legion/extensions/agentic/defense/dissonance/runners/dissonance.rb +163 -0
  38. data/lib/legion/extensions/agentic/defense/dissonance/version.rb +13 -0
  39. data/lib/legion/extensions/agentic/defense/dissonance.rb +20 -0
  40. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/actors/update.rb +45 -0
  41. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/client.rb +27 -0
  42. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/claim.rb +78 -0
  43. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/client.rb +23 -0
  44. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/constants.rb +37 -0
  45. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/source.rb +64 -0
  46. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb +195 -0
  47. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/runners/epistemic_vigilance.rb +91 -0
  48. data/lib/legion/extensions/agentic/defense/epistemic_vigilance/version.rb +13 -0
  49. data/lib/legion/extensions/agentic/defense/epistemic_vigilance.rb +20 -0
  50. data/lib/legion/extensions/agentic/defense/erosion/client.rb +23 -0
  51. data/lib/legion/extensions/agentic/defense/erosion/helpers/channel.rb +84 -0
  52. data/lib/legion/extensions/agentic/defense/erosion/helpers/constants.rb +47 -0
  53. data/lib/legion/extensions/agentic/defense/erosion/helpers/erosion_engine.rb +134 -0
  54. data/lib/legion/extensions/agentic/defense/erosion/helpers/formation.rb +100 -0
  55. data/lib/legion/extensions/agentic/defense/erosion/runners/cognitive_erosion.rb +93 -0
  56. data/lib/legion/extensions/agentic/defense/erosion/version.rb +13 -0
  57. data/lib/legion/extensions/agentic/defense/erosion.rb +21 -0
  58. data/lib/legion/extensions/agentic/defense/error_monitoring/actors/tick.rb +45 -0
  59. data/lib/legion/extensions/agentic/defense/error_monitoring/client.rb +28 -0
  60. data/lib/legion/extensions/agentic/defense/error_monitoring/helpers/constants.rb +50 -0
  61. data/lib/legion/extensions/agentic/defense/error_monitoring/helpers/error_monitor.rb +174 -0
  62. data/lib/legion/extensions/agentic/defense/error_monitoring/helpers/error_signal.rb +60 -0
  63. data/lib/legion/extensions/agentic/defense/error_monitoring/runners/error_monitoring.rb +102 -0
  64. data/lib/legion/extensions/agentic/defense/error_monitoring/version.rb +13 -0
  65. data/lib/legion/extensions/agentic/defense/error_monitoring.rb +19 -0
  66. data/lib/legion/extensions/agentic/defense/extinction/actors/protocol_monitor.rb +45 -0
  67. data/lib/legion/extensions/agentic/defense/extinction/client.rb +27 -0
  68. data/lib/legion/extensions/agentic/defense/extinction/helpers/levels.rb +43 -0
  69. data/lib/legion/extensions/agentic/defense/extinction/helpers/protocol_state.rb +125 -0
  70. data/lib/legion/extensions/agentic/defense/extinction/local_migrations/20260316000040_create_extinction_state.rb +13 -0
  71. data/lib/legion/extensions/agentic/defense/extinction/runners/extinction.rb +130 -0
  72. data/lib/legion/extensions/agentic/defense/extinction/version.rb +13 -0
  73. data/lib/legion/extensions/agentic/defense/extinction.rb +25 -0
  74. data/lib/legion/extensions/agentic/defense/friction/client.rb +15 -0
  75. data/lib/legion/extensions/agentic/defense/friction/helpers/constants.rb +38 -0
  76. data/lib/legion/extensions/agentic/defense/friction/helpers/friction_engine.rb +131 -0
  77. data/lib/legion/extensions/agentic/defense/friction/helpers/state_transition.rb +73 -0
  78. data/lib/legion/extensions/agentic/defense/friction/runners/cognitive_friction.rb +82 -0
  79. data/lib/legion/extensions/agentic/defense/friction/version.rb +13 -0
  80. data/lib/legion/extensions/agentic/defense/friction.rb +19 -0
  81. data/lib/legion/extensions/agentic/defense/immune_response/client.rb +19 -0
  82. data/lib/legion/extensions/agentic/defense/immune_response/helpers/antibody.rb +72 -0
  83. data/lib/legion/extensions/agentic/defense/immune_response/helpers/antigen.rb +87 -0
  84. data/lib/legion/extensions/agentic/defense/immune_response/helpers/constants.rb +75 -0
  85. data/lib/legion/extensions/agentic/defense/immune_response/helpers/immune_engine.rb +184 -0
  86. data/lib/legion/extensions/agentic/defense/immune_response/helpers/immune_response.rb +76 -0
  87. data/lib/legion/extensions/agentic/defense/immune_response/runners/cognitive_immune_response.rb +114 -0
  88. data/lib/legion/extensions/agentic/defense/immune_response/version.rb +13 -0
  89. data/lib/legion/extensions/agentic/defense/immune_response.rb +21 -0
  90. data/lib/legion/extensions/agentic/defense/immunology/client.rb +29 -0
  91. data/lib/legion/extensions/agentic/defense/immunology/helpers/antibody.rb +55 -0
  92. data/lib/legion/extensions/agentic/defense/immunology/helpers/constants.rb +43 -0
  93. data/lib/legion/extensions/agentic/defense/immunology/helpers/immune_engine.rb +187 -0
  94. data/lib/legion/extensions/agentic/defense/immunology/helpers/threat.rb +67 -0
  95. data/lib/legion/extensions/agentic/defense/immunology/runners/cognitive_immunology.rb +92 -0
  96. data/lib/legion/extensions/agentic/defense/immunology/version.rb +13 -0
  97. data/lib/legion/extensions/agentic/defense/immunology.rb +20 -0
  98. data/lib/legion/extensions/agentic/defense/phantom/client.rb +29 -0
  99. data/lib/legion/extensions/agentic/defense/phantom/helpers/constants.rb +54 -0
  100. data/lib/legion/extensions/agentic/defense/phantom/helpers/phantom_engine.rb +106 -0
  101. data/lib/legion/extensions/agentic/defense/phantom/helpers/phantom_limb.rb +103 -0
  102. data/lib/legion/extensions/agentic/defense/phantom/helpers/phantom_signal.rb +40 -0
  103. data/lib/legion/extensions/agentic/defense/phantom/runners/cognitive_phantom.rb +79 -0
  104. data/lib/legion/extensions/agentic/defense/phantom/version.rb +13 -0
  105. data/lib/legion/extensions/agentic/defense/phantom.rb +21 -0
  106. data/lib/legion/extensions/agentic/defense/quicksand/client.rb +15 -0
  107. data/lib/legion/extensions/agentic/defense/quicksand/helpers/constants.rb +48 -0
  108. data/lib/legion/extensions/agentic/defense/quicksand/helpers/pit.rb +82 -0
  109. data/lib/legion/extensions/agentic/defense/quicksand/helpers/quicksand_engine.rb +137 -0
  110. data/lib/legion/extensions/agentic/defense/quicksand/helpers/trap.rb +101 -0
  111. data/lib/legion/extensions/agentic/defense/quicksand/runners/cognitive_quicksand.rb +84 -0
  112. data/lib/legion/extensions/agentic/defense/quicksand/version.rb +13 -0
  113. data/lib/legion/extensions/agentic/defense/quicksand.rb +22 -0
  114. data/lib/legion/extensions/agentic/defense/quicksilver/client.rb +29 -0
  115. data/lib/legion/extensions/agentic/defense/quicksilver/helpers/constants.rb +50 -0
  116. data/lib/legion/extensions/agentic/defense/quicksilver/helpers/droplet.rb +126 -0
  117. data/lib/legion/extensions/agentic/defense/quicksilver/helpers/pool.rb +83 -0
  118. data/lib/legion/extensions/agentic/defense/quicksilver/helpers/quicksilver_engine.rb +124 -0
  119. data/lib/legion/extensions/agentic/defense/quicksilver/runners/cognitive_quicksilver.rb +130 -0
  120. data/lib/legion/extensions/agentic/defense/quicksilver/version.rb +13 -0
  121. data/lib/legion/extensions/agentic/defense/quicksilver.rb +21 -0
  122. data/lib/legion/extensions/agentic/defense/version.rb +11 -0
  123. data/lib/legion/extensions/agentic/defense/whirlpool/client.rb +65 -0
  124. data/lib/legion/extensions/agentic/defense/whirlpool/helpers/captured_thought.rb +67 -0
  125. data/lib/legion/extensions/agentic/defense/whirlpool/helpers/constants.rb +45 -0
  126. data/lib/legion/extensions/agentic/defense/whirlpool/helpers/vortex.rb +91 -0
  127. data/lib/legion/extensions/agentic/defense/whirlpool/helpers/whirlpool_engine.rb +92 -0
  128. data/lib/legion/extensions/agentic/defense/whirlpool/runners/cognitive_whirlpool.rb +117 -0
  129. data/lib/legion/extensions/agentic/defense/whirlpool/version.rb +13 -0
  130. data/lib/legion/extensions/agentic/defense/whirlpool.rb +22 -0
  131. data/lib/legion/extensions/agentic/defense.rb +32 -0
  132. data/spec/legion/extensions/agentic/defense/avalanche/client_spec.rb +96 -0
  133. data/spec/legion/extensions/agentic/defense/avalanche/helpers/avalanche_engine_spec.rb +276 -0
  134. data/spec/legion/extensions/agentic/defense/avalanche/helpers/cascade_spec.rb +190 -0
  135. data/spec/legion/extensions/agentic/defense/avalanche/helpers/constants_spec.rb +129 -0
  136. data/spec/legion/extensions/agentic/defense/avalanche/helpers/snowpack_spec.rb +197 -0
  137. data/spec/legion/extensions/agentic/defense/avalanche/runners/cognitive_avalanche_spec.rb +211 -0
  138. data/spec/legion/extensions/agentic/defense/bias/client_spec.rb +16 -0
  139. data/spec/legion/extensions/agentic/defense/bias/helpers/bias_detector_spec.rb +160 -0
  140. data/spec/legion/extensions/agentic/defense/bias/helpers/bias_event_spec.rb +64 -0
  141. data/spec/legion/extensions/agentic/defense/bias/helpers/bias_store_spec.rb +143 -0
  142. data/spec/legion/extensions/agentic/defense/bias/runners/bias_spec.rb +155 -0
  143. data/spec/legion/extensions/agentic/defense/confabulation/client_spec.rb +34 -0
  144. data/spec/legion/extensions/agentic/defense/confabulation/helpers/claim_spec.rb +119 -0
  145. data/spec/legion/extensions/agentic/defense/confabulation/helpers/confabulation_engine_spec.rb +163 -0
  146. data/spec/legion/extensions/agentic/defense/confabulation/helpers/constants_spec.rb +55 -0
  147. data/spec/legion/extensions/agentic/defense/confabulation/runners/confabulation_spec.rb +119 -0
  148. data/spec/legion/extensions/agentic/defense/dissonance/client_spec.rb +51 -0
  149. data/spec/legion/extensions/agentic/defense/dissonance/helpers/belief_spec.rb +103 -0
  150. data/spec/legion/extensions/agentic/defense/dissonance/helpers/constants_spec.rb +60 -0
  151. data/spec/legion/extensions/agentic/defense/dissonance/helpers/dissonance_event_spec.rb +113 -0
  152. data/spec/legion/extensions/agentic/defense/dissonance/helpers/dissonance_model_spec.rb +252 -0
  153. data/spec/legion/extensions/agentic/defense/dissonance/runners/dissonance_spec.rb +323 -0
  154. data/spec/legion/extensions/agentic/defense/epistemic_vigilance/client_spec.rb +28 -0
  155. data/spec/legion/extensions/agentic/defense/epistemic_vigilance/helpers/claim_spec.rb +135 -0
  156. data/spec/legion/extensions/agentic/defense/epistemic_vigilance/helpers/constants_spec.rb +59 -0
  157. data/spec/legion/extensions/agentic/defense/epistemic_vigilance/helpers/source_spec.rb +117 -0
  158. data/spec/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine_spec.rb +273 -0
  159. data/spec/legion/extensions/agentic/defense/epistemic_vigilance/runners/epistemic_vigilance_spec.rb +157 -0
  160. data/spec/legion/extensions/agentic/defense/erosion/client_spec.rb +90 -0
  161. data/spec/legion/extensions/agentic/defense/erosion/helpers/channel_spec.rb +173 -0
  162. data/spec/legion/extensions/agentic/defense/erosion/helpers/constants_spec.rb +137 -0
  163. data/spec/legion/extensions/agentic/defense/erosion/helpers/erosion_engine_spec.rb +263 -0
  164. data/spec/legion/extensions/agentic/defense/erosion/helpers/formation_spec.rb +206 -0
  165. data/spec/legion/extensions/agentic/defense/erosion/runners/cognitive_erosion_spec.rb +153 -0
  166. data/spec/legion/extensions/agentic/defense/error_monitoring/client_spec.rb +40 -0
  167. data/spec/legion/extensions/agentic/defense/error_monitoring/helpers/error_monitor_spec.rb +178 -0
  168. data/spec/legion/extensions/agentic/defense/error_monitoring/helpers/error_signal_spec.rb +76 -0
  169. data/spec/legion/extensions/agentic/defense/error_monitoring/runners/error_monitoring_spec.rb +87 -0
  170. data/spec/legion/extensions/agentic/defense/extinction/actors/protocol_monitor_spec.rb +45 -0
  171. data/spec/legion/extensions/agentic/defense/extinction/client_spec.rb +13 -0
  172. data/spec/legion/extensions/agentic/defense/extinction/helpers/levels_spec.rb +180 -0
  173. data/spec/legion/extensions/agentic/defense/extinction/helpers/protocol_state_spec.rb +291 -0
  174. data/spec/legion/extensions/agentic/defense/extinction/local_persistence_spec.rb +188 -0
  175. data/spec/legion/extensions/agentic/defense/extinction/runners/extinction_spec.rb +114 -0
  176. data/spec/legion/extensions/agentic/defense/friction/helpers/constants_spec.rb +46 -0
  177. data/spec/legion/extensions/agentic/defense/friction/helpers/friction_engine_spec.rb +175 -0
  178. data/spec/legion/extensions/agentic/defense/friction/helpers/state_transition_spec.rb +124 -0
  179. data/spec/legion/extensions/agentic/defense/friction/runners/cognitive_friction_spec.rb +89 -0
  180. data/spec/legion/extensions/agentic/defense/immune_response/client_spec.rb +32 -0
  181. data/spec/legion/extensions/agentic/defense/immune_response/cognitive_immune_response_spec.rb +7 -0
  182. data/spec/legion/extensions/agentic/defense/immune_response/helpers/antibody_spec.rb +117 -0
  183. data/spec/legion/extensions/agentic/defense/immune_response/helpers/antigen_spec.rb +125 -0
  184. data/spec/legion/extensions/agentic/defense/immune_response/helpers/constants_spec.rb +45 -0
  185. data/spec/legion/extensions/agentic/defense/immune_response/helpers/immune_engine_spec.rb +222 -0
  186. data/spec/legion/extensions/agentic/defense/immune_response/helpers/immune_response_spec.rb +84 -0
  187. data/spec/legion/extensions/agentic/defense/immune_response/runners_spec.rb +141 -0
  188. data/spec/legion/extensions/agentic/defense/immunology/client_spec.rb +61 -0
  189. data/spec/legion/extensions/agentic/defense/immunology/helpers/antibody_spec.rb +98 -0
  190. data/spec/legion/extensions/agentic/defense/immunology/helpers/constants_spec.rb +86 -0
  191. data/spec/legion/extensions/agentic/defense/immunology/helpers/immune_engine_spec.rb +275 -0
  192. data/spec/legion/extensions/agentic/defense/immunology/helpers/threat_spec.rb +133 -0
  193. data/spec/legion/extensions/agentic/defense/immunology/runners/cognitive_immunology_spec.rb +177 -0
  194. data/spec/legion/extensions/agentic/defense/phantom/client_spec.rb +53 -0
  195. data/spec/legion/extensions/agentic/defense/phantom/helpers/constants_spec.rb +87 -0
  196. data/spec/legion/extensions/agentic/defense/phantom/helpers/phantom_engine_spec.rb +222 -0
  197. data/spec/legion/extensions/agentic/defense/phantom/helpers/phantom_limb_spec.rb +180 -0
  198. data/spec/legion/extensions/agentic/defense/phantom/helpers/phantom_signal_spec.rb +59 -0
  199. data/spec/legion/extensions/agentic/defense/phantom/runners/cognitive_phantom_spec.rb +193 -0
  200. data/spec/legion/extensions/agentic/defense/quicksand/client_spec.rb +35 -0
  201. data/spec/legion/extensions/agentic/defense/quicksand/helpers/constants_spec.rb +58 -0
  202. data/spec/legion/extensions/agentic/defense/quicksand/helpers/pit_spec.rb +103 -0
  203. data/spec/legion/extensions/agentic/defense/quicksand/helpers/quicksand_engine_spec.rb +153 -0
  204. data/spec/legion/extensions/agentic/defense/quicksand/helpers/trap_spec.rb +166 -0
  205. data/spec/legion/extensions/agentic/defense/quicksand/runners/cognitive_quicksand_spec.rb +90 -0
  206. data/spec/legion/extensions/agentic/defense/quicksilver/client_spec.rb +72 -0
  207. data/spec/legion/extensions/agentic/defense/quicksilver/helpers/constants_spec.rb +105 -0
  208. data/spec/legion/extensions/agentic/defense/quicksilver/helpers/droplet_spec.rb +310 -0
  209. data/spec/legion/extensions/agentic/defense/quicksilver/helpers/pool_spec.rb +174 -0
  210. data/spec/legion/extensions/agentic/defense/quicksilver/helpers/quicksilver_engine_spec.rb +226 -0
  211. data/spec/legion/extensions/agentic/defense/quicksilver/runners/cognitive_quicksilver_spec.rb +227 -0
  212. data/spec/legion/extensions/agentic/defense/whirlpool/client_spec.rb +63 -0
  213. data/spec/legion/extensions/agentic/defense/whirlpool/helpers/captured_thought_spec.rb +171 -0
  214. data/spec/legion/extensions/agentic/defense/whirlpool/helpers/constants_spec.rb +65 -0
  215. data/spec/legion/extensions/agentic/defense/whirlpool/helpers/vortex_spec.rb +189 -0
  216. data/spec/legion/extensions/agentic/defense/whirlpool/helpers/whirlpool_engine_spec.rb +227 -0
  217. data/spec/legion/extensions/agentic/defense/whirlpool/runners/cognitive_whirlpool_spec.rb +226 -0
  218. data/spec/spec_helper.rb +46 -0
  219. metadata +303 -0
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require 'legion/extensions/agentic/defense/quicksilver/version'
5
+ require 'legion/extensions/agentic/defense/quicksilver/helpers/constants'
6
+ require 'legion/extensions/agentic/defense/quicksilver/helpers/droplet'
7
+ require 'legion/extensions/agentic/defense/quicksilver/helpers/pool'
8
+ require 'legion/extensions/agentic/defense/quicksilver/helpers/quicksilver_engine'
9
+ require 'legion/extensions/agentic/defense/quicksilver/runners/cognitive_quicksilver'
10
+ require 'legion/extensions/agentic/defense/quicksilver/client'
11
+
12
+ module Legion
13
+ module Extensions
14
+ module Agentic
15
+ module Defense
16
+ module Quicksilver
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ VERSION = '0.1.0'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module Whirlpool
8
+ class Client
9
+ include Runners::CognitiveWhirlpool
10
+
11
+ attr_reader :engine
12
+
13
+ def initialize
14
+ @engine = Helpers::WhirlpoolEngine.new
15
+ end
16
+
17
+ def create_vortex(vortex_type:, angular_velocity: 0.5, depth: 0.0, capture_radius: 0.5, **)
18
+ super(
19
+ vortex_type: vortex_type,
20
+ angular_velocity: angular_velocity,
21
+ depth: depth,
22
+ capture_radius: capture_radius,
23
+ engine: @engine
24
+ )
25
+ end
26
+
27
+ def inject_thought(vortex_id:, content:, domain: :general, distance_from_core: 1.0, **)
28
+ super(
29
+ vortex_id: vortex_id,
30
+ content: content,
31
+ domain: domain,
32
+ distance_from_core: distance_from_core,
33
+ engine: @engine
34
+ )
35
+ end
36
+
37
+ def tick_all(spiral_rate: nil, **)
38
+ super(spiral_rate: spiral_rate, engine: @engine)
39
+ end
40
+
41
+ def dissipate_all(rate: Helpers::Constants::VELOCITY_DECAY, **)
42
+ super(rate: rate, engine: @engine)
43
+ end
44
+
45
+ def vortex_report(**)
46
+ super(engine: @engine)
47
+ end
48
+
49
+ def deepest_vortices(limit: 3, **)
50
+ super(limit: limit, engine: @engine)
51
+ end
52
+
53
+ def remove_vortex(vortex_id:, **)
54
+ super(vortex_id: vortex_id, engine: @engine)
55
+ end
56
+
57
+ def clear_engine(**)
58
+ super(engine: @engine)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module Whirlpool
8
+ module Helpers
9
+ class CapturedThought
10
+ attr_reader :thought_id, :content, :domain, :spiral_depth, :distance_from_core, :captured_at
11
+
12
+ ESCAPE_DISTANCE = 1.0
13
+ CORE_DISTANCE = 0.05
14
+
15
+ def initialize(content:, domain: :general, spiral_depth: 0.0, distance_from_core: 1.0)
16
+ @thought_id = SecureRandom.uuid
17
+ @content = content
18
+ @domain = domain
19
+ @spiral_depth = spiral_depth.clamp(0.0, Constants::DEPTH_MAX)
20
+ @distance_from_core = distance_from_core.clamp(0.0, Constants::CAPTURE_RADIUS_MAX)
21
+ @captured_at = Time.now.utc
22
+ @escaped = false
23
+ end
24
+
25
+ def spiral!(rate: Constants::SPIRAL_RATE_DEFAULT)
26
+ return if @escaped
27
+
28
+ @spiral_depth = (@spiral_depth + rate).clamp(0.0, Constants::DEPTH_MAX)
29
+ @distance_from_core = (@distance_from_core - rate).clamp(0.0, Constants::CAPTURE_RADIUS_MAX)
30
+ end
31
+
32
+ def at_core?
33
+ @distance_from_core <= CORE_DISTANCE
34
+ end
35
+
36
+ def escaped?
37
+ @escaped
38
+ end
39
+
40
+ def escape!
41
+ @escaped = true
42
+ end
43
+
44
+ def depth_label
45
+ Constants::DEPTH_LABELS.find { |entry| entry[:range].cover?(@spiral_depth) }&.fetch(:label, :surface) || :surface
46
+ end
47
+
48
+ def to_h
49
+ {
50
+ thought_id: @thought_id,
51
+ content: @content,
52
+ domain: @domain,
53
+ spiral_depth: @spiral_depth.round(10),
54
+ distance_from_core: @distance_from_core.round(10),
55
+ depth_label: depth_label,
56
+ at_core: at_core?,
57
+ escaped: @escaped,
58
+ captured_at: @captured_at
59
+ }
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module Whirlpool
8
+ module Helpers
9
+ module Constants
10
+ VORTEX_TYPES = %i[
11
+ analytical
12
+ creative
13
+ emotional
14
+ procedural
15
+ associative
16
+ ].freeze
17
+
18
+ MAX_VORTICES = 12
19
+
20
+ VELOCITY_DECAY = 0.05
21
+
22
+ DEPTH_LABELS = [
23
+ { range: (0.0...0.2), label: :surface },
24
+ { range: (0.2...0.4), label: :shallow },
25
+ { range: (0.4...0.6), label: :mid },
26
+ { range: (0.6...0.8), label: :deep },
27
+ { range: (0.8..1.0), label: :insight_core }
28
+ ].freeze
29
+
30
+ CAPTURE_DECAY_RATE = 0.03
31
+ ANGULAR_VELOCITY_MIN = 0.1
32
+ ANGULAR_VELOCITY_MAX = 1.0
33
+ DEPTH_MAX = 1.0
34
+ CAPTURE_RADIUS_MAX = 1.0
35
+ SPIRAL_RATE_DEFAULT = 0.08
36
+ DISSIPATION_THRESHOLD = 0.05
37
+ POWERFUL_VELOCITY = 0.7
38
+ CALM_VELOCITY = 0.2
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module Whirlpool
8
+ module Helpers
9
+ class Vortex
10
+ attr_reader :vortex_id, :vortex_type, :angular_velocity, :depth, :capture_radius, :captured_thoughts,
11
+ :created_at
12
+
13
+ def initialize(vortex_type:, angular_velocity: 0.5, depth: 0.0, capture_radius: 0.5)
14
+ raise ArgumentError, "unknown vortex_type: #{vortex_type}" unless Constants::VORTEX_TYPES.include?(vortex_type)
15
+
16
+ @vortex_id = SecureRandom.uuid
17
+ @vortex_type = vortex_type
18
+ @angular_velocity = angular_velocity.clamp(Constants::ANGULAR_VELOCITY_MIN, Constants::ANGULAR_VELOCITY_MAX)
19
+ @depth = depth.clamp(0.0, Constants::DEPTH_MAX)
20
+ @capture_radius = capture_radius.clamp(0.0, Constants::CAPTURE_RADIUS_MAX)
21
+ @captured_thoughts = []
22
+ @created_at = Time.now.utc
23
+ end
24
+
25
+ def capture!(thought)
26
+ raise ArgumentError, 'thought must be a CapturedThought' unless thought.is_a?(CapturedThought)
27
+
28
+ @captured_thoughts << thought
29
+ thought
30
+ end
31
+
32
+ def tick!(spiral_rate: nil)
33
+ rate = spiral_rate || (Constants::SPIRAL_RATE_DEFAULT * @angular_velocity)
34
+ @captured_thoughts.each { |t| t.spiral!(rate: rate) }
35
+ @depth = (@depth + (rate * 0.5)).clamp(0.0, Constants::DEPTH_MAX)
36
+ self
37
+ end
38
+
39
+ def dissipate!(rate: Constants::VELOCITY_DECAY)
40
+ @angular_velocity = (@angular_velocity - rate).clamp(0.0, Constants::ANGULAR_VELOCITY_MAX)
41
+ @capture_radius = (@capture_radius - (rate * 0.5)).clamp(0.0, Constants::CAPTURE_RADIUS_MAX)
42
+ self
43
+ end
44
+
45
+ def powerful?
46
+ @angular_velocity >= Constants::POWERFUL_VELOCITY
47
+ end
48
+
49
+ def calm?
50
+ @angular_velocity <= Constants::CALM_VELOCITY
51
+ end
52
+
53
+ def dissipated?
54
+ @angular_velocity <= Constants::DISSIPATION_THRESHOLD
55
+ end
56
+
57
+ def thoughts_at_core
58
+ @captured_thoughts.select(&:at_core?)
59
+ end
60
+
61
+ def active_thoughts
62
+ @captured_thoughts.reject(&:escaped?)
63
+ end
64
+
65
+ def depth_label
66
+ Constants::DEPTH_LABELS.find { |entry| entry[:range].cover?(@depth) }&.fetch(:label, :surface) || :surface
67
+ end
68
+
69
+ def to_h
70
+ {
71
+ vortex_id: @vortex_id,
72
+ vortex_type: @vortex_type,
73
+ angular_velocity: @angular_velocity.round(10),
74
+ depth: @depth.round(10),
75
+ capture_radius: @capture_radius.round(10),
76
+ depth_label: depth_label,
77
+ powerful: powerful?,
78
+ calm: calm?,
79
+ dissipated: dissipated?,
80
+ thought_count: @captured_thoughts.size,
81
+ core_count: thoughts_at_core.size,
82
+ created_at: @created_at
83
+ }
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module Whirlpool
8
+ module Helpers
9
+ class WhirlpoolEngine
10
+ attr_reader :vortices
11
+
12
+ def initialize
13
+ @vortices = []
14
+ end
15
+
16
+ def create_vortex(vortex_type:, angular_velocity: 0.5, depth: 0.0, capture_radius: 0.5)
17
+ raise ArgumentError, "MAX_VORTICES (#{Constants::MAX_VORTICES}) reached" if @vortices.size >= Constants::MAX_VORTICES
18
+
19
+ vortex = Vortex.new(
20
+ vortex_type: vortex_type,
21
+ angular_velocity: angular_velocity,
22
+ depth: depth,
23
+ capture_radius: capture_radius
24
+ )
25
+ @vortices << vortex
26
+ vortex
27
+ end
28
+
29
+ def inject_thought(vortex_id:, content:, domain: :general, distance_from_core: 1.0)
30
+ vortex = find_vortex(vortex_id)
31
+ raise ArgumentError, "vortex not found: #{vortex_id}" unless vortex
32
+
33
+ thought = CapturedThought.new(
34
+ content: content,
35
+ domain: domain,
36
+ distance_from_core: distance_from_core
37
+ )
38
+ vortex.capture!(thought)
39
+ { vortex_id: vortex_id, thought_id: thought.thought_id, domain: domain }
40
+ end
41
+
42
+ def tick_all!(spiral_rate: nil)
43
+ results = @vortices.map do |v|
44
+ v.tick!(spiral_rate: spiral_rate)
45
+ { vortex_id: v.vortex_id, depth: v.depth.round(10), active_thoughts: v.active_thoughts.size }
46
+ end
47
+ { ticked: @vortices.size, results: results }
48
+ end
49
+
50
+ def dissipate_all!(rate: Constants::VELOCITY_DECAY)
51
+ before = @vortices.size
52
+ @vortices.each { |v| v.dissipate!(rate: rate) }
53
+ @vortices.reject!(&:dissipated?)
54
+ { dissipated: before - @vortices.size, remaining: @vortices.size }
55
+ end
56
+
57
+ def deepest_vortices(limit: 3)
58
+ @vortices.sort_by { |v| -v.depth }.first(limit).map(&:to_h)
59
+ end
60
+
61
+ def vortex_report
62
+ {
63
+ total_vortices: @vortices.size,
64
+ powerful_count: @vortices.count(&:powerful?),
65
+ calm_count: @vortices.count(&:calm?),
66
+ total_thoughts: @vortices.sum { |v| v.captured_thoughts.size },
67
+ core_thoughts: @vortices.sum { |v| v.thoughts_at_core.size },
68
+ deepest_vortices: deepest_vortices
69
+ }
70
+ end
71
+
72
+ def find_vortex(vortex_id)
73
+ @vortices.find { |v| v.vortex_id == vortex_id }
74
+ end
75
+
76
+ def remove_vortex(vortex_id)
77
+ before = @vortices.size
78
+ @vortices.reject! { |v| v.vortex_id == vortex_id }
79
+ { removed: before - @vortices.size }
80
+ end
81
+
82
+ def clear
83
+ @vortices = []
84
+ { cleared: true }
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module Whirlpool
8
+ module Runners
9
+ module CognitiveWhirlpool
10
+ extend self
11
+
12
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
13
+
14
+ def create_vortex(vortex_type:, angular_velocity: 0.5, depth: 0.0, capture_radius: 0.5,
15
+ engine: nil, **)
16
+ eng = engine || default_engine
17
+ vortex = eng.create_vortex(
18
+ vortex_type: vortex_type,
19
+ angular_velocity: angular_velocity,
20
+ depth: depth,
21
+ capture_radius: capture_radius
22
+ )
23
+ Legion::Logging.info "[cognitive_whirlpool] created vortex id=#{vortex.vortex_id} type=#{vortex_type}"
24
+ { success: true, vortex: vortex.to_h }
25
+ rescue ArgumentError => e
26
+ Legion::Logging.warn "[cognitive_whirlpool] create_vortex failed: #{e.message}"
27
+ { success: false, error: e.message }
28
+ end
29
+
30
+ def inject_thought(vortex_id:, content:, domain: :general, distance_from_core: 1.0,
31
+ engine: nil, **)
32
+ eng = engine || default_engine
33
+ result = eng.inject_thought(
34
+ vortex_id: vortex_id,
35
+ content: content,
36
+ domain: domain,
37
+ distance_from_core: distance_from_core
38
+ )
39
+ Legion::Logging.info "[cognitive_whirlpool] injected thought=#{result[:thought_id]} into vortex=#{vortex_id}"
40
+ result.merge(success: true)
41
+ rescue ArgumentError => e
42
+ Legion::Logging.warn "[cognitive_whirlpool] inject_thought failed: #{e.message}"
43
+ { success: false, error: e.message }
44
+ end
45
+
46
+ def tick_all(spiral_rate: nil, engine: nil, **)
47
+ eng = engine || default_engine
48
+ result = eng.tick_all!(spiral_rate: spiral_rate)
49
+ Legion::Logging.debug "[cognitive_whirlpool] tick: vortices=#{result[:ticked]}"
50
+ result.merge(success: true)
51
+ rescue ArgumentError => e
52
+ Legion::Logging.warn "[cognitive_whirlpool] tick_all failed: #{e.message}"
53
+ { success: false, error: e.message }
54
+ end
55
+
56
+ def dissipate_all(rate: Helpers::Constants::VELOCITY_DECAY, engine: nil, **)
57
+ eng = engine || default_engine
58
+ result = eng.dissipate_all!(rate: rate)
59
+ Legion::Logging.debug "[cognitive_whirlpool] dissipate: removed=#{result[:dissipated]} remaining=#{result[:remaining]}"
60
+ result.merge(success: true)
61
+ rescue ArgumentError => e
62
+ Legion::Logging.warn "[cognitive_whirlpool] dissipate_all failed: #{e.message}"
63
+ { success: false, error: e.message }
64
+ end
65
+
66
+ def vortex_report(engine: nil, **)
67
+ eng = engine || default_engine
68
+ report = eng.vortex_report
69
+ Legion::Logging.debug "[cognitive_whirlpool] report: vortices=#{report[:total_vortices]}"
70
+ report.merge(success: true)
71
+ rescue ArgumentError => e
72
+ Legion::Logging.warn "[cognitive_whirlpool] vortex_report failed: #{e.message}"
73
+ { success: false, error: e.message }
74
+ end
75
+
76
+ def deepest_vortices(limit: 3, engine: nil, **)
77
+ eng = engine || default_engine
78
+ vortices = eng.deepest_vortices(limit: limit)
79
+ Legion::Logging.debug "[cognitive_whirlpool] deepest: count=#{vortices.size}"
80
+ { success: true, vortices: vortices }
81
+ rescue ArgumentError => e
82
+ Legion::Logging.warn "[cognitive_whirlpool] deepest_vortices failed: #{e.message}"
83
+ { success: false, error: e.message }
84
+ end
85
+
86
+ def remove_vortex(vortex_id:, engine: nil, **)
87
+ eng = engine || default_engine
88
+ result = eng.remove_vortex(vortex_id)
89
+ Legion::Logging.debug "[cognitive_whirlpool] removed vortex=#{vortex_id}"
90
+ result.merge(success: true)
91
+ rescue ArgumentError => e
92
+ Legion::Logging.warn "[cognitive_whirlpool] remove_vortex failed: #{e.message}"
93
+ { success: false, error: e.message }
94
+ end
95
+
96
+ def clear_engine(engine: nil, **)
97
+ eng = engine || default_engine
98
+ result = eng.clear
99
+ Legion::Logging.info '[cognitive_whirlpool] engine cleared'
100
+ result.merge(success: true)
101
+ rescue ArgumentError => e
102
+ Legion::Logging.warn "[cognitive_whirlpool] clear_engine failed: #{e.message}"
103
+ { success: false, error: e.message }
104
+ end
105
+
106
+ private
107
+
108
+ def default_engine
109
+ @default_engine ||= Helpers::WhirlpoolEngine.new
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module Whirlpool
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ require_relative 'whirlpool/version'
6
+ require_relative 'whirlpool/helpers/constants'
7
+ require_relative 'whirlpool/helpers/captured_thought'
8
+ require_relative 'whirlpool/helpers/vortex'
9
+ require_relative 'whirlpool/helpers/whirlpool_engine'
10
+ require_relative 'whirlpool/runners/cognitive_whirlpool'
11
+ require_relative 'whirlpool/client'
12
+
13
+ module Legion
14
+ module Extensions
15
+ module Agentic
16
+ module Defense
17
+ module Whirlpool
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'defense/version'
4
+ require_relative 'defense/immune_response'
5
+ require_relative 'defense/immunology'
6
+ require_relative 'defense/erosion'
7
+ require_relative 'defense/friction'
8
+ require_relative 'defense/quicksand'
9
+ require_relative 'defense/quicksilver'
10
+ require_relative 'defense/phantom'
11
+ require_relative 'defense/epistemic_vigilance'
12
+ require_relative 'defense/bias'
13
+ require_relative 'defense/confabulation'
14
+ require_relative 'defense/dissonance'
15
+ require_relative 'defense/error_monitoring'
16
+ require_relative 'defense/extinction'
17
+ require_relative 'defense/avalanche'
18
+ require_relative 'defense/whirlpool'
19
+
20
+ module Legion
21
+ module Extensions
22
+ module Agentic
23
+ module Defense
24
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
25
+
26
+ def remote_invocable?
27
+ false
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Defense::Avalanche::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'creates an AvalancheEngine by default' do
8
+ expect(client.engine).to be_a(Legion::Extensions::Agentic::Defense::Avalanche::Helpers::AvalancheEngine)
9
+ end
10
+
11
+ it 'accepts an injected engine' do
12
+ custom_engine = Legion::Extensions::Agentic::Defense::Avalanche::Helpers::AvalancheEngine.new
13
+ c = described_class.new(engine: custom_engine)
14
+ expect(c.engine).to be(custom_engine)
15
+ end
16
+ end
17
+
18
+ describe '#create_snowpack' do
19
+ it 'creates a snowpack via the client' do
20
+ result = client.create_snowpack(snowpack_type: :ideas, domain: :creativity, content: 'spark')
21
+ expect(result[:success]).to be(true)
22
+ end
23
+
24
+ it 'persists the snowpack in the engine' do
25
+ result = client.create_snowpack(snowpack_type: :emotions, domain: :fear, content: 'dread')
26
+ expect(client.engine.snowpacks).to have_key(result[:snowpack_id])
27
+ end
28
+ end
29
+
30
+ describe '#trigger' do
31
+ let(:pack_id) do
32
+ client.create_snowpack(
33
+ snowpack_type: :impulses, domain: :action, content: 'urgent impulse', stability: 0.05
34
+ )[:snowpack_id]
35
+ end
36
+
37
+ it 'triggers a cascade for unstable snowpack' do
38
+ result = client.trigger(snowpack_id: pack_id, force: 0.8)
39
+ expect(result[:success]).to be(true)
40
+ expect(result[:triggered]).to be(true)
41
+ end
42
+
43
+ it 'returns failure for unknown id' do
44
+ result = client.trigger(snowpack_id: 'nonexistent', force: 0.5)
45
+ expect(result[:success]).to be(false)
46
+ end
47
+ end
48
+
49
+ describe '#accumulate' do
50
+ before { client.create_snowpack(snowpack_type: :associations, domain: :network, content: 'linked nodes') }
51
+
52
+ it 'accumulates all snowpacks' do
53
+ result = client.accumulate
54
+ expect(result[:success]).to be(true)
55
+ expect(result[:packs_accumulated]).to eq(1)
56
+ end
57
+ end
58
+
59
+ describe '#list_snowpacks' do
60
+ it 'returns empty list on fresh client' do
61
+ result = client.list_snowpacks
62
+ expect(result[:success]).to be(true)
63
+ expect(result[:count]).to eq(0)
64
+ end
65
+
66
+ it 'lists created snowpacks' do
67
+ client.create_snowpack(snowpack_type: :ideas, domain: :test, content: 'a')
68
+ client.create_snowpack(snowpack_type: :ideas, domain: :test, content: 'b')
69
+ result = client.list_snowpacks
70
+ expect(result[:count]).to eq(2)
71
+ end
72
+ end
73
+
74
+ describe '#terrain_status' do
75
+ it 'returns success with stats' do
76
+ result = client.terrain_status
77
+ expect(result[:success]).to be(true)
78
+ expect(result[:total_snowpacks]).to eq(0)
79
+ end
80
+
81
+ it 'reflects created snowpacks' do
82
+ client.create_snowpack(snowpack_type: :memories, domain: :past, content: 'childhood')
83
+ result = client.terrain_status
84
+ expect(result[:total_snowpacks]).to eq(1)
85
+ end
86
+ end
87
+
88
+ describe 'client isolation' do
89
+ it 'two clients do not share state' do
90
+ c1 = described_class.new
91
+ c2 = described_class.new
92
+ c1.create_snowpack(snowpack_type: :ideas, domain: :test, content: 'isolated idea')
93
+ expect(c2.terrain_status[:total_snowpacks]).to eq(0)
94
+ end
95
+ end
96
+ end