pwn 0.5.739 → 0.5.740

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 (163) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/documentation/Agent-Tool-Registry.md +163 -6
  4. data/documentation/Diagrams.md +1 -1
  5. data/documentation/Home.md +1 -1
  6. data/documentation/How-PWN-Works.md +1 -1
  7. data/documentation/Plugin-Degradation.md +6 -2
  8. data/documentation/Recon-Findings-API.md +33 -1
  9. data/documentation/What-is-PWN.md +1 -1
  10. data/documentation/pwn-ai-Agent.md +1 -1
  11. data/etc/default_skills/pwn/ai/agent/confirmation/SKILL.md +49 -0
  12. data/etc/default_skills/pwn/ai/agent/result/SKILL.md +4 -1
  13. data/etc/default_skills/pwn/ai/agent/task_dag/SKILL.md +50 -0
  14. data/etc/default_skills/pwn/ai/agent/tool_guard/SKILL.md +2 -0
  15. data/etc/default_skills/pwn/ai/agent/tools/browser_goto/SKILL.md +45 -0
  16. data/etc/default_skills/pwn/ai/agent/tools/loot_query/SKILL.md +45 -0
  17. data/etc/default_skills/pwn/ai/agent/tools/nmap_scan/SKILL.md +45 -0
  18. data/etc/default_skills/pwn/ai/agent/tools/nuclei_scan/SKILL.md +45 -0
  19. data/etc/default_skills/pwn/ai/agent/tools/radare2/SKILL.md +45 -0
  20. data/etc/default_skills/pwn/ai/agent/turn_finalizer/SKILL.md +3 -0
  21. data/etc/default_skills/pwn/ai/router/SKILL.md +51 -0
  22. data/etc/default_skills/pwn/engagement/SKILL.md +2 -0
  23. data/etc/default_skills/pwn/ffi/capstone/SKILL.md +54 -0
  24. data/etc/default_skills/pwn/ffi/keystone/SKILL.md +50 -0
  25. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +5 -1
  26. data/etc/default_skills/pwn/plugins/ai_sandbox/SKILL.md +52 -0
  27. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +3 -0
  28. data/etc/default_skills/pwn/plugins/assembly/SKILL.md +2 -0
  29. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +1 -0
  30. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +1 -0
  31. data/etc/default_skills/pwn/plugins/findings/SKILL.md +1 -0
  32. data/etc/default_skills/pwn/plugins/gdbmi/SKILL.md +8 -2
  33. data/etc/default_skills/pwn/plugins/httpx/SKILL.md +49 -0
  34. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +1 -0
  35. data/etc/default_skills/pwn/plugins/method_catalog/SKILL.md +50 -0
  36. data/etc/default_skills/pwn/plugins/nmap_it/SKILL.md +2 -0
  37. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +2 -1
  38. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +2 -0
  39. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +3 -0
  40. data/etc/default_skills/pwn/plugins/recon/SKILL.md +1 -0
  41. data/etc/default_skills/pwn/plugins/rop/SKILL.md +1 -0
  42. data/etc/default_skills/pwn/plugins/sandbox/driver/SKILL.md +1 -8
  43. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +1 -0
  44. data/etc/default_skills/pwn/plugins/vault/SKILL.md +3 -0
  45. data/etc/default_skills/pwn/reports/SKILL.md +2 -0
  46. data/lib/pwn/ai/agent/confirmation.rb +163 -0
  47. data/lib/pwn/ai/agent/dispatch.rb +43 -5
  48. data/lib/pwn/ai/agent/loop.rb +45 -11
  49. data/lib/pwn/ai/agent/prompt_builder.rb +7 -4
  50. data/lib/pwn/ai/agent/registry.rb +2 -1
  51. data/lib/pwn/ai/agent/result.rb +76 -6
  52. data/lib/pwn/ai/agent/task_dag.rb +220 -0
  53. data/lib/pwn/ai/agent/tool_guard.rb +166 -24
  54. data/lib/pwn/ai/agent/tools/artifacts.rb +35 -5
  55. data/lib/pwn/ai/agent/tools/binary_triage.rb +7 -3
  56. data/lib/pwn/ai/agent/tools/browser_goto.rb +32 -0
  57. data/lib/pwn/ai/agent/tools/debug_lane.rb +23 -0
  58. data/lib/pwn/ai/agent/tools/exploitdev.rb +32 -12
  59. data/lib/pwn/ai/agent/tools/finding_record.rb +31 -5
  60. data/lib/pwn/ai/agent/tools/fuzz_campaign.rb +44 -21
  61. data/lib/pwn/ai/agent/tools/job_run.rb +30 -18
  62. data/lib/pwn/ai/agent/tools/loot_query.rb +44 -0
  63. data/lib/pwn/ai/agent/tools/nmap_scan.rb +32 -0
  64. data/lib/pwn/ai/agent/tools/nuclei_scan.rb +31 -0
  65. data/lib/pwn/ai/agent/tools/radare2.rb +55 -0
  66. data/lib/pwn/ai/agent/tools/ruby_eval.rb +19 -2
  67. data/lib/pwn/ai/agent/tools/shell.rb +22 -10
  68. data/lib/pwn/ai/agent/turn_finalizer.rb +46 -5
  69. data/lib/pwn/ai/agent.rb +3 -1
  70. data/lib/pwn/ai/cli.rb +26 -2
  71. data/lib/pwn/ai/context.rb +4 -2
  72. data/lib/pwn/ai/router.rb +196 -0
  73. data/lib/pwn/ai/tools/README.md +5 -0
  74. data/lib/pwn/ai.rb +1 -0
  75. data/lib/pwn/config.rb +10 -0
  76. data/lib/pwn/engagement.rb +45 -1
  77. data/lib/pwn/ffi/capstone.rb +120 -0
  78. data/lib/pwn/ffi/keystone.rb +107 -0
  79. data/lib/pwn/ffi.rb +2 -0
  80. data/lib/pwn/migrate.rb +5 -1
  81. data/lib/pwn/plugins/aflplusplus.rb +238 -13
  82. data/lib/pwn/plugins/ai_sandbox.rb +240 -0
  83. data/lib/pwn/plugins/artifact_registry.rb +188 -22
  84. data/lib/pwn/plugins/assembly.rb +73 -2
  85. data/lib/pwn/plugins/basic_auth.rb +17 -4
  86. data/lib/pwn/plugins/binary_parser.rb +439 -38
  87. data/lib/pwn/plugins/exploit_dev.rb +83 -14
  88. data/lib/pwn/plugins/findings.rb +208 -42
  89. data/lib/pwn/plugins/gdbmi.rb +265 -38
  90. data/lib/pwn/plugins/httpx.rb +93 -0
  91. data/lib/pwn/plugins/jobs.rb +260 -102
  92. data/lib/pwn/plugins/method_catalog.rb +328 -0
  93. data/lib/pwn/plugins/nmap_it.rb +157 -26
  94. data/lib/pwn/plugins/nuclei.rb +122 -29
  95. data/lib/pwn/plugins/preflight_checker.rb +3 -2
  96. data/lib/pwn/plugins/process_tube.rb +51 -2
  97. data/lib/pwn/plugins/radare2.rb +120 -26
  98. data/lib/pwn/plugins/recon.rb +33 -0
  99. data/lib/pwn/plugins/repl/mesh.rb +76 -7
  100. data/lib/pwn/plugins/rop.rb +121 -31
  101. data/lib/pwn/plugins/transparent_browser.rb +212 -14
  102. data/lib/pwn/plugins/vault.rb +182 -24
  103. data/lib/pwn/plugins.rb +4 -0
  104. data/lib/pwn/reports/engagement.rb +8 -2
  105. data/lib/pwn/reports/html.rb +28 -9
  106. data/lib/pwn/reports/json.rb +2 -1
  107. data/lib/pwn/reports/markdown.rb +49 -12
  108. data/lib/pwn/reports/sarif.rb +17 -3
  109. data/lib/pwn/reports.rb +184 -34
  110. data/lib/pwn/version.rb +1 -1
  111. data/spec/integration/reports_spec.rb +93 -0
  112. data/spec/integration/result_condition_spec.rb +11 -8
  113. data/spec/lib/pwn/ai/agent/confirmation_spec.rb +59 -0
  114. data/spec/lib/pwn/ai/agent/dispatch_confirmation_spec.rb +52 -0
  115. data/spec/lib/pwn/ai/agent/dispatch_policy_spec.rb +51 -0
  116. data/spec/lib/pwn/ai/agent/loop_spec.rb +86 -0
  117. data/spec/lib/pwn/ai/agent/registry_spec.rb +1 -1
  118. data/spec/lib/pwn/ai/agent/result_spec.rb +84 -1
  119. data/spec/lib/pwn/ai/agent/task_dag_spec.rb +63 -0
  120. data/spec/lib/pwn/ai/agent/tool_guard_spec.rb +48 -0
  121. data/spec/lib/pwn/ai/agent/tools/ai_sandbox_spec.rb +36 -0
  122. data/spec/lib/pwn/ai/agent/tools/binary_triage_spec.rb +21 -0
  123. data/spec/lib/pwn/ai/agent/tools/browser_goto_spec.rb +57 -0
  124. data/spec/lib/pwn/ai/agent/tools/exploitdev_spec.rb +42 -0
  125. data/spec/lib/pwn/ai/agent/tools/finding_record_spec.rb +46 -2
  126. data/spec/lib/pwn/ai/agent/tools/fuzz_campaign_spec.rb +46 -0
  127. data/spec/lib/pwn/ai/agent/tools/job_run_spec.rb +52 -0
  128. data/spec/lib/pwn/ai/agent/tools/loot_query_spec.rb +46 -0
  129. data/spec/lib/pwn/ai/agent/tools/nmap_scan_spec.rb +26 -0
  130. data/spec/lib/pwn/ai/agent/tools/nuclei_scan_spec.rb +37 -0
  131. data/spec/lib/pwn/ai/agent/tools/pwn_eval_schema_spec.rb +27 -0
  132. data/spec/lib/pwn/ai/agent/tools/radare2_spec.rb +15 -0
  133. data/spec/lib/pwn/ai/agent/turn_finalizer_spec.rb +76 -0
  134. data/spec/lib/pwn/ai/cli_spec.rb +12 -1
  135. data/spec/lib/pwn/ai/router_spec.rb +57 -0
  136. data/spec/lib/pwn/ffi/capstone_spec.rb +33 -0
  137. data/spec/lib/pwn/ffi/keystone_spec.rb +33 -0
  138. data/spec/lib/pwn/migrate_spec.rb +30 -2
  139. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +40 -0
  140. data/spec/lib/pwn/plugins/ai_sandbox_spec.rb +44 -0
  141. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +116 -1
  142. data/spec/lib/pwn/plugins/assembly_spec.rb +12 -0
  143. data/spec/lib/pwn/plugins/basic_auth_spec.rb +15 -0
  144. data/spec/lib/pwn/plugins/binary_parser_spec.rb +59 -2
  145. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +44 -0
  146. data/spec/lib/pwn/plugins/findings_structured_spec.rb +196 -1
  147. data/spec/lib/pwn/plugins/gdbmi_spec.rb +99 -1
  148. data/spec/lib/pwn/plugins/httpx_spec.rb +23 -0
  149. data/spec/lib/pwn/plugins/jobs_spec.rb +141 -0
  150. data/spec/lib/pwn/plugins/method_catalog_spec.rb +29 -0
  151. data/spec/lib/pwn/plugins/nmap_it_spec.rb +49 -0
  152. data/spec/lib/pwn/plugins/nuclei_spec.rb +33 -1
  153. data/spec/lib/pwn/plugins/radare2_spec.rb +115 -0
  154. data/spec/lib/pwn/plugins/recon_spec.rb +15 -0
  155. data/spec/lib/pwn/plugins/repl_mesh_channel_route_spec.rb +101 -1
  156. data/spec/lib/pwn/plugins/rop_spec.rb +19 -0
  157. data/spec/lib/pwn/plugins/transparent_browser_spec.rb +71 -0
  158. data/spec/lib/pwn/plugins/vault_spec.rb +41 -0
  159. data/spec/lib/pwn/reports/engagement_spec.rb +51 -0
  160. data/spec/lib/pwn/reports_spec.rb +196 -0
  161. data/spec/spec_helper.rb +3 -0
  162. data/third_party/pwn_rdoc.jsonl +230 -4
  163. metadata +45 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5a7b0a41aca20dc31343279c213c042d7362ff5c0ac59a89150a427111d5b11d
4
- data.tar.gz: b4335ec85624abed2dbb25d8941ab1db79d73b07fb8b4eca64b90f56a96d15f7
3
+ metadata.gz: 4abf337af5fb9173890e87ee2d6d8523f93f62c6d9453d1fec9431f650f04a3e
4
+ data.tar.gz: 2639a24b9b3b1895e392b8168a604270b9f43118c743919c7b8348ec8f4dd929
5
5
  SHA512:
6
- metadata.gz: 226c64efa942d21212d5766604c299908118f1be000093204ff1e70b31359d2931e009df8cdc0894696832240d597b687397975fad7437eea288a0254236b6d6
7
- data.tar.gz: e2ed95fb25177d41d49cfe3efaef6cb162066eba28a7470d3256c88b74e6e8779b4daf2204836051305a8f7ec20d478fdd82526df046a13bd88eae4bbd68765c
6
+ metadata.gz: e383699557934dab9374bef09204e3e37c0e4b255a3dd3c13ef1597c265fd46b7b71bb79dd8094d2fb42aea71512e01b5a7bce9eae08a3f74d8dfb7639f8ff00
7
+ data.tar.gz: 6f1aea7cd79a34738923014fbc13024797c614c33e28058ab8b565402f665ccb464aa440c148291a385f4ad6b2617412d42b3c526df5d2f6cdff349149872c9d
data/Gemfile CHANGED
@@ -50,7 +50,7 @@ gem 'libusb', '0.8.0'
50
50
  gem 'luhn', '3.0.0'
51
51
  gem 'mail', '2.9.1'
52
52
  gem 'mcp', '1.5.1'
53
- gem 'meshtastic', '0.0.183'
53
+ gem 'meshtastic', '0.0.184'
54
54
  gem 'metasm', '1.0.6'
55
55
  gem 'mongo', '2.26.0'
56
56
  gem 'msfrpc-client', '1.1.2'
@@ -6,17 +6,17 @@ toolsets; the JSON-Schema for each tool is what the model actually sees.
6
6
 
7
7
  ![Tool registry](diagrams/agent-tool-registry.svg)
8
8
 
9
- ## Toolsets to tools (13 toolsets · 88 tools)
9
+ ## Toolsets to tools (16 toolsets · 150 tools)
10
10
 
11
11
  | Toolset | Tools | Backed by |
12
12
  |---|---|---|
13
13
  | `http` | `http_proxy_start` · `http_proxy_stop` · `http_proxy_entries` · `http_proxy_rules` · `http_replay` | `PWN::Plugins::MitmProxy`: native HTTP HAR capture/replay; opaque CONNECT tunnels |
14
- | `terminal` | `shell` | `Open3.capture3` on the host, after `PWN::AI::Agent::ToolGuard` |
15
- | `pwn` | `pwn_eval` · `sbom_scan` | `TOPLEVEL_BINDING.eval` in the live REPL process, after `ToolGuard`; SBOM engines via `PWN::Plugins::SBOM` |
14
+ | `terminal` | `shell` · `job_run` · `job_status` · `job_tail` · `job_result` · `job_kill` | Foreground host commands plus `PWN::Plugins::Jobs` durable supervisors |
15
+ | `pwn` | `pwn_eval` · `sbom_scan` · `r2_functions` · `r2_disasm` · `gdb_run_to_crash` · `nmap_scan` · `nuclei_scan` · `browser_goto` · `loot_query` | `TOPLEVEL_BINDING.eval` in the live REPL process, after `ToolGuard`; SBOM engines via `PWN::Plugins::SBOM`; r2pipe JSON via `PWN::Plugins::Radare2`; gdb MI3 crash reports via `PWN::Plugins::GDBMI`; nmap XML ingest/diff via `PWN::Plugins::NmapIt`; nuclei/httpx JSONL findings via `PWN::Plugins::Nuclei`; TransparentBrowser navigation captures screenshot/DOM/HAR via `browser_goto`; engagement loot via `PWN::Plugins::Vault` |
16
16
  | `mcp` | `mcp` | `PWN::AI::MCP` session broker → any `PWN::AI::MCP::*` stdio client |
17
17
  | `memory` | `memory_remember` · `memory_recall` · `memory_forget` · `memory_clear` · **`memory_lean`** | `PWN::Memory` → `~/.pwn/memory.json` |
18
18
  | `skills` | `skills_consolidate` · **`skills_recall`** · `skill_list` · `skill_view` · `skill_create` · `skill_add_reference` · `skill_delete` · `skill_migrate_legacy` | `~/.pwn/skills/<name>/SKILL.md` (**[agentskills.io](https://agentskills.io) spec**; legacy flat `*.md` auto-migrated) |
19
- | `sessions` | **`session_recall`** · `sessions_list` · `sessions_view` · `sessions_current` · `sessions_delete` · `sessions_stats` · **`sessions_lean`** | `PWN::Sessions` → `~/.pwn/sessions/` |
19
+ | `sessions` | **`session_recall`** · `sessions_list` · `sessions_view` · `sessions_current` · `sessions_delete` · `sessions_stats` · **`sessions_lean`** · `artifact_read` · `artifact_grep` · `artifacts_list` · `artifacts_get` · `artifact_put` · `artifact_get` | `PWN::Sessions` → `~/.pwn/sessions/`; `PWN::Plugins::ArtifactRegistry` → `~/.pwn/artifacts/` |
20
20
  | `learning` | `learning_note_outcome` · `learning_reflect` · `learning_distill_skill` · `learning_stats` · `learning_outcomes` · `learning_consolidate` · `learning_reset` · `learning_auto_introspect_toggle` · **`learning_gc_stores`** · **`learning_purge_noise`** · **`mistakes_list`** · **`mistakes_record`** · **`mistakes_resolve`** · **`mistakes_reset`** · **`mistakes_lean`** · **`reward_judge`** · **`reward_prm`** · **`reward_sentinel`** · **`reward_preferences`** · **`reward_export_dpo`** · **`reward_warm_sentinel`** · **`reward_scrub_preferences`** · **`reward_preference_balance`** · **`curriculum_practice`** · **`curriculum_train`** · **`curriculum_hindsight`** · **`curriculum_offline_judge`** · **`curriculum_preference_balance`** | `PWN::AI::Agent::Learning` + `Mistakes` + `Reward` + `Curriculum` → `~/.pwn/learning.jsonl` + `~/.pwn/mistakes.json` + `~/.pwn/preferences.jsonl` + `~/.pwn/curriculum/` + `~/.pwn/finetune/` |
21
21
  | `reward` | **`reward_generator_mix`** | `PWN::AI::Agent::Reward.generator_mix` → online preference source-mix controller (`preferences.jsonl`) |
22
22
  | `curriculum` | **`curriculum_practice_kpi`** | `PWN::AI::Agent::Curriculum.practice_kpi` → `~/.pwn/curriculum_kpi.jsonl` |
@@ -74,6 +74,8 @@ pool to:
74
74
  CORE_TOOLS / DEFAULT_PREFERENCE (same list):
75
75
  memory_recall · session_recall · skills_recall · pwn_eval · shell
76
76
  mistakes_record · mistakes_resolve · learning_note_outcome · memory_remember · skills_update
77
+ artifact_read · artifact_grep
78
+ job_run · job_status · job_tail · job_result · job_kill
77
79
  + top-K keyword-ranked matches for THIS request
78
80
  (ties break on Metrics per-engine success_rate, then
79
81
  ai.agent.tool_preference)
@@ -83,13 +85,121 @@ mistakes_record · mistakes_resolve · learning_note_outcome · memory_remember
83
85
  PWN::AI::Agent::Registry.definitions(relevance: 'nmap sweep 10.0.0.0/8', top_k: 10)
84
86
  PWN::AI::Agent::Registry.rank(query: 'run a shell command') # inspect ranking
85
87
  PWN::AI::Agent::Registry.preference_order # Env / DEFAULT_PREFERENCE
86
- PWN::AI::Agent::Registry.toolsets # -> the 13 names above
87
- PWN::AI::Agent::Registry.all.count # -> 88
88
+ PWN::AI::Agent::Registry.toolsets # -> the 16 names above
89
+ PWN::AI::Agent::Registry.all.count # -> 146 (after discover)
88
90
  ```
89
91
 
90
92
  Frontier engines leave `tool_router` off (unless you set it) and receive the
91
93
  full set. Local engines (`ollama` / `openwebui`) default `tool_router` to on.
92
94
 
95
+ ## Durable long-running jobs
96
+
97
+ Use `job_run(command:, max_runtime:, cwd:, env:, idempotency_key:)` for fuzzers,
98
+ full scans, and Ghidra headless analysis. It returns a job ID rather than holding
99
+ a tool call open. A separate Ruby supervisor owns the workload, persists status
100
+ and logs under `~/.pwn/jobs`, and remains alive when the launching agent exits.
101
+ `max_runtime: 21600` permits six hours; `0` means no runtime limit. The supervisor
102
+ enforces that deadline without requiring polls. This runtime does not enter
103
+ Dispatch's foreground timeout budget or its +180-second retry ladder.
104
+
105
+ Poll `job_status(id:)` for state and exit/signal. Read `job_tail(id:, offset: 0)`
106
+ and carry its `next_offset` into the next read; log pages are capped to the inline
107
+ budget. Log `eof` is only the current end of the log, not task completion.
108
+ Call `job_status` without an ID to rediscover recent jobs after changing sessions.
109
+ Use a stable `idempotency_key` for launch retries; do not rerun the command to poll
110
+ it. `job_kill` requests cancellation; confirm the terminal status afterward.
111
+ These job tools are in the default core set, subject to toolset exclusions.
112
+
113
+ `job_run(jobs: [...])` also runs its job graph inside a detached supervisor.
114
+ `shell(background: true, max_runtime: ...)` provides the same detached lifecycle;
115
+ the runtime predictor can route long shell work before Dispatch injects a timeout.
116
+ `fuzz_campaign(action: start, ...)` forwards runtime, working directory, environment,
117
+ session and idempotency settings to the same supervisor. No named-binary regex
118
+ is required for these routes. Host reboot/process-manager cgroup termination is
119
+ not session persistence: workloads are not automatically restarted after those
120
+ events, and lost supervision must not be reported as successful completion.
121
+
122
+ ## Lossless tool-result paging
123
+
124
+ Oversized handler results are saved before redaction/quarantine to
125
+ `~/.pwn/artifacts/<session>/<sha8>.bin`. The inline summary carries the handle,
126
+ full SHA-256, byte count, serialization type, bounded preview, and execution
127
+ status (including nonzero exits/timeouts). Raw string results retain every byte;
128
+ structured results use JSON, with base64 wrappers for non-UTF-8 strings.
129
+ Files are private (0600, directories 0700). A short-hash collision fails rather
130
+ than overwriting different bytes. Spill errors are explicit tool failures.
131
+
132
+ `PWN::Env[:ai][:agent][:artifact_max_tokens]` optionally sets N. Without a
133
+ provider tokenizer, a byte is treated as a conservative token upper bound:
134
+ spill may happen early, never on the assumption that arbitrary dumps average
135
+ four bytes per token. The default is 6000 (local engines: 1024), with a minimum
136
+ of 1024 to leave room for the handle/metadata. Existing `result_max` and per-tool
137
+ caps can lower the default. This is a runtime fallback; existing config files
138
+ are not rewritten.
139
+
140
+ `artifact_read(handle, offset, length)` uses byte offsets, clamps page length
141
+ to the inline budget, and returns `next_offset`/`eof`. Handle pages default to
142
+ base64 for exact reconstruction; request `mode: text` for inspection. Legacy
143
+ path/ref readers remain available. `artifact_grep(handle, regex, offset)` returns
144
+ bounded per-line search results with byte offsets and a continuation cursor.
145
+ Regexes match whole binary lines (first match per line), not page fragments;
146
+ lines over 64 MiB raise an explicit error directing the model to `artifact_read`.
147
+ Regex execution is time-limited. Both readers
148
+ are core tools (subject to explicit toolset exclusions). Follow cursors rather
149
+ than assuming the requested length was returned. The loop keeps only its bounded
150
+ recent tool history; paging does not accumulate the full dump in context.
151
+ Credential redaction still applies to inline views; the saved bytes are unchanged.
152
+
153
+ ## Payload validation diagnostics
154
+
155
+ `invalid_payload` responses include `rule_id`, `match`, `offset`, and `remedy`.
156
+ For rejected shell placeholders and syntax, `match` is the actual rejected
157
+ substring and `offset` is its zero-based byte position in the original decoded
158
+ command, including UTF-8 and base64 input. The legacy `offending_token`,
159
+ `byte_range` (exclusive end), `hint`, and `suggestion` fields remain available.
160
+ Missing fields and schema constraints have no command-text offset (`null`);
161
+ schema denials also identify the argument using `data_pointer`.
162
+
163
+ Ellipses in literal data pass without an escape hatch: Ruby is tokenized with
164
+ Ripper, and shell words are scanned with quote/escape state and queued heredoc
165
+ delimiters (including `<<-` tab stripping). Ruby strings, percent literals and
166
+ heredocs are data; parsed ranges and argument forwarding are valid code.
167
+ Bare elided commands and incomplete Ruby stubs such as `def foo(<3dots>)` are
168
+ denied with the same diagnostics. Explicit `placeholder_ok: true` still skips
169
+ the placeholder check, but never bypasses Ruby parsing or shell execution.
170
+ For quoting/transport, use `encoding: "base64"` and the encoded command in `data`.
171
+ Base64 is decoded before validation and is not a bypass: preserve the explicit
172
+ placeholder opt-in when needed. Neither option overrides shell syntax, size,
173
+ or policy restrictions. Each denial's `remedy` names the applicable correction.
174
+
175
+ ## Required artifact contract
176
+
177
+ At intent classification, `Loop.run` precommits explicit output destinations as
178
+ an immutable `required_artifacts` list. Relative paths resolve against the
179
+ initial working directory; input/read paths are not output obligations. The
180
+ same list drives the prompt checklist, dispatch snapshots and final-answer gate.
181
+ Artifact-bearing requests cannot take greeting/how-to/recall text-only shortcuts.
182
+
183
+ A successful write-effect call must change the destination's host snapshot.
184
+ The host then records stat and SHA-256 readback in internal tool-message metadata,
185
+ bound to this turn's contract ID. Finalization rechecks the current file against
186
+ that evidence. Textual delivery claims, mere existence, old-turn observations,
187
+ and files changed after readback cannot satisfy the gate. A proven current-turn
188
+ write delta takes precedence over filesystem timestamp clock-tick lag.
189
+ Nested calls inherit the contract and restore it on return. Historical mistake
190
+ entries are not deleted by this enforcement.
191
+
192
+ ## Retry checkpoints
193
+
194
+ The identical-payload checkpoint distinguishes retries from successful repeats.
195
+ A structured nonzero exit or timeout resets that payload's repeat count and
196
+ does not extinguish the payload through the repeated-failure guard. The command
197
+ can therefore be retried verbatim; timeout retries still use Dispatch's existing
198
+ deadline escalation and cumulative budget. Successful repeats retain the
199
+ checkpoint. Policy denials, exhausted budgets, checkpoint responses, and text
200
+ in stdout do not grant an execution-failure exemption. Actual command failures
201
+ remain recorded; the exemption does not erase historical mistake entries.
202
+
93
203
  ## Tool preference (`ai.agent.tool_preference`)
94
204
 
95
205
  When keyword fit and other rank scores tie, the registry prefers this
@@ -98,6 +208,8 @@ default order:
98
208
  ```text
99
209
  memory_recall · session_recall · skills_recall · pwn_eval · shell
100
210
  mistakes_record · mistakes_resolve · learning_note_outcome · memory_remember · skills_update
211
+ artifact_read · artifact_grep
212
+ job_run · job_status · job_tail · job_result · job_kill
101
213
  ```
102
214
 
103
215
  Set `ai.agent.tool_preference` in `~/.pwn/pwn.yaml`, or pass `order:` /
@@ -113,6 +225,51 @@ stable sort after the router slims the pool.
113
225
 
114
226
  `Policy` uses the same list when it suggests a next action in the prompt.
115
227
 
228
+ ## Finding evidence and reproducible reports
229
+
230
+ `finding_record` requires a command/code `poc`, ordered `reproduction_steps`
231
+ (setup, commands, expected observations), and an evidence-based
232
+ `severity_justification`, alongside its CVSS/CWE/asset/remediation fields.
233
+ Provide `evidence_paths` or `artifact_handles` (or both). Each handle is either
234
+ a string or an object containing `handle`, optional `kind` (`pcap`, `screenshot`,
235
+ `crash`, `poc`, `evidence`), optional display `label`, and optional expected
236
+ full `sha256`. Use artifact middleware handles such as `session/sha8.bin`,
237
+ `sha256:<64 lowercase hex digits>`, or the legacy bare full SHA-256 returned
238
+ by `ArtifactRegistry.put`. Handles are validated, not treated as file paths.
239
+
240
+ The host resolves each handle, computes the full SHA-256 and byte count, checks
241
+ any supplied digest, and preserves an engagement-owned copy. The persisted
242
+ finding includes `evidence_artifacts` with handle, kind, label, source `path`,
243
+ durable `stored` path, hash, and size. Malformed, missing, symlinked or tampered
244
+ handles fail recording. Verification/retest and combined-impact evidence are
245
+ also attached to the finding; previous evidence snapshots remain linked.
246
+
247
+ Export with `finding_record(op: 'export', engagement_id: 'fixture',
248
+ dir_path: '/tmp/findings-report', report_name: 'findings')`. Generated reports
249
+ include the supplied PoC instructions and justification with evidence hashes
250
+ per finding. HTML/Markdown include portable links, raster screenshots, and
251
+ escaped PoC previews; JSON/SARIF retain structured linkage. Distribute the
252
+ adjacent `attachments/` directory with the reports. Every attachment is checked
253
+ against its recorded digest and size; missing or changed durable copies and
254
+ tampered export targets fail explicitly. Active SVG/HTML is never embedded as
255
+ a screenshot. Full PoC text is downloadable even when its preview is bounded.
256
+ Evidence packaging currently reads one full attachment into memory at a time.
257
+ Hashes establish byte identity, not successful exploitation;
258
+ new records remain `not_executed` until explicitly verified. Direct legacy
259
+ `Findings.record_structured` callers may omit the new narrative fields (the
260
+ existing PoC becomes their reproduction step), but the agent tool requires
261
+ them. Original-source removal/tampering remains detectable by
262
+ `Findings.evidence_verify`; durable copies are checked too.
263
+
264
+ Findings can declare outgoing `enables: [finding_id]` links. Use
265
+ `finding_record(op: 'link', id: source_id, enables: [target_id])` to link
266
+ already recorded findings. `chain_impact` takes ordered source-to-impact
267
+ `ids`, combined-impact evidence, a severity justification, and reproduction
268
+ steps. Reports rank the resulting paths by their scoped combined-impact
269
+ assessment; linked constituents remain in technical details rather than
270
+ appearing as separate summary priorities. See
271
+ [Recon / Findings API](Recon-Findings-API.md#directed-attack-paths-and-combined-impact).
272
+
116
273
  ## Adding a tool
117
274
 
118
275
  ```ruby
@@ -68,7 +68,7 @@ groups) so lines never criss-cross.
68
68
  [source](diagrams/dot/ai-integration-tool-calling.dot) · doc: [AI Integration](AI-Integration.md)
69
69
  ![ai-integration-tool-calling](diagrams/ai-integration-tool-calling.svg)
70
70
 
71
- ### Agent Tool Registry (13 toolsets · 88 tools)
71
+ ### Agent Tool Registry (16 toolsets · 150 tools)
72
72
  [source](diagrams/dot/agent-tool-registry.dot) · doc: [Agent Tool Registry](Agent-Tool-Registry.md)
73
73
  ![agent-tool-registry](diagrams/agent-tool-registry.svg)
74
74
 
@@ -36,7 +36,7 @@
36
36
  | | |
37
37
  |---|---|
38
38
  | [AI / LLM Integration](AI-Integration.md) | OpenAI · Anthropic · Grok (OAuth) · Gemini · Ollama · Open WebUI |
39
- | [Agent Tool Registry](Agent-Tool-Registry.md) | 13 toolsets · **87** LLM-callable tools |
39
+ | [Agent Tool Registry](Agent-Tool-Registry.md) | 16 toolsets · **150** LLM-callable tools |
40
40
  | [Memory · Skills · Learning](Skills-Memory-Learning.md) | Introspection - self-improvement loop + 10 bundled skills on first launch |
41
41
  | [Mistakes](Mistakes.md) | **Negative feedback** - fingerprint failures · do-NOT-repeat · `[REPEATING]`/`[REGRESSED]` · inline self-correction |
42
42
  | [Reinforcement Learning](Reinforcement-Learning.md) | **`Reward` + `Curriculum` + `Policy`** - outcome/process judges · preference ledger · self-play practice · live Q / REINFORCE (advisory) · export-ready LoRA gate |
@@ -29,7 +29,7 @@ hardware).
29
29
  |---|---|
30
30
  | `Loop` | plan → **TaskSummarizer** briefs → dispatch tool_calls → observe → repeat until `may_finalize?`. No iteration-budget abort |
31
31
  | **`TaskSummarizer`** | Executive UX: every request gets an English task compass (`emit_plan!` · `about_to` as `task k/n`) - no statement/question/goal type |
32
- | `Registry` | JSON-Schema function definitions grouped into 13 **toolsets** · **88 tools** · `CORE_TOOLS` = `DEFAULT_PREFERENCE` (`memory_recall` · `session_recall` · `skills_recall` · `pwn_eval` · `shell` · `mistakes_record` · `mistakes_resolve` · `learning_note_outcome` · `memory_remember`) |
32
+ | `Registry` | JSON-Schema function definitions grouped into 16 **toolsets** · **150 tools** · `CORE_TOOLS` = `DEFAULT_PREFERENCE` (`memory_recall` · `session_recall` · `skills_recall` · `pwn_eval` · `shell` · `mistakes_record` · `mistakes_resolve` · `learning_note_outcome` · `memory_remember` · `skills_update` · `artifact_read` · `artifact_grep`) |
33
33
  | `Dispatch` / `Result` | execute a tool, capture stdout/value/error/duration |
34
34
  | `PromptBuilder` | inject MEMORY / SKILLS / LEARNING / **KNOWN MISTAKES + FIXES** / METRICS / **POLICY** / EXTROSPECTION / RECENT TURNS |
35
35
  | `Metrics` · `Learning` · `Reflect` · **`Policy`** | **introspection** - how well am I doing? (Policy is live Q / REINFORCE, advisory rank only) |
@@ -15,6 +15,10 @@ Required: `gdb`. Fallback: `PWN::Plugins::Debugger` still exposes `cyclic` helpe
15
15
 
16
16
  Required: `nuclei`. Fallback: `TransparentBrowser` + `pwn_eval`.
17
17
 
18
+ ## pwn-plugins-httpx
19
+
20
+ Required: `httpx`. Fallback: `TransparentBrowser` + `NmapIt.scan`.
21
+
18
22
  ## pwn-plugins-sqlmap
19
23
 
20
24
  Required: `sqlmap`. Fallback: `pwn_eval` HTTP clients.
@@ -41,11 +45,11 @@ Required: `msfconsole`. Fallback: `exploitdev`, `pwn_eval`, `PWN::Plugins::Handl
41
45
 
42
46
  ## pwn-plugins-burpsuite
43
47
 
44
- Required: `burpsuite`. Fallback: `TransparentBrowser`, `nuclei`, `PWN::Plugins::MitmProxy`.
48
+ Required: `burpsuite`. Fallback: `TransparentBrowser`, `nuclei`, `httpx`, `PWN::Plugins::MitmProxy`.
45
49
 
46
50
  ## pwn-plugins-zaproxy
47
51
 
48
- Required: `zaproxy`. Fallback: `nuclei`, `TransparentBrowser`, `PWN::Plugins::MitmProxy`.
52
+ Required: `zaproxy`. Fallback: `nuclei`, `httpx`, `TransparentBrowser`, `PWN::Plugins::MitmProxy`.
49
53
 
50
54
  ## pwn-plugins-packet
51
55
 
@@ -28,7 +28,39 @@ Legacy `Findings.record`, query/report, chain, render, and SARIF output remain c
28
28
 
29
29
  `PWN::AI::Agent::Swarm.ensure_specialists` / `agent_roster` writes recon, authz, injection, xss, and business_logic personas. SARIF export is `Findings.render`; `PWN::Plugins::Github.open_fix_pr` opens a remediation PR (tests stub the GitHub API).
30
30
 
31
- Markdown/HTML/JSON report payloads compose connected explicit references into attack-chain sections, preserving all finding fields. Combined severity is maximum recorded constituent severity with a rationale explicitly disclaiming escalation and combined exploitability. This is not a computed CVSS chain score.
31
+ ## Directed attack paths and combined impact
32
+
33
+ `enables: [finding_id]` is an outgoing edge: this finding enables the named
34
+ finding. Targets must already exist in the same engagement. For findings
35
+ recorded earlier, use `finding_record(op: 'link', id: ssrf_id,
36
+ enables: [admin_id])` or `Findings.link(id: ssrf_id, enables: [admin_id])`.
37
+ The update replaces outgoing `enables` links; legacy `attack_chain_refs` are
38
+ incoming prerequisites and remain supported. Missing IDs, duplicate edges,
39
+ self-links, cross-engagement links, and cycles are rejected.
40
+
41
+ Record the demonstrated combined impact with ordered source-to-impact `ids`:
42
+ `finding_record(op: 'chain_impact', ids: [ssrf_id, admin_id],
43
+ combined_impact_path: '/tmp/combined-impact.txt', escalate: true,
44
+ combined_severity: 'critical', severity_justification: justification,
45
+ reproduction_steps: steps)`. The evidence file must name each ID and describe
46
+ the combined impact; keep actual PoC output with it. This preserves a scoped
47
+ `chain_assessments` entry containing the ordered IDs, justification, steps,
48
+ and durable evidence hashes. Different paths retain separate assessments.
49
+
50
+ Reports enumerate directed root-to-leaf paths and rank them by the assessed
51
+ combined severity, not by summing or averaging constituent CVSS. An evidenced
52
+ SSRF → internal-admin takeover can therefore be one critical priority while
53
+ both constituent findings retain their medium CVSS in technical details.
54
+ HTML/Markdown display ranked paths before details; JSON includes `priorities`
55
+ and `attack_chains`; SARIF emits one result per path plus standalone findings.
56
+ Chain evidence is exported beside the report and verified against its hash.
57
+
58
+ An assessment applies only to its exact ordered path. Linking alone never
59
+ creates a critical rating: unassessed paths retain maximum constituent
60
+ severity and are explicitly marked `unassessed`. Severity is an evidence-based
61
+ assessment, not an automatically calculated chain CVSS score. The report
62
+ rejects invalid cyclic graphs and more than 1000 reportable paths rather than
63
+ silently dropping paths. Hash checks prove byte identity, not exploit execution.
32
64
 
33
65
  ## Verification boundaries
34
66
 
@@ -20,7 +20,7 @@ with a **tool-calling AI agent** on top that can run the same methods.
20
20
  | `PWN::FFI::*` | **8** | Native DSP/RF backends: Volk · Liquid · FFTW · RTLSdr · HackRF · AdalmPluto · SoapySDR · Stdio |
21
21
  | `PWN::AI::*` | **6** engines | OpenAI, Anthropic, Grok (OAuth device-flow), Gemini, Ollama, Open WebUI |
22
22
  | `bin/pwn_*` + `pwn` | **54** | Headless CLI executables for CI/CD |
23
- | Agent toolsets | **13** · **88 tools** | terminal · pwn · memory · skills · sessions · learning · metrics · policy · extrospection · cron · swarm · reward · curriculum |
23
+ | Agent toolsets | **16** · **150 tools** | terminal · pwn · memory · skills · sessions · learning · metrics · policy · extrospection · cron · swarm · reward · curriculum · http · mcp · manifest |
24
24
 
25
25
  ## Three ways to use it
26
26
 
@@ -101,7 +101,7 @@ $ pwn --ai "run bin/pwn_sast against ./src and push findings to DefectDojo"
101
101
 
102
102
  ## What the agent can call
103
103
 
104
- 13 toolsets · **88 tools** - full table at
104
+ 16 toolsets · **150 tools** - full table at
105
105
  [Agent Tool Registry](Agent-Tool-Registry.md).
106
106
 
107
107
  The two that matter most:
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: pwn-ai-agent-confirmation
3
+ description: Drive PWN::AI::Agent::Confirmation from pwn_eval.
4
+ license: MIT
5
+ allowed-tools: [pwn, pwn_eval]
6
+ metadata:
7
+ bundled: true
8
+ generated: true
9
+ module: PWN::AI::Agent::Confirmation
10
+ source: pwn/ai/agent/confirmation.rb
11
+ ---
12
+
13
+ # PWN::AI::Agent::Confirmation
14
+
15
+ Per-engagement ACK for exploit/destructive tool calls (PWN-AI-005 tiers).
16
+
17
+ ## When to use
18
+
19
+ Call `PWN::AI::Agent::Confirmation` from `pwn_eval` when the task needs this module.
20
+ Do not reimplement it in shell.
21
+
22
+ ## Methodologies
23
+
24
+ Generated from `pwn/ai/agent/confirmation.rb`. Prefer the public class methods below.
25
+ Class methods take `(opts = {})` and read `opts`.
26
+
27
+ ## How to call
28
+
29
+ ```ruby
30
+ PWN::AI::Agent::Confirmation.help
31
+ PWN::AI::Agent::Confirmation.required_bins(opts)
32
+ ```
33
+
34
+ ## Public methods
35
+
36
+ - `required_bins`
37
+ - `tier`
38
+ - `gate`
39
+ - `authors`
40
+ - `help`
41
+
42
+ ## Source
43
+
44
+ `pwn/ai/agent/confirmation.rb`
45
+
46
+ ## Verification
47
+
48
+ `PWN::AI::Agent::Confirmation.respond_to?(:required_bins)` after the
49
+ module is loaded. Read the source for parameter names.
@@ -12,7 +12,7 @@ metadata:
12
12
 
13
13
  # PWN::AI::Agent::Result
14
14
 
15
- Conditioning applied to every tool result before it re-enters the conversation as a role:'tool' message: hard size cap + credential redaction. Keeps the context window bounded and avoids leaking PWN::Env credentials back into the model.
15
+ Conditioning applied to every tool result before it re-enters the conversation as a role:'tool' message: lossless paging + credential redaction. Keeps the context window bounded and avoids leaking PWN::Env credentials back into the model.
16
16
 
17
17
  ## When to use
18
18
 
@@ -34,6 +34,9 @@ PWN::AI::Agent::Result.condition(opts)
34
34
  ## Public methods
35
35
 
36
36
  - `condition`
37
+ - `page`
38
+ - `token_limit`
39
+ - `page_length`
37
40
  - `default_max`
38
41
  - `redact`
39
42
  - `authors`
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: pwn-ai-agent-taskdag
3
+ description: Drive PWN::AI::Agent::TaskDAG from pwn_eval.
4
+ license: MIT
5
+ allowed-tools: [pwn, pwn_eval]
6
+ metadata:
7
+ bundled: true
8
+ generated: true
9
+ module: PWN::AI::Agent::TaskDAG
10
+ source: pwn/ai/agent/task_dag.rb
11
+ ---
12
+
13
+ # PWN::AI::Agent::TaskDAG
14
+
15
+ Planner/executor split: YAML task DAGs with per-step checkpoints.
16
+
17
+ ## When to use
18
+
19
+ Call `PWN::AI::Agent::TaskDAG` from `pwn_eval` when the task needs this module.
20
+ Do not reimplement it in shell.
21
+
22
+ ## Methodologies
23
+
24
+ Generated from `pwn/ai/agent/task_dag.rb`. Prefer the public class methods below.
25
+ Class methods take `(opts = {})` and read `opts`.
26
+
27
+ ## How to call
28
+
29
+ ```ruby
30
+ PWN::AI::Agent::TaskDAG.help
31
+ PWN::AI::Agent::TaskDAG.required_bins(opts)
32
+ ```
33
+
34
+ ## Public methods
35
+
36
+ - `required_bins`
37
+ - `plan`
38
+ - `execute`
39
+ - `resume`
40
+ - `authors`
41
+ - `help`
42
+
43
+ ## Source
44
+
45
+ `pwn/ai/agent/task_dag.rb`
46
+
47
+ ## Verification
48
+
49
+ `PWN::AI::Agent::TaskDAG.respond_to?(:required_bins)` after the
50
+ module is loaded. Read the source for parameter names.
@@ -36,7 +36,9 @@ PWN::AI::Agent::ToolGuard.unwrap_payload(opts)
36
36
  - `unwrap_payload`
37
37
  - `present`
38
38
  - `placeholder`
39
+ - `placeholder_match`
39
40
  - `bashism`
41
+ - `bashism_match`
40
42
  - `shell_syntax_surface`
41
43
  - `mint_canary`
42
44
  - `canary_leak`
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: pwn-ai-agent-tools-browsergoto
3
+ description: Drive PWN::Ai::Agent::Tools::BrowserGoto from pwn_eval.
4
+ license: MIT
5
+ allowed-tools: [pwn, pwn_eval]
6
+ metadata:
7
+ bundled: true
8
+ generated: true
9
+ module: PWN::Ai::Agent::Tools::BrowserGoto
10
+ source: pwn/ai/agent/tools/browser_goto.rb
11
+ ---
12
+
13
+ # PWN::Ai::Agent::Tools::BrowserGoto
14
+
15
+ Public API for PWN::Ai::Agent::Tools::BrowserGoto.
16
+
17
+ ## When to use
18
+
19
+ Call `PWN::Ai::Agent::Tools::BrowserGoto` from `pwn_eval` when the task needs this module.
20
+ Do not reimplement it in shell.
21
+
22
+ ## Methodologies
23
+
24
+ Generated from `pwn/ai/agent/tools/browser_goto.rb`. Prefer the public class methods below.
25
+ Class methods take `(opts = {})` and read `opts`.
26
+
27
+ ## How to call
28
+
29
+ ```ruby
30
+ PWN::Ai::Agent::Tools::BrowserGoto.help
31
+ PWN::Ai::Agent::Tools::BrowserGoto.help(opts)
32
+ ```
33
+
34
+ ## Public methods
35
+
36
+ - _(no public class methods parsed)_
37
+
38
+ ## Source
39
+
40
+ `pwn/ai/agent/tools/browser_goto.rb`
41
+
42
+ ## Verification
43
+
44
+ `PWN::Ai::Agent::Tools::BrowserGoto.respond_to?(:help)` after the
45
+ module is loaded. Read the source for parameter names.
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: pwn-ai-agent-tools-lootquery
3
+ description: Drive PWN::Ai::Agent::Tools::LootQuery from pwn_eval.
4
+ license: MIT
5
+ allowed-tools: [pwn, pwn_eval]
6
+ metadata:
7
+ bundled: true
8
+ generated: true
9
+ module: PWN::Ai::Agent::Tools::LootQuery
10
+ source: pwn/ai/agent/tools/loot_query.rb
11
+ ---
12
+
13
+ # PWN::Ai::Agent::Tools::LootQuery
14
+
15
+ Public API for PWN::Ai::Agent::Tools::LootQuery.
16
+
17
+ ## When to use
18
+
19
+ Call `PWN::Ai::Agent::Tools::LootQuery` from `pwn_eval` when the task needs this module.
20
+ Do not reimplement it in shell.
21
+
22
+ ## Methodologies
23
+
24
+ Generated from `pwn/ai/agent/tools/loot_query.rb`. Prefer the public class methods below.
25
+ Class methods take `(opts = {})` and read `opts`.
26
+
27
+ ## How to call
28
+
29
+ ```ruby
30
+ PWN::Ai::Agent::Tools::LootQuery.help
31
+ PWN::Ai::Agent::Tools::LootQuery.help(opts)
32
+ ```
33
+
34
+ ## Public methods
35
+
36
+ - _(no public class methods parsed)_
37
+
38
+ ## Source
39
+
40
+ `pwn/ai/agent/tools/loot_query.rb`
41
+
42
+ ## Verification
43
+
44
+ `PWN::Ai::Agent::Tools::LootQuery.respond_to?(:help)` after the
45
+ module is loaded. Read the source for parameter names.
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: pwn-ai-agent-tools-nmapscan
3
+ description: Drive PWN::Ai::Agent::Tools::NmapScan from pwn_eval.
4
+ license: MIT
5
+ allowed-tools: [pwn, pwn_eval]
6
+ metadata:
7
+ bundled: true
8
+ generated: true
9
+ module: PWN::Ai::Agent::Tools::NmapScan
10
+ source: pwn/ai/agent/tools/nmap_scan.rb
11
+ ---
12
+
13
+ # PWN::Ai::Agent::Tools::NmapScan
14
+
15
+ Public API for PWN::Ai::Agent::Tools::NmapScan.
16
+
17
+ ## When to use
18
+
19
+ Call `PWN::Ai::Agent::Tools::NmapScan` from `pwn_eval` when the task needs this module.
20
+ Do not reimplement it in shell.
21
+
22
+ ## Methodologies
23
+
24
+ Generated from `pwn/ai/agent/tools/nmap_scan.rb`. Prefer the public class methods below.
25
+ Class methods take `(opts = {})` and read `opts`.
26
+
27
+ ## How to call
28
+
29
+ ```ruby
30
+ PWN::Ai::Agent::Tools::NmapScan.help
31
+ PWN::Ai::Agent::Tools::NmapScan.help(opts)
32
+ ```
33
+
34
+ ## Public methods
35
+
36
+ - _(no public class methods parsed)_
37
+
38
+ ## Source
39
+
40
+ `pwn/ai/agent/tools/nmap_scan.rb`
41
+
42
+ ## Verification
43
+
44
+ `PWN::Ai::Agent::Tools::NmapScan.respond_to?(:help)` after the
45
+ module is loaded. Read the source for parameter names.