pwn 0.5.708 → 0.5.710

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 (450) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/documentation/Installation.md +1 -0
  4. data/etc/default_skills/exploitdev/SKILL.md +38 -0
  5. data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
  6. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
  7. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
  8. data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
  9. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  10. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +49 -0
  11. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  12. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  13. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  14. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +58 -0
  15. data/etc/default_skills/pwn/plugins/credential_attack/references/urls.md +3 -0
  16. data/etc/default_skills/pwn/plugins/exploit_db/SKILL.md +49 -0
  17. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +63 -0
  18. data/etc/default_skills/pwn/plugins/frida/SKILL.md +51 -0
  19. data/etc/default_skills/pwn/plugins/fuzz/SKILL.md +2 -0
  20. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +53 -0
  21. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  22. data/etc/default_skills/pwn/plugins/k8s/SKILL.md +51 -0
  23. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +50 -0
  24. data/etc/default_skills/pwn/plugins/preflight_checker/SKILL.md +59 -0
  25. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +53 -0
  26. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  27. data/etc/default_skills/pwn/plugins/recon/SKILL.md +57 -0
  28. data/etc/default_skills/pwn/plugins/recon/references/urls.md +6 -0
  29. data/etc/default_skills/pwn/plugins/semgrep/SKILL.md +48 -0
  30. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  31. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  32. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +49 -0
  33. data/lib/pwn/ai/agent/assembly.rb +4 -1
  34. data/lib/pwn/ai/agent/btc.rb +4 -1
  35. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  36. data/lib/pwn/ai/agent/curriculum.rb +89 -30
  37. data/lib/pwn/ai/agent/dispatch.rb +27 -16
  38. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  39. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  40. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  41. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  42. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  43. data/lib/pwn/ai/agent/learning.rb +142 -25
  44. data/lib/pwn/ai/agent/loop.rb +53 -46
  45. data/lib/pwn/ai/agent/metrics.rb +133 -23
  46. data/lib/pwn/ai/agent/mistakes.rb +126 -17
  47. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  48. data/lib/pwn/ai/agent/policy.rb +158 -18
  49. data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
  50. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  51. data/lib/pwn/ai/agent/reflect.rb +9 -5
  52. data/lib/pwn/ai/agent/registry.rb +65 -12
  53. data/lib/pwn/ai/agent/result.rb +19 -10
  54. data/lib/pwn/ai/agent/reward.rb +150 -32
  55. data/lib/pwn/ai/agent/sast.rb +4 -1
  56. data/lib/pwn/ai/agent/swarm.rb +72 -36
  57. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  58. data/lib/pwn/ai/agent/tool_guard.rb +105 -6
  59. data/lib/pwn/ai/agent/tools/sessions.rb +8 -1
  60. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  61. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  62. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  63. data/lib/pwn/ai/agent.rb +4 -0
  64. data/lib/pwn/ai/anthropic.rb +41 -7
  65. data/lib/pwn/ai/gemini.rb +21 -11
  66. data/lib/pwn/ai/grok.rb +44 -6
  67. data/lib/pwn/ai/http_retry.rb +40 -12
  68. data/lib/pwn/ai/ollama.rb +19 -10
  69. data/lib/pwn/ai/open_ai.rb +81 -30
  70. data/lib/pwn/ai/open_web_ui.rb +20 -14
  71. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  72. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  73. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  74. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  75. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  76. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  77. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  78. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  79. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  80. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  81. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  82. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  83. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  84. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  85. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  86. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  87. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  88. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  89. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  90. data/lib/pwn/ai/red_team.rb +4 -0
  91. data/lib/pwn/ai.rb +4 -0
  92. data/lib/pwn/aws/acm.rb +5 -2
  93. data/lib/pwn/aws/api_gateway.rb +10 -7
  94. data/lib/pwn/aws/app_stream.rb +5 -2
  95. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  96. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  97. data/lib/pwn/aws/auto_scaling.rb +5 -2
  98. data/lib/pwn/aws/batch.rb +5 -2
  99. data/lib/pwn/aws/budgets.rb +5 -2
  100. data/lib/pwn/aws/cloud_formation.rb +5 -2
  101. data/lib/pwn/aws/cloud_front.rb +7 -4
  102. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  103. data/lib/pwn/aws/cloud_search.rb +5 -2
  104. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  105. data/lib/pwn/aws/cloud_trail.rb +5 -2
  106. data/lib/pwn/aws/cloud_watch.rb +5 -2
  107. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  108. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  109. data/lib/pwn/aws/code_build.rb +5 -2
  110. data/lib/pwn/aws/code_commit.rb +5 -2
  111. data/lib/pwn/aws/code_deploy.rb +5 -2
  112. data/lib/pwn/aws/code_pipeline.rb +5 -2
  113. data/lib/pwn/aws/cognito_identity.rb +5 -2
  114. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  115. data/lib/pwn/aws/cognito_sync.rb +5 -2
  116. data/lib/pwn/aws/config_service.rb +5 -2
  117. data/lib/pwn/aws/data_pipleline.rb +5 -2
  118. data/lib/pwn/aws/database_migration_service.rb +5 -2
  119. data/lib/pwn/aws/device_farm.rb +5 -2
  120. data/lib/pwn/aws/direct_connect.rb +5 -2
  121. data/lib/pwn/aws/directory_service.rb +5 -2
  122. data/lib/pwn/aws/dynamo_db.rb +5 -2
  123. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  124. data/lib/pwn/aws/ec2.rb +5 -2
  125. data/lib/pwn/aws/ecr.rb +5 -2
  126. data/lib/pwn/aws/ecs.rb +5 -2
  127. data/lib/pwn/aws/efs.rb +5 -2
  128. data/lib/pwn/aws/elasti_cache.rb +5 -2
  129. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  130. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  131. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  132. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  133. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  134. data/lib/pwn/aws/emr.rb +5 -2
  135. data/lib/pwn/aws/firehose.rb +5 -2
  136. data/lib/pwn/aws/game_lift.rb +5 -2
  137. data/lib/pwn/aws/glacier.rb +6 -3
  138. data/lib/pwn/aws/health.rb +5 -2
  139. data/lib/pwn/aws/iam.rb +10 -4
  140. data/lib/pwn/aws/import_export.rb +5 -2
  141. data/lib/pwn/aws/inspector.rb +5 -2
  142. data/lib/pwn/aws/iot.rb +5 -2
  143. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  144. data/lib/pwn/aws/kinesis.rb +5 -2
  145. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  146. data/lib/pwn/aws/kms.rb +5 -2
  147. data/lib/pwn/aws/lambda.rb +5 -2
  148. data/lib/pwn/aws/lambda_preview.rb +5 -2
  149. data/lib/pwn/aws/lex.rb +5 -2
  150. data/lib/pwn/aws/lightsail.rb +5 -2
  151. data/lib/pwn/aws/machine_learning.rb +5 -2
  152. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  153. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  154. data/lib/pwn/aws/ops_works.rb +5 -2
  155. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  156. data/lib/pwn/aws/pinpoint.rb +5 -2
  157. data/lib/pwn/aws/polly.rb +5 -2
  158. data/lib/pwn/aws/rds.rb +5 -2
  159. data/lib/pwn/aws/redshift.rb +5 -2
  160. data/lib/pwn/aws/rekognition.rb +5 -2
  161. data/lib/pwn/aws/route53.rb +5 -2
  162. data/lib/pwn/aws/route53_domains.rb +5 -2
  163. data/lib/pwn/aws/s3.rb +5 -2
  164. data/lib/pwn/aws/service_catalog.rb +5 -2
  165. data/lib/pwn/aws/ses.rb +5 -2
  166. data/lib/pwn/aws/shield.rb +5 -2
  167. data/lib/pwn/aws/simple_db.rb +5 -2
  168. data/lib/pwn/aws/sms.rb +5 -2
  169. data/lib/pwn/aws/snowball.rb +5 -2
  170. data/lib/pwn/aws/sns.rb +5 -2
  171. data/lib/pwn/aws/sqs.rb +5 -2
  172. data/lib/pwn/aws/ssm.rb +5 -2
  173. data/lib/pwn/aws/states.rb +5 -2
  174. data/lib/pwn/aws/storage_gateway.rb +5 -2
  175. data/lib/pwn/aws/sts.rb +4 -1
  176. data/lib/pwn/aws/support.rb +5 -2
  177. data/lib/pwn/aws/swf.rb +5 -2
  178. data/lib/pwn/aws/waf.rb +5 -2
  179. data/lib/pwn/aws/waf_regional.rb +5 -2
  180. data/lib/pwn/aws/workspaces.rb +5 -2
  181. data/lib/pwn/aws/x_ray.rb +5 -2
  182. data/lib/pwn/aws.rb +4 -0
  183. data/lib/pwn/banner/anon.rb +3 -0
  184. data/lib/pwn/banner/bubble.rb +3 -0
  185. data/lib/pwn/banner/cheshire.rb +3 -0
  186. data/lib/pwn/banner/code_cave.rb +3 -0
  187. data/lib/pwn/banner/dont_panic.rb +3 -0
  188. data/lib/pwn/banner/f_society.rb +3 -0
  189. data/lib/pwn/banner/fork_bomb.rb +3 -0
  190. data/lib/pwn/banner/jmp_esp.rb +3 -0
  191. data/lib/pwn/banner/matrix.rb +5 -1
  192. data/lib/pwn/banner/ninja.rb +3 -0
  193. data/lib/pwn/banner/off_the_air.rb +3 -0
  194. data/lib/pwn/banner/pirate.rb +3 -0
  195. data/lib/pwn/banner/radare2.rb +3 -0
  196. data/lib/pwn/banner/radare2_ai.rb +3 -0
  197. data/lib/pwn/banner/white_rabbit.rb +3 -0
  198. data/lib/pwn/banner.rb +6 -2
  199. data/lib/pwn/blockchain/btc.rb +8 -3
  200. data/lib/pwn/blockchain/eth.rb +10 -3
  201. data/lib/pwn/blockchain.rb +4 -0
  202. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  203. data/lib/pwn/bounty.rb +4 -0
  204. data/lib/pwn/config.rb +79 -13
  205. data/lib/pwn/cron.rb +297 -20
  206. data/lib/pwn/driver.rb +2 -18
  207. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  208. data/lib/pwn/ffi/fftw.rb +31 -6
  209. data/lib/pwn/ffi/hack_rf.rb +59 -8
  210. data/lib/pwn/ffi/liquid.rb +63 -10
  211. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  212. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  213. data/lib/pwn/ffi/stdio.rb +7 -8
  214. data/lib/pwn/ffi/volk.rb +36 -7
  215. data/lib/pwn/ffi.rb +12 -0
  216. data/lib/pwn/memory.rb +136 -16
  217. data/lib/pwn/memory_index.rb +34 -19
  218. data/lib/pwn/migrate.rb +34 -24
  219. data/lib/pwn/module_skills.rb +39 -8
  220. data/lib/pwn/plugins/aflplusplus.rb +72 -0
  221. data/lib/pwn/plugins/android.rb +71 -245
  222. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  223. data/lib/pwn/plugins/assembly.rb +9 -4
  224. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  225. data/lib/pwn/plugins/baresip.rb +59 -12
  226. data/lib/pwn/plugins/basic_auth.rb +9 -3
  227. data/lib/pwn/plugins/beef.rb +28 -18
  228. data/lib/pwn/plugins/binary_parser.rb +133 -0
  229. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  230. data/lib/pwn/plugins/burp_suite.rb +98 -68
  231. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  232. data/lib/pwn/plugins/char.rb +33 -3
  233. data/lib/pwn/plugins/credential_attack.rb +158 -0
  234. data/lib/pwn/plugins/credit_card.rb +6 -1
  235. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  236. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  237. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  238. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  239. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  240. data/lib/pwn/plugins/detect_os.rb +5 -0
  241. data/lib/pwn/plugins/ein.rb +3 -0
  242. data/lib/pwn/plugins/exploit_db.rb +69 -0
  243. data/lib/pwn/plugins/exploit_dev.rb +330 -0
  244. data/lib/pwn/plugins/file_fu.rb +11 -8
  245. data/lib/pwn/plugins/frida.rb +112 -0
  246. data/lib/pwn/plugins/fuzz.rb +42 -6
  247. data/lib/pwn/plugins/gdb.rb +115 -0
  248. data/lib/pwn/plugins/git.rb +19 -14
  249. data/lib/pwn/plugins/github.rb +38 -15
  250. data/lib/pwn/plugins/google_workspace.rb +188 -45
  251. data/lib/pwn/plugins/hacker_one.rb +159 -35
  252. data/lib/pwn/plugins/hunter.rb +6 -3
  253. data/lib/pwn/plugins/ip_info.rb +9 -4
  254. data/lib/pwn/plugins/irc.rb +28 -15
  255. data/lib/pwn/plugins/jenkins.rb +65 -57
  256. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  257. data/lib/pwn/plugins/jobs.rb +110 -0
  258. data/lib/pwn/plugins/json_pathify.rb +9 -5
  259. data/lib/pwn/plugins/k8s.rb +73 -0
  260. data/lib/pwn/plugins/log.rb +113 -13
  261. data/lib/pwn/plugins/mail_agent.rb +87 -79
  262. data/lib/pwn/plugins/metasploit.rb +11 -6
  263. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  264. data/lib/pwn/plugins/msr206.rb +42 -28
  265. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  266. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  267. data/lib/pwn/plugins/nmap_it.rb +14 -34
  268. data/lib/pwn/plugins/nuclei.rb +90 -0
  269. data/lib/pwn/plugins/oauth2.rb +11 -5
  270. data/lib/pwn/plugins/ocr.rb +3 -0
  271. data/lib/pwn/plugins/open_api.rb +5 -2
  272. data/lib/pwn/plugins/openvas.rb +33 -25
  273. data/lib/pwn/plugins/packet.rb +152 -31
  274. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  275. data/lib/pwn/plugins/pony.rb +86 -1
  276. data/lib/pwn/plugins/preflight_checker.rb +166 -0
  277. data/lib/pwn/plugins/process_tube.rb +139 -0
  278. data/lib/pwn/plugins/ps.rb +7 -1
  279. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  280. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  281. data/lib/pwn/plugins/radare2.rb +253 -0
  282. data/lib/pwn/plugins/recon.rb +196 -0
  283. data/lib/pwn/plugins/repl.rb +122 -1
  284. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  285. data/lib/pwn/plugins/semgrep.rb +61 -0
  286. data/lib/pwn/plugins/serial.rb +24 -14
  287. data/lib/pwn/plugins/shodan.rb +54 -35
  288. data/lib/pwn/plugins/slack_client.rb +11 -6
  289. data/lib/pwn/plugins/sock.rb +17 -8
  290. data/lib/pwn/plugins/spider.rb +5 -2
  291. data/lib/pwn/plugins/sqlmap.rb +49 -0
  292. data/lib/pwn/plugins/ssn.rb +3 -0
  293. data/lib/pwn/plugins/thread_pool.rb +6 -9
  294. data/lib/pwn/plugins/tor.rb +9 -4
  295. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  296. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  297. data/lib/pwn/plugins/twitter_api.rb +6 -2
  298. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  299. data/lib/pwn/plugins/vault.rb +12 -3
  300. data/lib/pwn/plugins/vin.rb +24 -12
  301. data/lib/pwn/plugins/voice.rb +7 -2
  302. data/lib/pwn/plugins/volatility.rb +67 -0
  303. data/lib/pwn/plugins/vsphere.rb +9 -5
  304. data/lib/pwn/plugins/xxd.rb +12 -43
  305. data/lib/pwn/plugins/zaproxy.rb +30 -16
  306. data/lib/pwn/plugins.rb +22 -0
  307. data/lib/pwn/reports/ai_red_team.rb +6 -2
  308. data/lib/pwn/reports/csv.rb +8 -1
  309. data/lib/pwn/reports/fuzz.rb +5 -2
  310. data/lib/pwn/reports/html.rb +8 -1
  311. data/lib/pwn/reports/html_footer.rb +4 -3
  312. data/lib/pwn/reports/html_header.rb +6 -2
  313. data/lib/pwn/reports/json.rb +8 -1
  314. data/lib/pwn/reports/markdown.rb +8 -1
  315. data/lib/pwn/reports/pdf.rb +8 -1
  316. data/lib/pwn/reports/phone.rb +5 -2
  317. data/lib/pwn/reports/sast.rb +6 -2
  318. data/lib/pwn/reports/uri_buster.rb +5 -2
  319. data/lib/pwn/reports/xml.rb +8 -1
  320. data/lib/pwn/reports.rb +19 -0
  321. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  322. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  323. data/lib/pwn/sast/aws.rb +9 -3
  324. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  325. data/lib/pwn/sast/base64.rb +9 -3
  326. data/lib/pwn/sast/beef_hook.rb +9 -3
  327. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  328. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  329. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  330. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  331. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  332. data/lib/pwn/sast/csrf.rb +9 -3
  333. data/lib/pwn/sast/deserial_java.rb +9 -3
  334. data/lib/pwn/sast/emoticon.rb +9 -3
  335. data/lib/pwn/sast/eval.rb +9 -3
  336. data/lib/pwn/sast/factory.rb +9 -3
  337. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  338. data/lib/pwn/sast/inner_html.rb +9 -3
  339. data/lib/pwn/sast/keystore.rb +9 -3
  340. data/lib/pwn/sast/local_storage.rb +9 -3
  341. data/lib/pwn/sast/location_hash.rb +9 -3
  342. data/lib/pwn/sast/log4j.rb +9 -3
  343. data/lib/pwn/sast/logger.rb +9 -3
  344. data/lib/pwn/sast/md5.rb +9 -3
  345. data/lib/pwn/sast/outer_html.rb +9 -3
  346. data/lib/pwn/sast/padding_oracle.rb +9 -3
  347. data/lib/pwn/sast/password.rb +9 -3
  348. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  349. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  350. data/lib/pwn/sast/pom_version.rb +9 -3
  351. data/lib/pwn/sast/port.rb +9 -3
  352. data/lib/pwn/sast/post_message.rb +9 -3
  353. data/lib/pwn/sast/private_key.rb +9 -3
  354. data/lib/pwn/sast/redirect.rb +9 -3
  355. data/lib/pwn/sast/redos.rb +9 -3
  356. data/lib/pwn/sast/shell.rb +9 -3
  357. data/lib/pwn/sast/signature.rb +9 -3
  358. data/lib/pwn/sast/sql.rb +9 -3
  359. data/lib/pwn/sast/ssl.rb +9 -3
  360. data/lib/pwn/sast/sudo.rb +9 -3
  361. data/lib/pwn/sast/task_tag.rb +9 -3
  362. data/lib/pwn/sast/test_case_engine.rb +11 -7
  363. data/lib/pwn/sast/throw_errors.rb +9 -3
  364. data/lib/pwn/sast/token.rb +9 -3
  365. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  366. data/lib/pwn/sast/use_after_free.rb +9 -3
  367. data/lib/pwn/sast/version.rb +9 -3
  368. data/lib/pwn/sast/window_location_hash.rb +9 -3
  369. data/lib/pwn/sast.rb +4 -0
  370. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  371. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  372. data/lib/pwn/sdr/decoder/base.rb +74 -22
  373. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  374. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  375. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  376. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  377. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  378. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  379. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  380. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  381. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  382. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  383. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  384. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  385. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  386. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  387. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  388. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  389. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  390. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  391. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  392. data/lib/pwn/sdr/decoder.rb +9 -0
  393. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  394. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  395. data/lib/pwn/sdr/gqrx.rb +178 -119
  396. data/lib/pwn/sdr/rfidler.rb +4 -1
  397. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  398. data/lib/pwn/sdr.rb +14 -0
  399. data/lib/pwn/sessions.rb +86 -16
  400. data/lib/pwn/setup.rb +106 -37
  401. data/lib/pwn/version.rb +1 -1
  402. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  403. data/lib/pwn/www/bing.rb +10 -5
  404. data/lib/pwn/www/bug_crowd.rb +11 -5
  405. data/lib/pwn/www/checkip.rb +8 -4
  406. data/lib/pwn/www/coinbase_pro.rb +11 -5
  407. data/lib/pwn/www/duckduckgo.rb +12 -6
  408. data/lib/pwn/www/facebook.rb +11 -5
  409. data/lib/pwn/www/github.rb +11 -5
  410. data/lib/pwn/www/google.rb +11 -5
  411. data/lib/pwn/www/hacker_one.rb +20 -9
  412. data/lib/pwn/www/linkedin.rb +11 -5
  413. data/lib/pwn/www/pandora.rb +11 -5
  414. data/lib/pwn/www/pastebin.rb +9 -4
  415. data/lib/pwn/www/paypal.rb +19 -11
  416. data/lib/pwn/www/synack.rb +11 -5
  417. data/lib/pwn/www/torch.rb +13 -8
  418. data/lib/pwn/www/trading_view.rb +11 -5
  419. data/lib/pwn/www/twitter.rb +11 -5
  420. data/lib/pwn/www/uber.rb +11 -5
  421. data/lib/pwn/www/upwork.rb +11 -5
  422. data/lib/pwn/www/wayback_machine.rb +12 -6
  423. data/lib/pwn/www/youtube.rb +10 -5
  424. data/lib/pwn/www.rb +4 -0
  425. data/spec/conventions_spec.rb +118 -2
  426. data/spec/integration/help_contract_spec.rb +2 -0
  427. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  428. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  429. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  431. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  432. data/spec/lib/pwn/plugins/exploit_db_spec.rb +13 -0
  433. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  434. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  435. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  436. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  437. data/spec/lib/pwn/plugins/k8s_spec.rb +13 -0
  438. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  439. data/spec/lib/pwn/plugins/preflight_checker_spec.rb +23 -0
  440. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  441. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  442. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  443. data/spec/lib/pwn/plugins/semgrep_spec.rb +13 -0
  444. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  445. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  446. data/spec/lib/pwn/req_queue_spec.rb +168 -0
  447. data/third_party/pwn_rdoc.jsonl +160 -5
  448. metadata +63 -7
  449. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  450. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
@@ -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
@@ -1808,42 +1808,171 @@ module PWN
1808
1808
  # Display Usage for this Module
1809
1809
 
1810
1810
  public_class_method def self.help
1811
- puts <<~USAGE
1812
- USAGE:
1813
- state = PWN::AI::Agent::TaskSummarizer.fresh(request: 'ship task briefs to execs')
1814
- plan = PWN::AI::Agent::TaskSummarizer.plan(request: state[:request], state: state)
1815
- text = PWN::AI::Agent::TaskSummarizer.emit_plan!(state: state)
1816
- # → "Goal: ...\nTangible tasks (N) — each may use many tools:\n task 1/N: ...\n task 2/N: ..."
1817
- # UI: on_tool.call('task', text, '') # full text, no truncation
1818
- # One task brief for a whole tool collection (one-to-many):
1819
- pre = PWN::AI::Agent::TaskSummarizer.about_to(
1820
- tools: [{ name: 'shell' }, { name: 'pwn_eval' }],
1821
- state: state
1822
- )
1823
- # → "task k/N: <english> — via shell, pwn_eval (search+eval-ruby)"
1824
- ctx = PWN::AI::Agent::TaskSummarizer.plan_context(state: state)
1825
- focus = PWN::AI::Agent::TaskSummarizer.active_task_prompt(state: state)
1826
- # then real tools print on their own lines; record! stays silent by default
1827
- PWN::AI::Agent::TaskSummarizer.record!(
1828
- state: state,
1829
- name: 'shell',
1830
- args: 'ls',
1831
- result: '{success:true}'
1832
- )
1833
- line = PWN::AI::Agent::TaskSummarizer.flush!(state: state) # optional closing brief
1834
- PWN::AI::Agent::TaskSummarizer.enabled?
1835
- PWN::AI::Agent::TaskSummarizer.verbose?
1836
- PWN::AI::Agent::TaskSummarizer.llm_plan_enabled?
1837
- PWN::AI::Agent::TaskSummarizer.unify_plan!(state: state, outline: plan_text)
1838
- PWN::AI::Agent::TaskSummarizer.tool_jargon_task?(item: '`shell`')
1839
- PWN::AI::Agent::TaskSummarizer.relevance_query(state: state, request: state[:request])
1840
- PWN::AI::Agent::TaskSummarizer.apply_prm_advancement!(state: state, rewards: [1, 1], intents: ['search'])
1841
- PWN::AI::Agent::TaskSummarizer.parse_outline_tasks(outline: plan_text)
1842
- PWN::AI::Agent::TaskSummarizer.every_n
1843
- PWN::AI::Agent::TaskSummarizer.interval_s
1844
-
1845
- #{self}.authors
1846
- USAGE
1811
+ puts "USAGE:
1812
+ # Run enabled and return its result
1813
+ #{self}.enabled?
1814
+
1815
+ # Run verbose and return its result
1816
+ #{self}.verbose?
1817
+
1818
+ # LLM plan generation is on by default. Set
1819
+ #{self}.llm_plan_enabled?
1820
+
1821
+ # Run every n and return its result
1822
+ #{self}.every_n
1823
+
1824
+ # Run interval s and return its result
1825
+ #{self}.interval_s
1826
+
1827
+ # Per-run state (also safe for nested/swarm if callers keep their own hash)
1828
+ #{self}.fresh(
1829
+ request: 'optional - original user goal string'
1830
+ )
1831
+
1832
+ # Every request gets a task compass. There is no request type
1833
+ #{self}.needs_task_breakdown?
1834
+
1835
+ # Request → ordered tangible tasks (each may map to many tools)
1836
+ #{self}.plan(
1837
+ request: 'required - user goal string',
1838
+ state: 'optional - fresh() hash to mutate',
1839
+ tasks: 'optional - Array injected plan array (tests)',
1840
+ llm_tasks: 'optional - injected LLM task array (tests)'
1841
+ )
1842
+
1843
+ # Format the full plan as the task-summary body (shown in entirety)
1844
+ #{self}.format_plan(
1845
+ tasks: 'required - Array of task strings',
1846
+ request: 'optional - goal string'
1847
+ )
1848
+
1849
+ # Run emit plan and return its result
1850
+ #{self}.emit_plan!(
1851
+ state: 'required - state value consumed by #emit_plan!',
1852
+ request: 'required - request value consumed by #emit_plan!'
1853
+ )
1854
+
1855
+ # Prefer Reflect when module_reflection is on (teacher engine / gated)
1856
+ #{self}.chat_for_plan(
1857
+ request: 'required - user goal to decompose'
1858
+ )
1859
+
1860
+ # Parse JSON array, fenced JSON, or numbered/bulleted plain text
1861
+ #{self}.parse_llm_tasks(
1862
+ raw: 'required - raw LLM response text'
1863
+ )
1864
+
1865
+ # Thin offline fallback when the LLM is disabled or unavailable
1866
+ #{self}.fallback_decompose(
1867
+ goal: 'required - user goal string'
1868
+ )
1869
+
1870
+ # Back-compat alias used by older call sites / specs
1871
+ #{self}.heuristic_decompose(
1872
+ goal: 'required - user goal string'
1873
+ )
1874
+
1875
+ # High-level brief for a collection of impending tool calls
1876
+ #{self}.about_to(
1877
+ tools: 'optional - array of {name:, args:} or bare names',
1878
+ name: 'optional - single tool name (legacy one-tool path)',
1879
+ args: 'optional - single tool args (ignored for brief content)',
1880
+ request: 'optional - goal text',
1881
+ state: 'optional - fresh() hash'
1882
+ )
1883
+
1884
+ # Active plain-English plan item (and index/n) for Loop / model steering
1885
+ #{self}.active_task(
1886
+ state: 'required - fresh() hash',
1887
+ messages: 'optional - messages value consumed by #active_task'
1888
+ )
1889
+
1890
+ # Remaining English work units that lack tool-result evidence
1891
+ #{self}.unfinished_tasks(
1892
+ state: 'required - fresh() hash',
1893
+ messages: 'optional - Loop message array for extra coverage'
1894
+ )
1895
+
1896
+ # True while a multi-step English plan still has uncovered work
1897
+ #{self}.plan_open?(
1898
+ state: 'required - fresh() hash',
1899
+ messages: 'optional - Loop message array'
1900
+ )
1901
+
1902
+ # Short block for engine messages: full plan + focus on active English task
1903
+ #{self}.plan_context(
1904
+ state: 'required - fresh() hash'
1905
+ )
1906
+
1907
+ # Build a Registry/tool-router relevance string from English tasks
1908
+ #{self}.relevance_query(
1909
+ state: 'optional - fresh() hash',
1910
+ request: 'optional - original user goal fallback'
1911
+ )
1912
+
1913
+ # Inject / refresh the active-task focus into Loop messages when plan_idx changes
1914
+ #{self}.active_task_prompt(
1915
+ state: 'required - fresh() hash',
1916
+ force: 'optional - Boolean re-emit even if idx unchanged',
1917
+ messages: 'optional - messages value consumed by #active_task_prompt',
1918
+ request: 'optional - request value consumed by #active_task_prompt'
1919
+ )
1920
+
1921
+ # Pull the operators original ask out of curriculum / critic / GOAL+PLAN
1922
+ #{self}.canonical_request(
1923
+ request: 'required - raw user or wrapper string'
1924
+ )
1925
+
1926
+ # True when a candidate plan item is tool jargon (e.g. `shell`,
1927
+ #{self}.tool_jargon_task?(
1928
+ item: 'required - candidate task string'
1929
+ )
1930
+
1931
+ # Parse a plan_first / red_team surviving outline into tangible tasks
1932
+ #{self}.parse_outline_tasks(
1933
+ outline: 'required - free-text plan outline'
1934
+ )
1935
+
1936
+ # After S4 red_team / plan_first: optionally rewrite ts_state[:plan]
1937
+ #{self}.unify_plan!(
1938
+ state: 'required - fresh() hash',
1939
+ outline: 'required - plan_first text and/or red_team hint',
1940
+ source: 'optional - :plan_first|:red_team|:merged (default :merged)'
1941
+ )
1942
+
1943
+ # Advance or hold plan_idx from an R2 step batch
1944
+ #{self}.apply_prm_advancement!(
1945
+ state: 'required - fresh() hash',
1946
+ rewards: 'required - Array of -1|0|1 (batch order)',
1947
+ intents: 'optional - Array of intent verb strings for the batch',
1948
+ names: 'optional - Array tool names in the batch',
1949
+ result: 'optional - latest tool result string',
1950
+ mistake: 'optional - truthy when a mistake fingerprint hit this batch'
1951
+ )
1952
+
1953
+ # Record a completed tool. Does NOT emit task lines with results
1954
+ #{self}.record!(
1955
+ state: 'required - fresh() hash',
1956
+ name: 'required - tool name',
1957
+ args: 'optional - tool args',
1958
+ result: 'optional - tool result string'
1959
+ )
1960
+
1961
+ # Optional progress / done line (verbose or flush). Still plain English;
1962
+ #{self}.emit!(
1963
+ state: 'required - fresh() hash',
1964
+ final: 'optional - Boolean closing brief (default: false)'
1965
+ )
1966
+
1967
+ # Run flush and return its result
1968
+ #{self}.flush!(
1969
+ state: 'required - fresh() hash'
1970
+ )
1971
+
1972
+ # Print the AUTHOR(S) string for this module.
1973
+ #{self}.authors
1974
+ "
1975
+ constants.sort
1847
1976
  end
1848
1977
  end
1849
1978
  end
@@ -357,12 +357,111 @@ module PWN
357
357
  end
358
358
 
359
359
  public_class_method def self.help
360
- puts <<~USAGE
361
- USAGE:
362
- PWN::AI::Agent::ToolGuard.placeholder?(text: '...')
363
- PWN::AI::Agent::ToolGuard.coerce_args(args: { value: 'id' }, required: %w[command])
364
- #{self}.authors
365
- USAGE
360
+ puts "USAGE:
361
+ # Run present and return its result
362
+ #{self}.present?(
363
+ value: 'required - integer or string to pack/encode'
364
+ )
365
+
366
+ # Run placeholder and return its result
367
+ #{self}.placeholder?(
368
+ text: 'optional - text value consumed by #placeholder?'
369
+ )
370
+
371
+ # Run bashism and return its result
372
+ #{self}.bashism?(
373
+ text: 'optional - text value consumed by #bashism?'
374
+ )
375
+
376
+ # Run shell bash and return its result
377
+ #{self}.shell_bash?
378
+
379
+ # Run shell name and return its result
380
+ #{self}.shell_name
381
+
382
+ # Run protect http and return its result
383
+ #{self}.protect_http!
384
+
385
+ # Run protect core constants and return its result
386
+ #{self}.protect_core_constants!
387
+
388
+ # Coerce common wrong keys onto the first required schema field
389
+ #{self}.coerce_args(
390
+ args: 'optional - args value consumed by #coerce_args',
391
+ required: 'optional - Array required value consumed by #coerce_args'
392
+ )
393
+
394
+ # Run invalid payload and return its result
395
+ #{self}.invalid_payload(
396
+ hint: 'optional - hint value consumed by #invalid_payload',
397
+ shell: 'optional - shell value consumed by #invalid_payload (defaults to shell_name)'
398
+ )
399
+
400
+ # Run host load and return its result
401
+ #{self}.host_load
402
+
403
+ # Conservative wall-clock seconds for shell / pwn_eval
404
+ #{self}.deadline_s(
405
+ kind: 'optional - kind value consumed by #deadline_s',
406
+ timeout: 'optional - seconds to wait before giving up (defaults to opts[:timeout_s])',
407
+ timeout_s: 'optional - timeout s value consumed by #deadline_s'
408
+ )
409
+
410
+ # Run reset timeout budget and return its result
411
+ #{self}.reset_timeout_budget
412
+
413
+ # Run reset timeout budget and return its result
414
+ #{self}.reset_timeout_budget!
415
+
416
+ # Run mutation count and return its result
417
+ #{self}.mutation_count
418
+
419
+ # Run payload spent and return its result
420
+ #{self}.payload_spent
421
+
422
+ # Run note timeout and return its result
423
+ #{self}.note_timeout!(
424
+ timeout: 'optional - seconds to wait before giving up'
425
+ )
426
+
427
+ # Run next timeout and return its result
428
+ #{self}.next_timeout(
429
+ timeout: 'optional - seconds to wait before giving up',
430
+ spent: 'optional - spent value consumed by #next_timeout'
431
+ )
432
+
433
+ # Timeout policy (loop-law, not a skill):
434
+ #{self}.timeout_lesson(
435
+ tool: 'required - tool value consumed by #timeout_lesson',
436
+ timeout: 'required - seconds to wait before giving up'
437
+ )
438
+
439
+ # Run timeout result and return its result
440
+ #{self}.timeout_result(
441
+ timeout: 'required - seconds to wait before giving up',
442
+ tool: 'optional - tool value consumed by #timeout_result',
443
+ payload: 'optional - payload value consumed by #timeout_result',
444
+ task: 'optional - task value consumed by #timeout_result',
445
+ stdout: 'optional - stdout value consumed by #timeout_result',
446
+ stderr: 'optional - stderr value consumed by #timeout_result',
447
+ shell: 'required - shell value consumed by #timeout_result (defaults to shell_name)'
448
+ )
449
+
450
+ # Run timeout prior count and return its result
451
+ #{self}.timeout_prior_count(
452
+ tool: 'optional - tool value consumed by #timeout_prior_count'
453
+ )
454
+
455
+ # Run refuse copied persist and return its result
456
+ #{self}.refuse_copied_persist?(
457
+ name: 'optional - binary or identifier name',
458
+ args: 'optional - args value consumed by #refuse_copied_persist?'
459
+ )
460
+
461
+ # Print the AUTHOR(S) string for this module.
462
+ #{self}.authors
463
+ "
464
+ constants.sort
366
465
  end
367
466
  end
368
467
  end
@@ -31,7 +31,14 @@ PWN::AI::Agent::Registry.register(
31
31
  limit: args[:limit] || 12,
32
32
  exclude_session_id: exclude,
33
33
  include_current: args[:include_current] == true
34
- )
34
+ ).tap do |hits|
35
+ sid = exclude.to_s
36
+ next if sid.empty? || !defined?(PWN::Plugins::ArtifactRegistry)
37
+
38
+ artifacts = PWN::Plugins::ArtifactRegistry.list(session_id: sid)
39
+ hits[:artifacts] = artifacts if hits.is_a?(Hash)
40
+ hits << { artifacts: artifacts } if hits.is_a?(Array) && artifacts.any?
41
+ end
35
42
  }
36
43
  )
37
44
 
@@ -41,13 +41,16 @@ module PWN
41
41
 
42
42
  public_class_method def self.help
43
43
  puts "USAGE:
44
- ai_analysis = PWN::AI::Agent::TransparentBrowser.analyze(
44
+ # Run analyze and return its result
45
+ #{self}.analyze(
45
46
  request: 'required - current step in the JavaScript debugging session to analyze',
46
47
  source_to_review: 'required - the block of JavaScript code in which the current step resides'
47
48
  )
48
49
 
50
+ # Print the AUTHOR(S) string for this module.
49
51
  #{self}.authors
50
52
  "
53
+ constants.sort
51
54
  end
52
55
  end
53
56
  end
@@ -180,27 +180,47 @@ module PWN
180
180
  end
181
181
 
182
182
  public_class_method def self.help
183
- puts <<~USAGE
184
- USAGE:
185
- # Called from Learning.auto_introspect when Loop.run is on the
186
- # stack. You almost never invoke this directly.
187
- PWN::AI::Agent::TurnFinalizer.defer(
188
- session_id: sid,
189
- request: req,
190
- final: text,
191
- plan: plan,
192
- ts_state: ts
193
- )
194
-
195
- # Specs / cron that need the learner to finish before assert:
196
- PWN::AI::Agent::TurnFinalizer.join_all!(timeout: 15)
197
-
198
- Toggle via PWN::Env[:ai][:agent][:defer_introspect]
199
- true (default) Hermes split: learn after the reply
200
- false — legacy inline auto_introspect
201
-
202
- #{self}.authors
203
- USAGE
183
+ puts "USAGE:
184
+ # Run enter user path and return its result
185
+ #{self}.enter_user_path!
186
+
187
+ # Run leave user path and return its result
188
+ #{self}.leave_user_path!
189
+
190
+ # Run user path and return its result
191
+ #{self}.user_path?
192
+
193
+ # Run should defer and return its result
194
+ #{self}.should_defer?
195
+
196
+ # Run defer and return its result
197
+ #{self}.defer(
198
+ session_id: 'required - PWN::Sessions id',
199
+ request: 'optional - original user request',
200
+ final: 'optional - user-visible final answer',
201
+ predicted: 'optional - W3 predicted score',
202
+ plan: 'optional - tangible-task plan',
203
+ ts_state: 'optional - TaskSummarizer state'
204
+ )
205
+
206
+ # Run finalize and return its result
207
+ #{self}.finalize(
208
+ session_id: 'optional - request:, final:, predicted:, plan:, ts_state:',
209
+ should: 'optional - should value consumed by #finalize'
210
+ )
211
+
212
+ # Run join all and return its result
213
+ #{self}.join_all!(
214
+ timeout: 'optional - seconds to wait before giving up'
215
+ )
216
+
217
+ # Run pending and return its result
218
+ #{self}.pending
219
+
220
+ # Print the AUTHOR(S) string for this module.
221
+ #{self}.authors
222
+ "
223
+ constants.sort
204
224
  end
205
225
 
206
226
  private_class_method def self.track(opts = {})
@@ -89,14 +89,17 @@ module PWN
89
89
 
90
90
  public_class_method def self.help
91
91
  puts "USAGE:
92
- ai_analysis = #{self}.analyze(
93
- request: 'required - high level description of vulnerability discovered (e.g. \"Discovered a SQLi vulnerability in /login\"',
92
+ # Run analyze and return its result
93
+ #{self}.analyze(
94
+ request: 'required - high level description of vulnerability discovered (e.g. Discovered a SQLi vulnerability in /login',
94
95
  markup_type: 'optional - specify the type of markup to generate :jira|:markdown|:html|:confluence|:xml (default: :jira)',
95
- output_path: 'optional - full path to save the generated report as .md (e.g. /home/claw/reports/sqli-finding.md)'
96
+ output_path: 'optional - path to save the generated markdown report'
96
97
  )
97
98
 
99
+ # Print the AUTHOR(S) string for this module.
98
100
  #{self}.authors
99
101
  "
102
+ constants.sort
100
103
  end
101
104
  end
102
105
  end
data/lib/pwn/ai/agent.rb CHANGED
@@ -47,6 +47,10 @@ module PWN
47
47
  end
48
48
 
49
49
  public_class_method def self.help
50
+ puts "USAGE:
51
+ # Display a List of Every PWN::AI Module
52
+ #{self}.authors
53
+ "
50
54
  constants.sort
51
55
  end
52
56
  end