pwn 0.5.668 → 0.5.670

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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +15 -0
  3. data/Gemfile +1 -1
  4. data/README.md +8 -6
  5. data/documentation/AI-Integration.md +5 -3
  6. data/documentation/Agent-Tool-Registry.md +18 -14
  7. data/documentation/Configuration.md +6 -0
  8. data/documentation/Contributing.md +13 -0
  9. data/documentation/Diagrams.md +1 -1
  10. data/documentation/Home.md +4 -4
  11. data/documentation/How-PWN-Works.md +6 -6
  12. data/documentation/Persistence.md +17 -0
  13. data/documentation/Reinforcement-Learning.md +39 -39
  14. data/documentation/SDR.md +1 -1
  15. data/documentation/Sessions.md +1 -0
  16. data/documentation/Skills-Memory-Learning.md +2 -0
  17. data/documentation/What-is-PWN.md +3 -3
  18. data/documentation/diagrams/agent-tool-registry.svg +43 -43
  19. data/documentation/diagrams/ai-integration-tool-calling.svg +112 -85
  20. data/documentation/diagrams/dot/agent-tool-registry.dot +4 -4
  21. data/documentation/diagrams/dot/ai-integration-tool-calling.dot +7 -3
  22. data/documentation/diagrams/dot/memory-skills-detailed.dot +2 -2
  23. data/documentation/diagrams/dot/overall-pwn-architecture.dot +6 -4
  24. data/documentation/diagrams/dot/persistence-filesystem.dot +1 -1
  25. data/documentation/diagrams/dot/sdr-radio-flow.dot +1 -1
  26. data/documentation/diagrams/dot/task-summarizer.dot +24 -12
  27. data/documentation/diagrams/memory-skills-detailed.svg +182 -182
  28. data/documentation/diagrams/overall-pwn-architecture.svg +154 -146
  29. data/documentation/diagrams/persistence-filesystem.svg +6 -6
  30. data/documentation/diagrams/sdr-radio-flow.svg +1 -1
  31. data/documentation/diagrams/task-summarizer.svg +178 -126
  32. data/documentation/pwn-ai-Agent.md +53 -15
  33. data/lib/pwn/ai/agent/loop.rb +773 -6
  34. data/lib/pwn/ai/agent/prompt_builder.rb +81 -7
  35. data/lib/pwn/ai/agent/task_summarizer.rb +426 -28
  36. data/lib/pwn/ai/agent/tools/shell.rb +32 -0
  37. data/lib/pwn/config.rb +7 -2
  38. data/lib/pwn/memory.rb +188 -0
  39. data/lib/pwn/memory_index.rb +17 -2
  40. data/lib/pwn/plugins/repl.rb +36 -7
  41. data/lib/pwn/sessions.rb +9 -4
  42. data/lib/pwn/version.rb +1 -1
  43. data/spec/lib/pwn/ai/agent/loop_spec.rb +246 -2
  44. data/spec/lib/pwn/ai/agent/prompt_builder_spec.rb +51 -0
  45. data/spec/lib/pwn/ai/agent/task_summarizer_spec.rb +115 -0
  46. data/spec/lib/pwn/ai/agent/tools/shell_spec.rb +21 -0
  47. data/spec/lib/pwn/memory_spec.rb +62 -0
  48. data/spec/lib/pwn/plugins/repl_pwn_vault_spec.rb +134 -0
  49. data/third_party/pwn_rdoc.jsonl +30 -2
  50. metadata +4 -3
@@ -4,13 +4,13 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Agent_Tool_Registry Pages: 1 -->
7
- <svg width="755pt" height="1015pt"
8
- viewBox="0.00 0.00 755.00 1015.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 971.94)">
7
+ <svg width="755pt" height="1002pt"
8
+ viewBox="0.00 0.00 755.00 1002.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 958.94)">
10
10
  <title>PWN_Agent_Tool_Registry</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-971.94 711.95,-971.94 711.95,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="68.88" y="-906.74" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::Registry &#45; Toolsets exposed to the LLM</text>
13
- <text xml:space="preserve" text-anchor="start" x="207.25" y="-895.29" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">12 toolsets · 78 callable tools · lib/pwn/ai/agent/tools/*</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-958.94 711.95,-958.94 711.95,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="68.88" y="-893.74" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::Registry &#45; Toolsets exposed to the LLM</text>
13
+ <text xml:space="preserve" text-anchor="start" x="207.25" y="-882.29" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">12 toolsets · 82 callable tools · lib/pwn/ai/agent/tools/*</text>
14
14
  <g id="clust1" class="cluster">
15
15
  <title>cluster_ts</title>
16
16
  <path fill="#022c22" stroke="#047857" stroke-width="2" d="M289,-70.74C289,-70.74 355.5,-70.74 355.5,-70.74 361.5,-70.74 367.5,-76.74 367.5,-82.74 367.5,-82.74 367.5,-812.74 367.5,-812.74 367.5,-818.74 361.5,-824.74 355.5,-824.74 355.5,-824.74 289,-824.74 289,-824.74 283,-824.74 277,-818.74 277,-812.74 277,-812.74 277,-82.74 277,-82.74 277,-76.74 283,-70.74 289,-70.74"/>
@@ -18,8 +18,8 @@
18
18
  </g>
19
19
  <g id="clust2" class="cluster">
20
20
  <title>cluster_tools</title>
21
- <path fill="#422006" stroke="#a16207" stroke-width="2" d="M480.25,-27.74C480.25,-27.74 656.75,-27.74 656.75,-27.74 662.75,-27.74 668.75,-33.74 668.75,-39.74 668.75,-39.74 668.75,-869.74 668.75,-869.74 668.75,-875.74 662.75,-881.74 656.75,-881.74 656.75,-881.74 480.25,-881.74 480.25,-881.74 474.25,-881.74 468.25,-875.74 468.25,-869.74 468.25,-869.74 468.25,-39.74 468.25,-39.74 468.25,-33.74 474.25,-27.74 480.25,-27.74"/>
22
- <text xml:space="preserve" text-anchor="middle" x="568.5" y="-858.74" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Tools &#160;(LLM&#45;callable)</text>
21
+ <path fill="#422006" stroke="#a16207" stroke-width="2" d="M480.25,-27.74C480.25,-27.74 656.75,-27.74 656.75,-27.74 662.75,-27.74 668.75,-33.74 668.75,-39.74 668.75,-39.74 668.75,-856.74 668.75,-856.74 668.75,-862.74 662.75,-868.74 656.75,-868.74 656.75,-868.74 480.25,-868.74 480.25,-868.74 474.25,-868.74 468.25,-862.74 468.25,-856.74 468.25,-856.74 468.25,-39.74 468.25,-39.74 468.25,-33.74 474.25,-27.74 480.25,-27.74"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="568.5" y="-845.74" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Tools &#160;(LLM&#45;callable)</text>
23
23
  </g>
24
24
  <!-- Registry -->
25
25
  <g id="node1" class="node">
@@ -177,85 +177,85 @@
177
177
  <!-- t_shell -->
178
178
  <g id="node14" class="node">
179
179
  <title>t_shell</title>
180
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M583,-842.74C583,-842.74 553,-842.74 553,-842.74 547,-842.74 541,-836.74 541,-830.74 541,-830.74 541,-818.74 541,-818.74 541,-812.74 547,-806.74 553,-806.74 553,-806.74 583,-806.74 583,-806.74 589,-806.74 595,-812.74 595,-818.74 595,-818.74 595,-830.74 595,-830.74 595,-836.74 589,-842.74 583,-842.74"/>
181
- <text xml:space="preserve" text-anchor="middle" x="568" y="-821.44" font-family="sans-Serif" font-size="9.00" fill="#0f172a">shell</text>
180
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M583,-829.74C583,-829.74 553,-829.74 553,-829.74 547,-829.74 541,-823.74 541,-817.74 541,-817.74 541,-805.74 541,-805.74 541,-799.74 547,-793.74 553,-793.74 553,-793.74 583,-793.74 583,-793.74 589,-793.74 595,-799.74 595,-805.74 595,-805.74 595,-817.74 595,-817.74 595,-823.74 589,-829.74 583,-829.74"/>
181
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-808.44" font-family="sans-Serif" font-size="9.00" fill="#0f172a">shell</text>
182
182
  </g>
183
183
  <!-- terminal&#45;&gt;t_shell -->
184
184
  <g id="edge13" class="edge">
185
185
  <title>terminal&#45;&gt;t_shell</title>
186
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-773.95C394.03,-784.29 482.8,-805.05 532.06,-816.57"/>
187
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="531.49,-818.95 538.86,-818.16 532.6,-814.18 531.49,-818.95"/>
186
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-772.53C394.03,-780.52 482.8,-796.54 532.06,-805.43"/>
187
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="531.52,-807.83 538.84,-806.66 532.39,-803.01 531.52,-807.83"/>
188
188
  </g>
189
189
  <!-- t_eval -->
190
190
  <g id="node15" class="node">
191
191
  <title>t_eval</title>
192
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M583.88,-781.74C583.88,-781.74 552.12,-781.74 552.12,-781.74 546.12,-781.74 540.12,-775.74 540.12,-769.74 540.12,-769.74 540.12,-757.74 540.12,-757.74 540.12,-751.74 546.12,-745.74 552.12,-745.74 552.12,-745.74 583.88,-745.74 583.88,-745.74 589.88,-745.74 595.88,-751.74 595.88,-757.74 595.88,-757.74 595.88,-769.74 595.88,-769.74 595.88,-775.74 589.88,-781.74 583.88,-781.74"/>
193
- <text xml:space="preserve" text-anchor="middle" x="568" y="-760.44" font-family="sans-Serif" font-size="9.00" fill="#0f172a">pwn_eval</text>
192
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M583.88,-768.74C583.88,-768.74 552.12,-768.74 552.12,-768.74 546.12,-768.74 540.12,-762.74 540.12,-756.74 540.12,-756.74 540.12,-744.74 540.12,-744.74 540.12,-738.74 546.12,-732.74 552.12,-732.74 552.12,-732.74 583.88,-732.74 583.88,-732.74 589.88,-732.74 595.88,-738.74 595.88,-744.74 595.88,-744.74 595.88,-756.74 595.88,-756.74 595.88,-762.74 589.88,-768.74 583.88,-768.74"/>
193
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-747.44" font-family="sans-Serif" font-size="9.00" fill="#0f172a">pwn_eval</text>
194
194
  </g>
195
195
  <!-- pwn&#45;&gt;t_eval -->
196
196
  <g id="edge14" class="edge">
197
197
  <title>pwn&#45;&gt;t_eval</title>
198
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-712.95C393.89,-723.26 482.23,-743.92 531.58,-755.46"/>
199
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="530.74,-757.78 538.12,-756.99 531.86,-753.01 530.74,-757.78"/>
198
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-711.53C393.8,-719.48 481.87,-735.37 531.28,-744.29"/>
199
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="530.78,-746.69 538.1,-745.53 531.65,-741.87 530.78,-746.69"/>
200
200
  </g>
201
201
  <!-- t_mem -->
202
202
  <g id="node16" class="node">
203
203
  <title>t_mem</title>
204
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M604.12,-720.74C604.12,-720.74 531.88,-720.74 531.88,-720.74 525.88,-720.74 519.88,-714.74 519.88,-708.74 519.88,-708.74 519.88,-696.74 519.88,-696.74 519.88,-690.74 525.88,-684.74 531.88,-684.74 531.88,-684.74 604.12,-684.74 604.12,-684.74 610.12,-684.74 616.12,-690.74 616.12,-696.74 616.12,-696.74 616.12,-708.74 616.12,-708.74 616.12,-714.74 610.12,-720.74 604.12,-720.74"/>
205
- <text xml:space="preserve" text-anchor="middle" x="568" y="-704.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">memory_remember</text>
206
- <text xml:space="preserve" text-anchor="middle" x="568" y="-694.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">recall · forget · clear</text>
204
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M604.12,-707.49C604.12,-707.49 531.88,-707.49 531.88,-707.49 525.88,-707.49 519.88,-701.49 519.88,-695.49 519.88,-695.49 519.88,-679.99 519.88,-679.99 519.88,-673.99 525.88,-667.99 531.88,-667.99 531.88,-667.99 604.12,-667.99 604.12,-667.99 610.12,-667.99 616.12,-673.99 616.12,-679.99 616.12,-679.99 616.12,-695.49 616.12,-695.49 616.12,-701.49 610.12,-707.49 604.12,-707.49"/>
205
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-694.94" font-family="sans-Serif" font-size="9.00" fill="#0f172a">memory_remember</text>
206
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-684.44" font-family="sans-Serif" font-size="9.00" fill="#0f172a">recall · forget · clear</text>
207
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-673.94" font-family="sans-Serif" font-size="9.00" fill="#0f172a">lean</text>
207
208
  </g>
208
209
  <!-- memory&#45;&gt;t_mem -->
209
210
  <g id="edge15" class="edge">
210
211
  <title>memory&#45;&gt;t_mem</title>
211
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-651.95C388.37,-660.97 460.81,-677.91 511.38,-689.74"/>
212
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="510.62,-692.07 517.99,-691.28 511.73,-687.3 510.62,-692.07"/>
212
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-650.32C388.37,-656.96 460.81,-669.44 511.38,-678.16"/>
213
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="510.66,-680.52 517.97,-679.29 511.49,-675.69 510.66,-680.52"/>
213
214
  </g>
214
215
  <!-- t_skill -->
215
216
  <g id="node17" class="node">
216
217
  <title>t_skill</title>
217
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M610.12,-659.49C610.12,-659.49 525.88,-659.49 525.88,-659.49 519.88,-659.49 513.88,-653.49 513.88,-647.49 513.88,-647.49 513.88,-631.99 513.88,-631.99 513.88,-625.99 519.88,-619.99 525.88,-619.99 525.88,-619.99 610.12,-619.99 610.12,-619.99 616.12,-619.99 622.12,-625.99 622.12,-631.99 622.12,-631.99 622.12,-647.49 622.12,-647.49 622.12,-653.49 616.12,-659.49 610.12,-659.49"/>
218
- <text xml:space="preserve" text-anchor="middle" x="568" y="-646.94" font-family="sans-Serif" font-size="9.00" fill="#0f172a">skill_list · view · create</text>
219
- <text xml:space="preserve" text-anchor="middle" x="568" y="-636.44" font-family="sans-Serif" font-size="9.00" fill="#0f172a">add_reference · delete</text>
220
- <text xml:space="preserve" text-anchor="middle" x="568" y="-625.94" font-family="sans-Serif" font-size="9.00" fill="#0f172a">migrate_legacy</text>
218
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M610.12,-642.49C610.12,-642.49 525.88,-642.49 525.88,-642.49 519.88,-642.49 513.88,-636.49 513.88,-630.49 513.88,-630.49 513.88,-614.99 513.88,-614.99 513.88,-608.99 519.88,-602.99 525.88,-602.99 525.88,-602.99 610.12,-602.99 610.12,-602.99 616.12,-602.99 622.12,-608.99 622.12,-614.99 622.12,-614.99 622.12,-630.49 622.12,-630.49 622.12,-636.49 616.12,-642.49 610.12,-642.49"/>
219
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-629.94" font-family="sans-Serif" font-size="9.00" fill="#0f172a">skill_list · view · create</text>
220
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-619.44" font-family="sans-Serif" font-size="9.00" fill="#0f172a">add_reference · delete</text>
221
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-608.94" font-family="sans-Serif" font-size="9.00" fill="#0f172a">migrate_legacy</text>
221
222
  </g>
222
223
  <!-- skills&#45;&gt;t_skill -->
223
224
  <g id="edge16" class="edge">
224
225
  <title>skills&#45;&gt;t_skill</title>
225
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-590.73C386.85,-599.09 455.15,-614.5 505.3,-625.82"/>
226
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="504.51,-628.15 511.88,-627.3 505.59,-623.37 504.51,-628.15"/>
226
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-588.88C386.77,-594.65 454.87,-605.26 504.99,-613.08"/>
227
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="504.56,-615.49 511.86,-614.15 505.32,-610.65 504.56,-615.49"/>
227
228
  </g>
228
229
  <!-- t_sess -->
229
230
  <g id="node18" class="node">
230
231
  <title>t_sess</title>
231
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M607.12,-594.74C607.12,-594.74 528.88,-594.74 528.88,-594.74 522.88,-594.74 516.88,-588.74 516.88,-582.74 516.88,-582.74 516.88,-570.74 516.88,-570.74 516.88,-564.74 522.88,-558.74 528.88,-558.74 528.88,-558.74 607.12,-558.74 607.12,-558.74 613.12,-558.74 619.12,-564.74 619.12,-570.74 619.12,-570.74 619.12,-582.74 619.12,-582.74 619.12,-588.74 613.12,-594.74 607.12,-594.74"/>
232
- <text xml:space="preserve" text-anchor="middle" x="568" y="-578.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">sessions_list · view</text>
233
- <text xml:space="preserve" text-anchor="middle" x="568" y="-568.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">current · delete · stats</text>
232
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M607.12,-577.49C607.12,-577.49 528.88,-577.49 528.88,-577.49 522.88,-577.49 516.88,-571.49 516.88,-565.49 516.88,-565.49 516.88,-549.99 516.88,-549.99 516.88,-543.99 522.88,-537.99 528.88,-537.99 528.88,-537.99 607.12,-537.99 607.12,-537.99 613.12,-537.99 619.12,-543.99 619.12,-549.99 619.12,-549.99 619.12,-565.49 619.12,-565.49 619.12,-571.49 613.12,-577.49 607.12,-577.49"/>
233
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-564.94" font-family="sans-Serif" font-size="9.00" fill="#0f172a">sessions_list · view</text>
234
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-554.44" font-family="sans-Serif" font-size="9.00" fill="#0f172a">current · delete · stats</text>
235
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-543.94" font-family="sans-Serif" font-size="9.00" fill="#0f172a">lean</text>
234
236
  </g>
235
237
  <!-- sessions&#45;&gt;t_sess -->
236
238
  <g id="edge17" class="edge">
237
239
  <title>sessions&#45;&gt;t_sess</title>
238
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M350.27,-529.62C388.19,-537.86 458.19,-553.08 508.38,-564"/>
239
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="507.58,-566.33 514.94,-565.42 508.62,-561.54 507.58,-566.33"/>
240
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M350.27,-527.51C388.11,-532.79 457.9,-542.52 508.07,-549.52"/>
241
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="507.65,-551.94 514.92,-550.48 508.33,-547.08 507.65,-551.94"/>
240
242
  </g>
241
243
  <!-- t_learn -->
242
244
  <g id="node19" class="node">
243
245
  <title>t_learn</title>
244
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M638.62,-533.74C638.62,-533.74 497.38,-533.74 497.38,-533.74 491.38,-533.74 485.38,-527.74 485.38,-521.74 485.38,-521.74 485.38,-453.74 485.38,-453.74 485.38,-447.74 491.38,-441.74 497.38,-441.74 497.38,-441.74 638.62,-441.74 638.62,-441.74 644.62,-441.74 650.62,-447.74 650.62,-453.74 650.62,-453.74 650.62,-521.74 650.62,-521.74 650.62,-527.74 644.62,-533.74 638.62,-533.74"/>
245
- <text xml:space="preserve" text-anchor="middle" x="568" y="-521.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">learning_note_outcome · reflect</text>
246
- <text xml:space="preserve" text-anchor="middle" x="568" y="-510.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">distill_skill · outcomes · stats</text>
247
- <text xml:space="preserve" text-anchor="middle" x="568" y="-500.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">consolidate · reset · purge_noise</text>
248
- <text xml:space="preserve" text-anchor="middle" x="568" y="-489.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">auto_introspect_toggle</text>
249
- <text xml:space="preserve" text-anchor="middle" x="568" y="-479.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">mistakes_list · record · resolve · reset</text>
250
- <text xml:space="preserve" text-anchor="middle" x="568" y="-468.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">reward_judge · prm · sentinel</text>
251
- <text xml:space="preserve" text-anchor="middle" x="568" y="-458.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">reward_preferences · export_dpo</text>
252
- <text xml:space="preserve" text-anchor="middle" x="568" y="-447.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">curriculum_practice · train · hindsight</text>
246
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M623.25,-513.24C623.25,-513.24 512.75,-513.24 512.75,-513.24 506.75,-513.24 500.75,-507.24 500.75,-501.24 500.75,-501.24 500.75,-454.24 500.75,-454.24 500.75,-448.24 506.75,-442.24 512.75,-442.24 512.75,-442.24 623.25,-442.24 623.25,-442.24 629.25,-442.24 635.25,-448.24 635.25,-454.24 635.25,-454.24 635.25,-501.24 635.25,-501.24 635.25,-507.24 629.25,-513.24 623.25,-513.24"/>
247
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-500.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">learning_* · mistakes_*</text>
248
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-490.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">reward_judge · prm · sentinel</text>
249
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-479.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">export_dpo · scrub · balance</text>
250
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-469.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">curriculum_practice · train</text>
251
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-458.69" font-family="sans-Serif" font-size="9.00" fill="#0f172a">hindsight · offline_judge</text>
252
+ <text xml:space="preserve" text-anchor="middle" x="568" y="-448.19" font-family="sans-Serif" font-size="9.00" fill="#0f172a">gc_stores · lean helpers</text>
253
253
  </g>
254
254
  <!-- learning&#45;&gt;t_learn -->
255
255
  <g id="edge18" class="edge">
256
256
  <title>learning&#45;&gt;t_learn</title>
257
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-465.47C380.12,-468.57 431.36,-473.83 476.46,-478.46"/>
258
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="475.93,-480.86 483.14,-479.14 476.43,-475.99 475.93,-480.86"/>
257
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M349.8,-464.38C383.61,-466.46 443.46,-470.14 491.77,-473.11"/>
258
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="491.55,-475.55 498.68,-473.54 491.85,-470.66 491.55,-475.55"/>
259
259
  </g>
260
260
  <!-- t_metric -->
261
261
  <g id="node20" class="node">
@@ -4,180 +4,207 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_AI_Integration Pages: 1 -->
7
- <svg width="798pt" height="530pt"
8
- viewBox="0.00 0.00 798.00 530.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 486.95)">
7
+ <svg width="798pt" height="580pt"
8
+ viewBox="0.00 0.00 798.00 580.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 537.2)">
10
10
  <title>PWN_AI_Integration</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-486.95 754.95,-486.95 754.95,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="164.62" y="-421.75" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI &#45; Multi&#45;Provider LLM Integration</text>
13
- <text xml:space="preserve" text-anchor="start" x="245.25" y="-410.3" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">one Agent Loop · five interchangeable engines</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-537.2 754.95,-537.2 754.95,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="164.62" y="-472" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI &#45; Multi&#45;Provider LLM Integration</text>
13
+ <text xml:space="preserve" text-anchor="start" x="247.12" y="-460.55" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">one Agent Loop · six interchangeable engines</text>
14
14
  <g id="clust1" class="cluster">
15
15
  <title>cluster_c</title>
16
- <path fill="#2e1065" stroke="#6d28d9" d="M331.5,-33.75C331.5,-33.75 483.25,-33.75 483.25,-33.75 489.25,-33.75 495.25,-39.75 495.25,-45.75 495.25,-45.75 495.25,-384.75 495.25,-384.75 495.25,-390.75 489.25,-396.75 483.25,-396.75 483.25,-396.75 331.5,-396.75 331.5,-396.75 325.5,-396.75 319.5,-390.75 319.5,-384.75 319.5,-384.75 319.5,-45.75 319.5,-45.75 319.5,-39.75 325.5,-33.75 331.5,-33.75"/>
17
- <text xml:space="preserve" text-anchor="middle" x="407.38" y="-373.75" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">PWN::AI::* Clients</text>
16
+ <path fill="#2e1065" stroke="#6d28d9" d="M331.5,-8C331.5,-8 483.25,-8 483.25,-8 489.25,-8 495.25,-14 495.25,-20 495.25,-20 495.25,-435 495.25,-435 495.25,-441 489.25,-447 483.25,-447 483.25,-447 331.5,-447 331.5,-447 325.5,-447 319.5,-441 319.5,-435 319.5,-435 319.5,-20 319.5,-20 319.5,-14 325.5,-8 331.5,-8"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="407.38" y="-424" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">PWN::AI::* Clients</text>
18
18
  </g>
19
19
  <g id="clust3" class="cluster">
20
20
  <title>cluster_api</title>
21
- <path fill="#450a0a" stroke="#b91c1c" stroke-dasharray="5,2" d="M586.25,-41.75C586.25,-41.75 699.75,-41.75 699.75,-41.75 705.75,-41.75 711.75,-47.75 711.75,-53.75 711.75,-53.75 711.75,-384.75 711.75,-384.75 711.75,-390.75 705.75,-396.75 699.75,-396.75 699.75,-396.75 586.25,-396.75 586.25,-396.75 580.25,-396.75 574.25,-390.75 574.25,-384.75 574.25,-384.75 574.25,-53.75 574.25,-53.75 574.25,-47.75 580.25,-41.75 586.25,-41.75"/>
22
- <text xml:space="preserve" text-anchor="middle" x="643" y="-373.75" font-family="sans-Serif" font-size="20.00" fill="#fecaca">Provider APIs</text>
21
+ <path fill="#450a0a" stroke="#b91c1c" stroke-dasharray="5,2" d="M586.25,-24C586.25,-24 699.75,-24 699.75,-24 705.75,-24 711.75,-30 711.75,-36 711.75,-36 711.75,-435 711.75,-435 711.75,-441 705.75,-447 699.75,-447 699.75,-447 586.25,-447 586.25,-447 580.25,-447 574.25,-441 574.25,-435 574.25,-435 574.25,-36 574.25,-36 574.25,-30 580.25,-24 586.25,-24"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="643" y="-424" font-family="sans-Serif" font-size="20.00" fill="#fecaca">Provider APIs</text>
23
23
  </g>
24
24
  <!-- Loop -->
25
25
  <g id="node1" class="node">
26
26
  <title>Loop</title>
27
- <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M127,-192.75C127,-192.75 36.75,-192.75 36.75,-192.75 30.75,-192.75 24.75,-186.75 24.75,-180.75 24.75,-180.75 24.75,-168.75 24.75,-168.75 24.75,-162.75 30.75,-156.75 36.75,-156.75 36.75,-156.75 127,-156.75 127,-156.75 133,-156.75 139,-162.75 139,-168.75 139,-168.75 139,-180.75 139,-180.75 139,-186.75 133,-192.75 127,-192.75"/>
28
- <text xml:space="preserve" text-anchor="middle" x="81.88" y="-177.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PWN::AI::Agent::Loop</text>
29
- <text xml:space="preserve" text-anchor="middle" x="81.88" y="-165.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tool&#45;calling harness</text>
27
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M127,-224C127,-224 36.75,-224 36.75,-224 30.75,-224 24.75,-218 24.75,-212 24.75,-212 24.75,-200 24.75,-200 24.75,-194 30.75,-188 36.75,-188 36.75,-188 127,-188 127,-188 133,-188 139,-194 139,-200 139,-200 139,-212 139,-212 139,-218 133,-224 127,-224"/>
28
+ <text xml:space="preserve" text-anchor="middle" x="81.88" y="-208.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PWN::AI::Agent::Loop</text>
29
+ <text xml:space="preserve" text-anchor="middle" x="81.88" y="-196.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tool&#45;calling harness</text>
30
30
  </g>
31
31
  <!-- OpenAI -->
32
32
  <g id="node2" class="node">
33
33
  <title>OpenAI</title>
34
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M421.88,-357.75C421.88,-357.75 391.88,-357.75 391.88,-357.75 385.88,-357.75 379.88,-351.75 379.88,-345.75 379.88,-345.75 379.88,-333.75 379.88,-333.75 379.88,-327.75 385.88,-321.75 391.88,-321.75 391.88,-321.75 421.88,-321.75 421.88,-321.75 427.88,-321.75 433.88,-327.75 433.88,-333.75 433.88,-333.75 433.88,-345.75 433.88,-345.75 433.88,-351.75 427.88,-357.75 421.88,-357.75"/>
35
- <text xml:space="preserve" text-anchor="middle" x="406.88" y="-336.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">OpenAI</text>
34
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M421.88,-408C421.88,-408 391.88,-408 391.88,-408 385.88,-408 379.88,-402 379.88,-396 379.88,-396 379.88,-384 379.88,-384 379.88,-378 385.88,-372 391.88,-372 391.88,-372 421.88,-372 421.88,-372 427.88,-372 433.88,-378 433.88,-384 433.88,-384 433.88,-396 433.88,-396 433.88,-402 427.88,-408 421.88,-408"/>
35
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-386.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">OpenAI</text>
36
36
  </g>
37
37
  <!-- Loop&#45;&gt;OpenAI -->
38
38
  <g id="edge1" class="edge">
39
39
  <title>Loop&#45;&gt;OpenAI</title>
40
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M100.06,-193.75C123.03,-218.01 166.03,-259.74 210.75,-283.75 262.28,-311.41 328.99,-326.74 369.55,-334.1"/>
41
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="368.97,-336.85 377.33,-335.47 369.94,-331.33 368.97,-336.85"/>
40
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M96.36,-224.8C117.53,-252.96 161.3,-305.87 210.75,-335 261.21,-364.72 328.51,-379.04 369.44,-385.43"/>
41
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="368.98,-388.19 377.31,-386.59 369.81,-382.65 368.98,-388.19"/>
42
42
  </g>
43
43
  <!-- Anthropic -->
44
44
  <g id="node3" class="node">
45
45
  <title>Anthropic</title>
46
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M423.5,-289.75C423.5,-289.75 390.25,-289.75 390.25,-289.75 384.25,-289.75 378.25,-283.75 378.25,-277.75 378.25,-277.75 378.25,-265.75 378.25,-265.75 378.25,-259.75 384.25,-253.75 390.25,-253.75 390.25,-253.75 423.5,-253.75 423.5,-253.75 429.5,-253.75 435.5,-259.75 435.5,-265.75 435.5,-265.75 435.5,-277.75 435.5,-277.75 435.5,-283.75 429.5,-289.75 423.5,-289.75"/>
47
- <text xml:space="preserve" text-anchor="middle" x="406.88" y="-268.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Anthropic</text>
46
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M423.5,-340C423.5,-340 390.25,-340 390.25,-340 384.25,-340 378.25,-334 378.25,-328 378.25,-328 378.25,-316 378.25,-316 378.25,-310 384.25,-304 390.25,-304 390.25,-304 423.5,-304 423.5,-304 429.5,-304 435.5,-310 435.5,-316 435.5,-316 435.5,-328 435.5,-328 435.5,-334 429.5,-340 423.5,-340"/>
47
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-318.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Anthropic</text>
48
48
  </g>
49
49
  <!-- Loop&#45;&gt;Anthropic -->
50
50
  <g id="edge2" class="edge">
51
51
  <title>Loop&#45;&gt;Anthropic</title>
52
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M107.26,-193.62C131.9,-211.59 171.79,-237.77 210.75,-250.75 263.23,-268.24 327.63,-271.99 367.72,-272.4"/>
53
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="367.64,-275.2 375.65,-272.43 367.66,-269.6 367.64,-275.2"/>
52
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M101.24,-224.76C124.45,-247.17 166.71,-283.76 210.75,-301 262.41,-321.22 327.29,-324.21 367.68,-323.72"/>
53
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="367.73,-326.51 375.67,-323.55 367.62,-320.92 367.73,-326.51"/>
54
54
  </g>
55
55
  <!-- Loop&#45;&gt;Anthropic -->
56
- <g id="edge12" class="edge">
56
+ <g id="edge14" class="edge">
57
57
  <title>Loop&#45;&gt;Anthropic</title>
58
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M139.74,-185.82C179.58,-194.16 233.84,-206.73 280.5,-221.75 298.33,-227.49 302.12,-230.76 319.5,-237.75 335.6,-244.22 353.43,-251.26 368.69,-257.25"/>
59
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="367.52,-259.8 375.99,-260.11 369.57,-254.58 367.52,-259.8"/>
60
- <text xml:space="preserve" text-anchor="middle" x="245.62" y="-234.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">reflect_engine</text>
61
- <text xml:space="preserve" text-anchor="middle" x="245.62" y="-223.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(teacher&#45;student)</text>
58
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M139.88,-223.92C179.55,-236.66 233.54,-254.55 280.5,-272 298.06,-278.53 302.12,-281.01 319.5,-288 335.6,-294.47 353.43,-301.51 368.69,-307.5"/>
59
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="367.52,-310.05 375.99,-310.36 369.57,-304.83 367.52,-310.05"/>
60
+ <text xml:space="preserve" text-anchor="middle" x="245.62" y="-284.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">reflect_engine</text>
61
+ <text xml:space="preserve" text-anchor="middle" x="245.62" y="-273.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(teacher&#45;student)</text>
62
62
  </g>
63
63
  <!-- Grok -->
64
64
  <g id="node4" class="node">
65
65
  <title>Grok</title>
66
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M443,-221.75C443,-221.75 370.75,-221.75 370.75,-221.75 364.75,-221.75 358.75,-215.75 358.75,-209.75 358.75,-209.75 358.75,-197.75 358.75,-197.75 358.75,-191.75 364.75,-185.75 370.75,-185.75 370.75,-185.75 443,-185.75 443,-185.75 449,-185.75 455,-191.75 455,-197.75 455,-197.75 455,-209.75 455,-209.75 455,-215.75 449,-221.75 443,-221.75"/>
67
- <text xml:space="preserve" text-anchor="middle" x="406.88" y="-206.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Grok</text>
68
- <text xml:space="preserve" text-anchor="middle" x="406.88" y="-194.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">OAuth device flow</text>
66
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M443,-272C443,-272 370.75,-272 370.75,-272 364.75,-272 358.75,-266 358.75,-260 358.75,-260 358.75,-248 358.75,-248 358.75,-242 364.75,-236 370.75,-236 370.75,-236 443,-236 443,-236 449,-236 455,-242 455,-248 455,-248 455,-260 455,-260 455,-266 449,-272 443,-272"/>
67
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-256.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Grok</text>
68
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-244.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">OAuth device flow</text>
69
69
  </g>
70
70
  <!-- Loop&#45;&gt;Grok -->
71
71
  <g id="edge3" class="edge">
72
72
  <title>Loop&#45;&gt;Grok</title>
73
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M139.88,-179.87C198.51,-185.13 289.36,-193.29 348.23,-198.57"/>
74
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="347.94,-201.36 356.15,-199.29 348.44,-195.78 347.94,-201.36"/>
73
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M139.88,-214.47C198.64,-223.2 289.73,-236.74 348.59,-245.49"/>
74
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="347.84,-248.21 356.17,-246.61 348.67,-242.67 347.84,-248.21"/>
75
75
  </g>
76
76
  <!-- Gemini -->
77
77
  <g id="node5" class="node">
78
78
  <title>Gemini</title>
79
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M421.88,-153.75C421.88,-153.75 391.88,-153.75 391.88,-153.75 385.88,-153.75 379.88,-147.75 379.88,-141.75 379.88,-141.75 379.88,-129.75 379.88,-129.75 379.88,-123.75 385.88,-117.75 391.88,-117.75 391.88,-117.75 421.88,-117.75 421.88,-117.75 427.88,-117.75 433.88,-123.75 433.88,-129.75 433.88,-129.75 433.88,-141.75 433.88,-141.75 433.88,-147.75 427.88,-153.75 421.88,-153.75"/>
80
- <text xml:space="preserve" text-anchor="middle" x="406.88" y="-132.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Gemini</text>
79
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M421.88,-204C421.88,-204 391.88,-204 391.88,-204 385.88,-204 379.88,-198 379.88,-192 379.88,-192 379.88,-180 379.88,-180 379.88,-174 385.88,-168 391.88,-168 391.88,-168 421.88,-168 421.88,-168 427.88,-168 433.88,-174 433.88,-180 433.88,-180 433.88,-192 433.88,-192 433.88,-198 427.88,-204 421.88,-204"/>
80
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-182.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Gemini</text>
81
81
  </g>
82
82
  <!-- Loop&#45;&gt;Gemini -->
83
83
  <g id="edge4" class="edge">
84
84
  <title>Loop&#45;&gt;Gemini</title>
85
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M139.88,-167.87C206.2,-159.86 313.73,-146.88 369.59,-140.13"/>
86
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="369.83,-142.92 377.44,-139.18 369.16,-137.36 369.83,-142.92"/>
85
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M139.88,-202.47C206.2,-198.36 313.73,-191.71 369.59,-188.25"/>
86
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="369.62,-191.05 377.43,-187.76 369.27,-185.46 369.62,-191.05"/>
87
87
  </g>
88
88
  <!-- Ollama -->
89
89
  <g id="node6" class="node">
90
90
  <title>Ollama</title>
91
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M471.12,-85.75C471.12,-85.75 342.62,-85.75 342.62,-85.75 336.62,-85.75 330.62,-79.75 330.62,-73.75 330.62,-73.75 330.62,-53.75 330.62,-53.75 330.62,-47.75 336.62,-41.75 342.62,-41.75 342.62,-41.75 471.12,-41.75 471.12,-41.75 477.12,-41.75 483.12,-47.75 483.12,-53.75 483.12,-53.75 483.12,-73.75 483.12,-73.75 483.12,-79.75 477.12,-85.75 471.12,-85.75"/>
92
- <text xml:space="preserve" text-anchor="middle" x="406.88" y="-72.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Ollama (local)</text>
93
- <text xml:space="preserve" text-anchor="middle" x="406.88" y="-60.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">/api/chat &#160;num_ctx · keep_alive</text>
94
- <text xml:space="preserve" text-anchor="middle" x="406.88" y="-48.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">/api/embed → MemoryIndex</text>
91
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M471.12,-136C471.12,-136 342.62,-136 342.62,-136 336.62,-136 330.62,-130 330.62,-124 330.62,-124 330.62,-104 330.62,-104 330.62,-98 336.62,-92 342.62,-92 342.62,-92 471.12,-92 471.12,-92 477.12,-92 483.12,-98 483.12,-104 483.12,-104 483.12,-124 483.12,-124 483.12,-130 477.12,-136 471.12,-136"/>
92
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-122.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Ollama (local)</text>
93
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-110.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">/api/chat &#160;num_ctx · keep_alive</text>
94
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-98.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">/api/embed → MemoryIndex</text>
95
95
  </g>
96
96
  <!-- Loop&#45;&gt;Ollama -->
97
97
  <g id="edge5" class="edge">
98
98
  <title>Loop&#45;&gt;Ollama</title>
99
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M138.03,-155.79C191.14,-137.54 271.86,-109.8 330.8,-89.55"/>
100
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="331.55,-92.25 338.21,-87 329.73,-86.96 331.55,-92.25"/>
99
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M139.88,-189.76C189.97,-175.5 263.57,-154.53 320.66,-138.27"/>
100
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="321.22,-141.02 328.15,-136.14 319.68,-135.64 321.22,-141.02"/>
101
101
  </g>
102
- <!-- A1 -->
102
+ <!-- OpenWebUI -->
103
103
  <g id="node7" class="node">
104
+ <title>OpenWebUI</title>
105
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M450.12,-60C450.12,-60 363.62,-60 363.62,-60 357.62,-60 351.62,-54 351.62,-48 351.62,-48 351.62,-28 351.62,-28 351.62,-22 357.62,-16 363.62,-16 363.62,-16 450.12,-16 450.12,-16 456.12,-16 462.12,-22 462.12,-28 462.12,-28 462.12,-48 462.12,-48 462.12,-54 456.12,-60 450.12,-60"/>
106
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-46.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Open WebUI</text>
107
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">gateway JWT</text>
108
+ <text xml:space="preserve" text-anchor="middle" x="406.88" y="-22.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">/api/v1/chat + /ollama</text>
109
+ </g>
110
+ <!-- Loop&#45;&gt;OpenWebUI -->
111
+ <g id="edge6" class="edge">
112
+ <title>Loop&#45;&gt;OpenWebUI</title>
113
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M114.93,-187.21C159.99,-161.08 244.89,-112.82 319.5,-76 327.27,-72.17 335.51,-68.3 343.7,-64.57"/>
114
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="344.61,-67.23 350.75,-61.39 342.31,-62.12 344.61,-67.23"/>
115
+ </g>
116
+ <!-- A1 -->
117
+ <g id="node8" class="node">
104
118
  <title>A1</title>
105
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M671.5,-357.75C671.5,-357.75 613.5,-357.75 613.5,-357.75 607.5,-357.75 601.5,-351.75 601.5,-345.75 601.5,-345.75 601.5,-333.75 601.5,-333.75 601.5,-327.75 607.5,-321.75 613.5,-321.75 613.5,-321.75 671.5,-321.75 671.5,-321.75 677.5,-321.75 683.5,-327.75 683.5,-333.75 683.5,-333.75 683.5,-345.75 683.5,-345.75 683.5,-351.75 677.5,-357.75 671.5,-357.75"/>
106
- <text xml:space="preserve" text-anchor="middle" x="642.5" y="-336.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">api.openai.com</text>
119
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M671.5,-408C671.5,-408 613.5,-408 613.5,-408 607.5,-408 601.5,-402 601.5,-396 601.5,-396 601.5,-384 601.5,-384 601.5,-378 607.5,-372 613.5,-372 613.5,-372 671.5,-372 671.5,-372 677.5,-372 683.5,-378 683.5,-384 683.5,-384 683.5,-396 683.5,-396 683.5,-402 677.5,-408 671.5,-408"/>
120
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-386.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">api.openai.com</text>
107
121
  </g>
108
122
  <!-- OpenAI&#45;&gt;A1 -->
109
- <g id="edge6" class="edge">
123
+ <g id="edge7" class="edge">
110
124
  <title>OpenAI&#45;&gt;A1</title>
111
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M434.22,-339.75C472.21,-339.75 543.1,-339.75 591.28,-339.75"/>
112
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="591.23,-342.55 599.23,-339.75 591.23,-336.95 591.23,-342.55"/>
125
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M434.22,-390C472.21,-390 543.1,-390 591.28,-390"/>
126
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="591.23,-392.8 599.23,-390 591.23,-387.2 591.23,-392.8"/>
113
127
  </g>
114
128
  <!-- A2 -->
115
- <g id="node8" class="node">
129
+ <g id="node9" class="node">
116
130
  <title>A2</title>
117
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M677.12,-289.75C677.12,-289.75 607.88,-289.75 607.88,-289.75 601.88,-289.75 595.88,-283.75 595.88,-277.75 595.88,-277.75 595.88,-265.75 595.88,-265.75 595.88,-259.75 601.88,-253.75 607.88,-253.75 607.88,-253.75 677.12,-253.75 677.12,-253.75 683.12,-253.75 689.12,-259.75 689.12,-265.75 689.12,-265.75 689.12,-277.75 689.12,-277.75 689.12,-283.75 683.12,-289.75 677.12,-289.75"/>
118
- <text xml:space="preserve" text-anchor="middle" x="642.5" y="-268.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">api.anthropic.com</text>
131
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M677.12,-340C677.12,-340 607.88,-340 607.88,-340 601.88,-340 595.88,-334 595.88,-328 595.88,-328 595.88,-316 595.88,-316 595.88,-310 601.88,-304 607.88,-304 607.88,-304 677.12,-304 677.12,-304 683.12,-304 689.12,-310 689.12,-316 689.12,-316 689.12,-328 689.12,-328 689.12,-334 683.12,-340 677.12,-340"/>
132
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-318.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">api.anthropic.com</text>
119
133
  </g>
120
134
  <!-- Anthropic&#45;&gt;A2 -->
121
- <g id="edge7" class="edge">
135
+ <g id="edge8" class="edge">
122
136
  <title>Anthropic&#45;&gt;A2</title>
123
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M436.06,-271.75C472.99,-271.75 538.61,-271.75 585.76,-271.75"/>
124
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="585.56,-274.55 593.56,-271.75 585.56,-268.95 585.56,-274.55"/>
137
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M436.06,-322C472.99,-322 538.61,-322 585.76,-322"/>
138
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="585.56,-324.8 593.56,-322 585.56,-319.2 585.56,-324.8"/>
125
139
  </g>
126
140
  <!-- A3 -->
127
- <g id="node9" class="node">
141
+ <g id="node10" class="node">
128
142
  <title>A3</title>
129
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M657.5,-221.75C657.5,-221.75 627.5,-221.75 627.5,-221.75 621.5,-221.75 615.5,-215.75 615.5,-209.75 615.5,-209.75 615.5,-197.75 615.5,-197.75 615.5,-191.75 621.5,-185.75 627.5,-185.75 627.5,-185.75 657.5,-185.75 657.5,-185.75 663.5,-185.75 669.5,-191.75 669.5,-197.75 669.5,-197.75 669.5,-209.75 669.5,-209.75 669.5,-215.75 663.5,-221.75 657.5,-221.75"/>
130
- <text xml:space="preserve" text-anchor="middle" x="642.5" y="-206.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">api.x.ai</text>
131
- <text xml:space="preserve" text-anchor="middle" x="642.5" y="-194.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">auth.x.ai</text>
143
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M657.5,-272C657.5,-272 627.5,-272 627.5,-272 621.5,-272 615.5,-266 615.5,-260 615.5,-260 615.5,-248 615.5,-248 615.5,-242 621.5,-236 627.5,-236 627.5,-236 657.5,-236 657.5,-236 663.5,-236 669.5,-242 669.5,-248 669.5,-248 669.5,-260 669.5,-260 669.5,-266 663.5,-272 657.5,-272"/>
144
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-256.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">api.x.ai</text>
145
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-244.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">auth.x.ai</text>
132
146
  </g>
133
147
  <!-- Grok&#45;&gt;A3 -->
134
- <g id="edge8" class="edge">
148
+ <g id="edge9" class="edge">
135
149
  <title>Grok&#45;&gt;A3</title>
136
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M455.43,-203.75C499.74,-203.75 564.85,-203.75 605.14,-203.75"/>
137
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="605.09,-206.55 613.09,-203.75 605.09,-200.95 605.09,-206.55"/>
150
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M455.43,-254C499.74,-254 564.85,-254 605.14,-254"/>
151
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="605.09,-256.8 613.09,-254 605.09,-251.2 605.09,-256.8"/>
138
152
  </g>
139
153
  <!-- A4 -->
140
- <g id="node10" class="node">
154
+ <g id="node11" class="node">
141
155
  <title>A4</title>
142
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M680.5,-153.75C680.5,-153.75 604.5,-153.75 604.5,-153.75 598.5,-153.75 592.5,-147.75 592.5,-141.75 592.5,-141.75 592.5,-129.75 592.5,-129.75 592.5,-123.75 598.5,-117.75 604.5,-117.75 604.5,-117.75 680.5,-117.75 680.5,-117.75 686.5,-117.75 692.5,-123.75 692.5,-129.75 692.5,-129.75 692.5,-141.75 692.5,-141.75 692.5,-147.75 686.5,-153.75 680.5,-153.75"/>
143
- <text xml:space="preserve" text-anchor="middle" x="642.5" y="-138.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">generativelanguage</text>
144
- <text xml:space="preserve" text-anchor="middle" x="642.5" y="-126.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">.googleapis.com</text>
156
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M680.5,-204C680.5,-204 604.5,-204 604.5,-204 598.5,-204 592.5,-198 592.5,-192 592.5,-192 592.5,-180 592.5,-180 592.5,-174 598.5,-168 604.5,-168 604.5,-168 680.5,-168 680.5,-168 686.5,-168 692.5,-174 692.5,-180 692.5,-180 692.5,-192 692.5,-192 692.5,-198 686.5,-204 680.5,-204"/>
157
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-188.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">generativelanguage</text>
158
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-176.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">.googleapis.com</text>
145
159
  </g>
146
160
  <!-- Gemini&#45;&gt;A4 -->
147
- <g id="edge9" class="edge">
161
+ <g id="edge10" class="edge">
148
162
  <title>Gemini&#45;&gt;A4</title>
149
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M434.22,-135.75C469.87,-135.75 534.49,-135.75 582.13,-135.75"/>
150
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="582.06,-138.55 590.06,-135.75 582.06,-132.95 582.06,-138.55"/>
163
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M434.22,-186C469.87,-186 534.49,-186 582.13,-186"/>
164
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="582.06,-188.8 590.06,-186 582.06,-183.2 582.06,-188.8"/>
151
165
  </g>
152
166
  <!-- A5 -->
153
- <g id="node11" class="node">
167
+ <g id="node12" class="node">
154
168
  <title>A5</title>
155
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M672.62,-85.75C672.62,-85.75 612.38,-85.75 612.38,-85.75 606.38,-85.75 600.38,-79.75 600.38,-73.75 600.38,-73.75 600.38,-61.75 600.38,-61.75 600.38,-55.75 606.38,-49.75 612.38,-49.75 612.38,-49.75 672.62,-49.75 672.62,-49.75 678.62,-49.75 684.62,-55.75 684.62,-61.75 684.62,-61.75 684.62,-73.75 684.62,-73.75 684.62,-79.75 678.62,-85.75 672.62,-85.75"/>
156
- <text xml:space="preserve" text-anchor="middle" x="642.5" y="-64.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">localhost:11434</text>
169
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M672.62,-136C672.62,-136 612.38,-136 612.38,-136 606.38,-136 600.38,-130 600.38,-124 600.38,-124 600.38,-112 600.38,-112 600.38,-106 606.38,-100 612.38,-100 612.38,-100 672.62,-100 672.62,-100 678.62,-100 684.62,-106 684.62,-112 684.62,-112 684.62,-124 684.62,-124 684.62,-130 678.62,-136 672.62,-136"/>
170
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-114.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">localhost:11434</text>
157
171
  </g>
158
172
  <!-- Ollama&#45;&gt;A5 -->
159
- <g id="edge10" class="edge">
173
+ <g id="edge11" class="edge">
160
174
  <title>Ollama&#45;&gt;A5</title>
161
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M483.73,-65.05C518.59,-65.65 559.03,-66.34 590.24,-66.87"/>
162
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="590.01,-69.67 598.06,-67.01 590.11,-64.07 590.01,-69.67"/>
175
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M483.73,-115.3C518.59,-115.9 559.03,-116.59 590.24,-117.12"/>
176
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="590.01,-119.92 598.06,-117.26 590.11,-114.32 590.01,-119.92"/>
177
+ </g>
178
+ <!-- A6 -->
179
+ <g id="node13" class="node">
180
+ <title>A6</title>
181
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M677.5,-68C677.5,-68 607.5,-68 607.5,-68 601.5,-68 595.5,-62 595.5,-56 595.5,-56 595.5,-44 595.5,-44 595.5,-38 601.5,-32 607.5,-32 607.5,-32 677.5,-32 677.5,-32 683.5,-32 689.5,-38 689.5,-44 689.5,-44 689.5,-56 689.5,-56 689.5,-62 683.5,-68 677.5,-68"/>
182
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-52.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Open WebUI host</text>
183
+ <text xml:space="preserve" text-anchor="middle" x="642.5" y="-40.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">/api/v1 + /ollama</text>
184
+ </g>
185
+ <!-- OpenWebUI&#45;&gt;A6 -->
186
+ <g id="edge12" class="edge">
187
+ <title>OpenWebUI&#45;&gt;A6</title>
188
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M462.65,-40.81C499.54,-42.71 548.07,-45.2 585.26,-47.11"/>
189
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="584.85,-49.89 592.98,-47.51 585.14,-44.3 584.85,-49.89"/>
163
190
  </g>
164
191
  <!-- Cfg -->
165
- <g id="node12" class="node">
192
+ <g id="node14" class="node">
166
193
  <title>Cfg</title>
167
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M163.75,-85C163.75,-89.69 127.05,-93.5 81.88,-93.5 36.7,-93.5 0,-89.69 0,-85 0,-85 0,-8.5 0,-8.5 0,-3.81 36.7,0 81.88,0 127.05,0 163.75,-3.81 163.75,-8.5 163.75,-8.5 163.75,-85 163.75,-85"/>
168
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M163.75,-85C163.75,-80.31 127.05,-76.5 81.88,-76.5 36.7,-76.5 0,-80.31 0,-85"/>
169
- <text xml:space="preserve" text-anchor="middle" x="81.88" y="-67.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PWN::Config</text>
170
- <text xml:space="preserve" text-anchor="middle" x="81.88" y="-55.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">~/.pwn/pwn.yaml</text>
171
- <text xml:space="preserve" text-anchor="middle" x="81.88" y="-43.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">active · key · oauth</text>
172
- <text xml:space="preserve" text-anchor="middle" x="81.88" y="-31.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">prompt_budget · reflect_engine</text>
173
- <text xml:space="preserve" text-anchor="middle" x="81.88" y="-19.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_first · tool_router · escalation</text>
194
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M163.75,-116.25C163.75,-120.94 127.05,-124.75 81.88,-124.75 36.7,-124.75 0,-120.94 0,-116.25 0,-116.25 0,-39.75 0,-39.75 0,-35.06 36.7,-31.25 81.88,-31.25 127.05,-31.25 163.75,-35.06 163.75,-39.75 163.75,-39.75 163.75,-116.25 163.75,-116.25"/>
195
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M163.75,-116.25C163.75,-111.56 127.05,-107.75 81.88,-107.75 36.7,-107.75 0,-111.56 0,-116.25"/>
196
+ <text xml:space="preserve" text-anchor="middle" x="81.88" y="-98.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PWN::Config</text>
197
+ <text xml:space="preserve" text-anchor="middle" x="81.88" y="-86.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">~/.pwn/pwn.yaml</text>
198
+ <text xml:space="preserve" text-anchor="middle" x="81.88" y="-74.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">active · key · oauth</text>
199
+ <text xml:space="preserve" text-anchor="middle" x="81.88" y="-62.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">prompt_budget · reflect_engine</text>
200
+ <text xml:space="preserve" text-anchor="middle" x="81.88" y="-50.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_first · tool_router · escalation</text>
174
201
  </g>
175
202
  <!-- Cfg&#45;&gt;Loop -->
176
- <g id="edge11" class="edge">
203
+ <g id="edge13" class="edge">
177
204
  <title>Cfg&#45;&gt;Loop</title>
178
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M81.88,-94.05C81.88,-111.52 81.88,-130.78 81.88,-146.11"/>
179
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="79.08,-146.04 81.88,-154.04 84.68,-146.04 79.08,-146.04"/>
180
- <text xml:space="preserve" text-anchor="middle" x="73.62" y="-121.83" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">active engine</text>
205
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M81.88,-125.3C81.88,-142.77 81.88,-162.03 81.88,-177.36"/>
206
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="79.08,-177.29 81.88,-185.29 84.68,-177.29 79.08,-177.29"/>
207
+ <text xml:space="preserve" text-anchor="middle" x="73.62" y="-153.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">active engine</text>
181
208
  </g>
182
209
  </g>
183
210
  </svg>
@@ -1,6 +1,6 @@
1
1
  digraph "PWN_Agent_Tool_Registry" {
2
2
  graph [
3
- label=<<B>PWN::AI::Agent::Registry - Toolsets exposed to the LLM</B><BR/><FONT POINT-SIZE="11" COLOR="#94a3b8">12 toolsets · 78 callable tools · lib/pwn/ai/agent/tools/*</FONT>>,
3
+ label=<<B>PWN::AI::Agent::Registry - Toolsets exposed to the LLM</B><BR/><FONT POINT-SIZE="11" COLOR="#94a3b8">12 toolsets · 82 callable tools · lib/pwn/ai/agent/tools/*</FONT>>,
4
4
  labelloc=t, fontsize=20, fontname="Helvetica",
5
5
  rankdir=LR, splines=spline, nodesep=0.35, ranksep=1.4,
6
6
  bgcolor="#0f172a", fontcolor="#e2e8f0", pad=0.6, newrank=true
@@ -34,10 +34,10 @@ digraph "PWN_Agent_Tool_Registry" {
34
34
  node [fillcolor="#fcd34d", fontsize=9];
35
35
  t_shell [label="shell"];
36
36
  t_eval [label="pwn_eval"];
37
- t_mem [label="memory_remember\nrecall · forget · clear"];
37
+ t_mem [label="memory_remember\nrecall · forget · clear\nlean"];
38
38
  t_skill [label="skill_list · view · create\nadd_reference · delete\nmigrate_legacy"];
39
- t_sess [label="sessions_list · view\ncurrent · delete · stats"];
40
- t_learn [label="learning_note_outcome · reflect\ndistill_skill · outcomes · stats\nconsolidate · reset · purge_noise\nauto_introspect_toggle\nmistakes_list · record · resolve · reset\nreward_judge · prm · sentinel\nreward_preferences · export_dpo\ncurriculum_practice · train · hindsight"];
39
+ t_sess [label="sessions_list · view\ncurrent · delete · stats\nlean"];
40
+ t_learn [label="learning_* · mistakes_*\nreward_judge · prm · sentinel\nexport_dpo · scrub · balance\ncurriculum_practice · train\nhindsight · offline_judge\ngc_stores · lean helpers"];
41
41
  t_metric [label="metrics_summary\nmetrics_reset"];
42
42
  t_extro [label="extro_snapshot · drift\nobserve · observations · intel\nwatch · verify · rf_tune · osint\nserial · telecomm · packet\nvision · voice · correlate\nstats · reset · auto_toggle"];
43
43
  t_cron [label="cron_list · create · run\nenable · disable · remove"];