pwn 0.5.707 → 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 (447) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/Installation.md +1 -0
  3. data/documentation/Reinforcement-Learning.md +2 -2
  4. data/etc/default_skills/pwn/ai/agent/curriculum/SKILL.md +1 -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/ai/agent/metrics/SKILL.md +4 -0
  10. data/etc/default_skills/pwn/ai/agent/policy/SKILL.md +1 -1
  11. data/etc/default_skills/pwn/ai/agent/reward/SKILL.md +2 -0
  12. data/etc/default_skills/pwn/ai/agent/tool_guard/SKILL.md +2 -0
  13. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  14. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +48 -0
  15. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  16. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  17. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  18. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +51 -0
  19. data/etc/default_skills/pwn/plugins/doctor/SKILL.md +57 -0
  20. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +61 -0
  21. data/etc/default_skills/pwn/plugins/frida/SKILL.md +49 -0
  22. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +52 -0
  23. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  24. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +48 -0
  25. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +52 -0
  26. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  27. data/etc/default_skills/pwn/plugins/recon/SKILL.md +55 -0
  28. data/etc/default_skills/pwn/plugins/recon/references/urls.md +5 -0
  29. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  30. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  31. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +48 -0
  32. data/lib/pwn/ai/agent/assembly.rb +4 -1
  33. data/lib/pwn/ai/agent/btc.rb +4 -1
  34. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  35. data/lib/pwn/ai/agent/curriculum.rb +140 -37
  36. data/lib/pwn/ai/agent/dispatch.rb +34 -16
  37. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  38. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  39. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  40. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  41. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  42. data/lib/pwn/ai/agent/learning.rb +161 -29
  43. data/lib/pwn/ai/agent/loop.rb +84 -47
  44. data/lib/pwn/ai/agent/metrics.rb +198 -21
  45. data/lib/pwn/ai/agent/mistakes.rb +137 -20
  46. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  47. data/lib/pwn/ai/agent/policy.rb +204 -53
  48. data/lib/pwn/ai/agent/prompt_builder.rb +38 -16
  49. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  50. data/lib/pwn/ai/agent/reflect.rb +9 -5
  51. data/lib/pwn/ai/agent/registry.rb +65 -12
  52. data/lib/pwn/ai/agent/result.rb +19 -10
  53. data/lib/pwn/ai/agent/reward.rb +175 -38
  54. data/lib/pwn/ai/agent/sast.rb +4 -1
  55. data/lib/pwn/ai/agent/swarm.rb +72 -36
  56. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  57. data/lib/pwn/ai/agent/tool_guard.rb +124 -6
  58. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  59. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  60. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  61. data/lib/pwn/ai/agent.rb +4 -0
  62. data/lib/pwn/ai/anthropic.rb +41 -7
  63. data/lib/pwn/ai/gemini.rb +21 -11
  64. data/lib/pwn/ai/grok.rb +44 -6
  65. data/lib/pwn/ai/http_retry.rb +40 -12
  66. data/lib/pwn/ai/ollama.rb +19 -10
  67. data/lib/pwn/ai/open_ai.rb +81 -30
  68. data/lib/pwn/ai/open_web_ui.rb +20 -14
  69. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  70. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  71. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  72. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  73. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  74. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  75. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  76. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  77. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  78. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  79. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  80. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  81. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  82. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  83. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  84. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  85. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  86. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  87. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  88. data/lib/pwn/ai/red_team.rb +4 -0
  89. data/lib/pwn/ai.rb +4 -0
  90. data/lib/pwn/aws/acm.rb +5 -2
  91. data/lib/pwn/aws/api_gateway.rb +10 -7
  92. data/lib/pwn/aws/app_stream.rb +5 -2
  93. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  94. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  95. data/lib/pwn/aws/auto_scaling.rb +5 -2
  96. data/lib/pwn/aws/batch.rb +5 -2
  97. data/lib/pwn/aws/budgets.rb +5 -2
  98. data/lib/pwn/aws/cloud_formation.rb +5 -2
  99. data/lib/pwn/aws/cloud_front.rb +7 -4
  100. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  101. data/lib/pwn/aws/cloud_search.rb +5 -2
  102. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  103. data/lib/pwn/aws/cloud_trail.rb +5 -2
  104. data/lib/pwn/aws/cloud_watch.rb +5 -2
  105. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  106. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  107. data/lib/pwn/aws/code_build.rb +5 -2
  108. data/lib/pwn/aws/code_commit.rb +5 -2
  109. data/lib/pwn/aws/code_deploy.rb +5 -2
  110. data/lib/pwn/aws/code_pipeline.rb +5 -2
  111. data/lib/pwn/aws/cognito_identity.rb +5 -2
  112. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  113. data/lib/pwn/aws/cognito_sync.rb +5 -2
  114. data/lib/pwn/aws/config_service.rb +5 -2
  115. data/lib/pwn/aws/data_pipleline.rb +5 -2
  116. data/lib/pwn/aws/database_migration_service.rb +5 -2
  117. data/lib/pwn/aws/device_farm.rb +5 -2
  118. data/lib/pwn/aws/direct_connect.rb +5 -2
  119. data/lib/pwn/aws/directory_service.rb +5 -2
  120. data/lib/pwn/aws/dynamo_db.rb +5 -2
  121. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  122. data/lib/pwn/aws/ec2.rb +5 -2
  123. data/lib/pwn/aws/ecr.rb +5 -2
  124. data/lib/pwn/aws/ecs.rb +5 -2
  125. data/lib/pwn/aws/efs.rb +5 -2
  126. data/lib/pwn/aws/elasti_cache.rb +5 -2
  127. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  128. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  129. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  130. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  131. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  132. data/lib/pwn/aws/emr.rb +5 -2
  133. data/lib/pwn/aws/firehose.rb +5 -2
  134. data/lib/pwn/aws/game_lift.rb +5 -2
  135. data/lib/pwn/aws/glacier.rb +6 -3
  136. data/lib/pwn/aws/health.rb +5 -2
  137. data/lib/pwn/aws/iam.rb +10 -4
  138. data/lib/pwn/aws/import_export.rb +5 -2
  139. data/lib/pwn/aws/inspector.rb +5 -2
  140. data/lib/pwn/aws/iot.rb +5 -2
  141. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  142. data/lib/pwn/aws/kinesis.rb +5 -2
  143. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  144. data/lib/pwn/aws/kms.rb +5 -2
  145. data/lib/pwn/aws/lambda.rb +5 -2
  146. data/lib/pwn/aws/lambda_preview.rb +5 -2
  147. data/lib/pwn/aws/lex.rb +5 -2
  148. data/lib/pwn/aws/lightsail.rb +5 -2
  149. data/lib/pwn/aws/machine_learning.rb +5 -2
  150. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  151. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  152. data/lib/pwn/aws/ops_works.rb +5 -2
  153. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  154. data/lib/pwn/aws/pinpoint.rb +5 -2
  155. data/lib/pwn/aws/polly.rb +5 -2
  156. data/lib/pwn/aws/rds.rb +5 -2
  157. data/lib/pwn/aws/redshift.rb +5 -2
  158. data/lib/pwn/aws/rekognition.rb +5 -2
  159. data/lib/pwn/aws/route53.rb +5 -2
  160. data/lib/pwn/aws/route53_domains.rb +5 -2
  161. data/lib/pwn/aws/s3.rb +5 -2
  162. data/lib/pwn/aws/service_catalog.rb +5 -2
  163. data/lib/pwn/aws/ses.rb +5 -2
  164. data/lib/pwn/aws/shield.rb +5 -2
  165. data/lib/pwn/aws/simple_db.rb +5 -2
  166. data/lib/pwn/aws/sms.rb +5 -2
  167. data/lib/pwn/aws/snowball.rb +5 -2
  168. data/lib/pwn/aws/sns.rb +5 -2
  169. data/lib/pwn/aws/sqs.rb +5 -2
  170. data/lib/pwn/aws/ssm.rb +5 -2
  171. data/lib/pwn/aws/states.rb +5 -2
  172. data/lib/pwn/aws/storage_gateway.rb +5 -2
  173. data/lib/pwn/aws/sts.rb +4 -1
  174. data/lib/pwn/aws/support.rb +5 -2
  175. data/lib/pwn/aws/swf.rb +5 -2
  176. data/lib/pwn/aws/waf.rb +5 -2
  177. data/lib/pwn/aws/waf_regional.rb +5 -2
  178. data/lib/pwn/aws/workspaces.rb +5 -2
  179. data/lib/pwn/aws/x_ray.rb +5 -2
  180. data/lib/pwn/aws.rb +4 -0
  181. data/lib/pwn/banner/anon.rb +3 -0
  182. data/lib/pwn/banner/bubble.rb +3 -0
  183. data/lib/pwn/banner/cheshire.rb +3 -0
  184. data/lib/pwn/banner/code_cave.rb +3 -0
  185. data/lib/pwn/banner/dont_panic.rb +3 -0
  186. data/lib/pwn/banner/f_society.rb +3 -0
  187. data/lib/pwn/banner/fork_bomb.rb +3 -0
  188. data/lib/pwn/banner/jmp_esp.rb +3 -0
  189. data/lib/pwn/banner/matrix.rb +5 -1
  190. data/lib/pwn/banner/ninja.rb +3 -0
  191. data/lib/pwn/banner/off_the_air.rb +3 -0
  192. data/lib/pwn/banner/pirate.rb +3 -0
  193. data/lib/pwn/banner/radare2.rb +3 -0
  194. data/lib/pwn/banner/radare2_ai.rb +3 -0
  195. data/lib/pwn/banner/white_rabbit.rb +3 -0
  196. data/lib/pwn/banner.rb +6 -2
  197. data/lib/pwn/blockchain/btc.rb +8 -3
  198. data/lib/pwn/blockchain/eth.rb +10 -3
  199. data/lib/pwn/blockchain.rb +4 -0
  200. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  201. data/lib/pwn/bounty.rb +4 -0
  202. data/lib/pwn/config.rb +86 -19
  203. data/lib/pwn/cron.rb +297 -20
  204. data/lib/pwn/driver.rb +2 -18
  205. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  206. data/lib/pwn/ffi/fftw.rb +31 -6
  207. data/lib/pwn/ffi/hack_rf.rb +59 -8
  208. data/lib/pwn/ffi/liquid.rb +63 -10
  209. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  210. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  211. data/lib/pwn/ffi/stdio.rb +5 -8
  212. data/lib/pwn/ffi/volk.rb +36 -7
  213. data/lib/pwn/ffi.rb +12 -0
  214. data/lib/pwn/memory.rb +136 -16
  215. data/lib/pwn/memory_index.rb +34 -19
  216. data/lib/pwn/migrate.rb +34 -24
  217. data/lib/pwn/module_skills.rb +39 -8
  218. data/lib/pwn/plugins/aflplusplus.rb +52 -0
  219. data/lib/pwn/plugins/android.rb +65 -245
  220. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  221. data/lib/pwn/plugins/assembly.rb +9 -4
  222. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  223. data/lib/pwn/plugins/baresip.rb +59 -12
  224. data/lib/pwn/plugins/basic_auth.rb +9 -3
  225. data/lib/pwn/plugins/beef.rb +28 -18
  226. data/lib/pwn/plugins/binary_parser.rb +133 -0
  227. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  228. data/lib/pwn/plugins/burp_suite.rb +98 -68
  229. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  230. data/lib/pwn/plugins/char.rb +33 -3
  231. data/lib/pwn/plugins/credential_attack.rb +99 -0
  232. data/lib/pwn/plugins/credit_card.rb +6 -1
  233. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  234. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  235. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  236. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  237. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  238. data/lib/pwn/plugins/detect_os.rb +5 -0
  239. data/lib/pwn/plugins/doctor.rb +149 -0
  240. data/lib/pwn/plugins/ein.rb +3 -0
  241. data/lib/pwn/plugins/exploit_dev.rb +264 -0
  242. data/lib/pwn/plugins/file_fu.rb +11 -8
  243. data/lib/pwn/plugins/frida.rb +61 -0
  244. data/lib/pwn/plugins/fuzz.rb +9 -6
  245. data/lib/pwn/plugins/gdb.rb +95 -0
  246. data/lib/pwn/plugins/git.rb +19 -14
  247. data/lib/pwn/plugins/github.rb +38 -15
  248. data/lib/pwn/plugins/google_workspace.rb +188 -45
  249. data/lib/pwn/plugins/hacker_one.rb +159 -35
  250. data/lib/pwn/plugins/hunter.rb +6 -3
  251. data/lib/pwn/plugins/ip_info.rb +9 -4
  252. data/lib/pwn/plugins/irc.rb +28 -15
  253. data/lib/pwn/plugins/jenkins.rb +65 -57
  254. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  255. data/lib/pwn/plugins/jobs.rb +109 -0
  256. data/lib/pwn/plugins/json_pathify.rb +9 -5
  257. data/lib/pwn/plugins/log.rb +113 -13
  258. data/lib/pwn/plugins/mail_agent.rb +87 -79
  259. data/lib/pwn/plugins/metasploit.rb +11 -6
  260. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  261. data/lib/pwn/plugins/msr206.rb +42 -28
  262. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  263. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  264. data/lib/pwn/plugins/nmap_it.rb +14 -34
  265. data/lib/pwn/plugins/nuclei.rb +57 -0
  266. data/lib/pwn/plugins/oauth2.rb +11 -5
  267. data/lib/pwn/plugins/ocr.rb +3 -0
  268. data/lib/pwn/plugins/open_api.rb +5 -2
  269. data/lib/pwn/plugins/openvas.rb +33 -25
  270. data/lib/pwn/plugins/packet.rb +152 -31
  271. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  272. data/lib/pwn/plugins/pony.rb +86 -1
  273. data/lib/pwn/plugins/process_tube.rb +120 -0
  274. data/lib/pwn/plugins/ps.rb +7 -1
  275. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  276. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  277. data/lib/pwn/plugins/radare2.rb +253 -0
  278. data/lib/pwn/plugins/recon.rb +161 -0
  279. data/lib/pwn/plugins/repl.rb +122 -1
  280. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  281. data/lib/pwn/plugins/serial.rb +24 -14
  282. data/lib/pwn/plugins/shodan.rb +54 -35
  283. data/lib/pwn/plugins/slack_client.rb +11 -6
  284. data/lib/pwn/plugins/sock.rb +16 -8
  285. data/lib/pwn/plugins/spider.rb +5 -2
  286. data/lib/pwn/plugins/sqlmap.rb +49 -0
  287. data/lib/pwn/plugins/ssn.rb +3 -0
  288. data/lib/pwn/plugins/thread_pool.rb +6 -9
  289. data/lib/pwn/plugins/tor.rb +9 -4
  290. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  291. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  292. data/lib/pwn/plugins/twitter_api.rb +6 -2
  293. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  294. data/lib/pwn/plugins/vault.rb +12 -3
  295. data/lib/pwn/plugins/vin.rb +24 -12
  296. data/lib/pwn/plugins/voice.rb +7 -2
  297. data/lib/pwn/plugins/volatility.rb +48 -0
  298. data/lib/pwn/plugins/vsphere.rb +9 -5
  299. data/lib/pwn/plugins/xxd.rb +12 -43
  300. data/lib/pwn/plugins/zaproxy.rb +30 -16
  301. data/lib/pwn/plugins.rb +19 -0
  302. data/lib/pwn/reports/ai_red_team.rb +6 -2
  303. data/lib/pwn/reports/csv.rb +8 -1
  304. data/lib/pwn/reports/fuzz.rb +5 -2
  305. data/lib/pwn/reports/html.rb +8 -1
  306. data/lib/pwn/reports/html_footer.rb +4 -3
  307. data/lib/pwn/reports/html_header.rb +6 -2
  308. data/lib/pwn/reports/json.rb +8 -1
  309. data/lib/pwn/reports/markdown.rb +8 -1
  310. data/lib/pwn/reports/pdf.rb +8 -1
  311. data/lib/pwn/reports/phone.rb +5 -2
  312. data/lib/pwn/reports/sast.rb +6 -2
  313. data/lib/pwn/reports/uri_buster.rb +5 -2
  314. data/lib/pwn/reports/xml.rb +8 -1
  315. data/lib/pwn/reports.rb +19 -0
  316. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  317. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  318. data/lib/pwn/sast/aws.rb +9 -3
  319. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  320. data/lib/pwn/sast/base64.rb +9 -3
  321. data/lib/pwn/sast/beef_hook.rb +9 -3
  322. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  323. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  324. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  325. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  326. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  327. data/lib/pwn/sast/csrf.rb +9 -3
  328. data/lib/pwn/sast/deserial_java.rb +9 -3
  329. data/lib/pwn/sast/emoticon.rb +9 -3
  330. data/lib/pwn/sast/eval.rb +9 -3
  331. data/lib/pwn/sast/factory.rb +9 -3
  332. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  333. data/lib/pwn/sast/inner_html.rb +9 -3
  334. data/lib/pwn/sast/keystore.rb +9 -3
  335. data/lib/pwn/sast/local_storage.rb +9 -3
  336. data/lib/pwn/sast/location_hash.rb +9 -3
  337. data/lib/pwn/sast/log4j.rb +9 -3
  338. data/lib/pwn/sast/logger.rb +9 -3
  339. data/lib/pwn/sast/md5.rb +9 -3
  340. data/lib/pwn/sast/outer_html.rb +9 -3
  341. data/lib/pwn/sast/padding_oracle.rb +9 -3
  342. data/lib/pwn/sast/password.rb +9 -3
  343. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  344. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  345. data/lib/pwn/sast/pom_version.rb +9 -3
  346. data/lib/pwn/sast/port.rb +9 -3
  347. data/lib/pwn/sast/post_message.rb +9 -3
  348. data/lib/pwn/sast/private_key.rb +9 -3
  349. data/lib/pwn/sast/redirect.rb +9 -3
  350. data/lib/pwn/sast/redos.rb +9 -3
  351. data/lib/pwn/sast/shell.rb +9 -3
  352. data/lib/pwn/sast/signature.rb +9 -3
  353. data/lib/pwn/sast/sql.rb +9 -3
  354. data/lib/pwn/sast/ssl.rb +9 -3
  355. data/lib/pwn/sast/sudo.rb +9 -3
  356. data/lib/pwn/sast/task_tag.rb +9 -3
  357. data/lib/pwn/sast/test_case_engine.rb +11 -7
  358. data/lib/pwn/sast/throw_errors.rb +9 -3
  359. data/lib/pwn/sast/token.rb +9 -3
  360. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  361. data/lib/pwn/sast/use_after_free.rb +9 -3
  362. data/lib/pwn/sast/version.rb +9 -3
  363. data/lib/pwn/sast/window_location_hash.rb +9 -3
  364. data/lib/pwn/sast.rb +4 -0
  365. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  366. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  367. data/lib/pwn/sdr/decoder/base.rb +74 -22
  368. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  369. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  370. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  371. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  372. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  373. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  374. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  375. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  376. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  377. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  378. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  379. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  380. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  381. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  382. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  383. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  384. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  385. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  386. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  387. data/lib/pwn/sdr/decoder.rb +9 -0
  388. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  389. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  390. data/lib/pwn/sdr/gqrx.rb +178 -119
  391. data/lib/pwn/sdr/rfidler.rb +4 -1
  392. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  393. data/lib/pwn/sdr.rb +14 -0
  394. data/lib/pwn/sessions.rb +86 -16
  395. data/lib/pwn/setup.rb +94 -37
  396. data/lib/pwn/version.rb +1 -1
  397. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  398. data/lib/pwn/www/bing.rb +10 -5
  399. data/lib/pwn/www/bug_crowd.rb +11 -5
  400. data/lib/pwn/www/checkip.rb +8 -4
  401. data/lib/pwn/www/coinbase_pro.rb +11 -5
  402. data/lib/pwn/www/duckduckgo.rb +12 -6
  403. data/lib/pwn/www/facebook.rb +11 -5
  404. data/lib/pwn/www/github.rb +11 -5
  405. data/lib/pwn/www/google.rb +11 -5
  406. data/lib/pwn/www/hacker_one.rb +20 -9
  407. data/lib/pwn/www/linkedin.rb +11 -5
  408. data/lib/pwn/www/pandora.rb +11 -5
  409. data/lib/pwn/www/pastebin.rb +9 -4
  410. data/lib/pwn/www/paypal.rb +19 -11
  411. data/lib/pwn/www/synack.rb +11 -5
  412. data/lib/pwn/www/torch.rb +13 -8
  413. data/lib/pwn/www/trading_view.rb +11 -5
  414. data/lib/pwn/www/twitter.rb +11 -5
  415. data/lib/pwn/www/uber.rb +11 -5
  416. data/lib/pwn/www/upwork.rb +11 -5
  417. data/lib/pwn/www/wayback_machine.rb +12 -6
  418. data/lib/pwn/www/youtube.rb +10 -5
  419. data/lib/pwn/www.rb +4 -0
  420. data/spec/conventions_spec.rb +118 -2
  421. data/spec/integration/prompt_builder_spec.rb +1 -1
  422. data/spec/integration/reinforced_feedback_loop_spec.rb +8 -8
  423. data/spec/lib/pwn/ai/agent/injection_guard_spec.rb +65 -0
  424. data/spec/lib/pwn/ai/agent/metrics_spec.rb +15 -0
  425. data/spec/lib/pwn/ai/agent/mistakes_spec.rb +5 -2
  426. data/spec/lib/pwn/ai/agent/policy_spec.rb +33 -2
  427. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  428. data/spec/lib/pwn/ai/agent/scoreboard_roadmap_spec.rb +61 -0
  429. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  431. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  432. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  433. data/spec/lib/pwn/plugins/doctor_spec.rb +23 -0
  434. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  435. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  436. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  437. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  438. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  439. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  440. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  441. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  442. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  443. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  444. data/third_party/pwn_rdoc.jsonl +136 -6
  445. metadata +49 -3
  446. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  447. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
@@ -177,7 +177,16 @@ module PWN
177
177
  v[:confidence] = [v[:confidence].to_f, ground[:confidence].to_f].max if ground[:confidence]
178
178
  end
179
179
 
180
- v[:success] = v[:score] >= 0.6
180
+ v[:success] = promote_to_success?(
181
+ orm: v[:source].to_s != 'heuristic' && v[:score].to_f >= 0.6,
182
+ verify: if ground.nil?
183
+ nil
184
+ else
185
+ ground[:verdict] == :confirmed
186
+ end,
187
+ critic: opts.key?(:critic_pass) ? opts[:critic_pass] : nil
188
+ )
189
+ v[:needs_spot_check] = v[:success] && v[:score].to_f >= 0.85 && (rand < 0.05)
181
190
  v[:engine] = eng
182
191
  # W3 — write Brier on every judged turn so overconfidence can
183
192
  # throttle max_iters/critic even when plan_first never fired.
@@ -195,9 +204,16 @@ module PWN
195
204
  { score: 0.5, verdict: :unknown, rationale: "judge error: #{e.class}", success: !final.strip.empty?, error: e.message, confidence: 0.2, source: :error }
196
205
  end
197
206
 
198
- # ----------------------------------------------------------------
199
- # R2 — Process Reward Model (per-step credit assignment)
200
- # ----------------------------------------------------------------
207
+ public_class_method def self.promote_to_success?(opts = {})
208
+ flags = []
209
+ flags << (opts[:orm] ? true : false) unless opts[:orm].nil?
210
+ flags << (opts[:verify] ? true : false) unless opts[:verify].nil?
211
+ flags << (opts[:critic] ? true : false) unless opts[:critic].nil?
212
+ return false if flags.empty?
213
+ return flags.first if flags.length == 1
214
+
215
+ flags.count(true) >= 2
216
+ end
201
217
 
202
218
  # Supported Method Parameters::
203
219
  # steps = PWN::AI::Agent::Reward.prm(
@@ -1315,12 +1331,16 @@ module PWN
1315
1331
  req_toks = request.downcase.scan(/[a-z0-9_]{3,}/).uniq
1316
1332
  fin_toks = final.downcase.scan(/[a-z0-9_]{3,}/).uniq
1317
1333
  overlap = req_toks.empty? ? 1.0 : (req_toks & fin_toks).length.to_f / req_toks.length
1318
- score = [score, 0.35].min if overlap < 0.08 && req_toks.length >= 4 && score > 0.35
1319
-
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
1336
+ ev_score = ev ? ev[:score].to_f : 0.0
1320
1337
  bad = trace.count { |t| !semantic_ok(name: 'shell', raw: t.to_s)[:semantic_ok] }
1321
1338
  ratio = trace.empty? ? 0.5 : 1.0 - (bad.to_f / trace.length)
1322
1339
  score = ((score * 0.85) + (ratio * 0.15)).round(3)
1323
- score = score.round(2).clamp(0.0, 0.9)
1340
+ score = [score, 0.45].min if overlap >= 0.4 && ev_score < 0.55
1341
+ score = [score, 0.45].min if ratio <= 0.15
1342
+ score = [score, 0.70].min
1343
+ score = score.round(2).clamp(0.0, 0.70)
1324
1344
  verdict = if score >= 0.6 then :solved
1325
1345
  elsif score >= 0.3 then :partial
1326
1346
  else :wrong
@@ -1710,37 +1730,154 @@ module PWN
1710
1730
  # Display Usage for this Module
1711
1731
 
1712
1732
  public_class_method def self.help
1713
- puts <<~USAGE
1714
- USAGE:
1715
- # Tier 1 — reward signal
1716
- PWN::AI::Agent::Reward.judge(request: req, final: text, session_id: sid) # R1 ORM → {score:, verdict:, rationale:}
1717
- PWN::AI::Agent::Reward.prm(request: req, session_id: sid) # R2 PRM → per-step credit
1718
- PWN::AI::Agent::Reward.plan_coverage(plan: tasks, final: text, session_id: sid) # soft plan-quality feature
1719
- PWN::AI::Agent::Reward.sentinel # R3 reward-hacking detector
1720
- PWN::AI::Agent::Reward.reset_sentinel # wipe corrupt window + distrust
1721
- PWN::AI::Agent::Reward.warm_sentinel # P10 fill R3 window from Learning outcomes
1722
- PWN::AI::Agent::Reward.semantic_ok(name: 'shell', raw: json, args: args) # R4 kills phantom exit≠0 mistakes
1723
-
1724
- # Tier 5 — preference pairs → DPO
1725
- PWN::AI::Agent::Reward.record_preference(prompt: p, rejected: r, chosen: c, source: :user_correction)
1726
- PWN::AI::Agent::Reward.preferences(limit: 100)
1727
- PWN::AI::Agent::Reward.export_dpo(format: :dpo) # W1 → ~/.pwn/finetune/pwn-dpo-*.jsonl (≤40%/source, scrubbed)
1728
- PWN::AI::Agent::Reward.export_dpo(format: :dpo, balance: false) # raw dump (diagnostics)
1729
- PWN::AI::Agent::Reward.scrub_preferences(dry_run: true) # P15 ledger hygiene report
1730
- PWN::AI::Agent::Reward.scrub_preferences # P15 rewrite jsonl (backup first)
1731
- PWN::AI::Agent::Reward.preference_balance(scrub: true) # P15 geometry-aware mix
1732
-
1733
- # Tier 6 — grounded reward
1734
- PWN::AI::Agent::Reward.verify_as_reward(final: text) # E3 browser-verified reward
1735
-
1736
- Config (PWN::Env[:ai][:agent]):
1737
- :verify_as_reward - Boolean/nil, ground finals via extro_verify (nil=auto)
1738
- :reward_llm - Boolean/nil, force ORM/PRM LLM teacher (nil=on for remote engines)
1739
- :reward_model - optional cheaper model id for ORM/PRM (nil=active engine default)
1740
- :reward_llm_timeout - seconds for cheap ORM chat (default 12, clamp 2..30)
1741
-
1742
- #{self}.authors
1743
- 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
1744
1881
  end
1745
1882
  end
1746
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
@@ -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