pwn 0.5.708 → 0.5.709

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 (434) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/Installation.md +1 -0
  3. data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
  4. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
  5. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
  6. data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
  7. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  8. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +48 -0
  9. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  10. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  11. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  12. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +51 -0
  13. data/etc/default_skills/pwn/plugins/doctor/SKILL.md +57 -0
  14. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +61 -0
  15. data/etc/default_skills/pwn/plugins/frida/SKILL.md +49 -0
  16. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +52 -0
  17. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  18. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +48 -0
  19. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +52 -0
  20. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  21. data/etc/default_skills/pwn/plugins/recon/SKILL.md +55 -0
  22. data/etc/default_skills/pwn/plugins/recon/references/urls.md +5 -0
  23. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  24. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  25. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +48 -0
  26. data/lib/pwn/ai/agent/assembly.rb +4 -1
  27. data/lib/pwn/ai/agent/btc.rb +4 -1
  28. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  29. data/lib/pwn/ai/agent/curriculum.rb +89 -30
  30. data/lib/pwn/ai/agent/dispatch.rb +27 -16
  31. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  32. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  33. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  34. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  35. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  36. data/lib/pwn/ai/agent/learning.rb +142 -25
  37. data/lib/pwn/ai/agent/loop.rb +53 -46
  38. data/lib/pwn/ai/agent/metrics.rb +133 -23
  39. data/lib/pwn/ai/agent/mistakes.rb +126 -17
  40. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  41. data/lib/pwn/ai/agent/policy.rb +158 -18
  42. data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
  43. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  44. data/lib/pwn/ai/agent/reflect.rb +9 -5
  45. data/lib/pwn/ai/agent/registry.rb +65 -12
  46. data/lib/pwn/ai/agent/result.rb +19 -10
  47. data/lib/pwn/ai/agent/reward.rb +150 -32
  48. data/lib/pwn/ai/agent/sast.rb +4 -1
  49. data/lib/pwn/ai/agent/swarm.rb +72 -36
  50. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  51. data/lib/pwn/ai/agent/tool_guard.rb +105 -6
  52. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  53. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  54. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  55. data/lib/pwn/ai/agent.rb +4 -0
  56. data/lib/pwn/ai/anthropic.rb +41 -7
  57. data/lib/pwn/ai/gemini.rb +21 -11
  58. data/lib/pwn/ai/grok.rb +44 -6
  59. data/lib/pwn/ai/http_retry.rb +40 -12
  60. data/lib/pwn/ai/ollama.rb +19 -10
  61. data/lib/pwn/ai/open_ai.rb +81 -30
  62. data/lib/pwn/ai/open_web_ui.rb +20 -14
  63. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  64. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  65. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  66. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  67. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  68. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  69. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  70. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  71. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  72. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  73. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  74. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  75. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  76. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  77. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  78. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  79. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  80. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  81. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  82. data/lib/pwn/ai/red_team.rb +4 -0
  83. data/lib/pwn/ai.rb +4 -0
  84. data/lib/pwn/aws/acm.rb +5 -2
  85. data/lib/pwn/aws/api_gateway.rb +10 -7
  86. data/lib/pwn/aws/app_stream.rb +5 -2
  87. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  88. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  89. data/lib/pwn/aws/auto_scaling.rb +5 -2
  90. data/lib/pwn/aws/batch.rb +5 -2
  91. data/lib/pwn/aws/budgets.rb +5 -2
  92. data/lib/pwn/aws/cloud_formation.rb +5 -2
  93. data/lib/pwn/aws/cloud_front.rb +7 -4
  94. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  95. data/lib/pwn/aws/cloud_search.rb +5 -2
  96. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  97. data/lib/pwn/aws/cloud_trail.rb +5 -2
  98. data/lib/pwn/aws/cloud_watch.rb +5 -2
  99. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  100. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  101. data/lib/pwn/aws/code_build.rb +5 -2
  102. data/lib/pwn/aws/code_commit.rb +5 -2
  103. data/lib/pwn/aws/code_deploy.rb +5 -2
  104. data/lib/pwn/aws/code_pipeline.rb +5 -2
  105. data/lib/pwn/aws/cognito_identity.rb +5 -2
  106. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  107. data/lib/pwn/aws/cognito_sync.rb +5 -2
  108. data/lib/pwn/aws/config_service.rb +5 -2
  109. data/lib/pwn/aws/data_pipleline.rb +5 -2
  110. data/lib/pwn/aws/database_migration_service.rb +5 -2
  111. data/lib/pwn/aws/device_farm.rb +5 -2
  112. data/lib/pwn/aws/direct_connect.rb +5 -2
  113. data/lib/pwn/aws/directory_service.rb +5 -2
  114. data/lib/pwn/aws/dynamo_db.rb +5 -2
  115. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  116. data/lib/pwn/aws/ec2.rb +5 -2
  117. data/lib/pwn/aws/ecr.rb +5 -2
  118. data/lib/pwn/aws/ecs.rb +5 -2
  119. data/lib/pwn/aws/efs.rb +5 -2
  120. data/lib/pwn/aws/elasti_cache.rb +5 -2
  121. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  122. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  123. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  124. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  125. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  126. data/lib/pwn/aws/emr.rb +5 -2
  127. data/lib/pwn/aws/firehose.rb +5 -2
  128. data/lib/pwn/aws/game_lift.rb +5 -2
  129. data/lib/pwn/aws/glacier.rb +6 -3
  130. data/lib/pwn/aws/health.rb +5 -2
  131. data/lib/pwn/aws/iam.rb +10 -4
  132. data/lib/pwn/aws/import_export.rb +5 -2
  133. data/lib/pwn/aws/inspector.rb +5 -2
  134. data/lib/pwn/aws/iot.rb +5 -2
  135. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  136. data/lib/pwn/aws/kinesis.rb +5 -2
  137. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  138. data/lib/pwn/aws/kms.rb +5 -2
  139. data/lib/pwn/aws/lambda.rb +5 -2
  140. data/lib/pwn/aws/lambda_preview.rb +5 -2
  141. data/lib/pwn/aws/lex.rb +5 -2
  142. data/lib/pwn/aws/lightsail.rb +5 -2
  143. data/lib/pwn/aws/machine_learning.rb +5 -2
  144. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  145. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  146. data/lib/pwn/aws/ops_works.rb +5 -2
  147. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  148. data/lib/pwn/aws/pinpoint.rb +5 -2
  149. data/lib/pwn/aws/polly.rb +5 -2
  150. data/lib/pwn/aws/rds.rb +5 -2
  151. data/lib/pwn/aws/redshift.rb +5 -2
  152. data/lib/pwn/aws/rekognition.rb +5 -2
  153. data/lib/pwn/aws/route53.rb +5 -2
  154. data/lib/pwn/aws/route53_domains.rb +5 -2
  155. data/lib/pwn/aws/s3.rb +5 -2
  156. data/lib/pwn/aws/service_catalog.rb +5 -2
  157. data/lib/pwn/aws/ses.rb +5 -2
  158. data/lib/pwn/aws/shield.rb +5 -2
  159. data/lib/pwn/aws/simple_db.rb +5 -2
  160. data/lib/pwn/aws/sms.rb +5 -2
  161. data/lib/pwn/aws/snowball.rb +5 -2
  162. data/lib/pwn/aws/sns.rb +5 -2
  163. data/lib/pwn/aws/sqs.rb +5 -2
  164. data/lib/pwn/aws/ssm.rb +5 -2
  165. data/lib/pwn/aws/states.rb +5 -2
  166. data/lib/pwn/aws/storage_gateway.rb +5 -2
  167. data/lib/pwn/aws/sts.rb +4 -1
  168. data/lib/pwn/aws/support.rb +5 -2
  169. data/lib/pwn/aws/swf.rb +5 -2
  170. data/lib/pwn/aws/waf.rb +5 -2
  171. data/lib/pwn/aws/waf_regional.rb +5 -2
  172. data/lib/pwn/aws/workspaces.rb +5 -2
  173. data/lib/pwn/aws/x_ray.rb +5 -2
  174. data/lib/pwn/aws.rb +4 -0
  175. data/lib/pwn/banner/anon.rb +3 -0
  176. data/lib/pwn/banner/bubble.rb +3 -0
  177. data/lib/pwn/banner/cheshire.rb +3 -0
  178. data/lib/pwn/banner/code_cave.rb +3 -0
  179. data/lib/pwn/banner/dont_panic.rb +3 -0
  180. data/lib/pwn/banner/f_society.rb +3 -0
  181. data/lib/pwn/banner/fork_bomb.rb +3 -0
  182. data/lib/pwn/banner/jmp_esp.rb +3 -0
  183. data/lib/pwn/banner/matrix.rb +5 -1
  184. data/lib/pwn/banner/ninja.rb +3 -0
  185. data/lib/pwn/banner/off_the_air.rb +3 -0
  186. data/lib/pwn/banner/pirate.rb +3 -0
  187. data/lib/pwn/banner/radare2.rb +3 -0
  188. data/lib/pwn/banner/radare2_ai.rb +3 -0
  189. data/lib/pwn/banner/white_rabbit.rb +3 -0
  190. data/lib/pwn/banner.rb +6 -2
  191. data/lib/pwn/blockchain/btc.rb +8 -3
  192. data/lib/pwn/blockchain/eth.rb +10 -3
  193. data/lib/pwn/blockchain.rb +4 -0
  194. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  195. data/lib/pwn/bounty.rb +4 -0
  196. data/lib/pwn/config.rb +79 -13
  197. data/lib/pwn/cron.rb +297 -20
  198. data/lib/pwn/driver.rb +2 -18
  199. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  200. data/lib/pwn/ffi/fftw.rb +31 -6
  201. data/lib/pwn/ffi/hack_rf.rb +59 -8
  202. data/lib/pwn/ffi/liquid.rb +63 -10
  203. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  204. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  205. data/lib/pwn/ffi/stdio.rb +5 -8
  206. data/lib/pwn/ffi/volk.rb +36 -7
  207. data/lib/pwn/ffi.rb +12 -0
  208. data/lib/pwn/memory.rb +136 -16
  209. data/lib/pwn/memory_index.rb +34 -19
  210. data/lib/pwn/migrate.rb +34 -24
  211. data/lib/pwn/module_skills.rb +39 -8
  212. data/lib/pwn/plugins/aflplusplus.rb +52 -0
  213. data/lib/pwn/plugins/android.rb +65 -245
  214. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  215. data/lib/pwn/plugins/assembly.rb +9 -4
  216. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  217. data/lib/pwn/plugins/baresip.rb +59 -12
  218. data/lib/pwn/plugins/basic_auth.rb +9 -3
  219. data/lib/pwn/plugins/beef.rb +28 -18
  220. data/lib/pwn/plugins/binary_parser.rb +133 -0
  221. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  222. data/lib/pwn/plugins/burp_suite.rb +98 -68
  223. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  224. data/lib/pwn/plugins/char.rb +33 -3
  225. data/lib/pwn/plugins/credential_attack.rb +99 -0
  226. data/lib/pwn/plugins/credit_card.rb +6 -1
  227. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  228. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  229. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  230. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  231. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  232. data/lib/pwn/plugins/detect_os.rb +5 -0
  233. data/lib/pwn/plugins/doctor.rb +149 -0
  234. data/lib/pwn/plugins/ein.rb +3 -0
  235. data/lib/pwn/plugins/exploit_dev.rb +264 -0
  236. data/lib/pwn/plugins/file_fu.rb +11 -8
  237. data/lib/pwn/plugins/frida.rb +61 -0
  238. data/lib/pwn/plugins/fuzz.rb +9 -6
  239. data/lib/pwn/plugins/gdb.rb +95 -0
  240. data/lib/pwn/plugins/git.rb +19 -14
  241. data/lib/pwn/plugins/github.rb +38 -15
  242. data/lib/pwn/plugins/google_workspace.rb +188 -45
  243. data/lib/pwn/plugins/hacker_one.rb +159 -35
  244. data/lib/pwn/plugins/hunter.rb +6 -3
  245. data/lib/pwn/plugins/ip_info.rb +9 -4
  246. data/lib/pwn/plugins/irc.rb +28 -15
  247. data/lib/pwn/plugins/jenkins.rb +65 -57
  248. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  249. data/lib/pwn/plugins/jobs.rb +109 -0
  250. data/lib/pwn/plugins/json_pathify.rb +9 -5
  251. data/lib/pwn/plugins/log.rb +113 -13
  252. data/lib/pwn/plugins/mail_agent.rb +87 -79
  253. data/lib/pwn/plugins/metasploit.rb +11 -6
  254. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  255. data/lib/pwn/plugins/msr206.rb +42 -28
  256. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  257. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  258. data/lib/pwn/plugins/nmap_it.rb +14 -34
  259. data/lib/pwn/plugins/nuclei.rb +57 -0
  260. data/lib/pwn/plugins/oauth2.rb +11 -5
  261. data/lib/pwn/plugins/ocr.rb +3 -0
  262. data/lib/pwn/plugins/open_api.rb +5 -2
  263. data/lib/pwn/plugins/openvas.rb +33 -25
  264. data/lib/pwn/plugins/packet.rb +152 -31
  265. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  266. data/lib/pwn/plugins/pony.rb +86 -1
  267. data/lib/pwn/plugins/process_tube.rb +120 -0
  268. data/lib/pwn/plugins/ps.rb +7 -1
  269. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  270. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  271. data/lib/pwn/plugins/radare2.rb +253 -0
  272. data/lib/pwn/plugins/recon.rb +161 -0
  273. data/lib/pwn/plugins/repl.rb +122 -1
  274. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  275. data/lib/pwn/plugins/serial.rb +24 -14
  276. data/lib/pwn/plugins/shodan.rb +54 -35
  277. data/lib/pwn/plugins/slack_client.rb +11 -6
  278. data/lib/pwn/plugins/sock.rb +16 -8
  279. data/lib/pwn/plugins/spider.rb +5 -2
  280. data/lib/pwn/plugins/sqlmap.rb +49 -0
  281. data/lib/pwn/plugins/ssn.rb +3 -0
  282. data/lib/pwn/plugins/thread_pool.rb +6 -9
  283. data/lib/pwn/plugins/tor.rb +9 -4
  284. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  285. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  286. data/lib/pwn/plugins/twitter_api.rb +6 -2
  287. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  288. data/lib/pwn/plugins/vault.rb +12 -3
  289. data/lib/pwn/plugins/vin.rb +24 -12
  290. data/lib/pwn/plugins/voice.rb +7 -2
  291. data/lib/pwn/plugins/volatility.rb +48 -0
  292. data/lib/pwn/plugins/vsphere.rb +9 -5
  293. data/lib/pwn/plugins/xxd.rb +12 -43
  294. data/lib/pwn/plugins/zaproxy.rb +30 -16
  295. data/lib/pwn/plugins.rb +19 -0
  296. data/lib/pwn/reports/ai_red_team.rb +6 -2
  297. data/lib/pwn/reports/csv.rb +8 -1
  298. data/lib/pwn/reports/fuzz.rb +5 -2
  299. data/lib/pwn/reports/html.rb +8 -1
  300. data/lib/pwn/reports/html_footer.rb +4 -3
  301. data/lib/pwn/reports/html_header.rb +6 -2
  302. data/lib/pwn/reports/json.rb +8 -1
  303. data/lib/pwn/reports/markdown.rb +8 -1
  304. data/lib/pwn/reports/pdf.rb +8 -1
  305. data/lib/pwn/reports/phone.rb +5 -2
  306. data/lib/pwn/reports/sast.rb +6 -2
  307. data/lib/pwn/reports/uri_buster.rb +5 -2
  308. data/lib/pwn/reports/xml.rb +8 -1
  309. data/lib/pwn/reports.rb +19 -0
  310. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  311. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  312. data/lib/pwn/sast/aws.rb +9 -3
  313. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  314. data/lib/pwn/sast/base64.rb +9 -3
  315. data/lib/pwn/sast/beef_hook.rb +9 -3
  316. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  317. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  318. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  319. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  320. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  321. data/lib/pwn/sast/csrf.rb +9 -3
  322. data/lib/pwn/sast/deserial_java.rb +9 -3
  323. data/lib/pwn/sast/emoticon.rb +9 -3
  324. data/lib/pwn/sast/eval.rb +9 -3
  325. data/lib/pwn/sast/factory.rb +9 -3
  326. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  327. data/lib/pwn/sast/inner_html.rb +9 -3
  328. data/lib/pwn/sast/keystore.rb +9 -3
  329. data/lib/pwn/sast/local_storage.rb +9 -3
  330. data/lib/pwn/sast/location_hash.rb +9 -3
  331. data/lib/pwn/sast/log4j.rb +9 -3
  332. data/lib/pwn/sast/logger.rb +9 -3
  333. data/lib/pwn/sast/md5.rb +9 -3
  334. data/lib/pwn/sast/outer_html.rb +9 -3
  335. data/lib/pwn/sast/padding_oracle.rb +9 -3
  336. data/lib/pwn/sast/password.rb +9 -3
  337. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  338. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  339. data/lib/pwn/sast/pom_version.rb +9 -3
  340. data/lib/pwn/sast/port.rb +9 -3
  341. data/lib/pwn/sast/post_message.rb +9 -3
  342. data/lib/pwn/sast/private_key.rb +9 -3
  343. data/lib/pwn/sast/redirect.rb +9 -3
  344. data/lib/pwn/sast/redos.rb +9 -3
  345. data/lib/pwn/sast/shell.rb +9 -3
  346. data/lib/pwn/sast/signature.rb +9 -3
  347. data/lib/pwn/sast/sql.rb +9 -3
  348. data/lib/pwn/sast/ssl.rb +9 -3
  349. data/lib/pwn/sast/sudo.rb +9 -3
  350. data/lib/pwn/sast/task_tag.rb +9 -3
  351. data/lib/pwn/sast/test_case_engine.rb +11 -7
  352. data/lib/pwn/sast/throw_errors.rb +9 -3
  353. data/lib/pwn/sast/token.rb +9 -3
  354. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  355. data/lib/pwn/sast/use_after_free.rb +9 -3
  356. data/lib/pwn/sast/version.rb +9 -3
  357. data/lib/pwn/sast/window_location_hash.rb +9 -3
  358. data/lib/pwn/sast.rb +4 -0
  359. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  360. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  361. data/lib/pwn/sdr/decoder/base.rb +74 -22
  362. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  363. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  364. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  365. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  366. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  367. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  368. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  369. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  370. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  371. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  372. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  373. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  374. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  375. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  376. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  377. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  378. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  379. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  380. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  381. data/lib/pwn/sdr/decoder.rb +9 -0
  382. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  383. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  384. data/lib/pwn/sdr/gqrx.rb +178 -119
  385. data/lib/pwn/sdr/rfidler.rb +4 -1
  386. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  387. data/lib/pwn/sdr.rb +14 -0
  388. data/lib/pwn/sessions.rb +86 -16
  389. data/lib/pwn/setup.rb +94 -37
  390. data/lib/pwn/version.rb +1 -1
  391. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  392. data/lib/pwn/www/bing.rb +10 -5
  393. data/lib/pwn/www/bug_crowd.rb +11 -5
  394. data/lib/pwn/www/checkip.rb +8 -4
  395. data/lib/pwn/www/coinbase_pro.rb +11 -5
  396. data/lib/pwn/www/duckduckgo.rb +12 -6
  397. data/lib/pwn/www/facebook.rb +11 -5
  398. data/lib/pwn/www/github.rb +11 -5
  399. data/lib/pwn/www/google.rb +11 -5
  400. data/lib/pwn/www/hacker_one.rb +20 -9
  401. data/lib/pwn/www/linkedin.rb +11 -5
  402. data/lib/pwn/www/pandora.rb +11 -5
  403. data/lib/pwn/www/pastebin.rb +9 -4
  404. data/lib/pwn/www/paypal.rb +19 -11
  405. data/lib/pwn/www/synack.rb +11 -5
  406. data/lib/pwn/www/torch.rb +13 -8
  407. data/lib/pwn/www/trading_view.rb +11 -5
  408. data/lib/pwn/www/twitter.rb +11 -5
  409. data/lib/pwn/www/uber.rb +11 -5
  410. data/lib/pwn/www/upwork.rb +11 -5
  411. data/lib/pwn/www/wayback_machine.rb +12 -6
  412. data/lib/pwn/www/youtube.rb +10 -5
  413. data/lib/pwn/www.rb +4 -0
  414. data/spec/conventions_spec.rb +118 -2
  415. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  416. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  417. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  418. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  419. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  420. data/spec/lib/pwn/plugins/doctor_spec.rb +23 -0
  421. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  422. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  423. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  424. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  425. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  426. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  427. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  428. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  429. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  431. data/third_party/pwn_rdoc.jsonl +126 -5
  432. metadata +47 -3
  433. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  434. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
@@ -175,19 +175,23 @@ module PWN
175
175
 
176
176
  public_class_method def self.help
177
177
  puts "USAGE:
178
+ # Run on and return its result
178
179
  #{self}.on(
179
180
  request: 'required - String - What you want the AI to reflect on',
180
181
  system_role_content: 'optional - context to set up the model behavior for reflection',
181
- engine: 'optional - override engine (Symbol) for teacher-student reflection; defaults to PWN::Env[:ai][:reflect_engine]',
182
+ engine: 'optional - override engine for THIS reflection only (Symbol/String); defaults to PWN::Env[:ai][:reflect_engine] || :active',
183
+ model: 'optional - override model on the reflection engine for THIS call only; defaults to PWN::Env[:ai][:reflect_model]',
182
184
  spinner: 'optional - Boolean - Display spinner during operation (default: false)',
183
- suppress_pii_warning: 'optional - Boolean - Suppress PII Warnings (default: false)'
185
+ suppress_pii_warning: 'optional - Boolean - Suppress PII Warnings (default: false)',
186
+ timeout: 'optional - seconds to wait before giving up',
187
+ temp: 'optional - temp value consumed by #on',
188
+ quiet: 'optional - quiet value consumed by #on'
184
189
  )
185
190
 
186
- Teacher-student config:
187
- PWN::Env[:ai][:reflect_engine] = :anthropic # execute on :active, critique on :anthropic
188
-
191
+ # Print the AUTHOR(S) string for this module.
189
192
  #{self}.authors
190
193
  "
194
+ constants.sort
191
195
  end
192
196
  end
193
197
  end
@@ -347,18 +347,71 @@ module PWN
347
347
  # Display Usage for this Module
348
348
 
349
349
  public_class_method def self.help
350
- puts <<~USAGE
351
- USAGE:
352
- PWN::AI::Agent::Registry.discover
353
- PWN::AI::Agent::Registry.definitions(enabled: %w[terminal pwn])
354
- PWN::AI::Agent::Registry.definitions(relevance: 'nmap sweep 10/8') # slim (needs :tool_router)
355
- PWN::AI::Agent::Registry.rank(query: 'run a shell command')
356
- PWN::AI::Agent::Registry.lookup(name: 'shell') # => Entry
357
- PWN::AI::Agent::Registry.toolsets # => ["memory","pwn","skills","terminal"]
358
- PWN::AI::Agent::Registry.register(name:, toolset:, schema:, handler:)
359
-
360
- #{self}.authors
361
- USAGE
350
+ puts "USAGE:
351
+ # Run register and return its result
352
+ #{self}.register(
353
+ name: 'required - tool name exposed to the model',
354
+ toolset: 'required - grouping for enable/disable (terminal, file, pwn, memory…)',
355
+ schema: 'required - OpenAI function schema {name:, description:, parameters:}',
356
+ handler: 'required - ->(args_hash) { ... } returning a JSON-serialisable object',
357
+ check: 'optional - -> { bool } gate; tool only advertised when truthy',
358
+ max_chars: 'optional - cap on serialised result (default 24_000)'
359
+ )
360
+
361
+ # Run lookup and return its result
362
+ #{self}.lookup(
363
+ name: 'required - registered tool name'
364
+ )
365
+
366
+ # Run all and return its result
367
+ #{self}.all
368
+
369
+ # Run toolsets and return its result
370
+ #{self}.toolsets
371
+
372
+ # Run definitions and return its result
373
+ #{self}.definitions(
374
+ enabled: 'optional - Array of toolset names to include; nil = all whose check passes',
375
+ relevance: 'optional - user request; when set AND :tool_router is enabled, slim to CORE + top-K keyword matches',
376
+ top_k: 'optional - keyword-ranked tools to keep beyond CORE (default 10)',
377
+ order: 'optional - preference list forwarded only when this key is present',
378
+ preference: 'optional - alias of :order; same key-present rule',
379
+ kind: 'optional - kind value consumed by #definitions',
380
+ intent: 'optional - intent value consumed by #definitions',
381
+ core_only: 'optional - core only value consumed by #definitions'
382
+ )
383
+
384
+ # Run preference order and return its result
385
+ #{self}.preference_order(
386
+ order: 'optional - Array of tool names; explicit nil/[] disables',
387
+ preference: 'optional - alias of :order. Explicit key disables Env/DEFAULT fallback'
388
+ )
389
+
390
+ # Run apply preference and return its result
391
+ #{self}.apply_preference(
392
+ items: 'required - Array of Entry objects or OpenAI tool hashes',
393
+ order: 'optional - forwarded to preference_order only when the key is set',
394
+ preference: 'optional - alias of :order; same key-present rule',
395
+ entries: 'optional - entries value consumed by #apply_preference'
396
+ )
397
+
398
+ # Run rank and return its result
399
+ #{self}.rank(
400
+ query: 'required - user request text',
401
+ entries: 'optional - Entry pool to rank (default .all)',
402
+ order: 'optional - preference list forwarded to preference_order',
403
+ preference: 'optional - preference value consumed by #rank'
404
+ )
405
+
406
+ # Run discover and return its result
407
+ #{self}.discover(
408
+ force: 'optional - re-require tool files even if already discovered (default false)'
409
+ )
410
+
411
+ # Print the AUTHOR(S) string for this module.
412
+ #{self}.authors
413
+ "
414
+ constants.sort
362
415
  end
363
416
  end
364
417
  end
@@ -105,16 +105,25 @@ module PWN
105
105
  # Display Usage for this Module
106
106
 
107
107
  public_class_method def self.help
108
- puts <<~USAGE
109
- USAGE:
110
- safe = PWN::AI::Agent::Result.condition(
111
- content: json_string,
112
- entry: PWN::AI::Agent::Registry.lookup(name: 'shell')
113
- )
114
- safe = PWN::AI::Agent::Result.redact(content: string)
115
-
116
- #{self}.authors
117
- USAGE
108
+ puts "USAGE:
109
+ # Run condition and return its result
110
+ #{self}.condition(
111
+ content: 'required - String returned by Dispatch.call',
112
+ entry: 'optional - Registry::Entry (used for max_chars; nil → DEFAULT_MAX)'
113
+ )
114
+
115
+ # Engine-aware default: ollama keeps history inside a tight num_ctx;
116
+ #{self}.default_max
117
+
118
+ # Run redact and return its result
119
+ #{self}.redact(
120
+ content: 'required - String to scrub of credential-shaped substrings'
121
+ )
122
+
123
+ # Print the AUTHOR(S) string for this module.
124
+ #{self}.authors
125
+ "
126
+ constants.sort
118
127
  end
119
128
  end
120
129
  end
@@ -1331,7 +1331,8 @@ module PWN
1331
1331
  req_toks = request.downcase.scan(/[a-z0-9_]{3,}/).uniq
1332
1332
  fin_toks = final.downcase.scan(/[a-z0-9_]{3,}/).uniq
1333
1333
  overlap = req_toks.empty? ? 1.0 : (req_toks & fin_toks).length.to_f / req_toks.length
1334
- score = [score, 0.35].min if overlap < 0.08 && req_toks.length >= 4 && score > 0.35
1334
+ long_analytical = final.length >= 800
1335
+ score = [score, 0.35].min if overlap < 0.08 && req_toks.length >= 4 && score > 0.35 && !long_analytical
1335
1336
  ev_score = ev ? ev[:score].to_f : 0.0
1336
1337
  bad = trace.count { |t| !semantic_ok(name: 'shell', raw: t.to_s)[:semantic_ok] }
1337
1338
  ratio = trace.empty? ? 0.5 : 1.0 - (bad.to_f / trace.length)
@@ -1729,37 +1730,154 @@ module PWN
1729
1730
  # Display Usage for this Module
1730
1731
 
1731
1732
  public_class_method def self.help
1732
- puts <<~USAGE
1733
- USAGE:
1734
- # Tier 1 — reward signal
1735
- PWN::AI::Agent::Reward.judge(request: req, final: text, session_id: sid) # R1 ORM → {score:, verdict:, rationale:}
1736
- PWN::AI::Agent::Reward.prm(request: req, session_id: sid) # R2 PRM → per-step credit
1737
- PWN::AI::Agent::Reward.plan_coverage(plan: tasks, final: text, session_id: sid) # soft plan-quality feature
1738
- PWN::AI::Agent::Reward.sentinel # R3 reward-hacking detector
1739
- PWN::AI::Agent::Reward.reset_sentinel # wipe corrupt window + distrust
1740
- PWN::AI::Agent::Reward.warm_sentinel # P10 fill R3 window from Learning outcomes
1741
- PWN::AI::Agent::Reward.semantic_ok(name: 'shell', raw: json, args: args) # R4 kills phantom exit≠0 mistakes
1742
-
1743
- # Tier 5 — preference pairs → DPO
1744
- PWN::AI::Agent::Reward.record_preference(prompt: p, rejected: r, chosen: c, source: :user_correction)
1745
- PWN::AI::Agent::Reward.preferences(limit: 100)
1746
- PWN::AI::Agent::Reward.export_dpo(format: :dpo) # W1 → ~/.pwn/finetune/pwn-dpo-*.jsonl (≤40%/source, scrubbed)
1747
- PWN::AI::Agent::Reward.export_dpo(format: :dpo, balance: false) # raw dump (diagnostics)
1748
- PWN::AI::Agent::Reward.scrub_preferences(dry_run: true) # P15 ledger hygiene report
1749
- PWN::AI::Agent::Reward.scrub_preferences # P15 rewrite jsonl (backup first)
1750
- PWN::AI::Agent::Reward.preference_balance(scrub: true) # P15 geometry-aware mix
1751
-
1752
- # Tier 6 grounded reward
1753
- PWN::AI::Agent::Reward.verify_as_reward(final: text) # E3 browser-verified reward
1754
-
1755
- Config (PWN::Env[:ai][:agent]):
1756
- :verify_as_reward - Boolean/nil, ground finals via extro_verify (nil=auto)
1757
- :reward_llm - Boolean/nil, force ORM/PRM LLM teacher (nil=on for remote engines)
1758
- :reward_model - optional cheaper model id for ORM/PRM (nil=active engine default)
1759
- :reward_llm_timeout - seconds for cheap ORM chat (default 12, clamp 2..30)
1760
-
1761
- #{self}.authors
1762
- USAGE
1733
+ puts "USAGE:
1734
+ # R1 — LLM Outcome Reward Model
1735
+ #{self}.judge(
1736
+ request: 'required - original user request',
1737
+ final: 'required - assistant final answer',
1738
+ session_id: 'optional - PWN::Sessions id (adds tool trace)',
1739
+ trace: 'optional - Array of tool-result strings (overrides session_id)',
1740
+ commit: 'optional - write score into learning.jsonl / sentinel (default true)',
1741
+ critic_pass: 'optional - critic pass value consumed by #judge',
1742
+ predicted: 'optional - predicted value consumed by #judge',
1743
+ proxy_ok: 'optional - proxy ok value consumed by #judge'
1744
+ )
1745
+
1746
+ # Run promote to success and return its result
1747
+ #{self}.promote_to_success?(
1748
+ orm: 'optional - orm value consumed by #promote_to_success?',
1749
+ verify: 'optional - verify value consumed by #promote_to_success?',
1750
+ critic: 'optional - critic value consumed by #promote_to_success?'
1751
+ )
1752
+
1753
+ # Run prm and return its result
1754
+ #{self}.prm(
1755
+ request: 'required - user goal',
1756
+ session_id: 'optional - session to score in place',
1757
+ trace: 'optional - Array of {name:, args:, result:} or Strings'
1758
+ )
1759
+
1760
+ # Plan-quality soft signal (W3 feature / Learning tag)
1761
+ #{self}.plan_coverage(
1762
+ plan: 'required - Array of task strings or outline text',
1763
+ final: 'required - assistant final answer',
1764
+ request: 'optional - original user request',
1765
+ trace: 'optional - Array of tool-result strings',
1766
+ session_id: 'optional - load trace from session when trace empty'
1767
+ )
1768
+
1769
+ # R3 — Reward-hacking sentinel
1770
+ #{self}.sentinel
1771
+
1772
+ # P4 — scalar 0.0..1.0 haircut applied to Metrics success / Registry β when
1773
+ #{self}.proxy_distrust
1774
+
1775
+ # Run set proxy distrust and return its result
1776
+ #{self}.set_proxy_distrust(
1777
+ gap: 'optional - gap value consumed by #set_proxy_distrust',
1778
+ proxy: 'optional - scheme://proxy_host:port, or tor',
1779
+ judge: 'optional - judge value consumed by #set_proxy_distrust'
1780
+ )
1781
+
1782
+ # Run clear proxy distrust and return its result
1783
+ #{self}.clear_proxy_distrust
1784
+
1785
+ # One-shot: wipe sentinel window + distrust after deploying the
1786
+ #{self}.reset_sentinel
1787
+
1788
+ # P10 — backfill the R3 ring from Learning outcomes so offline/local
1789
+ #{self}.warm_sentinel(
1790
+ limit: 'optional - limit value consumed by #warm_sentinel'
1791
+ )
1792
+
1793
+ # R4 — Structured tool-result classifier
1794
+ #{self}.semantic_ok(
1795
+ name: 'required - tool name',
1796
+ raw: 'required - JSON string returned by Dispatch.call',
1797
+ args: 'optional - the tool call arguments (used for BENIGN_EXIT)'
1798
+ )
1799
+
1800
+ # 2.2 — coarse recoverable shape beside the fingerprint. Paths are
1801
+ #{self}.recoverable_shape(
1802
+ err: 'optional - err value consumed by #recoverable_shape',
1803
+ stderr: 'optional - stderr value consumed by #recoverable_shape',
1804
+ exit_code: 'optional - exit code value consumed by #recoverable_shape'
1805
+ )
1806
+
1807
+ # E3 — verify-as-reward (ground truth without a human)
1808
+ #{self}.verify_as_reward(
1809
+ final: 'optional - final value consumed by #verify_as_reward'
1810
+ )
1811
+
1812
+ # Run record preference and return its result
1813
+ #{self}.record_preference(
1814
+ prompt: 'required - prompt value consumed by #record_preference',
1815
+ rejected: 'required - rejected value consumed by #record_preference',
1816
+ chosen: 'required - chosen value consumed by #record_preference',
1817
+ force: 'optional - force value consumed by #record_preference',
1818
+ source: 'optional - source value consumed by #record_preference (defaults to :unknown))',
1819
+ shape: 'optional - shape value consumed by #record_preference',
1820
+ meta: 'optional - meta value consumed by #record_preference'
1821
+ )
1822
+
1823
+ # Share of `source` among the newest WRITE_SOURCE_WINDOW prefs
1824
+ #{self}.write_source_quota(
1825
+ source: 'optional - source value consumed by #write_source_quota'
1826
+ )
1827
+
1828
+ # P0 — online generator mix report + urgency flags. Controllers
1829
+ #{self}.generator_mix(
1830
+ limit: 'optional - limit value consumed by #generator_mix (defaults to WRITE_SOURCE_WINDOW)'
1831
+ )
1832
+
1833
+ # P0 ops — infer trajectory shape for legacy ledger rows that predate
1834
+ #{self}.infer_shape(
1835
+ row: 'optional - row value consumed by #infer_shape'
1836
+ )
1837
+
1838
+ # P15 — keep only usable preference pairs for balance/export/promote
1839
+ #{self}.usable_preference?(
1840
+ row: 'optional - row value consumed by #usable_preference?'
1841
+ )
1842
+
1843
+ # P15 — one-shot ledger hygiene. Filters in place (rewrite jsonl) or
1844
+ #{self}.scrub_preferences(
1845
+ dry_run: 'optional - dry run value consumed by #scrub_preferences'
1846
+ )
1847
+
1848
+ # P15/P5 — geometry-aware source mix. scrub:true uses usable_preference?
1849
+ #{self}.preference_balance(
1850
+ limit: 'optional - limit value consumed by #preference_balance (defaults to 10_000)',
1851
+ scrub: 'optional - scrub value consumed by #preference_balance'
1852
+ )
1853
+
1854
+ # Run preferences and return its result
1855
+ #{self}.preferences(
1856
+ limit: 'optional - limit value consumed by #preferences (defaults to 500)',
1857
+ source: 'required - source value consumed by #preferences'
1858
+ )
1859
+
1860
+ # Run export dpo and return its result
1861
+ #{self}.export_dpo(
1862
+ format: 'optional - format value consumed by #export_dpo (defaults to :dpo))',
1863
+ out: 'optional - out value consumed by #export_dpo',
1864
+ scrub: 'optional - scrub value consumed by #export_dpo',
1865
+ balance: 'optional - balance value consumed by #export_dpo',
1866
+ source_cap: 'optional - source cap value consumed by #export_dpo'
1867
+ )
1868
+
1869
+ # Run reset and return its result
1870
+ #{self}.reset
1871
+
1872
+ # Weight a judge sample for sentinel / Learning haircuts
1873
+ #{self}.judge_sample_weight(
1874
+ source: 'optional - source value consumed by #judge_sample_weight'
1875
+ )
1876
+
1877
+ # Print the AUTHOR(S) string for this module.
1878
+ #{self}.authors
1879
+ "
1880
+ constants.sort
1763
1881
  end
1764
1882
  end
1765
1883
  end
@@ -37,12 +37,15 @@ module PWN
37
37
 
38
38
  public_class_method def self.help
39
39
  puts "USAGE:
40
- ai_analysis = PWN::AI::Agent::SAST.analyze(
40
+ # Run analyze and return its result
41
+ #{self}.analyze(
41
42
  request: 'required - A string containing the source code snippet to be analyzed for SAST antipatterns and vulnerabilities.'
42
43
  )
43
44
 
45
+ # Print the AUTHOR(S) string for this module.
44
46
  #{self}.authors
45
47
  "
48
+ constants.sort
46
49
  end
47
50
  end
48
51
  end
@@ -396,42 +396,78 @@ module PWN
396
396
  # Display Usage for this Module
397
397
 
398
398
  public_class_method def self.help
399
- puts <<~USAGE
400
- USAGE:
401
- # Define personas (or edit #{AGENTS_FILE} directly)
402
- PWN::AI::Agent::Swarm.spawn(
403
- name: 'red',
404
- role: 'Offensive researcher. Propose the most likely exploit path...',
405
- toolsets: %w[terminal pwn memory extrospection],
406
- engine: :anthropic
407
- )
408
-
409
- # One-shot: ask a persona (creates a swarm if none given)
410
- r = PWN::AI::Agent::Swarm.ask(name: 'red', request: 'Enumerate attack surface for target X')
411
-
412
- # Antagonistic feedback loop
413
- d = PWN::AI::Agent::Swarm.debate(
414
- names: %w[red blue],
415
- topic: 'Is CVE-2026-NNNN exploitable on target X?',
416
- rounds: 3
417
- )
418
- puts d[:transcript].map { |t| "\#{t[:name]}: \#{t[:reply][0,200]}" }
419
-
420
- # Fan-out
421
- PWN::AI::Agent::Swarm.broadcast(request: 'Summarise findings so far')
422
-
423
- # Inspect / resume cross-session
424
- PWN::AI::Agent::Swarm.list
425
- PWN::AI::Agent::Swarm.bus_tail(swarm_id: d[:swarm_id], limit: 50)
426
-
427
- Config:
428
- PWN::Env[:ai][:agent][:max_depth] # recursion cap (default #{DEFAULT_DEPTH})
429
- persona[:max_iters] # per-turn iteration cap (default #{DEFAULT_ITERS})
430
- persona[:toolsets] # Registry toolset allow-list; omit 'swarm'
431
- # to prevent that persona spawning sub-agents.
432
-
433
- #{self}.authors
434
- USAGE
399
+ puts "USAGE:
400
+ # Persona registry (~/.pwn/agents.yml)
401
+ #{self}.personas
402
+
403
+ # Run spawn and return its result
404
+ #{self}.spawn(
405
+ name: 'required - persona name (snake_case)',
406
+ role: 'required - system_role_content overlay for this persona',
407
+ toolsets: 'optional - Array of Registry toolset names',
408
+ engine: 'optional - :openai / :anthropic / :grok / :gemini / :ollama / :openwebui',
409
+ max_iters: 'optional - per-turn iteration cap for this persona'
410
+ )
411
+
412
+ # Run retire and return its result
413
+ #{self}.retire(
414
+ name: 'optional - binary or identifier name'
415
+ )
416
+
417
+ # Swarm lifecycle & bus
418
+ #{self}.create(
419
+ topic: 'optional - topic value consumed by #create'
420
+ )
421
+
422
+ # Run list and return its result
423
+ #{self}.list
424
+
425
+ # Run bus append and return its result
426
+ #{self}.bus_append(
427
+ swarm_id: 'required - required, from: required, content: required',
428
+ to: 'optional - optional (default :all)',
429
+ from: 'optional - sender account or address to bind as operator',
430
+ content: 'optional - content value consumed by #bus_append'
431
+ )
432
+
433
+ # Run bus tail and return its result
434
+ #{self}.bus_tail(
435
+ swarm_id: 'optional - swarm id value consumed by #bus_tail',
436
+ limit: 'optional - limit value consumed by #bus_tail'
437
+ )
438
+
439
+ # Core: run a single persona turn under Loop.run
440
+ #{self}.ask(
441
+ name: 'required - persona name from ~/.pwn/agents.yml',
442
+ request: 'required - what to ask/instruct the persona',
443
+ swarm_id: 'optional - join an existing swarm (created if omitted)',
444
+ to: 'optional - addressee recorded on the bus (default :all)',
445
+ on_tool: 'optional - ->(name, args, result) live-UI callback',
446
+ from: 'optional - sender account or address to bind as operator (defaults to caller_label)',
447
+ text_only: 'required - text only value consumed by #ask'
448
+ )
449
+
450
+ # Run debate and return its result
451
+ #{self}.debate(
452
+ names: 'required - Array of persona names, order = speaking order',
453
+ topic: 'required - opening question / claim',
454
+ rounds: 'optional - full passes over names (default 2)',
455
+ swarm_id: 'optional - join an existing swarm',
456
+ on_tool: 'optional - ->(name, args, result) live-UI callback'
457
+ )
458
+
459
+ # Run broadcast and return its result
460
+ #{self}.broadcast(
461
+ request: 'required - required, names: optional - default all personas',
462
+ swarm_id: 'optional - swarm id value consumed by #broadcast',
463
+ names: 'required - Array names value consumed by #broadcast',
464
+ on_tool: 'optional - on tool value consumed by #broadcast'
465
+ )
466
+
467
+ # Print the AUTHOR(S) string for this module.
468
+ #{self}.authors
469
+ "
470
+ constants.sort
435
471
  end
436
472
  end
437
473
  end