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,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module ImmuneResponse
8
+ class Client
9
+ include Runners::CognitiveImmuneResponse
10
+
11
+ def initialize(engine: nil)
12
+ @default_engine = engine || Helpers::ImmuneEngine.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Defense
9
+ module ImmuneResponse
10
+ module Helpers
11
+ class Antibody
12
+ include Constants
13
+
14
+ attr_reader :id, :antigen_type, :signature, :immunity_level,
15
+ :match_count, :created_at
16
+
17
+ def initialize(antigen_type:, signature:, immunity_level: 0.3)
18
+ @id = SecureRandom.uuid
19
+ @antigen_type = antigen_type.to_sym
20
+ @signature = signature
21
+ @immunity_level = immunity_level.to_f.clamp(0.0, 1.0).round(10)
22
+ @match_count = 0
23
+ @created_at = Time.now.utc
24
+ end
25
+
26
+ def strengthen!(amount = IMMUNITY_BOOST)
27
+ @match_count += 1
28
+ @immunity_level = (@immunity_level + amount).clamp(0.0, 1.0).round(10)
29
+ self
30
+ end
31
+
32
+ def decay!
33
+ @immunity_level = (@immunity_level - IMMUNITY_DECAY).clamp(0.0, 1.0).round(10)
34
+ self
35
+ end
36
+
37
+ def matches?(antigen)
38
+ antigen.antigen_type == @antigen_type
39
+ end
40
+
41
+ def memory_cell?
42
+ @immunity_level >= MEMORY_CELL_THRESHOLD
43
+ end
44
+
45
+ def effective?
46
+ @immunity_level >= 0.5
47
+ end
48
+
49
+ def immunity_label
50
+ Constants.label_for(IMMUNITY_LABELS, @immunity_level)
51
+ end
52
+
53
+ def to_h
54
+ {
55
+ id: @id,
56
+ antigen_type: @antigen_type,
57
+ signature: @signature,
58
+ immunity_level: @immunity_level,
59
+ immunity_label: immunity_label,
60
+ match_count: @match_count,
61
+ memory_cell: memory_cell?,
62
+ effective: effective?,
63
+ created_at: @created_at
64
+ }
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Defense
9
+ module ImmuneResponse
10
+ module Helpers
11
+ class Antigen
12
+ include Constants
13
+
14
+ attr_reader :id, :pattern, :antigen_type, :threat_level,
15
+ :exposure_count, :first_seen, :last_seen
16
+
17
+ def initialize(pattern:, antigen_type:, threat_level: DEFAULT_THREAT_LEVEL)
18
+ @id = SecureRandom.uuid
19
+ @pattern = pattern
20
+ @antigen_type = validate_type(antigen_type)
21
+ @threat_level = threat_level.to_f.clamp(0.0, 1.0).round(10)
22
+ @exposure_count = 0
23
+ @first_seen = Time.now.utc
24
+ @last_seen = @first_seen
25
+ end
26
+
27
+ def expose!
28
+ @exposure_count += 1
29
+ @last_seen = Time.now.utc
30
+ self
31
+ end
32
+
33
+ def escalate!(amount = THREAT_ESCALATION)
34
+ @threat_level = (@threat_level + amount).clamp(0.0, 1.0).round(10)
35
+ self
36
+ end
37
+
38
+ def de_escalate!(amount = THREAT_ESCALATION)
39
+ @threat_level = (@threat_level - amount).clamp(0.0, 1.0).round(10)
40
+ self
41
+ end
42
+
43
+ def critical?
44
+ @threat_level >= REJECTION_THRESHOLD
45
+ end
46
+
47
+ def benign?
48
+ @threat_level <= TOLERANCE_THRESHOLD
49
+ end
50
+
51
+ def recurring?
52
+ @exposure_count >= 3
53
+ end
54
+
55
+ def threat_label
56
+ Constants.label_for(THREAT_LABELS, @threat_level)
57
+ end
58
+
59
+ def to_h
60
+ {
61
+ id: @id,
62
+ pattern: @pattern,
63
+ antigen_type: @antigen_type,
64
+ threat_level: @threat_level,
65
+ threat_label: threat_label,
66
+ exposure_count: @exposure_count,
67
+ critical: critical?,
68
+ benign: benign?,
69
+ recurring: recurring?,
70
+ first_seen: @first_seen,
71
+ last_seen: @last_seen
72
+ }
73
+ end
74
+
75
+ private
76
+
77
+ def validate_type(type)
78
+ sym = type.to_sym
79
+ ANTIGEN_TYPES.include?(sym) ? sym : :adversarial_input
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module ImmuneResponse
8
+ module Helpers
9
+ module Constants
10
+ MAX_ANTIGENS = 300
11
+ MAX_ANTIBODIES = 200
12
+ MAX_EXPOSURES = 500
13
+ MAX_RESPONSES = 500
14
+
15
+ DEFAULT_THREAT_LEVEL = 0.5
16
+ IMMUNITY_BOOST = 0.15
17
+ IMMUNITY_DECAY = 0.02
18
+ THREAT_ESCALATION = 0.1
19
+ TOLERANCE_THRESHOLD = 0.3
20
+ REJECTION_THRESHOLD = 0.8
21
+ MEMORY_CELL_THRESHOLD = 0.6
22
+
23
+ ANTIGEN_TYPES = %i[
24
+ prompt_injection social_engineering data_poisoning
25
+ adversarial_input logic_manipulation context_hijack
26
+ authority_spoofing emotional_manipulation
27
+ ].freeze
28
+
29
+ RESPONSE_LEVELS = %i[
30
+ tolerance monitoring mild_response strong_response full_rejection
31
+ ].freeze
32
+
33
+ THREAT_LABELS = {
34
+ (0.8..) => :critical,
35
+ (0.6...0.8) => :high,
36
+ (0.4...0.6) => :moderate,
37
+ (0.2...0.4) => :low,
38
+ (..0.2) => :minimal
39
+ }.freeze
40
+
41
+ IMMUNITY_LABELS = {
42
+ (0.8..) => :immune,
43
+ (0.6...0.8) => :resistant,
44
+ (0.4...0.6) => :partial,
45
+ (0.2...0.4) => :naive,
46
+ (..0.2) => :vulnerable
47
+ }.freeze
48
+
49
+ RESPONSE_LABELS = {
50
+ (0.8..) => :full_rejection,
51
+ (0.6...0.8) => :strong_response,
52
+ (0.4...0.6) => :mild_response,
53
+ (0.2...0.4) => :monitoring,
54
+ (..0.2) => :tolerance
55
+ }.freeze
56
+
57
+ HEALTH_LABELS = {
58
+ (0.8..) => :robust,
59
+ (0.6...0.8) => :healthy,
60
+ (0.4...0.6) => :compromised,
61
+ (0.2...0.4) => :weakened,
62
+ (..0.2) => :critical
63
+ }.freeze
64
+
65
+ def self.label_for(labels, value)
66
+ match = labels.find { |range, _| range.cover?(value) }
67
+ match&.last
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module ImmuneResponse
8
+ module Helpers
9
+ class ImmuneEngine
10
+ include Constants
11
+
12
+ def initialize
13
+ @antigens = {}
14
+ @antibodies = {}
15
+ @responses = {}
16
+ end
17
+
18
+ def register_antigen(pattern:, antigen_type:, threat_level: DEFAULT_THREAT_LEVEL)
19
+ prune_antigens
20
+ antigen = Antigen.new(
21
+ pattern: pattern, antigen_type: antigen_type, threat_level: threat_level
22
+ )
23
+ @antigens[antigen.id] = antigen
24
+ antigen
25
+ end
26
+
27
+ def encounter(antigen_id:)
28
+ antigen = @antigens[antigen_id]
29
+ return nil unless antigen
30
+
31
+ antigen.expose!
32
+ antibody = find_matching_antibody(antigen)
33
+ response = generate_response(antigen, antibody)
34
+ antibody&.strengthen!
35
+ @responses[response.id] = response
36
+ prune_responses
37
+ response
38
+ end
39
+
40
+ def create_antibody(antigen_type:, signature:, immunity_level: 0.3)
41
+ prune_antibodies
42
+ antibody = Antibody.new(
43
+ antigen_type: antigen_type, signature: signature, immunity_level: immunity_level
44
+ )
45
+ @antibodies[antibody.id] = antibody
46
+ antibody
47
+ end
48
+
49
+ def vaccinate(antigen_type:, signature:)
50
+ create_antibody(
51
+ antigen_type: antigen_type, signature: signature, immunity_level: 0.6
52
+ )
53
+ end
54
+
55
+ def decay_all!
56
+ @antibodies.each_value(&:decay!)
57
+ { antibodies_decayed: @antibodies.size }
58
+ end
59
+
60
+ def escalate_antigen(antigen_id:, amount: THREAT_ESCALATION)
61
+ antigen = @antigens[antigen_id]
62
+ return nil unless antigen
63
+
64
+ antigen.escalate!(amount)
65
+ antigen
66
+ end
67
+
68
+ def de_escalate_antigen(antigen_id:, amount: THREAT_ESCALATION)
69
+ antigen = @antigens[antigen_id]
70
+ return nil unless antigen
71
+
72
+ antigen.de_escalate!(amount)
73
+ antigen
74
+ end
75
+
76
+ def immunity_for(antigen_type:)
77
+ matching = @antibodies.values.select { |ab| ab.antigen_type == antigen_type.to_sym }
78
+ return 0.0 if matching.empty?
79
+
80
+ matching.map(&:immunity_level).max.round(10)
81
+ end
82
+
83
+ def critical_antigens = @antigens.values.select(&:critical?)
84
+ def benign_antigens = @antigens.values.select(&:benign?)
85
+ def memory_cells = @antibodies.values.select(&:memory_cell?)
86
+ def effective_antibodies = @antibodies.values.select(&:effective?)
87
+ def responses_for(antigen_id:) = @responses.values.select { |r| r.antigen_id == antigen_id }
88
+
89
+ def threat_by_type
90
+ ANTIGEN_TYPES.each_with_object({}) do |type, hash|
91
+ matching = @antigens.values.select { |a| a.antigen_type == type }
92
+ hash[type] = matching.empty? ? 0.0 : (matching.sum(&:threat_level) / matching.size).round(10)
93
+ end
94
+ end
95
+
96
+ def overall_immune_health
97
+ return 1.0 if @antigens.empty?
98
+
99
+ total_immunity = @antibodies.values.sum(&:immunity_level)
100
+ total_threat = @antigens.values.sum(&:threat_level)
101
+ denominator = total_immunity + total_threat
102
+ return 0.5 if denominator.zero?
103
+
104
+ (total_immunity / denominator).clamp(0.0, 1.0).round(10)
105
+ end
106
+
107
+ def immune_report
108
+ {
109
+ total_antigens: @antigens.size,
110
+ total_antibodies: @antibodies.size,
111
+ total_responses: @responses.size,
112
+ critical_count: critical_antigens.size,
113
+ memory_cell_count: memory_cells.size,
114
+ overall_health: overall_immune_health,
115
+ health_label: Constants.label_for(HEALTH_LABELS, overall_immune_health),
116
+ threat_by_type: threat_by_type,
117
+ most_exposed: most_exposed(limit: 3).map(&:to_h)
118
+ }
119
+ end
120
+
121
+ def most_exposed(limit: 5) = @antigens.values.sort_by { |a| -a.exposure_count }.first(limit)
122
+ def most_threatening(limit: 5) = @antigens.values.sort_by { |a| -a.threat_level }.first(limit)
123
+ def strongest_antibodies(limit: 5) = @antibodies.values.sort_by { |ab| -ab.immunity_level }.first(limit)
124
+
125
+ def to_h
126
+ {
127
+ antigens: @antigens.size,
128
+ antibodies: @antibodies.size,
129
+ responses: @responses.size,
130
+ overall_health: overall_immune_health
131
+ }
132
+ end
133
+
134
+ private
135
+
136
+ def find_matching_antibody(antigen)
137
+ @antibodies.values.select { |ab| ab.matches?(antigen) }.max_by(&:immunity_level)
138
+ end
139
+
140
+ def generate_response(antigen, antibody)
141
+ intensity = compute_intensity(antigen, antibody)
142
+ level = determine_response_level(intensity)
143
+ ImmuneResponse.new(
144
+ antigen_id: antigen.id, antibody_id: antibody&.id,
145
+ response_level: level, intensity: intensity
146
+ )
147
+ end
148
+
149
+ def compute_intensity(antigen, antibody)
150
+ base = antigen.threat_level
151
+ base *= (1.0 - (antibody.immunity_level * 0.5)) if antibody
152
+ base = [base, 0.8].min if antigen.recurring? && antibody&.memory_cell?
153
+ base.clamp(0.0, 1.0).round(10)
154
+ end
155
+
156
+ def determine_response_level(intensity) = Constants.label_for(RESPONSE_LABELS, intensity) || :monitoring
157
+
158
+ def prune_antigens
159
+ return if @antigens.size < MAX_ANTIGENS
160
+
161
+ oldest = @antigens.values.min_by(&:last_seen)
162
+ @antigens.delete(oldest.id) if oldest
163
+ end
164
+
165
+ def prune_antibodies
166
+ return if @antibodies.size < MAX_ANTIBODIES
167
+
168
+ weakest = @antibodies.values.reject(&:memory_cell?).min_by(&:immunity_level)
169
+ @antibodies.delete(weakest.id) if weakest
170
+ end
171
+
172
+ def prune_responses
173
+ return if @responses.size < MAX_RESPONSES
174
+
175
+ oldest = @responses.values.min_by(&:created_at)
176
+ @responses.delete(oldest.id) if oldest
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Defense
9
+ module ImmuneResponse
10
+ module Helpers
11
+ class ImmuneResponse
12
+ include Constants
13
+
14
+ attr_reader :id, :antigen_id, :antibody_id, :response_level,
15
+ :intensity, :action_taken, :created_at
16
+
17
+ def initialize(antigen_id:, response_level:, antibody_id: nil, intensity: 0.5)
18
+ @id = SecureRandom.uuid
19
+ @antigen_id = antigen_id
20
+ @antibody_id = antibody_id
21
+ @response_level = validate_response(response_level)
22
+ @intensity = intensity.to_f.clamp(0.0, 1.0).round(10)
23
+ @action_taken = nil
24
+ @created_at = Time.now.utc
25
+ end
26
+
27
+ def record_action!(action)
28
+ @action_taken = action.to_s
29
+ self
30
+ end
31
+
32
+ def adaptive?
33
+ !@antibody_id.nil?
34
+ end
35
+
36
+ def innate?
37
+ @antibody_id.nil?
38
+ end
39
+
40
+ def severe?
41
+ @intensity >= REJECTION_THRESHOLD
42
+ end
43
+
44
+ def response_label
45
+ Constants.label_for(RESPONSE_LABELS, @intensity)
46
+ end
47
+
48
+ def to_h
49
+ {
50
+ id: @id,
51
+ antigen_id: @antigen_id,
52
+ antibody_id: @antibody_id,
53
+ response_level: @response_level,
54
+ intensity: @intensity,
55
+ response_label: response_label,
56
+ adaptive: adaptive?,
57
+ innate: innate?,
58
+ severe: severe?,
59
+ action_taken: @action_taken,
60
+ created_at: @created_at
61
+ }
62
+ end
63
+
64
+ private
65
+
66
+ def validate_response(level)
67
+ sym = level.to_sym
68
+ RESPONSE_LEVELS.include?(sym) ? sym : :monitoring
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Defense
7
+ module ImmuneResponse
8
+ module Runners
9
+ module CognitiveImmuneResponse
10
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
11
+
12
+ def register_antigen(pattern:, antigen_type:, threat_level: 0.5, engine: nil, **)
13
+ eng = engine || default_engine
14
+ antigen = eng.register_antigen(
15
+ pattern: pattern, antigen_type: antigen_type, threat_level: threat_level
16
+ )
17
+ { success: true, antigen: antigen.to_h }
18
+ end
19
+
20
+ def encounter_antigen(antigen_id:, engine: nil, **)
21
+ eng = engine || default_engine
22
+ response = eng.encounter(antigen_id: antigen_id)
23
+ return { success: false, error: 'antigen not found' } unless response
24
+
25
+ { success: true, response: response.to_h }
26
+ end
27
+
28
+ def create_antibody(antigen_type:, signature:, immunity_level: 0.3, engine: nil, **)
29
+ eng = engine || default_engine
30
+ antibody = eng.create_antibody(
31
+ antigen_type: antigen_type, signature: signature, immunity_level: immunity_level
32
+ )
33
+ { success: true, antibody: antibody.to_h }
34
+ end
35
+
36
+ def vaccinate(antigen_type:, signature:, engine: nil, **)
37
+ eng = engine || default_engine
38
+ antibody = eng.vaccinate(antigen_type: antigen_type, signature: signature)
39
+ { success: true, antibody: antibody.to_h, vaccinated: true }
40
+ end
41
+
42
+ def escalate_threat(antigen_id:, amount: 0.1, engine: nil, **)
43
+ eng = engine || default_engine
44
+ antigen = eng.escalate_antigen(antigen_id: antigen_id, amount: amount)
45
+ return { success: false, error: 'antigen not found' } unless antigen
46
+
47
+ { success: true, antigen: antigen.to_h }
48
+ end
49
+
50
+ def de_escalate_threat(antigen_id:, amount: 0.1, engine: nil, **)
51
+ eng = engine || default_engine
52
+ antigen = eng.de_escalate_antigen(antigen_id: antigen_id, amount: amount)
53
+ return { success: false, error: 'antigen not found' } unless antigen
54
+
55
+ { success: true, antigen: antigen.to_h }
56
+ end
57
+
58
+ def immunity_for(antigen_type:, engine: nil, **)
59
+ eng = engine || default_engine
60
+ level = eng.immunity_for(antigen_type: antigen_type)
61
+ label = Helpers::Constants.label_for(Helpers::Constants::IMMUNITY_LABELS, level)
62
+ { success: true, antigen_type: antigen_type.to_sym, immunity_level: level, immunity_label: label }
63
+ end
64
+
65
+ def decay_all(engine: nil, **)
66
+ eng = engine || default_engine
67
+ result = eng.decay_all!
68
+ { success: true, **result }
69
+ end
70
+
71
+ def critical_antigens(engine: nil, **)
72
+ eng = engine || default_engine
73
+ { success: true, antigens: eng.critical_antigens.map(&:to_h) }
74
+ end
75
+
76
+ def memory_cells(engine: nil, **)
77
+ eng = engine || default_engine
78
+ { success: true, antibodies: eng.memory_cells.map(&:to_h) }
79
+ end
80
+
81
+ def most_threatening(limit: 5, engine: nil, **)
82
+ eng = engine || default_engine
83
+ { success: true, antigens: eng.most_threatening(limit: limit).map(&:to_h) }
84
+ end
85
+
86
+ def strongest_antibodies(limit: 5, engine: nil, **)
87
+ eng = engine || default_engine
88
+ { success: true, antibodies: eng.strongest_antibodies(limit: limit).map(&:to_h) }
89
+ end
90
+
91
+ def immune_report(engine: nil, **)
92
+ eng = engine || default_engine
93
+ { success: true, report: eng.immune_report }
94
+ end
95
+
96
+ def immune_status(engine: nil, **)
97
+ eng = engine || default_engine
98
+ health = eng.overall_immune_health
99
+ label = Helpers::Constants.label_for(Helpers::Constants::HEALTH_LABELS, health)
100
+ { success: true, overall_health: health, health_label: label, **eng.to_h }
101
+ end
102
+
103
+ private
104
+
105
+ def default_engine
106
+ @default_engine ||= Helpers::ImmuneEngine.new
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ 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 ImmuneResponse
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'immune_response/version'
4
+ require_relative 'immune_response/helpers/constants'
5
+ require_relative 'immune_response/helpers/antigen'
6
+ require_relative 'immune_response/helpers/antibody'
7
+ require_relative 'immune_response/helpers/immune_response'
8
+ require_relative 'immune_response/helpers/immune_engine'
9
+ require_relative 'immune_response/runners/cognitive_immune_response'
10
+ require_relative 'immune_response/client'
11
+
12
+ module Legion
13
+ module Extensions
14
+ module Agentic
15
+ module Defense
16
+ module ImmuneResponse
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/defense/immunology/helpers/constants'
4
+ require 'legion/extensions/agentic/defense/immunology/helpers/threat'
5
+ require 'legion/extensions/agentic/defense/immunology/helpers/antibody'
6
+ require 'legion/extensions/agentic/defense/immunology/helpers/immune_engine'
7
+ require 'legion/extensions/agentic/defense/immunology/runners/cognitive_immunology'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Agentic
12
+ module Defense
13
+ module Immunology
14
+ class Client
15
+ include Runners::CognitiveImmunology
16
+
17
+ def initialize(**)
18
+ @engine = Helpers::ImmuneEngine.new
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :engine
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end