pwn 0.5.615 → 0.5.618

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 (153) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +109 -85
  3. data/README.md.bak +200 -0
  4. data/bin/pwn +47 -2
  5. data/bin/pwn_gqrx_scanner +75 -18
  6. data/documentation/AI-Integration.md +42 -26
  7. data/documentation/AWS.md +57 -0
  8. data/documentation/Agent-Tool-Registry.md +56 -0
  9. data/documentation/Banner.md +17 -0
  10. data/documentation/Blockchain.md +18 -0
  11. data/documentation/Bounty.md +21 -0
  12. data/documentation/BurpSuite.md +41 -16
  13. data/documentation/CLI-Drivers.md +58 -0
  14. data/documentation/Configuration.md +66 -0
  15. data/documentation/Contributing.md +33 -19
  16. data/documentation/Cron.md +47 -0
  17. data/documentation/Diagrams.md +123 -40
  18. data/documentation/Drivers.md +43 -16
  19. data/documentation/Extrospection.md +54 -0
  20. data/documentation/FFI.md +14 -0
  21. data/documentation/Fuzzing.md +36 -0
  22. data/documentation/General-PWN-Usage.md +50 -30
  23. data/documentation/Hardware.md +40 -0
  24. data/documentation/Home.md +78 -51
  25. data/documentation/How-PWN-Works.md +59 -57
  26. data/documentation/Installation.md +53 -28
  27. data/documentation/Metasploit.md +34 -0
  28. data/documentation/NmapIt.md +18 -12
  29. data/documentation/PWN.png +0 -0
  30. data/documentation/PWN_Contributors_and_Users.png +0 -0
  31. data/documentation/Persistence.md +38 -0
  32. data/documentation/Plugins.md +97 -47
  33. data/documentation/Reporting.md +25 -18
  34. data/documentation/SAST.md +39 -22
  35. data/documentation/SDR.md +40 -0
  36. data/documentation/Sessions.md +39 -0
  37. data/documentation/Skills-Memory-Learning.md +49 -29
  38. data/documentation/Swarm.md +71 -0
  39. data/documentation/Transparent-Browser.md +26 -22
  40. data/documentation/Troubleshooting.md +44 -25
  41. data/documentation/WWW.md +32 -0
  42. data/documentation/What-is-PWN.md +51 -32
  43. data/documentation/Why-PWN.md +41 -11
  44. data/documentation/diagrams/agent-tool-registry.svg +284 -0
  45. data/documentation/diagrams/ai-integration-tool-calling.svg +141 -103
  46. data/documentation/diagrams/aws-cloud-security.svg +166 -0
  47. data/documentation/diagrams/build.sh +20 -0
  48. data/documentation/diagrams/burp-vs-zap-preference.svg +47 -62
  49. data/documentation/diagrams/code-scanning-sast.svg +139 -79
  50. data/documentation/diagrams/cron-scheduling.svg +148 -0
  51. data/documentation/diagrams/dot/_THEME.md +27 -0
  52. data/documentation/diagrams/dot/agent-tool-registry.dot +59 -0
  53. data/documentation/diagrams/dot/ai-integration-tool-calling.dot +47 -20
  54. data/documentation/diagrams/dot/aws-cloud-security.dot +48 -0
  55. data/documentation/diagrams/dot/burp-vs-zap-preference.dot +23 -12
  56. data/documentation/diagrams/dot/code-scanning-sast.dot +46 -18
  57. data/documentation/diagrams/dot/cron-scheduling.dot +40 -0
  58. data/documentation/diagrams/dot/driver-framework.dot +36 -14
  59. data/documentation/diagrams/dot/extrospection-world-awareness.dot +55 -0
  60. data/documentation/diagrams/dot/fuzzing-workflow.dot +44 -24
  61. data/documentation/diagrams/dot/hardware-hacking.dot +48 -0
  62. data/documentation/diagrams/dot/history-to-drivers.dot +31 -17
  63. data/documentation/diagrams/dot/memory-skills-detailed.dot +57 -25
  64. data/documentation/diagrams/dot/network-infra-testing.dot +51 -19
  65. data/documentation/diagrams/dot/overall-pwn-architecture.dot +110 -44
  66. data/documentation/diagrams/dot/penetration-testing-workflow.dot +56 -25
  67. data/documentation/diagrams/dot/persistence-filesystem.dot +29 -0
  68. data/documentation/diagrams/dot/plugin-ecosystem.dot +41 -27
  69. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +87 -46
  70. data/documentation/diagrams/dot/pwn-repl-prototyping.dot +49 -30
  71. data/documentation/diagrams/dot/reporting-pipeline.dot +43 -14
  72. data/documentation/diagrams/dot/reverse-engineering-flow.dot +40 -18
  73. data/documentation/diagrams/dot/sdr-radio-flow.dot +45 -0
  74. data/documentation/diagrams/dot/sessions-cron-automation.dot +41 -14
  75. data/documentation/diagrams/dot/swarm-multi-agent.dot +70 -0
  76. data/documentation/diagrams/dot/web-application-testing.dot +45 -23
  77. data/documentation/diagrams/dot/zero-day-research-flow.dot +46 -24
  78. data/documentation/diagrams/driver-framework.svg +87 -66
  79. data/documentation/diagrams/extrospection-world-awareness.svg +185 -0
  80. data/documentation/diagrams/fuzzing-workflow.svg +128 -115
  81. data/documentation/diagrams/hardware-hacking.svg +163 -0
  82. data/documentation/diagrams/history-to-drivers.svg +84 -82
  83. data/documentation/diagrams/memory-skills-detailed.svg +167 -119
  84. data/documentation/diagrams/network-infra-testing.svg +146 -84
  85. data/documentation/diagrams/overall-pwn-architecture.svg +356 -185
  86. data/documentation/diagrams/penetration-testing-workflow.svg +161 -108
  87. data/documentation/diagrams/persistence-filesystem.svg +174 -0
  88. data/documentation/diagrams/plugin-ecosystem.svg +225 -121
  89. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +257 -185
  90. data/documentation/diagrams/pwn-repl-prototyping.svg +126 -137
  91. data/documentation/diagrams/reporting-pipeline.svg +128 -68
  92. data/documentation/diagrams/reverse-engineering-flow.svg +100 -80
  93. data/documentation/diagrams/sdr-radio-flow.svg +146 -0
  94. data/documentation/diagrams/sessions-cron-automation.svg +112 -68
  95. data/documentation/diagrams/swarm-multi-agent.svg +225 -0
  96. data/documentation/diagrams/web-application-testing.svg +136 -100
  97. data/documentation/diagrams/zero-day-research-flow.svg +116 -112
  98. data/documentation/fax-spectrogram.png +0 -0
  99. data/documentation/fax-waveform.png +0 -0
  100. data/documentation/pwn-REPL.md +40 -24
  101. data/documentation/pwn-ai-Agent.md +59 -30
  102. data/documentation/pwn_android_war_dialer_session.png +0 -0
  103. data/documentation/pwn_install.png +0 -0
  104. data/documentation/pwn_wallpaper.jpg +0 -0
  105. data/documentation/ringing-spectrogram.png +0 -0
  106. data/documentation/ringing-waveform.png +0 -0
  107. data/git_commit.sh +1 -1
  108. data/lib/pwn/ai/agent/assembly.rb +1 -1
  109. data/lib/pwn/ai/agent/btc.rb +1 -1
  110. data/lib/pwn/ai/agent/burp_suite.rb +1 -1
  111. data/lib/pwn/ai/agent/extrospection.rb +618 -0
  112. data/lib/pwn/ai/agent/gqrx.rb +2 -2
  113. data/lib/pwn/ai/agent/hacker_one.rb +1 -1
  114. data/lib/pwn/ai/agent/introspection.rb +91 -0
  115. data/lib/pwn/ai/agent/learning.rb +6 -4
  116. data/lib/pwn/ai/agent/loop.rb +15 -0
  117. data/lib/pwn/ai/agent/prompt_builder.rb +10 -1
  118. data/lib/pwn/ai/agent/sast.rb +1 -1
  119. data/lib/pwn/ai/agent/swarm.rb +437 -0
  120. data/lib/pwn/ai/agent/tools/cron.rb +163 -0
  121. data/lib/pwn/ai/agent/tools/extrospection.rb +280 -0
  122. data/lib/pwn/ai/agent/tools/learning.rb +108 -0
  123. data/lib/pwn/ai/agent/tools/memory.rb +27 -0
  124. data/lib/pwn/ai/agent/tools/metrics.rb +61 -0
  125. data/lib/pwn/ai/agent/tools/sessions.rb +139 -0
  126. data/lib/pwn/ai/agent/tools/skills.rb +30 -0
  127. data/lib/pwn/ai/agent/tools/swarm.rb +229 -0
  128. data/lib/pwn/ai/agent/transparent_browser.rb +1 -1
  129. data/lib/pwn/ai/agent/vuln_gen.rb +2 -2
  130. data/lib/pwn/ai/agent.rb +3 -0
  131. data/lib/pwn/ai/anthropic.rb +19 -4
  132. data/lib/pwn/ai.rb +0 -1
  133. data/lib/pwn/config.rb +10 -23
  134. data/lib/pwn/cron.rb +16 -7
  135. data/lib/pwn/plugins/repl.rb +90 -281
  136. data/lib/pwn/sdr/decoder/base.rb +251 -0
  137. data/lib/pwn/sdr/decoder/gsm.rb +84 -185
  138. data/lib/pwn/sdr/decoder/pocsag.rb +62 -217
  139. data/lib/pwn/sdr/decoder.rb +1 -0
  140. data/lib/pwn/sdr/gqrx.rb +446 -65
  141. data/lib/pwn/version.rb +1 -1
  142. data/spec/lib/pwn/ai/agent/extrospection_spec.rb +15 -0
  143. data/spec/lib/pwn/ai/agent/introspection_spec.rb +15 -0
  144. data/spec/lib/pwn/ai/agent/swarm_spec.rb +34 -0
  145. data/spec/lib/pwn/ai/agent/tools/cron_spec.rb +40 -0
  146. data/spec/lib/pwn/ai/agent/tools/extrospection_spec.rb +40 -0
  147. data/spec/lib/pwn/ai/agent/tools/metrics_spec.rb +20 -0
  148. data/spec/lib/pwn/ai/agent/tools/sessions_spec.rb +35 -0
  149. data/spec/lib/pwn/ai/agent/tools/swarm_spec.rb +17 -0
  150. data/spec/lib/pwn/{ai/introspection_spec.rb → sdr/decoder/base_spec.rb} +3 -3
  151. data/third_party/pwn_rdoc.jsonl +199 -37
  152. metadata +65 -3
  153. data/lib/pwn/ai/introspection.rb +0 -76
@@ -3,232 +3,304 @@
3
3
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
- <!-- Title: PWN&#45;AI Feedback Learning Loop Pages: 1 -->
7
- <svg width="1079pt" height="412pt"
8
- viewBox="0.00 0.00 1079.00 412.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
- <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 408.11)">
10
- <title>PWN&#45;AI Feedback Learning Loop</title>
11
- <polygon fill="white" stroke="none" points="-4,4 -4,-408.11 1075.45,-408.11 1075.45,4 -4,4"/>
12
- <g id="clust1" class="cluster">
13
- <title>cluster_agent</title>
14
- <path fill="none" stroke="blue" d="M237.62,-93C237.62,-93 561.62,-93 561.62,-93 567.62,-93 573.62,-99 573.62,-105 573.62,-105 573.62,-310.48 573.62,-310.48 573.62,-316.48 567.62,-322.48 561.62,-322.48 561.62,-322.48 237.62,-322.48 237.62,-322.48 231.62,-322.48 225.62,-316.48 225.62,-310.48 225.62,-310.48 225.62,-105 225.62,-105 225.62,-99 231.62,-93 237.62,-93"/>
15
- <text xml:space="preserve" text-anchor="middle" x="399.62" y="-305.18" font-family="Times,serif" font-size="14.00">PWN::AI::Agent</text>
6
+ <!-- Title: PWN_AI_Feedback_Learning_Loop Pages: 1 -->
7
+ <svg width="1195pt" height="689pt"
8
+ viewBox="0.00 0.00 1195.00 689.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
+ <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 645.45)">
10
+ <title>PWN_AI_Feedback_Learning_Loop</title>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-645.45 1152.12,-645.45 1152.12,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="360.96" y="-580.25" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">pwn&#45;ai — Closed Self&#45;Improvement Loop</text>
13
+ <text xml:space="preserve" text-anchor="start" x="445.34" y="-568.8" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">Introspection (self) &#160;⟷ &#160;Extrospection (world)</text>
14
+ <g id="clust2" class="cluster">
15
+ <title>cluster_core</title>
16
+ <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M120,-389.5C120,-389.5 500,-389.5 500,-389.5 506,-389.5 512,-395.5 512,-401.5 512,-401.5 512,-460.75 512,-460.75 512,-466.75 506,-472.75 500,-472.75 500,-472.75 120,-472.75 120,-472.75 114,-472.75 108,-466.75 108,-460.75 108,-460.75 108,-401.5 108,-401.5 108,-395.5 114,-389.5 120,-389.5"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="310" y="-449.75" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">PWN::AI::Agent::Loop</text>
18
+ </g>
19
+ <g id="clust4" class="cluster">
20
+ <title>cluster_intro</title>
21
+ <path fill="#022c22" stroke="#047857" stroke-width="2" d="M357,-247.25C357,-247.25 656,-247.25 656,-247.25 662,-247.25 668,-253.25 668,-259.25 668,-259.25 668,-331 668,-331 668,-337 662,-343 656,-343 656,-343 357,-343 357,-343 351,-343 345,-337 345,-331 345,-331 345,-259.25 345,-259.25 345,-253.25 351,-247.25 357,-247.25"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="506.5" y="-320" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">INTROSPECTION &#160;(self)</text>
23
+ </g>
24
+ <g id="clust5" class="cluster">
25
+ <title>cluster_extro</title>
26
+ <path fill="#422006" stroke="#a16207" stroke-width="2" d="M20,-253.5C20,-253.5 304,-253.5 304,-253.5 310,-253.5 316,-259.5 316,-265.5 316,-265.5 316,-324.75 316,-324.75 316,-330.75 310,-336.75 304,-336.75 304,-336.75 20,-336.75 20,-336.75 14,-336.75 8,-330.75 8,-324.75 8,-324.75 8,-265.5 8,-265.5 8,-259.5 14,-253.5 20,-253.5"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="162" y="-313.75" font-family="sans-Serif" font-size="20.00" fill="#fde68a">EXTROSPECTION &#160;(world)</text>
28
+ </g>
29
+ <g id="clust7" class="cluster">
30
+ <title>cluster_store</title>
31
+ <path fill="#1e293b" stroke="#334155" stroke-dasharray="5,2" d="M199,-8C199,-8 759,-8 759,-8 765,-8 771,-14 771,-20 771,-20 771,-79.25 771,-79.25 771,-85.25 765,-91.25 759,-91.25 759,-91.25 199,-91.25 199,-91.25 193,-91.25 187,-85.25 187,-79.25 187,-79.25 187,-20 187,-20 187,-14 193,-8 199,-8"/>
32
+ <text xml:space="preserve" text-anchor="middle" x="479" y="-68.25" font-family="sans-Serif" font-size="20.00" fill="#94a3b8">~/.pwn/</text>
16
33
  </g>
17
34
  <!-- User -->
18
35
  <g id="node1" class="node">
19
36
  <title>User</title>
20
- <path fill="none" stroke="black" d="M93.25,-260.85C93.25,-260.85 12,-260.85 12,-260.85 6,-260.85 0,-254.85 0,-248.85 0,-248.85 0,-236.85 0,-236.85 0,-230.85 6,-224.85 12,-224.85 12,-224.85 93.25,-224.85 93.25,-224.85 99.25,-224.85 105.25,-230.85 105.25,-236.85 105.25,-236.85 105.25,-248.85 105.25,-248.85 105.25,-254.85 99.25,-260.85 93.25,-260.85"/>
21
- <text xml:space="preserve" text-anchor="middle" x="52.62" y="-245.35" font-family="Arial" font-size="10.00">Security Researcher</text>
22
- <text xml:space="preserve" text-anchor="middle" x="52.62" y="-233.35" font-family="Arial" font-size="10.00">(User / pwn&#45;ai)</text>
37
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M192.88,-563.25C192.88,-563.25 125.12,-563.25 125.12,-563.25 119.12,-563.25 113.12,-557.25 113.12,-551.25 113.12,-551.25 113.12,-539.25 113.12,-539.25 113.12,-533.25 119.12,-527.25 125.12,-527.25 125.12,-527.25 192.88,-527.25 192.88,-527.25 198.88,-527.25 204.88,-533.25 204.88,-539.25 204.88,-539.25 204.88,-551.25 204.88,-551.25 204.88,-557.25 198.88,-563.25 192.88,-563.25"/>
38
+ <text xml:space="preserve" text-anchor="middle" x="159" y="-541.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">👤 &#160;Researcher</text>
23
39
  </g>
24
- <!-- PwnAI -->
25
- <g id="node3" class="node">
26
- <title>PwnAI</title>
27
- <ellipse fill="lightblue" stroke="black" cx="466.62" cy="-242.85" rx="98.82" ry="22.63"/>
28
- <text xml:space="preserve" text-anchor="middle" x="466.62" y="-245.35" font-family="Arial" font-size="10.00">pwn&#45;ai TUI</text>
29
- <text xml:space="preserve" text-anchor="middle" x="466.62" y="-233.35" font-family="Arial" font-size="10.00">(Natural Language Interface)</text>
40
+ <!-- Prompt -->
41
+ <g id="node4" class="node">
42
+ <title>Prompt</title>
43
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M189.5,-433.5C189.5,-433.5 128.5,-433.5 128.5,-433.5 122.5,-433.5 116.5,-427.5 116.5,-421.5 116.5,-421.5 116.5,-409.5 116.5,-409.5 116.5,-403.5 122.5,-397.5 128.5,-397.5 128.5,-397.5 189.5,-397.5 189.5,-397.5 195.5,-397.5 201.5,-403.5 201.5,-409.5 201.5,-409.5 201.5,-421.5 201.5,-421.5 201.5,-427.5 195.5,-433.5 189.5,-433.5"/>
44
+ <text xml:space="preserve" text-anchor="middle" x="159" y="-418.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PromptBuilder</text>
45
+ <text xml:space="preserve" text-anchor="middle" x="159" y="-405.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">inject context</text>
30
46
  </g>
31
- <!-- User&#45;&gt;PwnAI -->
47
+ <!-- User&#45;&gt;Prompt -->
32
48
  <g id="edge1" class="edge">
33
- <title>User&#45;&gt;PwnAI</title>
34
- <path fill="none" stroke="black" d="M85.64,-261.31C119.01,-279.26 172.54,-306.16 221.62,-322.48 266.33,-337.35 327.03,-329.84 350.25,-325.63 385.14,-319.29 417.37,-294.2 439.02,-273.29"/>
35
- <polygon fill="black" stroke="black" points="441.4,-275.85 445.99,-266.31 436.45,-270.91 441.4,-275.85"/>
36
- <text xml:space="preserve" text-anchor="middle" x="293.62" y="-342.93" font-family="Arial" font-size="9.00">Natural language task</text>
37
- <text xml:space="preserve" text-anchor="middle" x="293.62" y="-332.43" font-family="Arial" font-size="9.00">(e.g. scan + exploit + report)</text>
38
- </g>
39
- <!-- History -->
40
- <g id="node10" class="node">
41
- <title>History</title>
42
- <path fill="none" stroke="black" d="M160.25,-150.11C160.25,-152.32 143.39,-154.11 122.62,-154.11 101.86,-154.11 85,-152.32 85,-150.11 85,-150.11 85,-114.11 85,-114.11 85,-111.91 101.86,-110.11 122.62,-110.11 143.39,-110.11 160.25,-111.91 160.25,-114.11 160.25,-114.11 160.25,-150.11 160.25,-150.11"/>
43
- <path fill="none" stroke="black" d="M160.25,-150.11C160.25,-147.91 143.39,-146.11 122.62,-146.11 101.86,-146.11 85,-147.91 85,-150.11"/>
44
- <text xml:space="preserve" text-anchor="middle" x="122.62" y="-134.61" font-family="Arial" font-size="10.00">Pry History /</text>
45
- <text xml:space="preserve" text-anchor="middle" x="122.62" y="-122.61" font-family="Arial" font-size="10.00">Session Logs</text>
46
- </g>
47
- <!-- User&#45;&gt;History -->
48
- <g id="edge16" class="edge">
49
- <title>User&#45;&gt;History</title>
50
- <path fill="none" stroke="black" d="M33.61,-224.43C22.5,-212.08 12.25,-195.26 21.12,-181.23 32.87,-162.66 53.93,-151.12 73.83,-144.01"/>
51
- <polygon fill="black" stroke="black" points="74.82,-147.37 83.26,-140.97 72.67,-140.71 74.82,-147.37"/>
52
- <text xml:space="preserve" text-anchor="middle" x="60.88" y="-193.68" font-family="Arial" font-size="9.00">history command to</text>
53
- <text xml:space="preserve" text-anchor="middle" x="60.88" y="-183.18" font-family="Arial" font-size="9.00">inspect previous</text>
49
+ <title>User&#45;&gt;Prompt</title>
50
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M159,-526.75C159,-505.75 159,-470.24 159,-445.2"/>
51
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="161.8,-445.22 159,-437.22 156.2,-445.22 161.8,-445.22"/>
52
+ <text xml:space="preserve" text-anchor="middle" x="167.25" y="-482.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">task</text>
54
53
  </g>
55
54
  <!-- LLM -->
56
55
  <g id="node2" class="node">
57
56
  <title>LLM</title>
58
- <path fill="none" stroke="black" d="M705.5,-264.85C705.5,-264.85 595.75,-264.85 595.75,-264.85 589.75,-264.85 583.75,-258.85 583.75,-252.85 583.75,-252.85 583.75,-232.85 583.75,-232.85 583.75,-226.85 589.75,-220.85 595.75,-220.85 595.75,-220.85 705.5,-220.85 705.5,-220.85 711.5,-220.85 717.5,-226.85 717.5,-232.85 717.5,-232.85 717.5,-252.85 717.5,-252.85 717.5,-258.85 711.5,-264.85 705.5,-264.85"/>
59
- <text xml:space="preserve" text-anchor="middle" x="650.62" y="-251.35" font-family="Arial" font-size="10.00">LLM Providers</text>
60
- <text xml:space="preserve" text-anchor="middle" x="650.62" y="-239.35" font-family="Arial" font-size="10.00">(Grok/OAuth, OpenAI,</text>
61
- <text xml:space="preserve" text-anchor="middle" x="650.62" y="-227.35" font-family="Arial" font-size="10.00">Anthropic, Gemini, Ollama)</text>
57
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M593,-563.25C593,-563.25 517,-563.25 517,-563.25 511,-563.25 505,-557.25 505,-551.25 505,-551.25 505,-539.25 505,-539.25 505,-533.25 511,-527.25 517,-527.25 517,-527.25 593,-527.25 593,-527.25 599,-527.25 605,-533.25 605,-539.25 605,-539.25 605,-551.25 605,-551.25 605,-557.25 599,-563.25 593,-563.25"/>
58
+ <text xml:space="preserve" text-anchor="middle" x="555" y="-541.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">🤖 &#160;LLM Provider</text>
62
59
  </g>
63
- <!-- ToolCall -->
64
- <g id="node4" class="node">
65
- <title>ToolCall</title>
66
- <ellipse fill="lightblue" stroke="black" cx="474.62" cy="-132.11" rx="91.39" ry="31.11"/>
67
- <text xml:space="preserve" text-anchor="middle" x="474.62" y="-140.61" font-family="Arial" font-size="10.00">Tool Calling Dispatcher</text>
68
- <text xml:space="preserve" text-anchor="middle" x="474.62" y="-128.61" font-family="Arial" font-size="10.00">(pwn_eval, shell, memory,</text>
69
- <text xml:space="preserve" text-anchor="middle" x="474.62" y="-116.61" font-family="Arial" font-size="10.00">skill_list, etc.)</text>
70
- </g>
71
- <!-- LLM&#45;&gt;ToolCall -->
72
- <g id="edge6" class="edge">
73
- <title>LLM&#45;&gt;ToolCall</title>
74
- <path fill="none" stroke="black" d="M673.74,-220.48C684.11,-208.31 692.11,-193.15 682.62,-181.23 668.37,-163.3 619.4,-151.47 572.56,-144.02"/>
75
- <polygon fill="black" stroke="black" points="573.26,-140.59 562.85,-142.54 572.2,-147.51 573.26,-140.59"/>
76
- <text xml:space="preserve" text-anchor="middle" x="710.1" y="-188.43" font-family="Arial" font-size="9.00">Responses</text>
77
- </g>
78
- <!-- PwnAI&#45;&gt;User -->
79
- <g id="edge18" class="edge">
80
- <title>PwnAI&#45;&gt;User</title>
81
- <path fill="none" stroke="black" d="M444.57,-265.15C424.25,-283.98 392.24,-309.56 358.62,-320.38 300.66,-339.02 281.11,-333.37 221.62,-320.38 174.75,-310.14 125.34,-285.66 92.14,-266.92"/>
82
- <polygon fill="black" stroke="black" points="94.1,-264.02 83.69,-262.07 90.62,-270.09 94.1,-264.02"/>
83
- <text xml:space="preserve" text-anchor="middle" x="177.62" y="-337.68" font-family="Arial" font-size="9.00">Results, reports, next steps</text>
60
+ <!-- Dispatch -->
61
+ <g id="node5" class="node">
62
+ <title>Dispatch</title>
63
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M333,-433.5C333,-433.5 299,-433.5 299,-433.5 293,-433.5 287,-427.5 287,-421.5 287,-421.5 287,-409.5 287,-409.5 287,-403.5 293,-397.5 299,-397.5 299,-397.5 333,-397.5 333,-397.5 339,-397.5 345,-403.5 345,-409.5 345,-409.5 345,-421.5 345,-421.5 345,-427.5 339,-433.5 333,-433.5"/>
64
+ <text xml:space="preserve" text-anchor="middle" x="316" y="-418.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Dispatch</text>
65
+ <text xml:space="preserve" text-anchor="middle" x="316" y="-405.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">tool calls</text>
84
66
  </g>
85
- <!-- PwnAI&#45;&gt;ToolCall -->
67
+ <!-- LLM&#45;&gt;Dispatch -->
86
68
  <g id="edge2" class="edge">
87
- <title>PwnAI&#45;&gt;ToolCall</title>
88
- <path fill="none" stroke="black" d="M464.52,-220.07C464.04,-214.28 463.61,-208.02 463.38,-202.23 462.99,-192.9 462.31,-190.5 463.38,-181.23 463.63,-179.05 463.94,-176.83 464.3,-174.6"/>
89
- <polygon fill="black" stroke="black" points="467.7,-175.43 466.13,-164.96 460.83,-174.13 467.7,-175.43"/>
90
- <text xml:space="preserve" text-anchor="middle" x="511" y="-188.43" font-family="Arial" font-size="9.00">Parse intent, plan steps</text>
69
+ <title>LLM&#45;&gt;Dispatch</title>
70
+ <path fill="none" stroke="#a78bfa" stroke-width="2" d="M506.92,-522.02C478.18,-508.41 441.13,-490.29 409,-472.75 390.13,-462.45 369.65,-450.18 352.71,-439.73"/>
71
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="505.55,-524.47 513.98,-525.35 507.94,-519.41 505.55,-524.47"/>
72
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="354.55,-437.58 346.28,-435.74 351.6,-442.34 354.55,-437.58"/>
73
+ <text xml:space="preserve" text-anchor="middle" x="460" y="-482.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">tool_calls</text>
91
74
  </g>
92
- <!-- ToolCall&#45;&gt;LLM -->
93
- <g id="edge5" class="edge">
94
- <title>ToolCall&#45;&gt;LLM</title>
95
- <path fill="none" stroke="black" d="M523.24,-158.66C535.12,-165.52 547.58,-173.26 558.62,-181.23 569.99,-189.42 570.78,-194.01 582.12,-202.23 588.11,-206.56 594.59,-210.82 601.11,-214.84"/>
96
- <polygon fill="black" stroke="black" points="598.96,-217.63 609.34,-219.78 602.56,-211.63 598.96,-217.63"/>
97
- <text xml:space="preserve" text-anchor="middle" x="632.38" y="-188.43" font-family="Arial" font-size="9.00">If needed for decisioning</text>
75
+ <!-- World -->
76
+ <g id="node3" class="node">
77
+ <title>World</title>
78
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M434.75,-563.25C434.75,-563.25 339.25,-563.25 339.25,-563.25 333.25,-563.25 327.25,-557.25 327.25,-551.25 327.25,-551.25 327.25,-539.25 327.25,-539.25 327.25,-533.25 333.25,-527.25 339.25,-527.25 339.25,-527.25 434.75,-527.25 434.75,-527.25 440.75,-527.25 446.75,-533.25 446.75,-539.25 446.75,-539.25 446.75,-551.25 446.75,-551.25 446.75,-557.25 440.75,-563.25 434.75,-563.25"/>
79
+ <text xml:space="preserve" text-anchor="middle" x="387" y="-548.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">🌍 &#160;Host · Net · Repo</text>
80
+ <text xml:space="preserve" text-anchor="middle" x="387" y="-534.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Toolchain · Intel feeds</text>
98
81
  </g>
99
- <!-- Memory -->
82
+ <!-- Result -->
100
83
  <g id="node6" class="node">
101
- <title>Memory</title>
102
- <path fill="none" stroke="black" d="M713.5,-40C713.5,-42.21 688.9,-44 658.62,-44 628.35,-44 603.75,-42.21 603.75,-40 603.75,-40 603.75,-4 603.75,-4 603.75,-1.79 628.35,0 658.62,0 688.9,0 713.5,-1.79 713.5,-4 713.5,-4 713.5,-40 713.5,-40"/>
103
- <path fill="none" stroke="black" d="M713.5,-40C713.5,-37.79 688.9,-36 658.62,-36 628.35,-36 603.75,-37.79 603.75,-40"/>
104
- <text xml:space="preserve" text-anchor="middle" x="658.62" y="-24.5" font-family="Arial" font-size="10.00">PWN::Memory</text>
105
- <text xml:space="preserve" text-anchor="middle" x="658.62" y="-12.5" font-family="Arial" font-size="10.00">(~/.pwn/memory.json)</text>
84
+ <title>Result</title>
85
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M491.88,-433.5C491.88,-433.5 442.12,-433.5 442.12,-433.5 436.12,-433.5 430.12,-427.5 430.12,-421.5 430.12,-421.5 430.12,-409.5 430.12,-409.5 430.12,-403.5 436.12,-397.5 442.12,-397.5 442.12,-397.5 491.88,-397.5 491.88,-397.5 497.88,-397.5 503.88,-403.5 503.88,-409.5 503.88,-409.5 503.88,-421.5 503.88,-421.5 503.88,-427.5 497.88,-433.5 491.88,-433.5"/>
86
+ <text xml:space="preserve" text-anchor="middle" x="467" y="-418.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Result</text>
87
+ <text xml:space="preserve" text-anchor="middle" x="467" y="-405.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">final answer</text>
106
88
  </g>
107
- <!-- ToolCall&#45;&gt;Memory -->
108
- <g id="edge7" class="edge">
109
- <title>ToolCall&#45;&gt;Memory</title>
110
- <path fill="none" stroke="black" d="M539.4,-109.83C557.6,-102.56 576.97,-93.56 593.62,-83 601.31,-78.13 615.79,-64.93 629.14,-52.14"/>
111
- <polygon fill="black" stroke="black" points="631.39,-54.84 636.15,-45.37 626.52,-49.8 631.39,-54.84"/>
112
- <text xml:space="preserve" text-anchor="middle" x="657.81" y="-69.2" font-family="Arial" font-size="9.00">remember(key, val)</text>
89
+ <!-- World&#45;&gt;Result -->
90
+ <!-- Snapshot -->
91
+ <g id="node9" class="node">
92
+ <title>Snapshot</title>
93
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M296.38,-297.5C296.38,-297.5 195.62,-297.5 195.62,-297.5 189.62,-297.5 183.62,-291.5 183.62,-285.5 183.62,-285.5 183.62,-273.5 183.62,-273.5 183.62,-267.5 189.62,-261.5 195.62,-261.5 195.62,-261.5 296.38,-261.5 296.38,-261.5 302.38,-261.5 308.38,-267.5 308.38,-273.5 308.38,-273.5 308.38,-285.5 308.38,-285.5 308.38,-291.5 302.38,-297.5 296.38,-297.5"/>
94
+ <text xml:space="preserve" text-anchor="middle" x="246" y="-282.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">snapshot · drift</text>
95
+ <text xml:space="preserve" text-anchor="middle" x="246" y="-269.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">host/net/toolchain/repo</text>
96
+ </g>
97
+ <!-- World&#45;&gt;Snapshot -->
98
+ <g id="edge10" class="edge">
99
+ <title>World&#45;&gt;Snapshot</title>
100
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M402.07,-526.82C416.01,-511.95 438.14,-491.34 462,-480.75 486.59,-469.84 499.66,-487.73 522,-472.75 572.77,-438.71 628.53,-394.91 586,-351 576.29,-340.98 348.23,-347.42 335,-343 311.08,-335.02 287.9,-318.36 271.19,-304.24"/>
101
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="273.35,-302.41 265.48,-299.27 269.67,-306.63 273.35,-302.41"/>
102
+ </g>
103
+ <!-- Observe -->
104
+ <g id="node10" class="node">
105
+ <title>Observe</title>
106
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M128.38,-297.5C128.38,-297.5 27.62,-297.5 27.62,-297.5 21.62,-297.5 15.63,-291.5 15.63,-285.5 15.63,-285.5 15.63,-273.5 15.63,-273.5 15.63,-267.5 21.63,-261.5 27.63,-261.5 27.63,-261.5 128.38,-261.5 128.38,-261.5 134.38,-261.5 140.38,-267.5 140.38,-273.5 140.38,-273.5 140.38,-285.5 140.38,-285.5 140.38,-291.5 134.38,-297.5 128.38,-297.5"/>
107
+ <text xml:space="preserve" text-anchor="middle" x="78" y="-282.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">observe · intel</text>
108
+ <text xml:space="preserve" text-anchor="middle" x="78" y="-269.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">recon facts · CVE feed</text>
109
+ </g>
110
+ <!-- World&#45;&gt;Observe -->
111
+ <g id="edge11" class="edge">
112
+ <title>World&#45;&gt;Observe</title>
113
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M422.73,-526.62C460,-508.02 514.11,-480.37 522,-472.75 565.98,-430.29 628.82,-394.63 586,-351 569.5,-334.18 184.29,-350.62 162,-343 139.24,-335.22 117.56,-318.78 101.93,-304.72"/>
114
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="103.97,-302.79 96.2,-299.39 100.15,-306.89 103.97,-302.79"/>
115
+ </g>
116
+ <!-- Prompt&#45;&gt;Dispatch -->
117
+ <g id="edge4" class="edge">
118
+ <title>Prompt&#45;&gt;Dispatch</title>
119
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M201.93,-415.5C226.84,-415.5 251.76,-415.5 276.67,-415.5"/>
120
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="276.62,-418.3 284.62,-415.5 276.62,-412.7 276.62,-418.3"/>
121
+ </g>
122
+ <!-- Dispatch&#45;&gt;Result -->
123
+ <g id="edge5" class="edge">
124
+ <title>Dispatch&#45;&gt;Result</title>
125
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M345.49,-415.5C370.21,-415.5 394.94,-415.5 419.66,-415.5"/>
126
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="419.54,-418.3 427.54,-415.5 419.54,-412.7 419.54,-418.3"/>
113
127
  </g>
114
128
  <!-- Metrics -->
115
129
  <g id="node7" class="node">
116
130
  <title>Metrics</title>
117
- <path fill="none" stroke="black" d="M287.38,-40C287.38,-42.21 259.25,-44 224.62,-44 190,-44 161.88,-42.21 161.88,-40 161.88,-40 161.88,-4 161.88,-4 161.88,-1.79 190,0 224.62,0 259.25,0 287.38,-1.79 287.38,-4 287.38,-4 287.38,-40 287.38,-40"/>
118
- <path fill="none" stroke="black" d="M287.38,-40C287.38,-37.79 259.25,-36 224.62,-36 190,-36 161.88,-37.79 161.88,-40"/>
119
- <text xml:space="preserve" text-anchor="middle" x="224.62" y="-24.5" font-family="Arial" font-size="10.00">PWN::AI::Agent::Metrics</text>
120
- <text xml:space="preserve" text-anchor="middle" x="224.62" y="-12.5" font-family="Arial" font-size="10.00">(~/.pwn/metrics.json)</text>
131
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M478.75,-297.5C478.75,-297.5 365.25,-297.5 365.25,-297.5 359.25,-297.5 353.25,-291.5 353.25,-285.5 353.25,-285.5 353.25,-273.5 353.25,-273.5 353.25,-267.5 359.25,-261.5 365.25,-261.5 365.25,-261.5 478.75,-261.5 478.75,-261.5 484.75,-261.5 490.75,-267.5 490.75,-273.5 490.75,-273.5 490.75,-285.5 490.75,-285.5 490.75,-291.5 484.75,-297.5 478.75,-297.5"/>
132
+ <text xml:space="preserve" text-anchor="middle" x="422" y="-282.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Metrics</text>
133
+ <text xml:space="preserve" text-anchor="middle" x="422" y="-269.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">per&#45;tool success · avg ms</text>
121
134
  </g>
122
- <!-- ToolCall&#45;&gt;Metrics -->
123
- <g id="edge9" class="edge">
124
- <title>ToolCall&#45;&gt;Metrics</title>
125
- <path fill="none" stroke="black" d="M415.43,-108.05C400.31,-102.66 383.99,-97.25 368.62,-93 346.47,-86.87 339.2,-91.59 317.88,-83 297.87,-74.94 277.52,-62.44 260.96,-50.94"/>
126
- <polygon fill="black" stroke="black" points="263.08,-48.15 252.91,-45.2 259.02,-53.85 263.08,-48.15"/>
127
- <text xml:space="preserve" text-anchor="middle" x="369.25" y="-74.45" font-family="Arial" font-size="9.00">record(success, duration,</text>
128
- <text xml:space="preserve" text-anchor="middle" x="369.25" y="-63.95" font-family="Arial" font-size="9.00">tool=...)</text>
135
+ <!-- Dispatch&#45;&gt;Metrics -->
136
+ <g id="edge6" class="edge">
137
+ <title>Dispatch&#45;&gt;Metrics</title>
138
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M341.32,-396.81C353.7,-387.32 368.22,-374.84 379,-361.5 392.43,-344.89 403.59,-323.44 411.17,-306.79"/>
139
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="413.55,-308.34 414.22,-299.89 408.43,-306.08 413.55,-308.34"/>
140
+ <text xml:space="preserve" text-anchor="middle" x="402.55" y="-352.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">record()</text>
141
+ </g>
142
+ <!-- Dispatch&#45;&gt;Snapshot -->
143
+ <g id="edge8" class="edge">
144
+ <title>Dispatch&#45;&gt;Snapshot</title>
145
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M286.41,-403.45C268.31,-394.97 246.64,-381.31 236,-361.5 227.09,-344.91 230.13,-323.71 235.11,-307.16"/>
146
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="237.66,-308.37 237.56,-299.89 232.35,-306.58 237.66,-308.37"/>
147
+ <text xml:space="preserve" text-anchor="middle" x="248" y="-352.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">probe</text>
148
+ </g>
149
+ <!-- Result&#45;&gt;User -->
150
+ <g id="edge26" class="edge">
151
+ <title>Result&#45;&gt;User</title>
152
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M438.83,-434.16C419.18,-446.03 392.08,-461.5 367,-472.75 317.22,-495.09 258.21,-514.76 215.78,-527.79"/>
153
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="215.1,-525.07 208.26,-530.08 216.73,-530.43 215.1,-525.07"/>
154
+ <text xml:space="preserve" text-anchor="middle" x="360.1" y="-482.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">answer</text>
129
155
  </g>
130
156
  <!-- Learning -->
131
157
  <g id="node8" class="node">
132
158
  <title>Learning</title>
133
- <path fill="none" stroke="black" d="M460.62,-40C460.62,-42.21 431.49,-44 395.62,-44 359.76,-44 330.62,-42.21 330.62,-40 330.62,-40 330.62,-4 330.62,-4 330.62,-1.79 359.76,0 395.62,0 431.49,0 460.62,-1.79 460.62,-4 460.62,-4 460.62,-40 460.62,-40"/>
134
- <path fill="none" stroke="black" d="M460.62,-40C460.62,-37.79 431.49,-36 395.62,-36 359.76,-36 330.62,-37.79 330.62,-40"/>
135
- <text xml:space="preserve" text-anchor="middle" x="395.62" y="-24.5" font-family="Arial" font-size="10.00">PWN::AI::Agent::Learning</text>
136
- <text xml:space="preserve" text-anchor="middle" x="395.62" y="-12.5" font-family="Arial" font-size="10.00">(~/.pwn/learning.jsonl)</text>
159
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M647.75,-303.75C647.75,-303.75 546.25,-303.75 546.25,-303.75 540.25,-303.75 534.25,-297.75 534.25,-291.75 534.25,-291.75 534.25,-267.25 534.25,-267.25 534.25,-261.25 540.25,-255.25 546.25,-255.25 546.25,-255.25 647.75,-255.25 647.75,-255.25 653.75,-255.25 659.75,-261.25 659.75,-267.25 659.75,-267.25 659.75,-291.75 659.75,-291.75 659.75,-297.75 653.75,-303.75 647.75,-303.75"/>
160
+ <text xml:space="preserve" text-anchor="middle" x="597" y="-289.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Learning</text>
161
+ <text xml:space="preserve" text-anchor="middle" x="597" y="-275.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">note_outcome · reflect</text>
162
+ <text xml:space="preserve" text-anchor="middle" x="597" y="-262.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">consolidate · distill_skill</text>
137
163
  </g>
138
- <!-- ToolCall&#45;&gt;Learning -->
139
- <g id="edge11" class="edge">
140
- <title>ToolCall&#45;&gt;Learning</title>
141
- <path fill="none" stroke="black" d="M453.3,-101.45C444.46,-89.21 434.08,-74.9 424.62,-62 422.59,-59.23 420.48,-56.36 418.35,-53.48"/>
142
- <polygon fill="black" stroke="black" points="421.3,-51.58 412.53,-45.63 415.68,-55.75 421.3,-51.58"/>
143
- <text xml:space="preserve" text-anchor="middle" x="514.82" y="-69.2" font-family="Arial" font-size="9.00">note_outcome(task, success, details)</text>
164
+ <!-- Result&#45;&gt;Learning -->
165
+ <g id="edge7" class="edge">
166
+ <title>Result&#45;&gt;Learning</title>
167
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M484,-396.98C505.1,-375.23 541.45,-337.76 567.22,-311.2"/>
168
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="568.93,-313.46 572.49,-305.77 564.91,-309.56 568.93,-313.46"/>
169
+ <text xml:space="preserve" text-anchor="middle" x="552.1" y="-352.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">auto_reflect</text>
170
+ </g>
171
+ <!-- Result&#45;&gt;Observe -->
172
+ <g id="edge9" class="edge">
173
+ <title>Result&#45;&gt;Observe</title>
174
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M429.54,-402.15C376,-384.59 282.26,-354.15 266,-351 220.49,-342.18 205.42,-359.25 162,-343 139.62,-334.62 118.07,-318.36 102.4,-304.53"/>
175
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="104.46,-302.61 96.66,-299.3 100.69,-306.76 104.46,-302.61"/>
176
+ <text xml:space="preserve" text-anchor="middle" x="332.76" y="-352.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">auto_extrospect</text>
144
177
  </g>
145
- <!-- REPL -->
178
+ <!-- Correlate -->
146
179
  <g id="node11" class="node">
147
- <title>REPL</title>
148
- <path fill="none" stroke="black" d="M949.62,-40C949.62,-40 855.62,-40 855.62,-40 849.62,-40 843.62,-34 843.62,-28 843.62,-28 843.62,-16 843.62,-16 843.62,-10 849.62,-4 855.62,-4 855.62,-4 949.62,-4 949.62,-4 955.62,-4 961.62,-10 961.62,-16 961.62,-16 961.62,-28 961.62,-28 961.62,-34 955.62,-40 949.62,-40"/>
149
- <text xml:space="preserve" text-anchor="middle" x="902.62" y="-24.5" font-family="Arial" font-size="10.00">PWN REPL</text>
150
- <text xml:space="preserve" text-anchor="middle" x="902.62" y="-12.5" font-family="Arial" font-size="10.00">(Full PWN namespace)</text>
151
- </g>
152
- <!-- ToolCall&#45;&gt;REPL -->
153
- <g id="edge3" class="edge">
154
- <title>ToolCall&#45;&gt;REPL</title>
155
- <path fill="none" stroke="black" d="M564.63,-126.04C629.65,-120.35 718.82,-108.32 793.62,-83 794.57,-82.68 830.75,-62.73 861.17,-45.93"/>
156
- <polygon fill="black" stroke="black" points="862.82,-49.01 869.88,-41.11 859.44,-42.89 862.82,-49.01"/>
157
- <text xml:space="preserve" text-anchor="middle" x="890.35" y="-69.2" font-family="Arial" font-size="9.00">pwn_eval(code) or shell(cmd)</text>
158
- </g>
159
- <!-- Introspection -->
160
- <g id="node5" class="node">
161
- <title>Introspection</title>
162
- <ellipse fill="lightblue" stroke="black" cx="291.62" cy="-242.85" rx="57.98" ry="22.63"/>
163
- <text xml:space="preserve" text-anchor="middle" x="291.62" y="-245.35" font-family="Arial" font-size="10.00">Introspection &amp;</text>
164
- <text xml:space="preserve" text-anchor="middle" x="291.62" y="-233.35" font-family="Arial" font-size="10.00">Reflection</text>
180
+ <title>Correlate</title>
181
+ <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M345.88,-172.75C345.88,-172.75 146.12,-172.75 146.12,-172.75 140.12,-172.75 134.12,-166.75 134.12,-160.75 134.12,-160.75 134.12,-148.25 134.12,-148.25 134.12,-142.25 140.12,-136.25 146.12,-136.25 146.12,-136.25 345.88,-136.25 345.88,-136.25 351.88,-136.25 357.88,-142.25 357.88,-148.25 357.88,-148.25 357.88,-160.75 357.88,-160.75 357.88,-166.75 351.88,-172.75 345.88,-172.75"/>
182
+ <text xml:space="preserve" text-anchor="middle" x="246" y="-157.35" font-family="sans-Serif" font-size="12.00" fill="#0f172a">extro_correlate()</text>
183
+ <text xml:space="preserve" text-anchor="middle" x="246" y="-143.1" font-family="sans-Serif" font-size="12.00" fill="#0f172a">&quot;I did it wrong&quot; &#160;vs &#160;&quot;the world changed&quot;</text>
165
184
  </g>
166
- <!-- Skills -->
167
- <g id="node9" class="node">
168
- <title>Skills</title>
169
- <path fill="none" stroke="black" d="M836,-260.85C836,-263.06 813.42,-264.85 785.62,-264.85 757.83,-264.85 735.25,-263.06 735.25,-260.85 735.25,-260.85 735.25,-224.85 735.25,-224.85 735.25,-222.65 757.83,-220.85 785.62,-220.85 813.42,-220.85 836,-222.65 836,-224.85 836,-224.85 836,-260.85 836,-260.85"/>
170
- <path fill="none" stroke="black" d="M836,-260.85C836,-258.65 813.42,-256.85 785.62,-256.85 757.83,-256.85 735.25,-258.65 735.25,-260.85"/>
171
- <text xml:space="preserve" text-anchor="middle" x="785.62" y="-245.35" font-family="Arial" font-size="10.00">PWN::Skills</text>
172
- <text xml:space="preserve" text-anchor="middle" x="785.62" y="-233.35" font-family="Arial" font-size="10.00">(~/.pwn/skills/*.md)</text>
185
+ <!-- Metrics&#45;&gt;Correlate -->
186
+ <g id="edge12" class="edge">
187
+ <title>Metrics&#45;&gt;Correlate</title>
188
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M396,-261.03C378.65,-249.31 355.37,-233.48 335,-219.25 316.25,-206.16 295.47,-191.29 278.7,-179.21"/>
189
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="280.55,-177.08 272.42,-174.67 277.27,-181.62 280.55,-177.08"/>
190
+ </g>
191
+ <!-- Fmet -->
192
+ <g id="node12" class="node">
193
+ <title>Fmet</title>
194
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M413.5,-48.73C413.5,-50.53 397.14,-52 377,-52 356.86,-52 340.5,-50.53 340.5,-48.73 340.5,-48.73 340.5,-19.27 340.5,-19.27 340.5,-17.47 356.86,-16 377,-16 397.14,-16 413.5,-17.47 413.5,-19.27 413.5,-19.27 413.5,-48.73 413.5,-48.73"/>
195
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M413.5,-48.73C413.5,-46.92 397.14,-45.45 377,-45.45 356.86,-45.45 340.5,-46.92 340.5,-48.73"/>
196
+ <text xml:space="preserve" text-anchor="middle" x="377" y="-30.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">metrics.json</text>
173
197
  </g>
174
- <!-- Introspection&#45;&gt;Skills -->
198
+ <!-- Metrics&#45;&gt;Fmet -->
199
+ <g id="edge17" class="edge">
200
+ <title>Metrics&#45;&gt;Fmet</title>
201
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M418.76,-260.99C411.01,-219.06 391.35,-112.65 382.04,-62.26"/>
202
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="384.83,-61.97 380.63,-54.62 379.33,-62.99 384.83,-61.97"/>
203
+ </g>
204
+ <!-- Learning&#45;&gt;Correlate -->
175
205
  <g id="edge13" class="edge">
176
- <title>Introspection&#45;&gt;Skills</title>
177
- <path fill="none" stroke="black" d="M303.33,-265.34C314.64,-284.41 333.71,-310.51 358.62,-322.48 410.92,-347.6 431.11,-324.93 489.12,-325.63 594.68,-326.9 632.91,-371.08 726.62,-322.48 746.16,-312.35 760.9,-292.47 770.76,-275.1"/>
178
- <polygon fill="black" stroke="black" points="773.68,-277.07 775.29,-266.6 767.5,-273.78 773.68,-277.07"/>
179
- <text xml:space="preserve" text-anchor="middle" x="541.62" y="-342.93" font-family="Arial" font-size="9.00">distill_skill(name, content,</text>
180
- <text xml:space="preserve" text-anchor="middle" x="541.62" y="-332.43" font-family="Arial" font-size="9.00">references)</text>
206
+ <title>Learning&#45;&gt;Correlate</title>
207
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M533.92,-255.15C526.54,-252.46 519.11,-249.78 512,-247.25 442.72,-222.57 362.94,-195.19 308.96,-176.82"/>
208
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="310.2,-174.28 301.72,-174.36 308.4,-179.58 310.2,-174.28"/>
181
209
  </g>
182
- <!-- Introspection&#45;&gt;History -->
183
- <g id="edge15" class="edge">
184
- <title>Introspection&#45;&gt;History</title>
185
- <path fill="none" stroke="black" d="M235.97,-236.03C192.76,-230.23 137.91,-219.64 123.88,-202.23 115.74,-192.14 114.25,-178.27 115.24,-165.6"/>
186
- <polygon fill="black" stroke="black" points="118.67,-166.32 116.53,-155.95 111.73,-165.4 118.67,-166.32"/>
187
- <text xml:space="preserve" text-anchor="middle" x="155.75" y="-188.43" font-family="Arial" font-size="9.00">Update session</text>
210
+ <!-- Flrn -->
211
+ <g id="node13" class="node">
212
+ <title>Flrn</title>
213
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M535.5,-48.73C535.5,-50.53 517.8,-52 496,-52 474.2,-52 456.5,-50.53 456.5,-48.73 456.5,-48.73 456.5,-19.27 456.5,-19.27 456.5,-17.47 474.2,-16 496,-16 517.8,-16 535.5,-17.47 535.5,-19.27 535.5,-19.27 535.5,-48.73 535.5,-48.73"/>
214
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M535.5,-48.73C535.5,-46.92 517.8,-45.45 496,-45.45 474.2,-45.45 456.5,-46.92 456.5,-48.73"/>
215
+ <text xml:space="preserve" text-anchor="middle" x="496" y="-30.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">learning.jsonl</text>
188
216
  </g>
189
- <!-- Memory&#45;&gt;ToolCall -->
190
- <g id="edge8" class="edge">
191
- <title>Memory&#45;&gt;ToolCall</title>
192
- <path fill="none" stroke="black" d="M687.64,-44.42C700,-56.15 709.54,-70.74 699.62,-83 683.44,-103.01 626.56,-115.06 574.04,-122.1"/>
193
- <polygon fill="black" stroke="black" points="573.9,-118.59 564.42,-123.34 574.79,-125.54 573.9,-118.59"/>
194
- <text xml:space="preserve" text-anchor="middle" x="746.87" y="-74.45" font-family="Arial" font-size="9.00">recall(query) injected</text>
195
- <text xml:space="preserve" text-anchor="middle" x="746.87" y="-63.95" font-family="Arial" font-size="9.00">into prompts</text>
217
+ <!-- Learning&#45;&gt;Flrn -->
218
+ <g id="edge18" class="edge">
219
+ <title>Learning&#45;&gt;Flrn</title>
220
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M587.13,-254.71C568.19,-209.03 526.84,-109.35 507.02,-61.57"/>
221
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="509.65,-60.6 504,-54.29 504.48,-62.75 509.65,-60.6"/>
196
222
  </g>
197
- <!-- Metrics&#45;&gt;Introspection -->
198
- <g id="edge10" class="edge">
199
- <title>Metrics&#45;&gt;Introspection</title>
200
- <path fill="none" stroke="black" d="M216.99,-44.37C208.16,-72.7 196.78,-123.73 213.12,-163.23 221.71,-183.98 238.73,-202.12 254.73,-215.73"/>
201
- <polygon fill="black" stroke="black" points="252.31,-218.27 262.28,-221.86 256.72,-212.84 252.31,-218.27"/>
202
- <text xml:space="preserve" text-anchor="middle" x="239.38" y="-128.81" font-family="Arial" font-size="9.00">per&#45;tool stats</text>
223
+ <!-- Fmem -->
224
+ <g id="node14" class="node">
225
+ <title>Fmem</title>
226
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M655.75,-48.73C655.75,-50.53 638.38,-52 617,-52 595.62,-52 578.25,-50.53 578.25,-48.73 578.25,-48.73 578.25,-19.27 578.25,-19.27 578.25,-17.47 595.62,-16 617,-16 638.38,-16 655.75,-17.47 655.75,-19.27 655.75,-19.27 655.75,-48.73 655.75,-48.73"/>
227
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M655.75,-48.73C655.75,-46.92 638.38,-45.45 617,-45.45 595.62,-45.45 578.25,-46.92 578.25,-48.73"/>
228
+ <text xml:space="preserve" text-anchor="middle" x="617" y="-30.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">memory.json</text>
203
229
  </g>
204
- <!-- Learning&#45;&gt;Introspection -->
205
- <g id="edge12" class="edge">
206
- <title>Learning&#45;&gt;Introspection</title>
207
- <path fill="none" stroke="black" d="M330.35,-39.57C319.33,-45.06 309.07,-52.35 301.62,-62 269.11,-104.17 275.42,-169.82 283.3,-209.05"/>
208
- <polygon fill="black" stroke="black" points="279.83,-209.58 285.38,-218.61 286.67,-208.09 279.83,-209.58"/>
209
- <text xml:space="preserve" text-anchor="middle" x="323.33" y="-128.81" font-family="Arial" font-size="9.00">reflect on transcript</text>
230
+ <!-- Learning&#45;&gt;Fmem -->
231
+ <g id="edge19" class="edge">
232
+ <title>Learning&#45;&gt;Fmem</title>
233
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M598.95,-254.71C602.69,-209.22 610.83,-110.18 614.77,-62.17"/>
234
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="617.54,-62.63 615.4,-54.43 611.96,-62.17 617.54,-62.63"/>
235
+ <text xml:space="preserve" text-anchor="middle" x="622.16" y="-151.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">lesson</text>
210
236
  </g>
211
- <!-- Skills&#45;&gt;ToolCall -->
237
+ <!-- Fskl -->
238
+ <g id="node15" class="node">
239
+ <title>Fskl</title>
240
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M763,-48.73C763,-50.53 748.66,-52 731,-52 713.34,-52 699,-50.53 699,-48.73 699,-48.73 699,-19.27 699,-19.27 699,-17.47 713.34,-16 731,-16 748.66,-16 763,-17.47 763,-19.27 763,-19.27 763,-48.73 763,-48.73"/>
241
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M763,-48.73C763,-46.92 748.66,-45.45 731,-45.45 713.34,-45.45 699,-46.92 699,-48.73"/>
242
+ <text xml:space="preserve" text-anchor="middle" x="731" y="-30.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">skills/*.md</text>
243
+ </g>
244
+ <!-- Learning&#45;&gt;Fskl -->
245
+ <g id="edge20" class="edge">
246
+ <title>Learning&#45;&gt;Fskl</title>
247
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M612.35,-254.81C619.17,-244.07 627.17,-231.13 634,-219.25 665.74,-164 699.75,-97.49 717.86,-61.42"/>
248
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="720.37,-62.67 721.45,-54.26 715.36,-60.16 720.37,-62.67"/>
249
+ <text xml:space="preserve" text-anchor="middle" x="686.07" y="-151.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">skill</text>
250
+ </g>
251
+ <!-- Snapshot&#45;&gt;Correlate -->
212
252
  <g id="edge14" class="edge">
213
- <title>Skills&#45;&gt;ToolCall</title>
214
- <path fill="none" stroke="black" d="M774.19,-220.58C765.84,-207.15 753.28,-190.63 737.62,-181.23 710.08,-164.68 635.42,-151.96 572.65,-143.76"/>
215
- <polygon fill="black" stroke="black" points="573.35,-140.33 562.99,-142.53 572.46,-147.27 573.35,-140.33"/>
216
- <text xml:space="preserve" text-anchor="middle" x="816.11" y="-193.68" font-family="Arial" font-size="9.00">skill_list / skill_view</text>
217
- <text xml:space="preserve" text-anchor="middle" x="816.11" y="-183.18" font-family="Arial" font-size="9.00">injected into future prompts</text>
253
+ <title>Snapshot&#45;&gt;Correlate</title>
254
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M246,-260.88C246,-240.62 246,-207.13 246,-183.34"/>
255
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="248.8,-183.46 246,-175.46 243.2,-183.46 248.8,-183.46"/>
218
256
  </g>
219
- <!-- History&#45;&gt;PwnAI -->
220
- <g id="edge17" class="edge">
221
- <title>History&#45;&gt;PwnAI</title>
222
- <path fill="none" stroke="black" d="M155.7,-153.21C162.48,-156.86 169.67,-160.39 176.62,-163.23 243.8,-190.58 323.55,-211.42 382.4,-224.74"/>
223
- <polygon fill="black" stroke="black" points="381.51,-228.13 392.03,-226.9 383.04,-221.3 381.51,-228.13"/>
224
- <text xml:space="preserve" text-anchor="middle" x="340.33" y="-188.43" font-family="Arial" font-size="9.00">context from prior sessions</text>
257
+ <!-- Observe&#45;&gt;Correlate -->
258
+ <g id="edge15" class="edge">
259
+ <title>Observe&#45;&gt;Correlate</title>
260
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M102.07,-260.88C131.26,-239.51 180.6,-203.38 213.24,-179.49"/>
261
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="214.76,-181.84 219.57,-174.85 211.46,-177.32 214.76,-181.84"/>
225
262
  </g>
226
- <!-- REPL&#45;&gt;ToolCall -->
227
- <g id="edge4" class="edge">
228
- <title>REPL&#45;&gt;ToolCall</title>
229
- <path fill="none" stroke="black" d="M932.83,-40.31C950.24,-52.43 966.37,-68.91 953.62,-83 928.87,-110.37 710.31,-122.87 577.13,-128"/>
230
- <polygon fill="black" stroke="black" points="577.08,-124.5 567.22,-128.37 577.34,-131.49 577.08,-124.5"/>
231
- <text xml:space="preserve" text-anchor="middle" x="1014.82" y="-69.2" font-family="Arial" font-size="9.00">Results / stdout / exceptions</text>
263
+ <!-- Fext -->
264
+ <g id="node16" class="node">
265
+ <title>Fext</title>
266
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M297.12,-48.73C297.12,-50.53 274.21,-52 246,-52 217.79,-52 194.88,-50.53 194.88,-48.73 194.88,-48.73 194.88,-19.27 194.88,-19.27 194.88,-17.47 217.79,-16 246,-16 274.21,-16 297.12,-17.47 297.12,-19.27 297.12,-19.27 297.12,-48.73 297.12,-48.73"/>
267
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M297.12,-48.73C297.12,-46.92 274.21,-45.45 246,-45.45 217.79,-45.45 194.88,-46.92 194.88,-48.73"/>
268
+ <text xml:space="preserve" text-anchor="middle" x="246" y="-30.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">extrospection.json</text>
269
+ </g>
270
+ <!-- Observe&#45;&gt;Fext -->
271
+ <g id="edge21" class="edge">
272
+ <title>Observe&#45;&gt;Fext</title>
273
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M78.63,-260.82C80.4,-232.36 87.19,-175.59 113,-136.25 135.46,-102.02 173.55,-74.77 203.23,-57.2"/>
274
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="204.52,-59.69 210.05,-53.27 201.72,-54.84 204.52,-59.69"/>
275
+ </g>
276
+ <!-- Correlate&#45;&gt;Prompt -->
277
+ <g id="edge25" class="edge">
278
+ <title>Correlate&#45;&gt;Prompt</title>
279
+ <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M358.73,-163.68C473.02,-174.59 638.52,-198.5 678,-247.25 704.78,-280.32 704.96,-310.08 678,-343 619.62,-414.28 356.98,-374.97 266,-389.5 248.45,-392.3 229.5,-396.38 212.5,-400.43"/>
280
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="212.25,-397.61 205.13,-402.22 213.57,-403.05 212.25,-397.61"/>
281
+ <text xml:space="preserve" text-anchor="middle" x="737.53" y="-276.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">findings → next run</text>
282
+ </g>
283
+ <!-- Correlate&#45;&gt;Fmet -->
284
+ <!-- Fmem&#45;&gt;Prompt -->
285
+ <g id="edge22" class="edge">
286
+ <title>Fmem&#45;&gt;Prompt</title>
287
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M633.9,-52.68C673.84,-94.96 771.88,-201.78 787,-247.25 800.43,-287.63 814,-310.1 787,-343 750.13,-387.93 323.49,-380.96 266,-389.5 248.09,-392.16 228.75,-396.28 211.5,-400.42"/>
288
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="211.17,-397.62 204.07,-402.24 212.51,-403.06 211.17,-397.62"/>
289
+ <text xml:space="preserve" text-anchor="middle" x="804.5" y="-210.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">MEMORY block</text>
290
+ </g>
291
+ <!-- Fskl&#45;&gt;Prompt -->
292
+ <g id="edge23" class="edge">
293
+ <title>Fskl&#45;&gt;Prompt</title>
294
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M747.89,-52.39C775.06,-81.72 827.43,-144.19 847,-208.75 864.5,-266.48 862.72,-294.39 827,-343 816.11,-357.82 807.77,-356.8 790,-361.5 564.53,-421.12 496.89,-356.62 266,-389.5 248.07,-392.05 228.73,-396.15 211.48,-400.29"/>
295
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="211.15,-397.49 204.05,-402.12 212.49,-402.93 211.15,-397.49"/>
296
+ <text xml:space="preserve" text-anchor="middle" x="877.38" y="-210.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">SKILLS block</text>
297
+ </g>
298
+ <!-- Fext&#45;&gt;Prompt -->
299
+ <g id="edge24" class="edge">
300
+ <title>Fext&#45;&gt;Prompt</title>
301
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M263.15,-52.62C276.95,-65.62 297.51,-82.51 319,-91.25 622.57,-214.77 840.6,45.84 1047,-208.75 1084.61,-255.14 1077.51,-295.73 1041,-343 988.27,-411.27 351.49,-377.95 266,-389.5 248.06,-391.92 228.71,-395.99 211.46,-400.14"/>
302
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="211.13,-397.34 204.03,-401.98 212.47,-402.78 211.13,-397.34"/>
303
+ <text xml:space="preserve" text-anchor="middle" x="1081.55" y="-210.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">EXTRO block</text>
232
304
  </g>
233
305
  </g>
234
306
  </svg>