pwn 0.5.668 → 0.5.669

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +15 -0
  3. data/README.md +4 -4
  4. data/documentation/AI-Integration.md +5 -3
  5. data/documentation/Agent-Tool-Registry.md +18 -14
  6. data/documentation/Configuration.md +2 -0
  7. data/documentation/Contributing.md +13 -0
  8. data/documentation/Diagrams.md +1 -1
  9. data/documentation/Home.md +4 -4
  10. data/documentation/How-PWN-Works.md +6 -6
  11. data/documentation/Persistence.md +17 -0
  12. data/documentation/Reinforcement-Learning.md +39 -39
  13. data/documentation/SDR.md +1 -1
  14. data/documentation/Sessions.md +1 -0
  15. data/documentation/Skills-Memory-Learning.md +2 -0
  16. data/documentation/What-is-PWN.md +3 -3
  17. data/documentation/diagrams/agent-tool-registry.svg +43 -43
  18. data/documentation/diagrams/ai-integration-tool-calling.svg +112 -85
  19. data/documentation/diagrams/dot/agent-tool-registry.dot +4 -4
  20. data/documentation/diagrams/dot/ai-integration-tool-calling.dot +7 -3
  21. data/documentation/diagrams/dot/memory-skills-detailed.dot +2 -2
  22. data/documentation/diagrams/dot/overall-pwn-architecture.dot +6 -4
  23. data/documentation/diagrams/dot/persistence-filesystem.dot +1 -1
  24. data/documentation/diagrams/dot/sdr-radio-flow.dot +1 -1
  25. data/documentation/diagrams/memory-skills-detailed.svg +182 -182
  26. data/documentation/diagrams/overall-pwn-architecture.svg +154 -146
  27. data/documentation/diagrams/persistence-filesystem.svg +6 -6
  28. data/documentation/diagrams/sdr-radio-flow.svg +1 -1
  29. data/documentation/pwn-ai-Agent.md +29 -13
  30. data/lib/pwn/ai/agent/loop.rb +189 -1
  31. data/lib/pwn/ai/agent/prompt_builder.rb +24 -5
  32. data/lib/pwn/ai/agent/task_summarizer.rb +40 -3
  33. data/lib/pwn/ai/agent/tools/shell.rb +32 -0
  34. data/lib/pwn/memory_index.rb +17 -2
  35. data/lib/pwn/plugins/repl.rb +36 -7
  36. data/lib/pwn/version.rb +1 -1
  37. data/spec/lib/pwn/ai/agent/loop_spec.rb +31 -0
  38. data/spec/lib/pwn/ai/agent/task_summarizer_spec.rb +10 -0
  39. data/spec/lib/pwn/ai/agent/tools/shell_spec.rb +21 -0
  40. data/spec/lib/pwn/plugins/repl_pwn_vault_spec.rb +134 -0
  41. data/third_party/pwn_rdoc.jsonl +5 -0
  42. metadata +2 -1
@@ -4,282 +4,282 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Overall_Architecture Pages: 1 -->
7
- <svg width="1504pt" height="848pt"
8
- viewBox="0.00 0.00 1504.00 848.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
7
+ <svg width="1642pt" height="848pt"
8
+ viewBox="0.00 0.00 1642.00 848.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
9
  <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 804.83)">
10
10
  <title>PWN_Overall_Architecture</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-804.83 1461.2,-804.83 1461.2,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="452.12" y="-737.73" font-family="sans-Serif" font-weight="bold" font-size="22.00" fill="#e2e8f0">PWN &#45; Offensive Security Automation Framework</text>
13
- <text xml:space="preserve" text-anchor="start" x="637" y="-726.18" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">Overall Architecture · lib/pwn/*</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-804.83 1599.2,-804.83 1599.2,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="521.12" y="-737.73" font-family="sans-Serif" font-weight="bold" font-size="22.00" fill="#e2e8f0">PWN &#45; Offensive Security Automation Framework</text>
13
+ <text xml:space="preserve" text-anchor="start" x="706" y="-726.18" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">Overall Architecture · lib/pwn/*</text>
14
14
  <g id="clust1" class="cluster">
15
15
  <title>cluster_actors</title>
16
- <path fill="#1e293b" stroke="#334155" stroke-dasharray="5,2" d="M469,-614.62C469,-614.62 1054,-614.62 1054,-614.62 1060,-614.62 1066,-620.62 1066,-626.62 1066,-626.62 1066,-700.62 1066,-700.62 1066,-706.62 1060,-712.62 1054,-712.62 1054,-712.62 469,-712.62 469,-712.62 463,-712.62 457,-706.62 457,-700.62 457,-700.62 457,-626.62 457,-626.62 457,-620.62 463,-614.62 469,-614.62"/>
17
- <text xml:space="preserve" text-anchor="middle" x="761.5" y="-687.73" font-family="sans-Serif" font-size="22.00" fill="#94a3b8">Actors</text>
16
+ <path fill="#1e293b" stroke="#334155" stroke-dasharray="5,2" d="M491,-614.62C491,-614.62 1116,-614.62 1116,-614.62 1122,-614.62 1128,-620.62 1128,-626.62 1128,-626.62 1128,-700.62 1128,-700.62 1128,-706.62 1122,-712.62 1116,-712.62 1116,-712.62 491,-712.62 491,-712.62 485,-712.62 479,-706.62 479,-700.62 479,-700.62 479,-626.62 479,-626.62 479,-620.62 485,-614.62 491,-614.62"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="803.5" y="-687.73" font-family="sans-Serif" font-size="22.00" fill="#94a3b8">Actors</text>
18
18
  </g>
19
19
  <g id="clust3" class="cluster">
20
20
  <title>cluster_entry</title>
21
- <path fill="#0c4a6e" stroke="#0369a1" stroke-width="2" d="M335,-476.62C335,-476.62 853,-476.62 853,-476.62 859,-476.62 865,-482.62 865,-488.62 865,-488.62 865,-550.12 865,-550.12 865,-556.12 859,-562.12 853,-562.12 853,-562.12 335,-562.12 335,-562.12 329,-562.12 323,-556.12 323,-550.12 323,-550.12 323,-488.62 323,-488.62 323,-482.62 329,-476.62 335,-476.62"/>
22
- <text xml:space="preserve" text-anchor="middle" x="594" y="-537.23" font-family="sans-Serif" font-size="22.00" fill="#7dd3fc">Entry Points &#160;(bin/)</text>
21
+ <path fill="#0c4a6e" stroke="#0369a1" stroke-width="2" d="M357,-476.62C357,-476.62 875,-476.62 875,-476.62 881,-476.62 887,-482.62 887,-488.62 887,-488.62 887,-550.12 887,-550.12 887,-556.12 881,-562.12 875,-562.12 875,-562.12 357,-562.12 357,-562.12 351,-562.12 345,-556.12 345,-550.12 345,-550.12 345,-488.62 345,-488.62 345,-482.62 351,-476.62 357,-476.62"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="616" y="-537.23" font-family="sans-Serif" font-size="22.00" fill="#7dd3fc">Entry Points &#160;(bin/)</text>
23
23
  </g>
24
24
  <g id="clust5" class="cluster">
25
25
  <title>cluster_agent</title>
26
- <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M312,-299.12C312,-299.12 1000,-299.12 1000,-299.12 1006,-299.12 1012,-305.12 1012,-311.12 1012,-311.12 1012,-412.12 1012,-412.12 1012,-418.12 1006,-424.12 1000,-424.12 1000,-424.12 312,-424.12 312,-424.12 306,-424.12 300,-418.12 300,-412.12 300,-412.12 300,-311.12 300,-311.12 300,-305.12 306,-299.12 312,-299.12"/>
27
- <text xml:space="preserve" text-anchor="middle" x="656" y="-399.23" font-family="sans-Serif" font-size="22.00" fill="#ddd6fe">PWN::AI::Agent</text>
26
+ <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M334,-299.12C334,-299.12 1022,-299.12 1022,-299.12 1028,-299.12 1034,-305.12 1034,-311.12 1034,-311.12 1034,-412.12 1034,-412.12 1034,-418.12 1028,-424.12 1022,-424.12 1022,-424.12 334,-424.12 334,-424.12 328,-424.12 322,-418.12 322,-412.12 322,-412.12 322,-311.12 322,-311.12 322,-305.12 328,-299.12 334,-299.12"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="678" y="-399.23" font-family="sans-Serif" font-size="22.00" fill="#ddd6fe">PWN::AI::Agent</text>
28
28
  </g>
29
29
  <g id="clust7" class="cluster">
30
30
  <title>cluster_caps</title>
31
- <path fill="#022c22" stroke="#047857" stroke-width="2" d="M207,-148.62C207,-148.62 1124,-148.62 1124,-148.62 1130,-148.62 1136,-154.62 1136,-160.62 1136,-160.62 1136,-234.62 1136,-234.62 1136,-240.62 1130,-246.62 1124,-246.62 1124,-246.62 207,-246.62 207,-246.62 201,-246.62 195,-240.62 195,-234.62 195,-234.62 195,-160.62 195,-160.62 195,-154.62 201,-148.62 207,-148.62"/>
32
- <text xml:space="preserve" text-anchor="middle" x="665.5" y="-221.72" font-family="sans-Serif" font-size="22.00" fill="#a7f3d0">Capability Namespaces &#160;(lib/pwn/*)</text>
31
+ <path fill="#022c22" stroke="#047857" stroke-width="2" d="M222,-148.62C222,-148.62 1161,-148.62 1161,-148.62 1167,-148.62 1173,-154.62 1173,-160.62 1173,-160.62 1173,-234.62 1173,-234.62 1173,-240.62 1167,-246.62 1161,-246.62 1161,-246.62 222,-246.62 222,-246.62 216,-246.62 210,-240.62 210,-234.62 210,-234.62 210,-160.62 210,-160.62 210,-154.62 216,-148.62 222,-148.62"/>
32
+ <text xml:space="preserve" text-anchor="middle" x="691.5" y="-221.72" font-family="sans-Serif" font-size="22.00" fill="#a7f3d0">Capability Namespaces &#160;(lib/pwn/*)</text>
33
33
  </g>
34
34
  <g id="clust9" class="cluster">
35
35
  <title>cluster_persist</title>
36
- <path fill="#422006" stroke="#a16207" stroke-width="2" d="M20,-8C20,-8 1398,-8 1398,-8 1404,-8 1410,-14 1410,-20 1410,-20 1410,-93.62 1410,-93.62 1410,-99.62 1404,-105.62 1398,-105.62 1398,-105.62 20,-105.62 20,-105.62 14,-105.62 8,-99.62 8,-93.62 8,-93.62 8,-20 8,-20 8,-14 14,-8 20,-8"/>
37
- <text xml:space="preserve" text-anchor="middle" x="709" y="-80.72" font-family="sans-Serif" font-size="22.00" fill="#fde68a">Persistence &#160;~/.pwn/</text>
36
+ <path fill="#422006" stroke="#a16207" stroke-width="2" d="M20,-8C20,-8 1536,-8 1536,-8 1542,-8 1548,-14 1548,-20 1548,-20 1548,-93.62 1548,-93.62 1548,-99.62 1542,-105.62 1536,-105.62 1536,-105.62 20,-105.62 20,-105.62 14,-105.62 8,-99.62 8,-93.62 8,-93.62 8,-20 8,-20 8,-14 14,-8 20,-8"/>
37
+ <text xml:space="preserve" text-anchor="middle" x="778" y="-80.72" font-family="sans-Serif" font-size="22.00" fill="#fde68a">Persistence &#160;~/.pwn/</text>
38
38
  </g>
39
39
  <!-- User -->
40
40
  <g id="node1" class="node">
41
41
  <title>User</title>
42
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M583,-664.88C583,-664.88 477,-664.88 477,-664.88 471,-664.88 465,-658.88 465,-652.88 465,-652.88 465,-640.88 465,-640.88 465,-634.88 471,-628.88 477,-628.88 477,-628.88 583,-628.88 583,-628.88 589,-628.88 595,-634.88 595,-640.88 595,-640.88 595,-652.88 595,-652.88 595,-658.88 589,-664.88 583,-664.88"/>
43
- <text xml:space="preserve" text-anchor="middle" x="530" y="-649.92" font-family="sans-Serif" font-size="11.00" fill="#0f172a">👤 &#160;Researcher</text>
44
- <text xml:space="preserve" text-anchor="middle" x="530" y="-636.42" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Red Team · Bug Hunter</text>
42
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M605,-664.88C605,-664.88 499,-664.88 499,-664.88 493,-664.88 487,-658.88 487,-652.88 487,-652.88 487,-640.88 487,-640.88 487,-634.88 493,-628.88 499,-628.88 499,-628.88 605,-628.88 605,-628.88 611,-628.88 617,-634.88 617,-640.88 617,-640.88 617,-652.88 617,-652.88 617,-658.88 611,-664.88 605,-664.88"/>
43
+ <text xml:space="preserve" text-anchor="middle" x="552" y="-649.92" font-family="sans-Serif" font-size="11.00" fill="#0f172a">👤 &#160;Researcher</text>
44
+ <text xml:space="preserve" text-anchor="middle" x="552" y="-636.42" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Red Team · Bug Hunter</text>
45
45
  </g>
46
46
  <!-- REPL -->
47
47
  <g id="node5" class="node">
48
48
  <title>REPL</title>
49
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M435.25,-520.62C435.25,-520.62 342.75,-520.62 342.75,-520.62 336.75,-520.62 330.75,-514.62 330.75,-508.62 330.75,-508.62 330.75,-496.62 330.75,-496.62 330.75,-490.62 336.75,-484.62 342.75,-484.62 342.75,-484.62 435.25,-484.62 435.25,-484.62 441.25,-484.62 447.25,-490.62 447.25,-496.62 447.25,-496.62 447.25,-508.62 447.25,-508.62 447.25,-514.62 441.25,-520.62 435.25,-520.62"/>
50
- <text xml:space="preserve" text-anchor="middle" x="389" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">🐚 &#160;pwn REPL</text>
51
- <text xml:space="preserve" text-anchor="middle" x="389" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Pry + PWN:: preload</text>
49
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M457.25,-520.62C457.25,-520.62 364.75,-520.62 364.75,-520.62 358.75,-520.62 352.75,-514.62 352.75,-508.62 352.75,-508.62 352.75,-496.62 352.75,-496.62 352.75,-490.62 358.75,-484.62 364.75,-484.62 364.75,-484.62 457.25,-484.62 457.25,-484.62 463.25,-484.62 469.25,-490.62 469.25,-496.62 469.25,-496.62 469.25,-508.62 469.25,-508.62 469.25,-514.62 463.25,-520.62 457.25,-520.62"/>
50
+ <text xml:space="preserve" text-anchor="middle" x="411" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">🐚 &#160;pwn REPL</text>
51
+ <text xml:space="preserve" text-anchor="middle" x="411" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Pry + PWN:: preload</text>
52
52
  </g>
53
53
  <!-- User&#45;&gt;REPL -->
54
54
  <g id="edge1" class="edge">
55
55
  <title>User&#45;&gt;REPL</title>
56
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M512.71,-628.43C487.76,-603.26 441.56,-556.65 413.23,-528.07"/>
57
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="415.44,-526.32 407.82,-522.61 411.46,-530.26 415.44,-526.32"/>
56
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M534.71,-628.43C509.76,-603.26 463.56,-556.65 435.23,-528.07"/>
57
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="437.44,-526.32 429.82,-522.61 433.46,-530.26 437.44,-526.32"/>
58
58
  </g>
59
59
  <!-- PwnAI -->
60
60
  <g id="node6" class="node">
61
61
  <title>PwnAI</title>
62
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M588.75,-520.62C588.75,-520.62 499.25,-520.62 499.25,-520.62 493.25,-520.62 487.25,-514.62 487.25,-508.62 487.25,-508.62 487.25,-496.62 487.25,-496.62 487.25,-490.62 493.25,-484.62 499.25,-484.62 499.25,-484.62 588.75,-484.62 588.75,-484.62 594.75,-484.62 600.75,-490.62 600.75,-496.62 600.75,-496.62 600.75,-508.62 600.75,-508.62 600.75,-514.62 594.75,-520.62 588.75,-520.62"/>
63
- <text xml:space="preserve" text-anchor="middle" x="544" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">✨ &#160;pwn&#45;ai</text>
64
- <text xml:space="preserve" text-anchor="middle" x="544" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Agent TUI · pwn &#45;&#45;ai</text>
62
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M610.75,-520.62C610.75,-520.62 521.25,-520.62 521.25,-520.62 515.25,-520.62 509.25,-514.62 509.25,-508.62 509.25,-508.62 509.25,-496.62 509.25,-496.62 509.25,-490.62 515.25,-484.62 521.25,-484.62 521.25,-484.62 610.75,-484.62 610.75,-484.62 616.75,-484.62 622.75,-490.62 622.75,-496.62 622.75,-496.62 622.75,-508.62 622.75,-508.62 622.75,-514.62 616.75,-520.62 610.75,-520.62"/>
63
+ <text xml:space="preserve" text-anchor="middle" x="566" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">✨ &#160;pwn&#45;ai</text>
64
+ <text xml:space="preserve" text-anchor="middle" x="566" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Agent TUI · pwn &#45;&#45;ai</text>
65
65
  </g>
66
66
  <!-- User&#45;&gt;PwnAI -->
67
67
  <g id="edge2" class="edge">
68
68
  <title>User&#45;&gt;PwnAI</title>
69
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M531.72,-628.43C534.11,-604.12 538.47,-559.79 541.3,-531.03"/>
70
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="544.08,-531.4 542.08,-523.17 538.51,-530.86 544.08,-531.4"/>
69
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M553.72,-628.43C556.11,-604.12 560.47,-559.79 563.3,-531.03"/>
70
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="566.08,-531.4 564.08,-523.17 560.51,-530.86 566.08,-531.4"/>
71
71
  </g>
72
72
  <!-- CI -->
73
73
  <g id="node2" class="node">
74
74
  <title>CI</title>
75
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M729,-664.88C729,-664.88 647,-664.88 647,-664.88 641,-664.88 635,-658.88 635,-652.88 635,-652.88 635,-640.88 635,-640.88 635,-634.88 641,-628.88 647,-628.88 647,-628.88 729,-628.88 729,-628.88 735,-628.88 741,-634.88 741,-640.88 741,-640.88 741,-652.88 741,-652.88 741,-658.88 735,-664.88 729,-664.88"/>
76
- <text xml:space="preserve" text-anchor="middle" x="688" y="-649.92" font-family="sans-Serif" font-size="11.00" fill="#0f172a">⚙️ &#160;CI / CD</text>
77
- <text xml:space="preserve" text-anchor="middle" x="688" y="-636.42" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Headless pipelines</text>
75
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M751,-664.88C751,-664.88 669,-664.88 669,-664.88 663,-664.88 657,-658.88 657,-652.88 657,-652.88 657,-640.88 657,-640.88 657,-634.88 663,-628.88 669,-628.88 669,-628.88 751,-628.88 751,-628.88 757,-628.88 763,-634.88 763,-640.88 763,-640.88 763,-652.88 763,-652.88 763,-658.88 757,-664.88 751,-664.88"/>
76
+ <text xml:space="preserve" text-anchor="middle" x="710" y="-649.92" font-family="sans-Serif" font-size="11.00" fill="#0f172a">⚙️ &#160;CI / CD</text>
77
+ <text xml:space="preserve" text-anchor="middle" x="710" y="-636.42" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Headless pipelines</text>
78
78
  </g>
79
79
  <!-- CLI -->
80
80
  <g id="node7" class="node">
81
81
  <title>CLI</title>
82
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M712.75,-520.62C712.75,-520.62 653.25,-520.62 653.25,-520.62 647.25,-520.62 641.25,-514.62 641.25,-508.62 641.25,-508.62 641.25,-496.62 641.25,-496.62 641.25,-490.62 647.25,-484.62 653.25,-484.62 653.25,-484.62 712.75,-484.62 712.75,-484.62 718.75,-484.62 724.75,-490.62 724.75,-496.62 724.75,-496.62 724.75,-508.62 724.75,-508.62 724.75,-514.62 718.75,-520.62 712.75,-520.62"/>
83
- <text xml:space="preserve" text-anchor="middle" x="683" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">📜 &#160;bin/pwn_*</text>
84
- <text xml:space="preserve" text-anchor="middle" x="683" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">53 CLI drivers</text>
82
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M734.75,-520.62C734.75,-520.62 675.25,-520.62 675.25,-520.62 669.25,-520.62 663.25,-514.62 663.25,-508.62 663.25,-508.62 663.25,-496.62 663.25,-496.62 663.25,-490.62 669.25,-484.62 675.25,-484.62 675.25,-484.62 734.75,-484.62 734.75,-484.62 740.75,-484.62 746.75,-490.62 746.75,-496.62 746.75,-496.62 746.75,-508.62 746.75,-508.62 746.75,-514.62 740.75,-520.62 734.75,-520.62"/>
83
+ <text xml:space="preserve" text-anchor="middle" x="705" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">📜 &#160;bin/pwn_*</text>
84
+ <text xml:space="preserve" text-anchor="middle" x="705" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">53 CLI drivers</text>
85
85
  </g>
86
86
  <!-- CI&#45;&gt;CLI -->
87
87
  <g id="edge3" class="edge">
88
88
  <title>CI&#45;&gt;CLI</title>
89
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M687.39,-628.43C686.53,-604.12 684.97,-559.79 683.96,-531.03"/>
90
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="686.77,-531.07 683.69,-523.18 681.17,-531.27 686.77,-531.07"/>
89
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M709.39,-628.43C708.53,-604.12 706.97,-559.79 705.96,-531.03"/>
90
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="708.77,-531.07 705.69,-523.18 703.17,-531.27 708.77,-531.07"/>
91
91
  </g>
92
92
  <!-- Cronb -->
93
93
  <g id="node8" class="node">
94
94
  <title>Cronb</title>
95
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M844.88,-520.62C844.88,-520.62 777.12,-520.62 777.12,-520.62 771.12,-520.62 765.12,-514.62 765.12,-508.62 765.12,-508.62 765.12,-496.62 765.12,-496.62 765.12,-490.62 771.12,-484.62 777.12,-484.62 777.12,-484.62 844.88,-484.62 844.88,-484.62 850.88,-484.62 856.88,-490.62 856.88,-496.62 856.88,-496.62 856.88,-508.62 856.88,-508.62 856.88,-514.62 850.88,-520.62 844.88,-520.62"/>
96
- <text xml:space="preserve" text-anchor="middle" x="811" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">⏱ &#160;PWN::Cron</text>
97
- <text xml:space="preserve" text-anchor="middle" x="811" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Scheduled jobs</text>
95
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M866.88,-520.62C866.88,-520.62 799.12,-520.62 799.12,-520.62 793.12,-520.62 787.12,-514.62 787.12,-508.62 787.12,-508.62 787.12,-496.62 787.12,-496.62 787.12,-490.62 793.12,-484.62 799.12,-484.62 799.12,-484.62 866.88,-484.62 866.88,-484.62 872.88,-484.62 878.88,-490.62 878.88,-496.62 878.88,-496.62 878.88,-508.62 878.88,-508.62 878.88,-514.62 872.88,-520.62 866.88,-520.62"/>
96
+ <text xml:space="preserve" text-anchor="middle" x="833" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">⏱ &#160;PWN::Cron</text>
97
+ <text xml:space="preserve" text-anchor="middle" x="833" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Scheduled jobs</text>
98
98
  </g>
99
99
  <!-- CI&#45;&gt;Cronb -->
100
100
  <g id="edge4" class="edge">
101
101
  <title>CI&#45;&gt;Cronb</title>
102
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M703.08,-628.43C724.75,-603.37 764.81,-557.05 789.55,-528.43"/>
103
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="791.39,-530.58 794.51,-522.7 787.16,-526.92 791.39,-530.58"/>
104
- <text xml:space="preserve" text-anchor="middle" x="768.56" y="-572.08" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">crontab</text>
102
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M725.08,-628.43C746.75,-603.37 786.81,-557.05 811.55,-528.43"/>
103
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="813.39,-530.58 816.51,-522.7 809.16,-526.92 813.39,-530.58"/>
104
+ <text xml:space="preserve" text-anchor="middle" x="790.56" y="-572.08" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">crontab</text>
105
105
  </g>
106
106
  <!-- LLM -->
107
107
  <g id="node3" class="node">
108
108
  <title>LLM</title>
109
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M893.38,-671.12C893.38,-671.12 792.62,-671.12 792.62,-671.12 786.62,-671.12 780.62,-665.12 780.62,-659.12 780.62,-659.12 780.62,-634.62 780.62,-634.62 780.62,-628.62 786.62,-622.62 792.62,-622.62 792.62,-622.62 893.38,-622.62 893.38,-622.62 899.38,-622.62 905.38,-628.62 905.38,-634.62 905.38,-634.62 905.38,-659.12 905.38,-659.12 905.38,-665.12 899.38,-671.12 893.38,-671.12"/>
110
- <text xml:space="preserve" text-anchor="middle" x="843" y="-656.67" font-family="sans-Serif" font-size="11.00" fill="#0f172a">🤖 &#160;LLM Providers</text>
111
- <text xml:space="preserve" text-anchor="middle" x="843" y="-643.17" font-family="sans-Serif" font-size="11.00" fill="#0f172a">OpenAI · Anthropic</text>
112
- <text xml:space="preserve" text-anchor="middle" x="843" y="-629.67" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Grok · Gemini · Ollama</text>
109
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M955.25,-671.12C955.25,-671.12 814.75,-671.12 814.75,-671.12 808.75,-671.12 802.75,-665.12 802.75,-659.12 802.75,-659.12 802.75,-634.62 802.75,-634.62 802.75,-628.62 808.75,-622.62 814.75,-622.62 814.75,-622.62 955.25,-622.62 955.25,-622.62 961.25,-622.62 967.25,-628.62 967.25,-634.62 967.25,-634.62 967.25,-659.12 967.25,-659.12 967.25,-665.12 961.25,-671.12 955.25,-671.12"/>
110
+ <text xml:space="preserve" text-anchor="middle" x="885" y="-656.67" font-family="sans-Serif" font-size="11.00" fill="#0f172a">🤖 &#160;LLM Providers</text>
111
+ <text xml:space="preserve" text-anchor="middle" x="885" y="-643.17" font-family="sans-Serif" font-size="11.00" fill="#0f172a">OpenAI · Anthropic · Grok</text>
112
+ <text xml:space="preserve" text-anchor="middle" x="885" y="-629.67" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Gemini · Ollama · Open WebUI</text>
113
113
  </g>
114
114
  <!-- Target -->
115
115
  <g id="node4" class="node">
116
116
  <title>Target</title>
117
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M1046.38,-671.12C1046.38,-671.12 957.62,-671.12 957.62,-671.12 951.62,-671.12 945.62,-665.12 945.62,-659.12 945.62,-659.12 945.62,-634.62 945.62,-634.62 945.62,-628.62 951.62,-622.62 957.62,-622.62 957.62,-622.62 1046.38,-622.62 1046.38,-622.62 1052.38,-622.62 1058.38,-628.62 1058.38,-634.62 1058.38,-634.62 1058.38,-659.12 1058.38,-659.12 1058.38,-665.12 1052.38,-671.12 1046.38,-671.12"/>
118
- <text xml:space="preserve" text-anchor="middle" x="1002" y="-656.67" font-family="sans-Serif" font-size="11.00" fill="#0f172a">🎯 &#160;Attack Surface</text>
119
- <text xml:space="preserve" text-anchor="middle" x="1002" y="-643.17" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Hosts · Web · Cloud</text>
120
- <text xml:space="preserve" text-anchor="middle" x="1002" y="-629.67" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Radio · Hardware</text>
117
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M1108.38,-671.12C1108.38,-671.12 1019.62,-671.12 1019.62,-671.12 1013.62,-671.12 1007.62,-665.12 1007.62,-659.12 1007.62,-659.12 1007.62,-634.62 1007.62,-634.62 1007.62,-628.62 1013.62,-622.62 1019.62,-622.62 1019.62,-622.62 1108.38,-622.62 1108.38,-622.62 1114.38,-622.62 1120.38,-628.62 1120.38,-634.62 1120.38,-634.62 1120.38,-659.12 1120.38,-659.12 1120.38,-665.12 1114.38,-671.12 1108.38,-671.12"/>
118
+ <text xml:space="preserve" text-anchor="middle" x="1064" y="-656.67" font-family="sans-Serif" font-size="11.00" fill="#0f172a">🎯 &#160;Attack Surface</text>
119
+ <text xml:space="preserve" text-anchor="middle" x="1064" y="-643.17" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Hosts · Web · Cloud</text>
120
+ <text xml:space="preserve" text-anchor="middle" x="1064" y="-629.67" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Radio · Hardware</text>
121
121
  </g>
122
122
  <!-- Loop -->
123
123
  <g id="node9" class="node">
124
124
  <title>Loop</title>
125
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M421.75,-382.62C421.75,-382.62 320.25,-382.62 320.25,-382.62 314.25,-382.62 308.25,-376.62 308.25,-370.62 308.25,-370.62 308.25,-319.12 308.25,-319.12 308.25,-313.12 314.25,-307.12 320.25,-307.12 320.25,-307.12 421.75,-307.12 421.75,-307.12 427.75,-307.12 433.75,-313.12 433.75,-319.12 433.75,-319.12 433.75,-370.62 433.75,-370.62 433.75,-376.62 427.75,-382.62 421.75,-382.62"/>
126
- <text xml:space="preserve" text-anchor="middle" x="371" y="-368.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Loop</text>
127
- <text xml:space="preserve" text-anchor="middle" x="371" y="-354.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">TaskSummarizer briefs</text>
128
- <text xml:space="preserve" text-anchor="middle" x="371" y="-341.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">plan_first → dispatch</text>
129
- <text xml:space="preserve" text-anchor="middle" x="371" y="-327.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ observe → escalate</text>
130
- <text xml:space="preserve" text-anchor="middle" x="371" y="-314.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">budget&#45;pressure caps</text>
125
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M443.75,-382.62C443.75,-382.62 342.25,-382.62 342.25,-382.62 336.25,-382.62 330.25,-376.62 330.25,-370.62 330.25,-370.62 330.25,-319.12 330.25,-319.12 330.25,-313.12 336.25,-307.12 342.25,-307.12 342.25,-307.12 443.75,-307.12 443.75,-307.12 449.75,-307.12 455.75,-313.12 455.75,-319.12 455.75,-319.12 455.75,-370.62 455.75,-370.62 455.75,-376.62 449.75,-382.62 443.75,-382.62"/>
126
+ <text xml:space="preserve" text-anchor="middle" x="393" y="-368.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Loop</text>
127
+ <text xml:space="preserve" text-anchor="middle" x="393" y="-354.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">TaskSummarizer briefs</text>
128
+ <text xml:space="preserve" text-anchor="middle" x="393" y="-341.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">plan_first → dispatch</text>
129
+ <text xml:space="preserve" text-anchor="middle" x="393" y="-327.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ observe → escalate</text>
130
+ <text xml:space="preserve" text-anchor="middle" x="393" y="-314.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">budget&#45;pressure caps</text>
131
131
  </g>
132
132
  <!-- REPL&#45;&gt;Loop -->
133
133
  <g id="edge5" class="edge">
134
134
  <title>REPL&#45;&gt;Loop</title>
135
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M386.97,-484.06C384.43,-462.09 379.99,-423.63 376.43,-392.85"/>
136
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="379.24,-392.74 375.54,-385.12 373.67,-393.38 379.24,-392.74"/>
135
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M408.97,-484.06C406.43,-462.09 401.99,-423.63 398.43,-392.85"/>
136
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="401.24,-392.74 397.54,-385.12 395.67,-393.38 401.24,-392.74"/>
137
137
  </g>
138
138
  <!-- PwnAI&#45;&gt;Loop -->
139
139
  <g id="edge6" class="edge">
140
140
  <title>PwnAI&#45;&gt;Loop</title>
141
- <path fill="none" stroke="#a78bfa" stroke-width="2" d="M518.02,-484.06C502,-472.84 481.34,-457.62 464.25,-442.62 446.17,-426.75 427.52,-407.97 411.7,-391.2"/>
142
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="413.75,-389.29 406.24,-385.36 409.66,-393.11 413.75,-389.29"/>
143
- <text xml:space="preserve" text-anchor="middle" x="499.12" y="-434.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">natural language</text>
141
+ <path fill="none" stroke="#a78bfa" stroke-width="2" d="M540.02,-484.06C524,-472.84 503.34,-457.62 486.25,-442.62 468.17,-426.75 449.52,-407.97 433.7,-391.2"/>
142
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="435.75,-389.29 428.24,-385.36 431.66,-393.11 435.75,-389.29"/>
143
+ <text xml:space="preserve" text-anchor="middle" x="521.12" y="-434.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">natural language</text>
144
144
  </g>
145
145
  <!-- Registry -->
146
146
  <g id="node10" class="node">
147
147
  <title>Registry</title>
148
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M601.88,-369.12C601.88,-369.12 486.12,-369.12 486.12,-369.12 480.12,-369.12 474.12,-363.12 474.12,-357.12 474.12,-357.12 474.12,-332.62 474.12,-332.62 474.12,-326.62 480.12,-320.62 486.12,-320.62 486.12,-320.62 601.88,-320.62 601.88,-320.62 607.88,-320.62 613.88,-326.62 613.88,-332.62 613.88,-332.62 613.88,-357.12 613.88,-357.12 613.88,-363.12 607.88,-369.12 601.88,-369.12"/>
149
- <text xml:space="preserve" text-anchor="middle" x="544" y="-354.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Registry</text>
150
- <text xml:space="preserve" text-anchor="middle" x="544" y="-341.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">12 toolsets · 78 tools</text>
151
- <text xml:space="preserve" text-anchor="middle" x="544" y="-327.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">tool_router (CORE+topK)</text>
148
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M623.88,-369.12C623.88,-369.12 508.12,-369.12 508.12,-369.12 502.12,-369.12 496.12,-363.12 496.12,-357.12 496.12,-357.12 496.12,-332.62 496.12,-332.62 496.12,-326.62 502.12,-320.62 508.12,-320.62 508.12,-320.62 623.88,-320.62 623.88,-320.62 629.88,-320.62 635.88,-326.62 635.88,-332.62 635.88,-332.62 635.88,-357.12 635.88,-357.12 635.88,-363.12 629.88,-369.12 623.88,-369.12"/>
149
+ <text xml:space="preserve" text-anchor="middle" x="566" y="-354.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Registry</text>
150
+ <text xml:space="preserve" text-anchor="middle" x="566" y="-341.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">12 toolsets · 82 tools</text>
151
+ <text xml:space="preserve" text-anchor="middle" x="566" y="-327.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">tool_router (CORE+topK)</text>
152
152
  </g>
153
153
  <!-- PwnAI&#45;&gt;Registry -->
154
154
  <g id="edge7" class="edge">
155
155
  <title>PwnAI&#45;&gt;Registry</title>
156
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M544,-484.06C544,-458.79 544,-411.69 544,-379.58"/>
157
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="546.8,-379.69 544,-371.69 541.2,-379.69 546.8,-379.69"/>
156
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M566,-484.06C566,-458.79 566,-411.69 566,-379.58"/>
157
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="568.8,-379.69 566,-371.69 563.2,-379.69 568.8,-379.69"/>
158
158
  </g>
159
159
  <!-- Swarm -->
160
160
  <g id="node11" class="node">
161
161
  <title>Swarm</title>
162
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M770.25,-362.88C770.25,-362.88 665.75,-362.88 665.75,-362.88 659.75,-362.88 653.75,-356.88 653.75,-350.88 653.75,-350.88 653.75,-338.88 653.75,-338.88 653.75,-332.88 659.75,-326.88 665.75,-326.88 665.75,-326.88 770.25,-326.88 770.25,-326.88 776.25,-326.88 782.25,-332.88 782.25,-338.88 782.25,-338.88 782.25,-350.88 782.25,-350.88 782.25,-356.88 776.25,-362.88 770.25,-362.88"/>
163
- <text xml:space="preserve" text-anchor="middle" x="718" y="-347.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Swarm</text>
164
- <text xml:space="preserve" text-anchor="middle" x="718" y="-334.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">personas · debate · bus</text>
162
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M792.25,-362.88C792.25,-362.88 687.75,-362.88 687.75,-362.88 681.75,-362.88 675.75,-356.88 675.75,-350.88 675.75,-350.88 675.75,-338.88 675.75,-338.88 675.75,-332.88 681.75,-326.88 687.75,-326.88 687.75,-326.88 792.25,-326.88 792.25,-326.88 798.25,-326.88 804.25,-332.88 804.25,-338.88 804.25,-338.88 804.25,-350.88 804.25,-350.88 804.25,-356.88 798.25,-362.88 792.25,-362.88"/>
163
+ <text xml:space="preserve" text-anchor="middle" x="740" y="-347.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Swarm</text>
164
+ <text xml:space="preserve" text-anchor="middle" x="740" y="-334.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">personas · debate · bus</text>
165
165
  </g>
166
166
  <!-- CLI&#45;&gt;Swarm -->
167
167
  <!-- Plugins -->
168
168
  <g id="node13" class="node">
169
169
  <title>Plugins</title>
170
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M262.75,-198.88C262.75,-198.88 215.25,-198.88 215.25,-198.88 209.25,-198.88 203.25,-192.88 203.25,-186.88 203.25,-186.88 203.25,-174.88 203.25,-174.88 203.25,-168.88 209.25,-162.88 215.25,-162.88 215.25,-162.88 262.75,-162.88 262.75,-162.88 268.75,-162.88 274.75,-168.88 274.75,-174.88 274.75,-174.88 274.75,-186.88 274.75,-186.88 274.75,-192.88 268.75,-198.88 262.75,-198.88"/>
171
- <text xml:space="preserve" text-anchor="middle" x="239" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Plugins</text>
172
- <text xml:space="preserve" text-anchor="middle" x="239" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">66 modules</text>
170
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M277.75,-198.88C277.75,-198.88 230.25,-198.88 230.25,-198.88 224.25,-198.88 218.25,-192.88 218.25,-186.88 218.25,-186.88 218.25,-174.88 218.25,-174.88 218.25,-168.88 224.25,-162.88 230.25,-162.88 230.25,-162.88 277.75,-162.88 277.75,-162.88 283.75,-162.88 289.75,-168.88 289.75,-174.88 289.75,-174.88 289.75,-186.88 289.75,-186.88 289.75,-192.88 283.75,-198.88 277.75,-198.88"/>
171
+ <text xml:space="preserve" text-anchor="middle" x="254" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Plugins</text>
172
+ <text xml:space="preserve" text-anchor="middle" x="254" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">66 modules</text>
173
173
  </g>
174
174
  <!-- CLI&#45;&gt;Plugins -->
175
175
  <g id="edge18" class="edge">
176
176
  <title>CLI&#45;&gt;Plugins</title>
177
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M723.64,-483.98C730.68,-481.29 737.99,-478.71 745,-476.62 842.27,-447.63 869.01,-449.59 969,-432.12 980.73,-430.08 1014.23,-433.15 1022,-424.12 1058.23,-382.01 1059.84,-339.8 1022,-299.12 994.42,-269.48 331.2,-264.78 295,-246.62 277.79,-237.99 263.65,-221.51 253.89,-207.34"/>
178
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="256.46,-206.14 249.73,-200.98 251.77,-209.21 256.46,-206.14"/>
177
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M745.64,-483.98C752.68,-481.29 759.99,-478.71 767,-476.62 864.27,-447.63 891.01,-449.59 991,-432.12 1002.73,-430.08 1036.23,-433.15 1044,-424.12 1080.23,-382.01 1081.86,-339.79 1044,-299.12 1030.07,-284.16 328.27,-255.78 310,-246.62 292.78,-238 278.65,-221.52 268.89,-207.34"/>
178
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="271.45,-206.15 264.73,-200.99 266.77,-209.21 271.45,-206.15"/>
179
179
  </g>
180
180
  <!-- Prompt -->
181
181
  <g id="node12" class="node">
182
182
  <title>Prompt</title>
183
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M991.88,-369.12C991.88,-369.12 834.12,-369.12 834.12,-369.12 828.12,-369.12 822.12,-363.12 822.12,-357.12 822.12,-357.12 822.12,-332.62 822.12,-332.62 822.12,-326.62 828.12,-320.62 834.12,-320.62 834.12,-320.62 991.88,-320.62 991.88,-320.62 997.88,-320.62 1003.88,-326.62 1003.88,-332.62 1003.88,-332.62 1003.88,-357.12 1003.88,-357.12 1003.88,-363.12 997.88,-369.12 991.88,-369.12"/>
184
- <text xml:space="preserve" text-anchor="middle" x="913" y="-354.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PromptBuilder</text>
185
- <text xml:space="preserve" text-anchor="middle" x="913" y="-341.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">engine&#45;budgeted blocks</text>
186
- <text xml:space="preserve" text-anchor="middle" x="913" y="-327.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">MemoryIndex → relevance&#45;ranked</text>
183
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1013.88,-369.12C1013.88,-369.12 856.12,-369.12 856.12,-369.12 850.12,-369.12 844.12,-363.12 844.12,-357.12 844.12,-357.12 844.12,-332.62 844.12,-332.62 844.12,-326.62 850.12,-320.62 856.12,-320.62 856.12,-320.62 1013.88,-320.62 1013.88,-320.62 1019.88,-320.62 1025.88,-326.62 1025.88,-332.62 1025.88,-332.62 1025.88,-357.12 1025.88,-357.12 1025.88,-363.12 1019.88,-369.12 1013.88,-369.12"/>
184
+ <text xml:space="preserve" text-anchor="middle" x="935" y="-354.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PromptBuilder</text>
185
+ <text xml:space="preserve" text-anchor="middle" x="935" y="-341.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">engine&#45;budgeted blocks</text>
186
+ <text xml:space="preserve" text-anchor="middle" x="935" y="-327.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">MemoryIndex → relevance&#45;ranked</text>
187
187
  </g>
188
188
  <!-- Cronb&#45;&gt;Prompt -->
189
189
  <!-- Loop&#45;&gt;LLM -->
190
- <g id="edge28" class="edge">
190
+ <g id="edge29" class="edge">
191
191
  <title>Loop&#45;&gt;LLM</title>
192
- <path fill="none" stroke="#c4b5fd" stroke-width="2" d="M400.65,-383.26C415.02,-398.63 433.59,-414.95 454,-424.12 472.31,-432.35 524.05,-429.9 544,-432.12 617.76,-440.36 826.14,-420.76 875,-476.62 907.98,-514.34 884.09,-575.17 863.64,-612.72"/>
193
- <polygon fill="#c4b5fd" stroke="#c4b5fd" stroke-width="2" points="861.27,-611.21 859.77,-619.56 866.15,-613.97 861.27,-611.21"/>
194
- <text xml:space="preserve" text-anchor="middle" x="916.07" y="-499.32" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">tool&#45;use API</text>
192
+ <path fill="none" stroke="#c4b5fd" stroke-width="2" d="M422.65,-383.26C437.02,-398.63 455.59,-414.95 476,-424.12 494.31,-432.35 546.05,-429.9 566,-432.12 639.76,-440.36 848.14,-420.76 897,-476.62 929.35,-513.61 914.44,-574.26 900.13,-612.03"/>
193
+ <polygon fill="#c4b5fd" stroke="#c4b5fd" stroke-width="2" points="897.63,-610.76 897.27,-619.23 902.83,-612.83 897.63,-610.76"/>
194
+ <text xml:space="preserve" text-anchor="middle" x="941.08" y="-499.32" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">tool&#45;use API</text>
195
195
  </g>
196
196
  <!-- Loop&#45;&gt;Plugins -->
197
197
  <g id="edge10" class="edge">
198
198
  <title>Loop&#45;&gt;Plugins</title>
199
- <path fill="none" stroke="#34d399" stroke-width="2" d="M340.3,-306.67C329.51,-293.56 317.32,-278.71 306.25,-265.12 290.7,-246.05 273.24,-224.42 260,-207.99"/>
200
- <polygon fill="#34d399" stroke="#34d399" stroke-width="2" points="262.22,-206.28 255.02,-201.81 257.86,-209.8 262.22,-206.28"/>
201
- <text xml:space="preserve" text-anchor="middle" x="326.12" y="-256.57" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">pwn_eval</text>
199
+ <path fill="none" stroke="#34d399" stroke-width="2" d="M360.35,-306.73C348.89,-293.63 335.95,-278.76 324.25,-265.12 307.78,-245.94 289.36,-224.09 275.51,-207.59"/>
200
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="2" points="277.95,-206.14 270.66,-201.81 273.66,-209.74 277.95,-206.14"/>
201
+ <text xml:space="preserve" text-anchor="middle" x="344.12" y="-256.57" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">pwn_eval</text>
202
202
  </g>
203
203
  <!-- SAST -->
204
204
  <g id="node14" class="node">
205
205
  <title>SAST</title>
206
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M357.12,-198.88C357.12,-198.88 326.88,-198.88 326.88,-198.88 320.88,-198.88 314.88,-192.88 314.88,-186.88 314.88,-186.88 314.88,-174.88 314.88,-174.88 314.88,-168.88 320.88,-162.88 326.88,-162.88 326.88,-162.88 357.12,-162.88 357.12,-162.88 363.12,-162.88 369.12,-168.88 369.12,-174.88 369.12,-174.88 369.12,-186.88 369.12,-186.88 369.12,-192.88 363.12,-198.88 357.12,-198.88"/>
207
- <text xml:space="preserve" text-anchor="middle" x="342" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">SAST</text>
208
- <text xml:space="preserve" text-anchor="middle" x="342" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">48 rules</text>
206
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M372.12,-198.88C372.12,-198.88 341.88,-198.88 341.88,-198.88 335.88,-198.88 329.88,-192.88 329.88,-186.88 329.88,-186.88 329.88,-174.88 329.88,-174.88 329.88,-168.88 335.88,-162.88 341.88,-162.88 341.88,-162.88 372.12,-162.88 372.12,-162.88 378.12,-162.88 384.12,-168.88 384.12,-174.88 384.12,-174.88 384.12,-186.88 384.12,-186.88 384.12,-192.88 378.12,-198.88 372.12,-198.88"/>
207
+ <text xml:space="preserve" text-anchor="middle" x="357" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">SAST</text>
208
+ <text xml:space="preserve" text-anchor="middle" x="357" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">48 rules</text>
209
209
  </g>
210
210
  <!-- Loop&#45;&gt;SAST -->
211
211
  <g id="edge11" class="edge">
212
212
  <title>Loop&#45;&gt;SAST</title>
213
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M364.35,-306.71C359.01,-276.89 351.64,-235.73 346.85,-208.96"/>
214
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="349.66,-208.78 345.49,-201.39 344.15,-209.76 349.66,-208.78"/>
213
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M384.74,-306.71C378.11,-276.89 368.97,-235.73 363.02,-208.96"/>
214
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="365.8,-208.58 361.33,-201.38 360.34,-209.8 365.8,-208.58"/>
215
215
  </g>
216
216
  <!-- WWW -->
217
217
  <g id="node15" class="node">
218
218
  <title>WWW</title>
219
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M480.38,-198.88C480.38,-198.88 421.62,-198.88 421.62,-198.88 415.62,-198.88 409.62,-192.88 409.62,-186.88 409.62,-186.88 409.62,-174.88 409.62,-174.88 409.62,-168.88 415.62,-162.88 421.62,-162.88 421.62,-162.88 480.38,-162.88 480.38,-162.88 486.38,-162.88 492.38,-168.88 492.38,-174.88 492.38,-174.88 492.38,-186.88 492.38,-186.88 492.38,-192.88 486.38,-198.88 480.38,-198.88"/>
220
- <text xml:space="preserve" text-anchor="middle" x="451" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">WWW</text>
221
- <text xml:space="preserve" text-anchor="middle" x="451" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">21 site drivers</text>
219
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M495.38,-198.88C495.38,-198.88 436.62,-198.88 436.62,-198.88 430.62,-198.88 424.62,-192.88 424.62,-186.88 424.62,-186.88 424.62,-174.88 424.62,-174.88 424.62,-168.88 430.62,-162.88 436.62,-162.88 436.62,-162.88 495.38,-162.88 495.38,-162.88 501.38,-162.88 507.38,-168.88 507.38,-174.88 507.38,-174.88 507.38,-186.88 507.38,-186.88 507.38,-192.88 501.38,-198.88 495.38,-198.88"/>
220
+ <text xml:space="preserve" text-anchor="middle" x="466" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">WWW</text>
221
+ <text xml:space="preserve" text-anchor="middle" x="466" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">21 site drivers</text>
222
222
  </g>
223
223
  <!-- Registry&#45;&gt;WWW -->
224
224
  <g id="edge12" class="edge">
225
225
  <title>Registry&#45;&gt;WWW</title>
226
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M530.28,-319.97C513.08,-290.01 483.71,-238.85 465.95,-207.92"/>
227
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="468.45,-206.64 462.03,-201.1 463.59,-209.43 468.45,-206.64"/>
226
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M551.24,-319.97C532.67,-289.88 500.9,-238.41 481.83,-207.52"/>
227
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="484.43,-206.4 477.85,-201.06 479.66,-209.34 484.43,-206.4"/>
228
228
  </g>
229
229
  <!-- AWS -->
230
230
  <g id="node16" class="node">
231
231
  <title>AWS</title>
232
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M590,-198.88C590,-198.88 544,-198.88 544,-198.88 538,-198.88 532,-192.88 532,-186.88 532,-186.88 532,-174.88 532,-174.88 532,-168.88 538,-162.88 544,-162.88 544,-162.88 590,-162.88 590,-162.88 596,-162.88 602,-168.88 602,-174.88 602,-174.88 602,-186.88 602,-186.88 602,-192.88 596,-198.88 590,-198.88"/>
233
- <text xml:space="preserve" text-anchor="middle" x="567" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">AWS</text>
234
- <text xml:space="preserve" text-anchor="middle" x="567" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">90 services</text>
232
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M605,-198.88C605,-198.88 559,-198.88 559,-198.88 553,-198.88 547,-192.88 547,-186.88 547,-186.88 547,-174.88 547,-174.88 547,-168.88 553,-162.88 559,-162.88 559,-162.88 605,-162.88 605,-162.88 611,-162.88 617,-168.88 617,-174.88 617,-174.88 617,-186.88 617,-186.88 617,-192.88 611,-198.88 605,-198.88"/>
233
+ <text xml:space="preserve" text-anchor="middle" x="582" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">AWS</text>
234
+ <text xml:space="preserve" text-anchor="middle" x="582" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">90 services</text>
235
235
  </g>
236
236
  <!-- Registry&#45;&gt;AWS -->
237
237
  <g id="edge13" class="edge">
238
238
  <title>Registry&#45;&gt;AWS</title>
239
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M547.39,-319.97C551.59,-290.4 558.72,-240.16 563.13,-209.12"/>
240
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="565.88,-209.65 564.24,-201.34 560.34,-208.86 565.88,-209.65"/>
239
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M568.36,-319.97C571.28,-290.4 576.24,-240.16 579.31,-209.12"/>
240
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="582.08,-209.58 580.08,-201.35 576.5,-209.03 582.08,-209.58"/>
241
241
  </g>
242
242
  <!-- SDR -->
243
243
  <g id="node17" class="node">
244
244
  <title>SDR</title>
245
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M755.75,-205.12C755.75,-205.12 654.25,-205.12 654.25,-205.12 648.25,-205.12 642.25,-199.12 642.25,-193.12 642.25,-193.12 642.25,-168.62 642.25,-168.62 642.25,-162.62 648.25,-156.62 654.25,-156.62 654.25,-156.62 755.75,-156.62 755.75,-156.62 761.75,-156.62 767.75,-162.62 767.75,-168.62 767.75,-168.62 767.75,-193.12 767.75,-193.12 767.75,-199.12 761.75,-205.12 755.75,-205.12"/>
246
- <text xml:space="preserve" text-anchor="middle" x="705" y="-190.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">SDR</text>
247
- <text xml:space="preserve" text-anchor="middle" x="705" y="-177.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">GQRX · Flipper · RFID</text>
248
- <text xml:space="preserve" text-anchor="middle" x="705" y="-163.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Decoder::* (20)</text>
245
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M793,-205.12C793,-205.12 669,-205.12 669,-205.12 663,-205.12 657,-199.12 657,-193.12 657,-193.12 657,-168.62 657,-168.62 657,-162.62 663,-156.62 669,-156.62 669,-156.62 793,-156.62 793,-156.62 799,-156.62 805,-162.62 805,-168.62 805,-168.62 805,-193.12 805,-193.12 805,-199.12 799,-205.12 793,-205.12"/>
246
+ <text xml:space="preserve" text-anchor="middle" x="731" y="-190.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">SDR</text>
247
+ <text xml:space="preserve" text-anchor="middle" x="731" y="-177.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">GQRX · Flipper · RFID</text>
248
+ <text xml:space="preserve" text-anchor="middle" x="731" y="-163.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Decoder::* (20+Base/DSP)</text>
249
249
  </g>
250
250
  <!-- Swarm&#45;&gt;SDR -->
251
251
  <g id="edge14" class="edge">
252
252
  <title>Swarm&#45;&gt;SDR</title>
253
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M716.58,-326.23C714.46,-299.77 710.41,-249.34 707.71,-215.65"/>
254
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="710.51,-215.49 707.08,-207.74 704.92,-215.94 710.51,-215.49"/>
253
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M739.02,-326.23C737.55,-299.77 734.75,-249.34 732.88,-215.65"/>
254
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="735.68,-215.58 732.44,-207.75 730.09,-215.89 735.68,-215.58"/>
255
255
  </g>
256
256
  <!-- Chain -->
257
257
  <g id="node18" class="node">
258
258
  <title>Chain</title>
259
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M866,-198.88C866,-198.88 820,-198.88 820,-198.88 814,-198.88 808,-192.88 808,-186.88 808,-186.88 808,-174.88 808,-174.88 808,-168.88 814,-162.88 820,-162.88 820,-162.88 866,-162.88 866,-162.88 872,-162.88 878,-168.88 878,-174.88 878,-174.88 878,-186.88 878,-186.88 878,-192.88 872,-198.88 866,-198.88"/>
260
- <text xml:space="preserve" text-anchor="middle" x="843" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Blockchain</text>
261
- <text xml:space="preserve" text-anchor="middle" x="843" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">BTC · ETH</text>
259
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M903,-198.88C903,-198.88 857,-198.88 857,-198.88 851,-198.88 845,-192.88 845,-186.88 845,-186.88 845,-174.88 845,-174.88 845,-168.88 851,-162.88 857,-162.88 857,-162.88 903,-162.88 903,-162.88 909,-162.88 915,-168.88 915,-174.88 915,-174.88 915,-186.88 915,-186.88 915,-192.88 909,-198.88 903,-198.88"/>
260
+ <text xml:space="preserve" text-anchor="middle" x="880" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Blockchain</text>
261
+ <text xml:space="preserve" text-anchor="middle" x="880" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">BTC · ETH</text>
262
262
  </g>
263
263
  <!-- Swarm&#45;&gt;Chain -->
264
264
  <g id="edge15" class="edge">
265
265
  <title>Swarm&#45;&gt;Chain</title>
266
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M731.62,-326.23C753.78,-297.5 797.76,-240.51 823.32,-207.38"/>
267
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="825.53,-209.1 828.2,-201.06 821.1,-205.68 825.53,-209.1"/>
266
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M755.43,-326.37C772.52,-306.95 800.85,-274.65 825,-246.62 836.21,-233.61 848.61,-219.03 858.79,-207.01"/>
267
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="860.83,-208.94 863.86,-201.02 856.55,-205.32 860.83,-208.94"/>
268
268
  </g>
269
269
  <!-- Bounty -->
270
270
  <g id="node19" class="node">
271
271
  <title>Bounty</title>
272
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M991.88,-198.88C991.88,-198.88 930.12,-198.88 930.12,-198.88 924.12,-198.88 918.12,-192.88 918.12,-186.88 918.12,-186.88 918.12,-174.88 918.12,-174.88 918.12,-168.88 924.12,-162.88 930.12,-162.88 930.12,-162.88 991.88,-162.88 991.88,-162.88 997.88,-162.88 1003.88,-168.88 1003.88,-174.88 1003.88,-174.88 1003.88,-186.88 1003.88,-186.88 1003.88,-192.88 997.88,-198.88 991.88,-198.88"/>
273
- <text xml:space="preserve" text-anchor="middle" x="961" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Bounty</text>
274
- <text xml:space="preserve" text-anchor="middle" x="961" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">lifecycle replay</text>
272
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M1028.88,-198.88C1028.88,-198.88 967.12,-198.88 967.12,-198.88 961.12,-198.88 955.12,-192.88 955.12,-186.88 955.12,-186.88 955.12,-174.88 955.12,-174.88 955.12,-168.88 961.12,-162.88 967.12,-162.88 967.12,-162.88 1028.88,-162.88 1028.88,-162.88 1034.88,-162.88 1040.88,-168.88 1040.88,-174.88 1040.88,-174.88 1040.88,-186.88 1040.88,-186.88 1040.88,-192.88 1034.88,-198.88 1028.88,-198.88"/>
273
+ <text xml:space="preserve" text-anchor="middle" x="998" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Bounty</text>
274
+ <text xml:space="preserve" text-anchor="middle" x="998" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">lifecycle replay</text>
275
275
  </g>
276
276
  <!-- Prompt&#45;&gt;Bounty -->
277
277
  <!-- Reports -->
278
278
  <g id="node20" class="node">
279
279
  <title>Reports</title>
280
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M1116.12,-198.88C1116.12,-198.88 1055.88,-198.88 1055.88,-198.88 1049.88,-198.88 1043.88,-192.88 1043.88,-186.88 1043.88,-186.88 1043.88,-174.88 1043.88,-174.88 1043.88,-168.88 1049.88,-162.88 1055.88,-162.88 1055.88,-162.88 1116.12,-162.88 1116.12,-162.88 1122.12,-162.88 1128.12,-168.88 1128.12,-174.88 1128.12,-174.88 1128.12,-186.88 1128.12,-186.88 1128.12,-192.88 1122.12,-198.88 1116.12,-198.88"/>
281
- <text xml:space="preserve" text-anchor="middle" x="1086" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Reports</text>
282
- <text xml:space="preserve" text-anchor="middle" x="1086" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">HTML · JSON</text>
280
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M1153.12,-198.88C1153.12,-198.88 1092.88,-198.88 1092.88,-198.88 1086.88,-198.88 1080.88,-192.88 1080.88,-186.88 1080.88,-186.88 1080.88,-174.88 1080.88,-174.88 1080.88,-168.88 1086.88,-162.88 1092.88,-162.88 1092.88,-162.88 1153.12,-162.88 1153.12,-162.88 1159.12,-162.88 1165.12,-168.88 1165.12,-174.88 1165.12,-174.88 1165.12,-186.88 1165.12,-186.88 1165.12,-192.88 1159.12,-198.88 1153.12,-198.88"/>
281
+ <text xml:space="preserve" text-anchor="middle" x="1123" y="-183.93" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Reports</text>
282
+ <text xml:space="preserve" text-anchor="middle" x="1123" y="-170.43" font-family="sans-Serif" font-size="11.00" fill="#0f172a">HTML · JSON</text>
283
283
  </g>
284
284
  <!-- Prompt&#45;&gt;Reports -->
285
285
  <!-- Memory -->
@@ -290,24 +290,24 @@
290
290
  <text xml:space="preserve" text-anchor="middle" x="55" y="-36.36" font-family="sans-Serif" font-size="11.00" fill="#0f172a">memory.json</text>
291
291
  </g>
292
292
  <!-- Prompt&#45;&gt;Memory -->
293
- <g id="edge30" class="edge">
293
+ <g id="edge31" class="edge">
294
294
  <title>Prompt&#45;&gt;Memory</title>
295
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1014.03,-328.22C1062.57,-315.07 1116.49,-290.91 1146,-246.62 1170.15,-210.38 1176.15,-180.06 1146,-148.62 1106.28,-107.21 166.01,-129.86 114,-105.62 92.67,-95.69 75.54,-74.11 65.34,-58.64"/>
296
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1013.35,-325.51 1006.3,-330.22 1014.75,-330.93 1013.35,-325.51"/>
297
- <text xml:space="preserve" text-anchor="middle" x="1177.3" y="-177.57" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">inject</text>
295
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1035.99,-331.47C1089.18,-319.24 1150.06,-294.92 1183,-246.62 1207.54,-210.64 1213.17,-180.04 1183,-148.62 1141.83,-105.76 167.89,-130.69 114,-105.62 92.66,-95.7 75.53,-74.13 65.34,-58.65"/>
296
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1035.64,-328.68 1028.42,-333.13 1036.83,-334.15 1035.64,-328.68"/>
297
+ <text xml:space="preserve" text-anchor="middle" x="1214.45" y="-177.57" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">inject</text>
298
298
  </g>
299
299
  <!-- Plugins&#45;&gt;Target -->
300
- <g id="edge29" class="edge">
300
+ <g id="edge30" class="edge">
301
301
  <title>Plugins&#45;&gt;Target</title>
302
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M248.58,-199.49C258.09,-215 274.24,-236.63 295,-246.62 315.14,-256.32 473.69,-253.31 496,-254.62 559.53,-258.36 1023.79,-252.41 1067,-299.12 1148.83,-387.58 1066.49,-544.88 1023.99,-612.96"/>
303
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="1021.82,-611.15 1019.9,-619.4 1026.55,-614.15 1021.82,-611.15"/>
304
- <text xml:space="preserve" text-anchor="middle" x="1110.32" y="-434.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">attack</text>
302
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M263.58,-199.5C273.09,-215.01 289.24,-236.64 310,-246.62 330.74,-256.6 494.02,-253.29 517,-254.62 580.64,-258.33 1045.71,-252.33 1089,-299.12 1169.51,-386.14 1111.76,-543.76 1080.52,-612.41"/>
303
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="1078.05,-611.08 1077.21,-619.51 1083.13,-613.44 1078.05,-611.08"/>
304
+ <text xml:space="preserve" text-anchor="middle" x="1141.46" y="-434.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">attack</text>
305
305
  </g>
306
306
  <!-- Plugins&#45;&gt;Memory -->
307
307
  <g id="edge19" class="edge">
308
308
  <title>Plugins&#45;&gt;Memory</title>
309
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M203.25,-162.28C177.22,-148.62 141.8,-128.25 114,-105.62 99.66,-93.96 85.62,-78.79 74.83,-66.08"/>
310
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="77.09,-64.42 69.82,-60.06 72.79,-68 77.09,-64.42"/>
309
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M217.76,-164.83C188.24,-151.62 146.3,-130.64 114,-105.62 99.29,-94.23 85.14,-78.95 74.39,-66.11"/>
310
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="76.63,-64.44 69.4,-60.02 72.3,-67.98 76.63,-64.44"/>
311
311
  </g>
312
312
  <!-- Skills -->
313
313
  <g id="node23" class="node">
@@ -319,8 +319,8 @@
319
319
  <!-- SAST&#45;&gt;Skills -->
320
320
  <g id="edge20" class="edge">
321
321
  <title>SAST&#45;&gt;Skills</title>
322
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M338.58,-162.29C333.95,-138.51 325.66,-95.87 320.24,-68.03"/>
323
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="323.04,-67.75 318.77,-60.43 317.55,-68.82 323.04,-67.75"/>
322
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M351.68,-162.29C344.49,-138.51 331.58,-95.87 323.16,-68.03"/>
323
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="325.84,-67.23 320.85,-60.38 320.48,-68.85 325.84,-67.23"/>
324
324
  </g>
325
325
  <!-- Learn -->
326
326
  <g id="node24" class="node">
@@ -332,8 +332,8 @@
332
332
  <!-- WWW&#45;&gt;Learn -->
333
333
  <g id="edge21" class="edge">
334
334
  <title>WWW&#45;&gt;Learn</title>
335
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M451,-162.29C451,-138.62 451,-96.25 451,-68.4"/>
336
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="453.8,-68.47 451,-60.47 448.2,-68.47 453.8,-68.47"/>
335
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M464.1,-162.29C461.54,-138.62 456.96,-96.25 453.95,-68.4"/>
336
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="456.74,-68.11 453.1,-60.46 451.17,-68.71 456.74,-68.11"/>
337
337
  </g>
338
338
  <!-- Metrics -->
339
339
  <g id="node25" class="node">
@@ -345,8 +345,8 @@
345
345
  <!-- AWS&#45;&gt;Metrics -->
346
346
  <g id="edge22" class="edge">
347
347
  <title>AWS&#45;&gt;Metrics</title>
348
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M567,-162.29C567,-138.62 567,-96.25 567,-68.4"/>
349
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="569.8,-68.47 567,-60.47 564.2,-68.47 569.8,-68.47"/>
348
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M580.1,-162.29C577.54,-138.62 572.96,-96.25 569.95,-68.4"/>
349
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="572.74,-68.11 569.1,-60.46 567.17,-68.71 572.74,-68.11"/>
350
350
  </g>
351
351
  <!-- MistF -->
352
352
  <g id="node26" class="node">
@@ -367,8 +367,8 @@
367
367
  <!-- SDR&#45;&gt;Extro -->
368
368
  <g id="edge24" class="edge">
369
369
  <title>SDR&#45;&gt;Extro</title>
370
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M725.63,-156.01C745.67,-132.83 776.2,-97.51 798.13,-72.14"/>
371
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="800.24,-73.99 803.35,-66.1 796,-70.32 800.24,-73.99"/>
370
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M747.16,-156.01C762.72,-133.03 786.36,-98.12 803.51,-72.8"/>
371
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="805.78,-74.44 807.95,-66.24 801.14,-71.3 805.78,-74.44"/>
372
372
  </g>
373
373
  <!-- Sessions -->
374
374
  <g id="node28" class="node">
@@ -380,8 +380,8 @@
380
380
  <!-- Chain&#45;&gt;Sessions -->
381
381
  <g id="edge25" class="edge">
382
382
  <title>Chain&#45;&gt;Sessions</title>
383
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M859.21,-162.29C881.81,-137.78 922.89,-93.24 948.46,-65.51"/>
384
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="950.22,-67.73 953.59,-59.95 946.1,-63.93 950.22,-67.73"/>
383
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M891.53,-162.29C907.39,-138.1 936.05,-94.37 954.27,-66.58"/>
384
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="956.45,-68.37 958.49,-60.15 951.76,-65.3 956.45,-68.37"/>
385
385
  </g>
386
386
  <!-- SwarmB -->
387
387
  <g id="node29" class="node">
@@ -393,15 +393,15 @@
393
393
  <!-- Bounty&#45;&gt;SwarmB -->
394
394
  <g id="edge26" class="edge">
395
395
  <title>Bounty&#45;&gt;SwarmB</title>
396
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M979.36,-162.29C1005.08,-137.68 1051.9,-92.86 1080.84,-65.15"/>
397
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1082.52,-67.42 1086.36,-59.86 1078.65,-63.37 1082.52,-67.42"/>
396
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1011.68,-162.29C1030.59,-137.99 1064.82,-93.99 1086.43,-66.22"/>
397
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1088.52,-68.09 1091.22,-60.05 1084.1,-64.65 1088.52,-68.09"/>
398
398
  </g>
399
399
  <!-- Reports&#45;&gt;User -->
400
- <g id="edge31" class="edge">
400
+ <g id="edge32" class="edge">
401
401
  <title>Reports&#45;&gt;User</title>
402
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1095.51,-199.35C1104.26,-213.91 1118.51,-234.21 1136,-246.62 1145.17,-253.14 1151.8,-246.93 1160,-254.62 1215.22,-306.49 1215.13,-358.09 1178,-424.12 1048.52,-654.37 870.71,-548.34 615,-614.62 604.5,-617.35 593.48,-620.87 582.99,-624.57"/>
403
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="582.13,-621.91 575.56,-627.27 584.04,-627.17 582.13,-621.91"/>
404
- <text xml:space="preserve" text-anchor="middle" x="1188.11" y="-434.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">findings</text>
402
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1135.12,-199.35C1144.77,-212.8 1158.95,-231.57 1173,-246.62 1176.65,-250.54 1178.92,-250.25 1182,-254.62 1225.66,-316.53 1236.94,-357.98 1200,-424.12 1071.2,-654.76 892.75,-548.51 637,-614.62 626.5,-617.34 615.48,-620.86 604.99,-624.56"/>
403
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="604.12,-621.89 597.56,-627.26 606.04,-627.16 604.12,-621.89"/>
404
+ <text xml:space="preserve" text-anchor="middle" x="1210.15" y="-434.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">findings</text>
405
405
  </g>
406
406
  <!-- CronF -->
407
407
  <g id="node30" class="node">
@@ -413,9 +413,17 @@
413
413
  <!-- Reports&#45;&gt;CronF -->
414
414
  <g id="edge27" class="edge">
415
415
  <title>Reports&#45;&gt;CronF</title>
416
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1108.89,-162.36C1127.51,-147.79 1154.19,-126.19 1176,-105.62 1189.28,-93.11 1203.2,-78.24 1214.29,-65.93"/>
417
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1216.25,-67.94 1219.49,-60.11 1212.08,-64.22 1216.25,-67.94"/>
416
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1127.9,-162.22C1132.81,-147.46 1141.73,-126.77 1156,-113.62 1163.04,-107.14 1168.11,-111.04 1176,-105.62 1191.72,-94.84 1206.34,-79.27 1217.22,-66.12"/>
417
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1219.11,-68.24 1221.94,-60.25 1214.75,-64.73 1219.11,-68.24"/>
418
+ </g>
419
+ <!-- Prefs -->
420
+ <g id="node32" class="node">
421
+ <title>Prefs</title>
422
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M1539.88,-54.79C1539.88,-56.6 1517.97,-58.06 1491,-58.06 1464.03,-58.06 1442.12,-56.6 1442.12,-54.79 1442.12,-54.79 1442.12,-25.34 1442.12,-25.34 1442.12,-23.53 1464.03,-22.06 1491,-22.06 1517.97,-22.06 1539.88,-23.53 1539.88,-25.34 1539.88,-25.34 1539.88,-54.79 1539.88,-54.79"/>
423
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M1539.88,-54.79C1539.88,-52.98 1517.97,-51.52 1491,-51.52 1464.03,-51.52 1442.12,-52.98 1442.12,-54.79"/>
424
+ <text xml:space="preserve" text-anchor="middle" x="1491" y="-36.36" font-family="sans-Serif" font-size="11.00" fill="#0f172a">preferences.jsonl</text>
418
425
  </g>
426
+ <!-- Reports&#45;&gt;Prefs -->
419
427
  <!-- MemIdx -->
420
428
  <g id="node22" class="node">
421
429
  <title>MemIdx</title>