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
@@ -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
@@ -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
@@ -862,25 +862,59 @@ module PWN
862
862
 
863
863
  public_class_method def self.help
864
864
  puts "USAGE:
865
- models = #{self}.get_models
865
+ # Run refresh oauth bearer token and return its result
866
+ #{self}.refresh_oauth_bearer_token(
867
+ refresh_token: 'required - Anthropic OAuth refresh_token',
868
+ client_id: 'optional - defaults to Claude Code public client',
869
+ token_uri: 'optional - defaults to platform.claude.com token endpoint',
870
+ bearer_token: 'optional - bearer token value consumed by #refresh_oauth_bearer_token',
871
+ expires_at: 'optional - expires at value consumed by #refresh_oauth_bearer_token'
872
+ )
873
+
874
+ # Run obtain oauth bearer token and return its result
875
+ #{self}.obtain_oauth_bearer_token(
876
+ client_id: 'optional - Claude Code public client id',
877
+ scope: 'optional - space-delimited scopes',
878
+ redirect_uri: 'optional - must match registered callback',
879
+ authorize_uri: 'optional - claude.ai authorize endpoint',
880
+ token_uri: 'optional - platform.claude.com token endpoint',
881
+ bearer_token: 'optional - bearer token value consumed by #obtain_oauth_bearer_token',
882
+ refresh_token: 'optional - refresh token value consumed by #obtain_oauth_bearer_token',
883
+ expires_at: 'optional - expires at value consumed by #obtain_oauth_bearer_token'
884
+ )
866
885
 
867
- # One-time Claude Pro/Max OAuth enrollment (PKCE paste flow):
868
- bearer = #{self}.obtain_oauth_bearer_token
869
- # Subsequent runs silently refresh via ai.anthropic.oauth.refresh_token
886
+ # Run get models and return its result
887
+ #{self}.get_models
888
+
889
+ # Native tool-calling adapter for PWN::AI::Agent::Loop
890
+ #{self}.chat_with_tools(
891
+ assistant_message: 'optional - <same hash> }',
892
+ messages: 'required - OpenAI-format messages array (system/user/assistant/tool)',
893
+ tools: 'optional - OpenAI tools array [{type:function, function:{...}}]',
894
+ tool_choice: 'optional - auto | none | required | {type:function, function:{name:..}}',
895
+ model: 'optional - overrides PWN::Env[:ai][:anthropic][:model]',
896
+ temp: 'optional - temperature (defaults to PWN::Env[:ai][:anthropic][:temp] || 1)',
897
+ max_tokens: 'optional - defaults to PWN::Env[:ai][:anthropic][:max_tokens] || 128_000',
898
+ timeout: 'optional - seconds (default 900)',
899
+ spinner: 'optional - display spinner (default false)'
900
+ )
870
901
 
871
- response = #{self}.chat(
902
+ # Run chat and return its result
903
+ #{self}.chat(
872
904
  request: 'required - message to Anthropic',
873
905
  model: 'optional - model to use for text generation (defaults to PWN::Env[:ai][:anthropic][:model])',
874
906
  temp: 'optional - creative response float (defaults to PWN::Env[:ai][:anthropic][:temp])',
875
907
  system_role_content: 'optional - context to set up the model behavior for conversation (Default: PWN::Env[:ai][:anthropic][:system_role_content])',
876
908
  response_history: 'optional - pass response back in to have a conversation',
877
- speak_answer: 'optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',
878
- timeout: 'optional - timeout in seconds (defaults to 900)',
909
+ speak_answer: 'optional - optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',
910
+ timeout: 'optional - optional timeout in seconds (defaults to 900)',
879
911
  spinner: 'optional - display spinner (defaults to false)'
880
912
  )
881
913
 
914
+ # Print the AUTHOR(S) string for this module.
882
915
  #{self}.authors
883
916
  "
917
+ constants.sort
884
918
  end
885
919
  end
886
920
  end
data/lib/pwn/ai/gemini.rb CHANGED
@@ -454,28 +454,38 @@ module PWN
454
454
 
455
455
  public_class_method def self.help
456
456
  puts "USAGE:
457
- models = #{self}.get_models
457
+ # Run get models and return its result
458
+ #{self}.get_models
459
+
460
+ # Native tool-calling adapter for PWN::AI::Agent::Loop
461
+ #{self}.chat_with_tools(
462
+ assistant_message: 'optional - <same hash> }',
463
+ messages: 'required - OpenAI-format messages array (system/user/assistant/tool)',
464
+ tools: 'optional - OpenAI tools array [{type:function, function:{...}}]',
465
+ tool_choice: 'optional - auto | none | required | {type:function, function:{name:..}}',
466
+ model: 'optional - overrides PWN::Env[:ai][:gemini][:model]',
467
+ temp: 'optional - temperature (defaults to PWN::Env[:ai][:gemini][:temp] || 1)',
468
+ max_tokens: 'optional - maxOutputTokens (defaults to 8192)',
469
+ timeout: 'optional - seconds (default 900)',
470
+ spinner: 'optional - display spinner (default false)'
471
+ )
458
472
 
459
- response = #{self}.chat(
473
+ # Run chat and return its result
474
+ #{self}.chat(
460
475
  request: 'required - message to Gemini',
461
476
  model: 'optional - model to use for text generation (defaults to PWN::Env[:ai][:gemini][:model])',
462
477
  temp: 'optional - creative response float (defaults to PWN::Env[:ai][:gemini][:temp])',
463
478
  system_role_content: 'optional - context to set up the model behavior for conversation (Default: PWN::Env[:ai][:gemini][:system_role_content])',
464
479
  response_history: 'optional - pass response back in to have a conversation',
465
- speak_answer: 'optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',
466
- timeout: 'optional - timeout in seconds (defaults to 900)',
480
+ speak_answer: 'optional - optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',
481
+ timeout: 'optional - optional timeout in seconds (defaults to 900)',
467
482
  spinner: 'optional - display spinner (defaults to false)'
468
483
  )
469
484
 
470
- response = #{self}.chat_with_tools(
471
- messages: 'required - OpenAI-format messages array',
472
- tools: 'optional - OpenAI tools array',
473
- tool_choice: 'optional - auto | none | required | {function:{name:..}}',
474
- model: 'optional - overrides PWN::Env[:ai][:gemini][:model]'
475
- )
476
-
485
+ # Print the AUTHOR(S) string for this module.
477
486
  #{self}.authors
478
487
  "
488
+ constants.sort
479
489
  end
480
490
  end
481
491
  end
data/lib/pwn/ai/grok.rb CHANGED
@@ -705,21 +705,59 @@ module PWN
705
705
 
706
706
  public_class_method def self.help
707
707
  puts "USAGE:
708
- models = #{self}.get_models
708
+ # Run refresh oauth bearer token and return its result
709
+ #{self}.refresh_oauth_bearer_token(
710
+ refresh_token: 'required - xAI OAuth refresh_token',
711
+ client_id: 'optional - defaults to public Grok-CLI client',
712
+ token_uri: 'optional - defaults to https://auth.x.ai/oauth2/token',
713
+ bearer_token: 'optional - bearer token value consumed by #refresh_oauth_bearer_token',
714
+ expires_at: 'optional - expires at value consumed by #refresh_oauth_bearer_token'
715
+ )
716
+
717
+ # Run obtain oauth bearer token and return its result
718
+ #{self}.obtain_oauth_bearer_token(
719
+ client_id: 'optional - xAI OAuth Client ID (defaults to public Grok-CLI client)',
720
+ scope: 'optional - space-delimited scopes (defaults to XAI_OAUTH_SCOPE)',
721
+ timeout: 'optional - seconds to wait for user consent (default 300)',
722
+ api: 'optional - access at consent time.',
723
+ token_uri: 'optional - token uri value consumed by #obtain_oauth_bearer_token',
724
+ bearer_token: 'optional - bearer token value consumed by #obtain_oauth_bearer_token',
725
+ refresh_token: 'optional - refresh token value consumed by #obtain_oauth_bearer_token',
726
+ expires_at: 'optional - expires at value consumed by #obtain_oauth_bearer_token'
727
+ )
728
+
729
+ # Run get models and return its result
730
+ #{self}.get_models
731
+
732
+ # Run chat with tools and return its result
733
+ #{self}.chat_with_tools(
734
+ messages: 'required - full OpenAI-format messages array (system/user/assistant/tool)',
735
+ tools: 'optional - OpenAI tools array [{type:function, function:{...}}]',
736
+ tool_choice: 'optional - auto | none | required | {type:function, function:{name:..}}',
737
+ model: 'optional - overrides PWN::Env[:ai][:grok][:model]',
738
+ temp: 'optional - temperature (defaults to PWN::Env[:ai][:grok][:temp] || 1)',
739
+ timeout: 'optional - seconds (default 180)',
740
+ spinner: 'optional - display spinner (default false)',
741
+ quiet: 'optional - quiet value consumed by #chat_with_tools'
742
+ )
709
743
 
710
- response = #{self}.chat(
744
+ # Run chat and return its result
745
+ #{self}.chat(
711
746
  request: 'required - message to Grok',
712
747
  model: 'optional - model to use for text generation (defaults to PWN::Env[:ai][:grok][:model])',
713
- temp: 'optional - creative response float (defaults to PWN::Env[:ai][:grok][:temp])',
748
+ temp: 'optional - creative response float (deafults to PWN::Env[:ai][:grok][:temp])',
714
749
  system_role_content: 'optional - context to set up the model behavior for conversation (Default: PWN::Env[:ai][:grok][:system_role_content])',
715
750
  response_history: 'optional - pass response back in to have a conversation',
716
- speak_answer: 'optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',
717
- timeout: 'optional - timeout in seconds (defaults to 900)'.
718
- spinner: 'optional - display spinner (defaults to false)'
751
+ speak_answer: 'optional - optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',
752
+ timeout: 'optional - optional timeout in seconds (defaults to 900)',
753
+ spinner: 'optional - display spinner (defaults to false)',
754
+ quiet: 'optional - quiet value consumed by #chat'
719
755
  )
720
756
 
757
+ # Print the AUTHOR(S) string for this module.
721
758
  #{self}.authors
722
759
  "
760
+ constants.sort
723
761
  end
724
762
  end
725
763
  end