pwn 0.5.617 → 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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +95 -85
  3. data/README.md.bak +200 -0
  4. data/documentation/AI-Integration.md +42 -26
  5. data/documentation/AWS.md +57 -0
  6. data/documentation/Agent-Tool-Registry.md +56 -0
  7. data/documentation/Banner.md +17 -0
  8. data/documentation/Blockchain.md +18 -0
  9. data/documentation/Bounty.md +21 -0
  10. data/documentation/BurpSuite.md +41 -16
  11. data/documentation/CLI-Drivers.md +58 -0
  12. data/documentation/Configuration.md +66 -0
  13. data/documentation/Contributing.md +33 -19
  14. data/documentation/Cron.md +47 -0
  15. data/documentation/Drivers.md +43 -16
  16. data/documentation/Extrospection.md +54 -0
  17. data/documentation/FFI.md +14 -0
  18. data/documentation/Fuzzing.md +36 -0
  19. data/documentation/Hardware.md +40 -0
  20. data/documentation/Metasploit.md +34 -0
  21. data/documentation/NmapIt.md +18 -12
  22. data/documentation/PWN.png +0 -0
  23. data/documentation/PWN_Contributors_and_Users.png +0 -0
  24. data/documentation/Persistence.md +38 -0
  25. data/documentation/Plugins.md +97 -47
  26. data/documentation/Reporting.md +25 -18
  27. data/documentation/SAST.md +39 -22
  28. data/documentation/SDR.md +40 -0
  29. data/documentation/Sessions.md +39 -0
  30. data/documentation/Skills-Memory-Learning.md +49 -29
  31. data/documentation/Swarm.md +71 -0
  32. data/documentation/Transparent-Browser.md +26 -22
  33. data/documentation/Troubleshooting.md +44 -25
  34. data/documentation/WWW.md +32 -0
  35. data/documentation/diagrams/agent-tool-registry.svg +284 -0
  36. data/documentation/diagrams/aws-cloud-security.svg +166 -0
  37. data/documentation/diagrams/cron-scheduling.svg +148 -0
  38. data/documentation/diagrams/dot/hardware-hacking.dot +48 -0
  39. data/documentation/diagrams/dot/persistence-filesystem.dot +29 -0
  40. data/documentation/diagrams/extrospection-world-awareness.svg +185 -0
  41. data/documentation/diagrams/hardware-hacking.svg +163 -0
  42. data/documentation/diagrams/persistence-filesystem.svg +174 -0
  43. data/documentation/diagrams/sdr-radio-flow.svg +146 -0
  44. data/documentation/diagrams/swarm-multi-agent.svg +225 -0
  45. data/documentation/fax-spectrogram.png +0 -0
  46. data/documentation/fax-waveform.png +0 -0
  47. data/documentation/pwn-REPL.md +40 -24
  48. data/documentation/pwn-ai-Agent.md +59 -30
  49. data/documentation/pwn_android_war_dialer_session.png +0 -0
  50. data/documentation/pwn_install.png +0 -0
  51. data/documentation/pwn_wallpaper.jpg +0 -0
  52. data/documentation/ringing-spectrogram.png +0 -0
  53. data/documentation/ringing-waveform.png +0 -0
  54. data/lib/pwn/version.rb +1 -1
  55. data/third_party/pwn_rdoc.jsonl +22 -5
  56. metadata +39 -1
@@ -1,32 +1,36 @@
1
- # Transparent Browser
1
+ # `PWN::Plugins::TransparentBrowser`
2
2
 
3
- `PWN::Plugins::TransparentBrowser` — powerful browser automation (headless + visible) built on top of Selenium / Watir / Ferrum / similar.
3
+ Watir + Selenium wrapper that gives you a real Chrome/Firefox headless or
4
+ visible — with proxy support, DevTools protocol access, and cookie/console
5
+ capture. It's the traffic source for [BurpSuite](BurpSuite.md), the engine
6
+ under every [`PWN::WWW`](WWW.md) driver, and the agent's go-to for anything
7
+ JS-heavy.
4
8
 
5
- ## Primary Uses
6
-
7
- - Web spidering / crawling
8
- - JavaScript-heavy application interaction
9
- - Automated form submission, auth flows
10
- - Screenshotting, DOM inspection
11
- - Proxied browsing (pairs excellently with BurpSuite)
12
-
13
- ## Example Calls
9
+ ## Open
14
10
 
15
11
  ```ruby
16
- browser = PWN::Plugins::TransparentBrowser.open_browser(
17
- browser_type: :chrome,
18
- proxy: 'http://127.0.0.1:8080' # Burp
12
+ b = PWN::Plugins::TransparentBrowser.open(
13
+ browser_type: :headless, # :chrome | :firefox | :headless | :rest
14
+ proxy: 'http://127.0.0.1:8080',
15
+ with_devtools: true
19
16
  )
20
- browser.goto 'https://target.example.com'
21
- # ... interact ...
22
- browser.close
17
+ b[:browser].goto 'https://target'
18
+ b[:browser].text_field(name: 'q').set 'pwn'
23
19
  ```
24
20
 
25
- Agent-friendly.
21
+ ## Useful bits
22
+
23
+ ```ruby
24
+ b[:browser].cookies.to_a
25
+ b[:browser].execute_script('return document.title')
26
+ b[:devtools].send_cmd('Network.enable')
27
+ PWN::Plugins::TransparentBrowser.dump_links(browser_obj: b)
28
+ PWN::Plugins::TransparentBrowser.close(browser_obj: b)
29
+ ```
26
30
 
27
- ## See Also
31
+ ## `:rest` mode
28
32
 
29
- - [Burp Suite](BurpSuite.md)
30
- - [Plugins](Plugins.md)
33
+ `browser_type: :rest` returns a `RestClient`-backed object with the same proxy
34
+ plumbing — for APIs where a full browser is overkill.
31
35
 
32
- [[Diagrams]]
36
+ [← Home](Home.md) · [BurpSuite](BurpSuite.md) · [WWW](WWW.md)
@@ -1,38 +1,57 @@
1
1
  # Troubleshooting
2
2
 
3
- ## Common Issues
3
+ ## SHIFT+ENTER submits instead of newline
4
4
 
5
- ### Burp / ZAP Proxy Problems
6
- - Prefer `PWN::Plugins::BurpSuite`
7
- - 502 errors usually mean upstream proxy not listening or crashed. Check with `ps`, `ss -tlnp`, restart via plugin methods.
5
+ `pwn-ai` / `pwn-asm` need the terminal to send a *distinct* code for
6
+ Shift-Enter. Under **tmux** both sides must be configured:
8
7
 
9
- ### Ruby / Gemset Issues
10
- - Use RVM and the gemset defined in `.ruby-version` / `.ruby-gemset`.
11
- - Re-run `./install.sh ruby-gem` or the vagrant provisioner after Ruby upgrades.
12
-
13
- ### AI / LLM Authentication
14
- - Grok uses OAuth device flow (public client) — see `xai_grok_oauth_device_flow` skill.
15
- - Store credentials via `PWN::Config` or environment as documented.
8
+ ```tmux
9
+ # ~/.tmux.conf
10
+ set -s extended-keys on
11
+ set -as terminal-features 'xterm*:extkeys' # replace xterm* with your $TERM
12
+ ```
16
13
 
17
- ### SHIFT+ENTER Not Working in pwn-ai
18
- - Requires tmux `extended-keys on` on **both** inner and outer sides.
19
- - See recent lessons in memory for exact tmux config.
14
+ Then fully **detach and re-attach** (a `source-file` isn't enough for
15
+ `terminal-features`). Verify with `tmux display -p '#{client_termfeatures}'`
16
+ it must include `extkeys`.
20
17
 
21
- ### Git / Permissions
22
- - Run `sudo chown -R $USER:$USER /opt/pwn` if permission issues after install.
18
+ ## `502 Bad Gateway` from a proxy plugin
23
19
 
24
- ## Diagnostics
20
+ The upstream (Burp/ZAP) isn't listening. Check:
25
21
 
26
22
  ```bash
27
- pwn
28
- PWN.help
29
- # Inside REPL:
30
- PWN::Config
31
- PWN::Plugins::PWNLogger
23
+ ps aux | grep -E 'burp|zap'
24
+ ss -tlnp | grep -E ':8080|:1337'
32
25
  ```
33
26
 
34
- Check `~/.pwn/` for logs, metrics, learning files.
27
+ Restart via `PWN::Plugins::BurpSuite.start` / `PWN::Plugins::Zaproxy.start` or
28
+ fix the port in `~/.pwn/config.yml`.
29
+
30
+ ## `Psych::DisallowedClass` on cron/agents YAML
31
+
32
+ Fixed in current `PWN::Cron` / `Swarm` — both loaders now pass
33
+ `permitted_classes: [Symbol]`. If you see it, `git pull && rake install`.
34
+
35
+ ## Agent stops early ("max iterations")
36
+
37
+ Raise `ai.agent.max_iters` in `~/.pwn/config.yml`, or split the request.
38
+
39
+ ## A tool is stuck at 0 % success
40
+
41
+ If you've since fixed the tool, wipe the stale telemetry so it stops steering
42
+ the agent away: `metrics_reset(confirm: true)`.
43
+
44
+ ## LLM auth
45
+
46
+ | Engine | Fix |
47
+ |---|---|
48
+ | grok `oauth: true` | first run prints a `https://accounts.x.ai/…` URL — open it, approve, token is cached |
49
+ | ollama | ensure `ollama serve` is running and `base_url:` matches |
50
+ | others | check `key:` under `ai.<engine>` in `~/.pwn/config.yml` |
51
+
52
+ ## Diagrams won't rebuild
35
53
 
36
- Report bugs via GitHub issues with full reproduction + `pwn` version.
54
+ `sudo apt install graphviz` (need `dot` on `$PATH`), then
55
+ `cd documentation/diagrams && ./build.sh`.
37
56
 
38
- [[Diagrams]]
57
+ [← Home](Home.md)
@@ -0,0 +1,32 @@
1
+ # `PWN::WWW` — Site-Specific Browser Automations
2
+
3
+ 21 modules, each a scripted [`TransparentBrowser`](Transparent-Browser.md)
4
+ session against a real site: log in, navigate, scrape, submit.
5
+ Source: `lib/pwn/www/*.rb`.
6
+
7
+ ## Modules
8
+
9
+ | Category | Modules |
10
+ |---|---|
11
+ | **Bug bounty** | `HackerOne` · `BugCrowd` · `Synack` · `AppCobaltIO` |
12
+ | **Search / OSINT** | `Google` · `Bing` · `DuckDuckGo` · `Torch` · `WaybackMachine` · `Pastebin` · `Checkip` |
13
+ | **Social** | `Twitter` · `Facebook` · `LinkedIn` · `Youtube` · `Pandora` |
14
+ | **Finance / Work** | `CoinbasePro` · `Paypal` · `TradingView` · `Uber` · `Upwork` |
15
+
16
+ ## Pattern
17
+
18
+ ```ruby
19
+ b = PWN::WWW::HackerOne.open(browser_type: :headless,
20
+ proxy: 'http://127.0.0.1:8080')
21
+ PWN::WWW::HackerOne.login(browser_obj: b, username: '…', mfa: '…')
22
+ # ... scripted navigation ...
23
+ PWN::WWW::HackerOne.logout(browser_obj: b)
24
+ PWN::Plugins::TransparentBrowser.close(browser_obj: b)
25
+ ```
26
+
27
+ Because traffic goes through TransparentBrowser, you can point `proxy:` at
28
+ [BurpSuite](BurpSuite.md) and passively capture every request the automation
29
+ makes.
30
+
31
+ [← Home](Home.md) · [Transparent-Browser](Transparent-Browser.md) ·
32
+ [Bounty](Bounty.md)
@@ -0,0 +1,284 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <!-- Generated by graphviz version 14.1.2 (0)
5
+ -->
6
+ <!-- Title: PWN_Agent_Tool_Registry Pages: 1 -->
7
+ <svg width="652pt" height="785pt"
8
+ viewBox="0.00 0.00 652.00 785.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 742.2)">
10
+ <title>PWN_Agent_Tool_Registry</title>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-742.2 608.45,-742.2 608.45,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="10.38" y="-677" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::Registry — Toolsets exposed to the LLM</text>
13
+ <text xml:space="preserve" text-anchor="start" x="152.12" y="-665.55" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">10 toolsets · 45+ callable tools · lib/pwn/ai/agent/tools/*</text>
14
+ <g id="clust1" class="cluster">
15
+ <title>cluster_ts</title>
16
+ <path fill="#022c22" stroke="#047857" stroke-width="2" d="M201.25,-9C201.25,-9 267.75,-9 267.75,-9 273.75,-9 279.75,-15 279.75,-21 279.75,-21 279.75,-629 279.75,-629 279.75,-635 273.75,-641 267.75,-641 267.75,-641 201.25,-641 201.25,-641 195.25,-641 189.25,-635 189.25,-629 189.25,-629 189.25,-21 189.25,-21 189.25,-15 195.25,-9 201.25,-9"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-618" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Toolsets</text>
18
+ </g>
19
+ <g id="clust2" class="cluster">
20
+ <title>cluster_tools</title>
21
+ <path fill="#422006" stroke="#a16207" stroke-width="2" d="M376.75,-8C376.75,-8 553.25,-8 553.25,-8 559.25,-8 565.25,-14 565.25,-20 565.25,-20 565.25,-640 565.25,-640 565.25,-646 559.25,-652 553.25,-652 553.25,-652 376.75,-652 376.75,-652 370.75,-652 364.75,-646 364.75,-640 364.75,-640 364.75,-20 364.75,-20 364.75,-14 370.75,-8 376.75,-8"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="465" y="-629" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Tools &#160;(LLM&#45;callable)</text>
23
+ </g>
24
+ <!-- Registry -->
25
+ <g id="node1" class="node">
26
+ <title>Registry</title>
27
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M84.25,-334.38C84.25,-334.38 12,-334.38 12,-334.38 6,-334.38 0,-328.38 0,-322.38 0,-322.38 0,-295.62 0,-295.62 0,-289.62 6,-283.62 12,-283.62 12,-283.62 84.25,-283.62 84.25,-283.62 90.25,-283.62 96.25,-289.62 96.25,-295.62 96.25,-295.62 96.25,-322.38 96.25,-322.38 96.25,-328.38 90.25,-334.38 84.25,-334.38"/>
28
+ <text xml:space="preserve" text-anchor="middle" x="48.12" y="-318.98" font-family="sans-Serif" font-size="12.00" fill="#0f172a">Registry</text>
29
+ <text xml:space="preserve" text-anchor="middle" x="48.12" y="-304.73" font-family="sans-Serif" font-size="12.00" fill="#0f172a">JSON&#45;Schema</text>
30
+ <text xml:space="preserve" text-anchor="middle" x="48.12" y="-290.48" font-family="sans-Serif" font-size="12.00" fill="#0f172a">function defs</text>
31
+ </g>
32
+ <!-- terminal -->
33
+ <g id="node2" class="node">
34
+ <title>terminal</title>
35
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-53C249.5,-53 219.5,-53 219.5,-53 213.5,-53 207.5,-47 207.5,-41 207.5,-41 207.5,-29 207.5,-29 207.5,-23 213.5,-17 219.5,-17 219.5,-17 249.5,-17 249.5,-17 255.5,-17 261.5,-23 261.5,-29 261.5,-29 261.5,-41 261.5,-41 261.5,-47 255.5,-53 249.5,-53"/>
36
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-31.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">terminal</text>
37
+ </g>
38
+ <!-- Registry&#45;&gt;terminal -->
39
+ <g id="edge1" class="edge">
40
+ <title>Registry&#45;&gt;terminal</title>
41
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M59.65,-282.85C79.6,-235.57 126.6,-134.42 189.25,-66 192.58,-62.37 196.4,-58.92 200.38,-55.73"/>
42
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="201.71,-57.8 205.83,-51.63 198.76,-53.88 201.71,-57.8"/>
43
+ </g>
44
+ <!-- pwn -->
45
+ <g id="node3" class="node">
46
+ <title>pwn</title>
47
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-114C249.5,-114 219.5,-114 219.5,-114 213.5,-114 207.5,-108 207.5,-102 207.5,-102 207.5,-90 207.5,-90 207.5,-84 213.5,-78 219.5,-78 219.5,-78 249.5,-78 249.5,-78 255.5,-78 261.5,-84 261.5,-90 261.5,-90 261.5,-102 261.5,-102 261.5,-108 255.5,-114 249.5,-114"/>
48
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-92.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">pwn</text>
49
+ </g>
50
+ <!-- Registry&#45;&gt;pwn -->
51
+ <g id="edge2" class="edge">
52
+ <title>Registry&#45;&gt;pwn</title>
53
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M65.53,-282.9C89.7,-245.65 137.65,-176.32 189.25,-127 192.72,-123.68 196.58,-120.44 200.53,-117.4"/>
54
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="201.7,-119.58 205.87,-113.45 198.78,-115.64 201.7,-119.58"/>
55
+ </g>
56
+ <!-- memory -->
57
+ <g id="node4" class="node">
58
+ <title>memory</title>
59
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-175C249.5,-175 219.5,-175 219.5,-175 213.5,-175 207.5,-169 207.5,-163 207.5,-163 207.5,-151 207.5,-151 207.5,-145 213.5,-139 219.5,-139 219.5,-139 249.5,-139 249.5,-139 255.5,-139 261.5,-145 261.5,-151 261.5,-151 261.5,-163 261.5,-163 261.5,-169 255.5,-175 249.5,-175"/>
60
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-153.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory</text>
61
+ </g>
62
+ <!-- Registry&#45;&gt;memory -->
63
+ <g id="edge3" class="edge">
64
+ <title>Registry&#45;&gt;memory</title>
65
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M77.66,-282.86C105.48,-257.74 149.31,-219.11 189.25,-188 192.68,-185.33 196.31,-182.61 199.97,-179.95"/>
66
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="201.36,-181.97 205.62,-175.9 198.51,-177.99 201.36,-181.97"/>
67
+ </g>
68
+ <!-- skills -->
69
+ <g id="node5" class="node">
70
+ <title>skills</title>
71
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-236C249.5,-236 219.5,-236 219.5,-236 213.5,-236 207.5,-230 207.5,-224 207.5,-224 207.5,-212 207.5,-212 207.5,-206 213.5,-200 219.5,-200 219.5,-200 249.5,-200 249.5,-200 255.5,-200 261.5,-206 261.5,-212 261.5,-212 261.5,-224 261.5,-224 261.5,-230 255.5,-236 249.5,-236"/>
72
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-214.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skills</text>
73
+ </g>
74
+ <!-- Registry&#45;&gt;skills -->
75
+ <g id="edge4" class="edge">
76
+ <title>Registry&#45;&gt;skills</title>
77
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M97.09,-285.33C129.08,-269.54 170.38,-249.16 199.11,-234.97"/>
78
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="200.18,-237.18 205.38,-231.88 198.01,-232.78 200.18,-237.18"/>
79
+ </g>
80
+ <!-- sessions -->
81
+ <g id="node6" class="node">
82
+ <title>sessions</title>
83
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M250,-297C250,-297 219,-297 219,-297 213,-297 207,-291 207,-285 207,-285 207,-273 207,-273 207,-267 213,-261 219,-261 219,-261 250,-261 250,-261 256,-261 262,-267 262,-273 262,-273 262,-285 262,-285 262,-291 256,-297 250,-297"/>
84
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-275.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions</text>
85
+ </g>
86
+ <!-- Registry&#45;&gt;sessions -->
87
+ <g id="edge5" class="edge">
88
+ <title>Registry&#45;&gt;sessions</title>
89
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M97.09,-301.2C128.71,-296.05 169.42,-289.43 198.11,-284.76"/>
90
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="198.45,-287.19 204.96,-283.64 197.66,-282.35 198.45,-287.19"/>
91
+ </g>
92
+ <!-- learning -->
93
+ <g id="node7" class="node">
94
+ <title>learning</title>
95
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-358C249.5,-358 219.5,-358 219.5,-358 213.5,-358 207.5,-352 207.5,-346 207.5,-346 207.5,-334 207.5,-334 207.5,-328 213.5,-322 219.5,-322 219.5,-322 249.5,-322 249.5,-322 255.5,-322 261.5,-328 261.5,-334 261.5,-334 261.5,-346 261.5,-346 261.5,-352 255.5,-358 249.5,-358"/>
96
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-336.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning</text>
97
+ </g>
98
+ <!-- Registry&#45;&gt;learning -->
99
+ <g id="edge6" class="edge">
100
+ <title>Registry&#45;&gt;learning</title>
101
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M97.09,-317.06C128.8,-322.4 169.67,-329.27 198.37,-334.09"/>
102
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="197.92,-336.5 205.23,-335.25 198.73,-331.67 197.92,-336.5"/>
103
+ </g>
104
+ <!-- metrics -->
105
+ <g id="node8" class="node">
106
+ <title>metrics</title>
107
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-419C249.5,-419 219.5,-419 219.5,-419 213.5,-419 207.5,-413 207.5,-407 207.5,-407 207.5,-395 207.5,-395 207.5,-389 213.5,-383 219.5,-383 219.5,-383 249.5,-383 249.5,-383 255.5,-383 261.5,-389 261.5,-395 261.5,-395 261.5,-407 261.5,-407 261.5,-413 255.5,-419 249.5,-419"/>
108
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-397.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">metrics</text>
109
+ </g>
110
+ <!-- Registry&#45;&gt;metrics -->
111
+ <g id="edge7" class="edge">
112
+ <title>Registry&#45;&gt;metrics</title>
113
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M97.09,-332.93C129.21,-348.96 170.73,-369.68 199.48,-384.03"/>
114
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="198.02,-386.03 205.38,-386.97 200.21,-381.65 198.02,-386.03"/>
115
+ </g>
116
+ <!-- extro -->
117
+ <g id="node9" class="node">
118
+ <title>extro</title>
119
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M259.75,-480C259.75,-480 209.25,-480 209.25,-480 203.25,-480 197.25,-474 197.25,-468 197.25,-468 197.25,-456 197.25,-456 197.25,-450 203.25,-444 209.25,-444 209.25,-444 259.75,-444 259.75,-444 265.75,-444 271.75,-450 271.75,-456 271.75,-456 271.75,-468 271.75,-468 271.75,-474 265.75,-480 259.75,-480"/>
120
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-458.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extrospection</text>
121
+ </g>
122
+ <!-- Registry&#45;&gt;extro -->
123
+ <g id="edge8" class="edge">
124
+ <title>Registry&#45;&gt;extro</title>
125
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M76.96,-335.28C104.62,-360.95 148.66,-400.62 189.25,-432 192.06,-434.17 195.02,-436.36 198.01,-438.52"/>
126
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="196.54,-440.48 203.68,-442.51 199.37,-436.48 196.54,-440.48"/>
127
+ </g>
128
+ <!-- cron -->
129
+ <g id="node10" class="node">
130
+ <title>cron</title>
131
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-541C249.5,-541 219.5,-541 219.5,-541 213.5,-541 207.5,-535 207.5,-529 207.5,-529 207.5,-517 207.5,-517 207.5,-511 213.5,-505 219.5,-505 219.5,-505 249.5,-505 249.5,-505 255.5,-505 261.5,-511 261.5,-517 261.5,-517 261.5,-529 261.5,-529 261.5,-535 255.5,-541 249.5,-541"/>
132
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-519.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">cron</text>
133
+ </g>
134
+ <!-- Registry&#45;&gt;cron -->
135
+ <g id="edge9" class="edge">
136
+ <title>Registry&#45;&gt;cron</title>
137
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M65.16,-335.2C89.07,-372.93 136.9,-443.46 189.25,-493 192.62,-496.19 196.36,-499.28 200.2,-502.18"/>
138
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="198.7,-504.12 205.81,-506.22 201.56,-500.14 198.7,-504.12"/>
139
+ </g>
140
+ <!-- swarm -->
141
+ <g id="node11" class="node">
142
+ <title>swarm</title>
143
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-602C249.5,-602 219.5,-602 219.5,-602 213.5,-602 207.5,-596 207.5,-590 207.5,-590 207.5,-578 207.5,-578 207.5,-572 213.5,-566 219.5,-566 219.5,-566 249.5,-566 249.5,-566 255.5,-566 261.5,-572 261.5,-578 261.5,-578 261.5,-590 261.5,-590 261.5,-596 255.5,-602 249.5,-602"/>
144
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-580.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">swarm</text>
145
+ </g>
146
+ <!-- Registry&#45;&gt;swarm -->
147
+ <g id="edge10" class="edge">
148
+ <title>Registry&#45;&gt;swarm</title>
149
+ <path fill="none" stroke="#94a3b8" stroke-width="1.1" d="M59.34,-335.09C78.95,-382.76 125.64,-485.35 189.25,-554 192.56,-557.58 196.38,-560.95 200.35,-564.05"/>
150
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.1" points="198.69,-565.87 205.79,-568.02 201.58,-561.91 198.69,-565.87"/>
151
+ </g>
152
+ <!-- t_shell -->
153
+ <g id="node12" class="node">
154
+ <title>t_shell</title>
155
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M479.5,-52C479.5,-52 449.5,-52 449.5,-52 443.5,-52 437.5,-46 437.5,-40 437.5,-40 437.5,-28 437.5,-28 437.5,-22 443.5,-16 449.5,-16 449.5,-16 479.5,-16 479.5,-16 485.5,-16 491.5,-22 491.5,-28 491.5,-28 491.5,-40 491.5,-40 491.5,-46 485.5,-52 479.5,-52"/>
156
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-30.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">shell</text>
157
+ </g>
158
+ <!-- terminal&#45;&gt;t_shell -->
159
+ <g id="edge11" class="edge">
160
+ <title>terminal&#45;&gt;t_shell</title>
161
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-34.88C303.37,-34.7 382.84,-34.35 428.65,-34.15"/>
162
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="428.41,-36.6 435.4,-34.12 428.39,-31.7 428.41,-36.6"/>
163
+ </g>
164
+ <!-- t_eval -->
165
+ <g id="node13" class="node">
166
+ <title>t_eval</title>
167
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M480.38,-113C480.38,-113 448.62,-113 448.62,-113 442.62,-113 436.62,-107 436.62,-101 436.62,-101 436.62,-89 436.62,-89 436.62,-83 442.62,-77 448.62,-77 448.62,-77 480.38,-77 480.38,-77 486.38,-77 492.38,-83 492.38,-89 492.38,-89 492.38,-101 492.38,-101 492.38,-107 486.38,-113 480.38,-113"/>
168
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-91.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">pwn_eval</text>
169
+ </g>
170
+ <!-- pwn&#45;&gt;t_eval -->
171
+ <g id="edge12" class="edge">
172
+ <title>pwn&#45;&gt;t_eval</title>
173
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-95.88C303.04,-95.7 381.57,-95.36 427.54,-95.16"/>
174
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="427.35,-97.61 434.34,-95.13 427.33,-92.71 427.35,-97.61"/>
175
+ </g>
176
+ <!-- t_mem -->
177
+ <g id="node14" class="node">
178
+ <title>t_mem</title>
179
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M500.62,-174C500.62,-174 428.38,-174 428.38,-174 422.38,-174 416.38,-168 416.38,-162 416.38,-162 416.38,-150 416.38,-150 416.38,-144 422.38,-138 428.38,-138 428.38,-138 500.62,-138 500.62,-138 506.62,-138 512.62,-144 512.62,-150 512.62,-150 512.62,-162 512.62,-162 512.62,-168 506.62,-174 500.62,-174"/>
180
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-157.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">memory_remember</text>
181
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-147.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">recall · forget · clear</text>
182
+ </g>
183
+ <!-- memory&#45;&gt;t_mem -->
184
+ <g id="edge13" class="edge">
185
+ <title>memory&#45;&gt;t_mem</title>
186
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-156.88C297.6,-156.73 361.35,-156.45 407.64,-156.24"/>
187
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="407.42,-158.7 414.41,-156.22 407.4,-153.8 407.42,-158.7"/>
188
+ </g>
189
+ <!-- t_skill -->
190
+ <g id="node15" class="node">
191
+ <title>t_skill</title>
192
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M522.75,-235C522.75,-235 406.25,-235 406.25,-235 400.25,-235 394.25,-229 394.25,-223 394.25,-223 394.25,-211 394.25,-211 394.25,-205 400.25,-199 406.25,-199 406.25,-199 522.75,-199 522.75,-199 528.75,-199 534.75,-205 534.75,-211 534.75,-211 534.75,-223 534.75,-223 534.75,-229 528.75,-235 522.75,-235"/>
193
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-218.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">skill_list · view</text>
194
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-208.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">create · add_reference · delete</text>
195
+ </g>
196
+ <!-- skills&#45;&gt;t_skill -->
197
+ <g id="edge14" class="edge">
198
+ <title>skills&#45;&gt;t_skill</title>
199
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-217.88C292.17,-217.75 342.5,-217.53 385.32,-217.34"/>
200
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="385.13,-219.79 392.11,-217.31 385.1,-214.89 385.13,-219.79"/>
201
+ </g>
202
+ <!-- t_sess -->
203
+ <g id="node16" class="node">
204
+ <title>t_sess</title>
205
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M503.62,-296C503.62,-296 425.38,-296 425.38,-296 419.38,-296 413.38,-290 413.38,-284 413.38,-284 413.38,-272 413.38,-272 413.38,-266 419.38,-260 425.38,-260 425.38,-260 503.62,-260 503.62,-260 509.62,-260 515.62,-266 515.62,-272 515.62,-272 515.62,-284 515.62,-284 515.62,-290 509.62,-296 503.62,-296"/>
206
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-279.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">sessions_list · view</text>
207
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-269.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">current · delete · stats</text>
208
+ </g>
209
+ <!-- sessions&#45;&gt;t_sess -->
210
+ <g id="edge15" class="edge">
211
+ <title>sessions&#45;&gt;t_sess</title>
212
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.55,-278.88C297.24,-278.73 358.36,-278.46 404.12,-278.26"/>
213
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="404.11,-280.71 411.1,-278.23 404.08,-275.81 404.11,-280.71"/>
214
+ </g>
215
+ <!-- t_learn -->
216
+ <g id="node17" class="node">
217
+ <title>t_learn</title>
218
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M520.88,-360.75C520.88,-360.75 408.12,-360.75 408.12,-360.75 402.12,-360.75 396.12,-354.75 396.12,-348.75 396.12,-348.75 396.12,-333.25 396.12,-333.25 396.12,-327.25 402.12,-321.25 408.12,-321.25 408.12,-321.25 520.88,-321.25 520.88,-321.25 526.88,-321.25 532.88,-327.25 532.88,-333.25 532.88,-333.25 532.88,-348.75 532.88,-348.75 532.88,-354.75 526.88,-360.75 520.88,-360.75"/>
219
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-348.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">learning_note_outcome</text>
220
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-337.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">reflect · distill_skill</text>
221
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-327.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">consolidate · outcomes · reset</text>
222
+ </g>
223
+ <!-- learning&#45;&gt;t_learn -->
224
+ <g id="edge16" class="edge">
225
+ <title>learning&#45;&gt;t_learn</title>
226
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-340.12C292.61,-340.25 343.98,-340.48 387.2,-340.67"/>
227
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="387.05,-343.11 394.06,-340.7 387.07,-338.21 387.05,-343.11"/>
228
+ </g>
229
+ <!-- t_metric -->
230
+ <g id="node18" class="node">
231
+ <title>t_metric</title>
232
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M496.5,-422C496.5,-422 432.5,-422 432.5,-422 426.5,-422 420.5,-416 420.5,-410 420.5,-410 420.5,-398 420.5,-398 420.5,-392 426.5,-386 432.5,-386 432.5,-386 496.5,-386 496.5,-386 502.5,-386 508.5,-392 508.5,-398 508.5,-398 508.5,-410 508.5,-410 508.5,-416 502.5,-422 496.5,-422"/>
233
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-405.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">metrics_summary</text>
234
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-395.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">metrics_reset</text>
235
+ </g>
236
+ <!-- metrics&#45;&gt;t_metric -->
237
+ <g id="edge17" class="edge">
238
+ <title>metrics&#45;&gt;t_metric</title>
239
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-401.35C298.59,-401.83 364.95,-402.7 411.49,-403.32"/>
240
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="411.25,-405.76 418.28,-403.4 411.31,-400.86 411.25,-405.76"/>
241
+ </g>
242
+ <!-- t_extro -->
243
+ <g id="node19" class="node">
244
+ <title>t_extro</title>
245
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M513,-486.75C513,-486.75 416,-486.75 416,-486.75 410,-486.75 404,-480.75 404,-474.75 404,-474.75 404,-459.25 404,-459.25 404,-453.25 410,-447.25 416,-447.25 416,-447.25 513,-447.25 513,-447.25 519,-447.25 525,-453.25 525,-459.25 525,-459.25 525,-474.75 525,-474.75 525,-480.75 519,-486.75 513,-486.75"/>
246
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-474.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">extro_snapshot · drift</text>
247
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-463.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">observe · intel · correlate</text>
248
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-453.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">observations · stats · reset</text>
249
+ </g>
250
+ <!-- extro&#45;&gt;t_extro -->
251
+ <g id="edge18" class="edge">
252
+ <title>extro&#45;&gt;t_extro</title>
253
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M272.39,-462.81C305.45,-463.53 354.8,-464.62 395.08,-465.5"/>
254
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="394.81,-467.94 401.86,-465.65 394.91,-463.05 394.81,-467.94"/>
255
+ </g>
256
+ <!-- t_cron -->
257
+ <g id="node20" class="node">
258
+ <title>t_cron</title>
259
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M511.88,-548C511.88,-548 417.12,-548 417.12,-548 411.12,-548 405.12,-542 405.12,-536 405.12,-536 405.12,-524 405.12,-524 405.12,-518 411.12,-512 417.12,-512 417.12,-512 511.88,-512 511.88,-512 517.88,-512 523.88,-518 523.88,-524 523.88,-524 523.88,-536 523.88,-536 523.88,-542 517.88,-548 511.88,-548"/>
260
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-531.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">cron_list · create · run</text>
261
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-521.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">enable · disable · remove</text>
262
+ </g>
263
+ <!-- cron&#45;&gt;t_cron -->
264
+ <g id="edge19" class="edge">
265
+ <title>cron&#45;&gt;t_cron</title>
266
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-523.82C294.77,-524.82 351.36,-526.56 396.25,-527.94"/>
267
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="396.04,-530.38 403.11,-528.15 396.19,-525.48 396.04,-530.38"/>
268
+ </g>
269
+ <!-- t_swarm -->
270
+ <g id="node21" class="node">
271
+ <title>t_swarm</title>
272
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M509.25,-612.75C509.25,-612.75 419.75,-612.75 419.75,-612.75 413.75,-612.75 407.75,-606.75 407.75,-600.75 407.75,-600.75 407.75,-585.25 407.75,-585.25 407.75,-579.25 413.75,-573.25 419.75,-573.25 419.75,-573.25 509.25,-573.25 509.25,-573.25 515.25,-573.25 521.25,-579.25 521.25,-585.25 521.25,-585.25 521.25,-600.75 521.25,-600.75 521.25,-606.75 515.25,-612.75 509.25,-612.75"/>
273
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-600.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">agent_list · spawn · ask</text>
274
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-589.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">debate · broadcast</text>
275
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-579.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">swarm_bus · swarm_list</text>
276
+ </g>
277
+ <!-- swarm&#45;&gt;t_swarm -->
278
+ <g id="edge20" class="edge">
279
+ <title>swarm&#45;&gt;t_swarm</title>
280
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-585.05C295.43,-586.37 353.66,-588.66 398.97,-590.45"/>
281
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="398.8,-592.9 405.89,-590.73 398.99,-588 398.8,-592.9"/>
282
+ </g>
283
+ </g>
284
+ </svg>