pwn 0.5.684 → 0.5.686

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -0
  3. data/documentation/Agent-Tool-Registry.md +1 -3
  4. data/documentation/Configuration.md +0 -2
  5. data/documentation/General-PWN-Usage.md +1 -1
  6. data/documentation/Home.md +2 -2
  7. data/documentation/How-PWN-Works.md +2 -2
  8. data/documentation/Installation.md +18 -2
  9. data/documentation/Persistence.md +1 -1
  10. data/documentation/Session-Workflow.md +8 -28
  11. data/documentation/Skills-Memory-Learning.md +20 -0
  12. data/documentation/Troubleshooting.md +1 -1
  13. data/documentation/Why-PWN.md +1 -1
  14. data/documentation/diagrams/dot/memory-skills-detailed.dot +1 -1
  15. data/documentation/diagrams/dot/overall-pwn-architecture.dot +1 -1
  16. data/documentation/diagrams/dot/persistence-filesystem.dot +1 -1
  17. data/documentation/diagrams/dot/sessions-cron-automation.dot +1 -1
  18. data/documentation/diagrams/memory-skills-detailed.svg +85 -84
  19. data/documentation/diagrams/overall-pwn-architecture.svg +15 -15
  20. data/documentation/diagrams/persistence-filesystem.svg +1 -1
  21. data/documentation/diagrams/sessions-cron-automation.svg +7 -6
  22. data/documentation/pwn-REPL.md +1 -1
  23. data/documentation/pwn-ai-Agent.md +4 -7
  24. data/etc/default_skills/bug-bounty-hunting/SKILL.md +70 -0
  25. data/etc/default_skills/deep-exploitation/SKILL.md +74 -0
  26. data/etc/default_skills/hardware-and-firmware-testing/SKILL.md +83 -0
  27. data/etc/default_skills/osint/SKILL.md +147 -0
  28. data/etc/default_skills/penetration-testing/SKILL.md +81 -0
  29. data/etc/default_skills/red-teaming/SKILL.md +70 -0
  30. data/etc/default_skills/reverse-engineering-binaries/SKILL.md +70 -0
  31. data/etc/default_skills/sast-code-scans/SKILL.md +66 -0
  32. data/etc/default_skills/social-engineering/SKILL.md +67 -0
  33. data/etc/default_skills/vulnerability-research-fundamentals/SKILL.md +74 -0
  34. data/etc/default_skills/web-application-penetration-testing/SKILL.md +68 -0
  35. data/lib/pwn/ai/agent/loop.rb +79 -41
  36. data/lib/pwn/ai/agent/mistakes.rb +6 -6
  37. data/lib/pwn/ai/agent/prompt_builder.rb +3 -4
  38. data/lib/pwn/ai/agent/tool_guard.rb +1 -46
  39. data/lib/pwn/ai/agent/tools/ruby_eval.rb +0 -10
  40. data/lib/pwn/ai/agent/tools/shell.rb +0 -6
  41. data/lib/pwn/ai/anthropic.rb +0 -118
  42. data/lib/pwn/ai/gemini.rb +0 -15
  43. data/lib/pwn/ai/grok.rb +0 -158
  44. data/lib/pwn/ai/ollama.rb +0 -12
  45. data/lib/pwn/ai/open_ai.rb +0 -110
  46. data/lib/pwn/ai/open_web_ui.rb +0 -12
  47. data/lib/pwn/ai.rb +0 -86
  48. data/lib/pwn/config.rb +62 -1
  49. data/lib/pwn/migrate.rb +2 -0
  50. data/lib/pwn/plugins/log.rb +302 -0
  51. data/lib/pwn/plugins/repl.rb +28 -8
  52. data/lib/pwn/version.rb +1 -1
  53. data/spec/integration/config_spec.rb +37 -0
  54. data/spec/lib/pwn/ai/agent/loop_spec.rb +52 -12
  55. data/spec/lib/pwn/ai/agent/mistakes_spec.rb +7 -0
  56. data/spec/lib/pwn/ai/agent/signal_hygiene_spec.rb +5 -8
  57. data/spec/lib/pwn/ai/agent/tools/shell_spec.rb +10 -18
  58. data/spec/lib/pwn/ai/anthropic_spec.rb +2 -2
  59. data/spec/lib/pwn/ai/gemini_spec.rb +2 -2
  60. data/spec/lib/pwn/ai/grok_spec.rb +2 -2
  61. data/spec/lib/pwn/ai/ollama_spec.rb +2 -7
  62. data/spec/lib/pwn/ai/open_ai_spec.rb +2 -23
  63. data/spec/lib/pwn/ai/open_web_ui_spec.rb +2 -7
  64. data/spec/lib/pwn/ai_spec.rb +4 -21
  65. data/spec/lib/pwn/plugins/log_spec.rb +139 -0
  66. data/spec/lib/pwn/plugins/repl_pwn_vault_spec.rb +31 -0
  67. data/spec/lib/pwn/plugins/repl_spec.rb +4 -3
  68. data/third_party/pwn_rdoc.jsonl +29 -24
  69. metadata +12 -2
  70. data/documentation/PWN_Contributors_and_Users.png +0 -0
@@ -321,12 +321,7 @@ describe PWN::AI::Ollama do
321
321
  expect(args[:command] || args['command']).to eq('id')
322
322
  end
323
323
 
324
- it 'exposes get_plan_usage for the PS1 subscription suffix' do
325
- expect(described_class).to respond_to(:get_plan_usage)
326
- end
327
- it 'marks local plan usage as unlimited so the PS1 shows infinity' do
328
- usage = described_class.get_plan_usage
329
- expect(usage[:available]).to be false
330
- expect(usage[:unlimited]).to be true
324
+ it 'does not expose get_plan_usage' do
325
+ expect(described_class).not_to respond_to(:get_plan_usage)
331
326
  end
332
327
  end
@@ -18,29 +18,8 @@ describe PWN::AI::OpenAI do
18
18
  expect(src).to match(/openai_wire_messages/)
19
19
  end
20
20
 
21
- it 'exposes get_plan_usage for the PS1 subscription suffix' do
22
- expect(described_class).to respond_to(:get_plan_usage)
23
- end
24
- it 'computes a percentage from dashboard billing used vs hard limit' do
25
- allow(described_class).to receive(:plan_usage_credentials?).and_return(true)
26
- allow(described_class).to receive(:open_ai_rest_call) do |**kwargs|
27
- case kwargs[:rest_call]
28
- when 'dashboard/billing/subscription'
29
- '{"hard_limit_usd":100.0}'
30
- when 'dashboard/billing/usage'
31
- '{"total_usage":1900}'
32
- else
33
- '{"error":"no"}'
34
- end
35
- end
36
- usage = described_class.get_plan_usage
37
- expect(usage[:available]).to be true
38
- expect(usage[:percent]).to eq(19)
39
- end
40
-
41
- it 'returns unavailable when credentials are missing' do
42
- allow(described_class).to receive(:plan_usage_credentials?).and_return(false)
43
- expect(described_class.get_plan_usage[:available]).to be false
21
+ it 'does not expose get_plan_usage' do
22
+ expect(described_class).not_to respond_to(:get_plan_usage)
44
23
  end
45
24
 
46
25
  it 'open_ai_rest_call swallows ReadTimeout quietly without ERROR: print' do
@@ -300,12 +300,7 @@ describe PWN::AI::OpenWebUI do
300
300
  expect(args[:command] || args['command']).to eq('id')
301
301
  end
302
302
 
303
- it 'exposes get_plan_usage for the PS1 subscription suffix' do
304
- expect(described_class).to respond_to(:get_plan_usage)
305
- end
306
- it 'marks local plan usage as unlimited so the PS1 shows infinity' do
307
- usage = described_class.get_plan_usage
308
- expect(usage[:available]).to be false
309
- expect(usage[:unlimited]).to be true
303
+ it 'does not expose get_plan_usage' do
304
+ expect(described_class).not_to respond_to(:get_plan_usage)
310
305
  end
311
306
  end
@@ -8,26 +8,9 @@ describe PWN::AI do
8
8
  expect(help_response).not_to be_nil
9
9
  end
10
10
 
11
- it 'normalizes used/limit into a clamped percentage' do
12
- usage = described_class.normalize_plan_usage(used: 19, limit: 100, engine: :grok)
13
- expect(usage[:available]).to be true
14
- expect(usage[:percent]).to eq(19)
15
- end
16
-
17
- it 'returns the infinity glyph for ollama and openwebui' do
18
- expect(described_class.plan_usage_glyph(engine: :ollama)).to eq("\u221E")
19
- expect(described_class.plan_usage_glyph(engine: :openwebui)).to eq("\u221E")
20
- end
21
-
22
- it 'returns a percent glyph when usage data is available' do
23
- glyph = described_class.plan_usage_glyph(
24
- engine: :grok,
25
- usage: { available: true, percent: 19 }
26
- )
27
- expect(glyph).to eq('19%')
28
- end
29
-
30
- it 'returns infinity when a hosted engine has no usage data' do
31
- expect(described_class.plan_usage_glyph(engine: :gemini, usage: { available: false })).to eq("\u221E")
11
+ it 'does not expose plan-usage helpers' do
12
+ expect(described_class).not_to respond_to(:normalize_plan_usage)
13
+ expect(described_class).not_to respond_to(:plan_usage)
14
+ expect(described_class).not_to respond_to(:plan_usage_glyph)
32
15
  end
33
16
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
+ require 'stringio'
4
5
 
5
6
  describe PWN::Plugins::Log do
6
7
  it 'should display information for authors' do
@@ -12,4 +13,142 @@ describe PWN::Plugins::Log do
12
13
  help_response = PWN::Plugins::Log
13
14
  expect(help_response).to respond_to :help
14
15
  end
16
+
17
+ describe 'pwn-ai debug session' do
18
+ after do
19
+ PWN::Plugins::Log.stop_debug if PWN::Plugins::Log.respond_to?(:stop_debug)
20
+ end
21
+
22
+ it 'starts a /tmp/pwn-ai-DEBUG-TIMESTAMP.log and tees progress to TUI + file' do
23
+ expect(PWN::Plugins::Log).to respond_to(:start_debug)
24
+ expect(PWN::Plugins::Log).to respond_to(:stop_debug)
25
+ expect(PWN::Plugins::Log).to respond_to(:progress)
26
+ expect(PWN::Plugins::Log).to respond_to(:debug_enabled?)
27
+ expect(PWN::Plugins::Log).to respond_to(:debug_log_path)
28
+
29
+ tee = StringIO.new
30
+ path = PWN::Plugins::Log.start_debug(tee: tee, path: nil)
31
+ expect(path).to match(%r{\A/tmp/pwn-ai-DEBUG-.+\.log\z})
32
+ expect(File.file?(path)).to eq(true)
33
+ expect(PWN::Plugins::Log.debug_enabled?).to eq(true)
34
+ expect(PWN::Plugins::Log.debug_log_path).to eq(path)
35
+
36
+ ok = PWN::Plugins::Log.progress(msg: 'Loop.run start request=hi', which_self: PWN::AI::Agent::Loop)
37
+ expect(ok).to eq(true)
38
+ body = File.read(path)
39
+ expect(body).to include('Loop.run start request=hi')
40
+ expect(body).to include('PWN::AI::Agent::Loop')
41
+ expect(tee.string).to include('Loop.run start request=hi')
42
+
43
+ PWN::Plugins::Log.stop_debug
44
+ expect(PWN::Plugins::Log.debug_enabled?).to eq(false)
45
+ expect(PWN::Plugins::Log.progress(msg: 'after stop', which_self: self)).to eq(false)
46
+ end
47
+
48
+ it 'quiet_tui keeps writing the file but stops teeing to the TUI' do
49
+ expect(PWN::Plugins::Log).to respond_to(:quiet_tui!)
50
+ expect(PWN::Plugins::Log).to respond_to(:loud_tui!)
51
+ tee = StringIO.new
52
+ path = PWN::Plugins::Log.start_debug(tee: tee, path: "/tmp/pwn-ai-DEBUG-#{Process.pid}-quiet.log")
53
+ PWN::Plugins::Log.progress(msg: 'before-quiet', which_self: PWN::AI::Agent::Loop)
54
+ PWN::Plugins::Log.quiet_tui!
55
+ PWN::Plugins::Log.progress(msg: 'after-quiet', which_self: PWN::AI::Agent::Loop)
56
+ expect(tee.string).to include('before-quiet')
57
+ expect(tee.string).not_to include('after-quiet')
58
+ expect(File.read(path)).to include('after-quiet')
59
+ PWN::Plugins::Log.loud_tui!
60
+ PWN::Plugins::Log.progress(msg: 'after-loud', which_self: PWN::AI::Agent::Loop)
61
+ expect(tee.string).to include('after-loud')
62
+ end
63
+
64
+ it 'rolls the debug log to .N+1 when the file exceeds 1MB' do
65
+ stem = "/tmp/pwn-ai-DEBUG-#{Process.pid}-roll"
66
+ first = "#{stem}.1.log"
67
+ File.write(first, 'x' * (1_024_000 + 10))
68
+ path = PWN::Plugins::Log.start_debug(tee: StringIO.new, path: first)
69
+ expect(path).to eq(first)
70
+ PWN::Plugins::Log.progress(msg: 'overflow-line', which_self: PWN::AI::Agent::Loop)
71
+ second = "#{stem}.2.log"
72
+ expect(PWN::Plugins::Log.debug_log_path).to eq(second)
73
+ expect(File.file?(second)).to eq(true)
74
+ expect(File.read(second)).to include('overflow-line')
75
+ end
76
+
77
+ it 'traces PWN module calls into the same debug log while the session is on' do
78
+ path = PWN::Plugins::Log.start_debug(tee: StringIO.new, path: "/tmp/pwn-ai-DEBUG-#{Process.pid}-#{Time.now.to_i}.log")
79
+ PWN::AI::Agent::OpenGoal.current if defined?(PWN::AI::Agent::OpenGoal)
80
+ body = File.read(path)
81
+ expect(body).to match(/PWN::AI::Agent::OpenGoal/)
82
+ end
83
+
84
+ it 'does not raise when a traced module #name is a Symbol' do
85
+ probe = Module.new do
86
+ def self.name
87
+ :symname
88
+ end
89
+
90
+ def self.ping
91
+ :ok
92
+ end
93
+ end
94
+ stub_const('PWN::AI::Agent::SymNameProbe', probe)
95
+ PWN::Plugins::Log.start_debug(
96
+ tee: StringIO.new,
97
+ path: "/tmp/pwn-ai-DEBUG-#{Process.pid}-sym.log"
98
+ )
99
+ expect { PWN::AI::Agent::SymNameProbe.ping }.not_to raise_error
100
+ end
101
+
102
+ it 'logs the complete traced call including parameters' do
103
+ probe = Module.new do
104
+ def self.echo(opts = {})
105
+ opts[:msg]
106
+ end
107
+ end
108
+ stub_const('PWN::AI::Agent::ArgProbe', probe)
109
+ path = PWN::Plugins::Log.start_debug(
110
+ tee: StringIO.new,
111
+ path: "/tmp/pwn-ai-DEBUG-#{Process.pid}-args.log"
112
+ )
113
+ PWN::AI::Agent::ArgProbe.echo(
114
+ msg: 'hello-browser',
115
+ url: 'https://example.test/open',
116
+ password: 's3cret-token'
117
+ )
118
+ body = File.read(path)
119
+ expect(body).to include('PWN::AI::Agent::ArgProbe.echo')
120
+ expect(body).to include('hello-browser')
121
+ expect(body).to include('https://example.test/open')
122
+ expect(body).not_to include('s3cret-token')
123
+ expect(body).to match(/\[REDACTED\]/)
124
+ end
125
+
126
+ it 'redacts secret-shaped values even when the key is not a password name' do
127
+ probe = Module.new do
128
+ def self.echo(opts = {})
129
+ opts[:msg]
130
+ end
131
+ end
132
+ stub_const('PWN::AI::Agent::ArgProbe', probe)
133
+ path = PWN::Plugins::Log.start_debug(
134
+ tee: StringIO.new,
135
+ path: "/tmp/pwn-ai-DEBUG-#{Process.pid}-redact.log"
136
+ )
137
+ PWN::AI::Agent::ArgProbe.echo(
138
+ header: 'Bearer eyJhbGciOiJIUzI1NiJ9.aaa.bbb',
139
+ blob: "-----BEGIN PRIVATE KEY-----\nMIIB\n-----END PRIVATE KEY-----",
140
+ note: 'xai-abcdefghijklmnopqrstuvwxyz0123456789ABCD'
141
+ )
142
+ PWN::Plugins::Log.progress(
143
+ msg: 'Loop.run start request=use key sk-live-SUPERSECRET999',
144
+ which_self: PWN::AI::Agent::Loop
145
+ )
146
+ body = File.read(path)
147
+ expect(body).not_to include('eyJhbGciOiJIUzI1NiJ9')
148
+ expect(body).not_to include('BEGIN PRIVATE KEY')
149
+ expect(body).not_to include('xai-abcdefghijklmnopqrstuvwxyz0123456789ABCD')
150
+ expect(body).not_to include('sk-live-SUPERSECRET999')
151
+ expect(body).to match(/\[REDACTED\]/)
152
+ end
153
+ end
15
154
  end
@@ -132,3 +132,34 @@ describe 'pwn-vault Config RuntimeError retry' do
132
132
  end
133
133
  end
134
134
  end
135
+
136
+ describe 'toggle-pwn-ai-debug' do
137
+ let(:repl_src) { File.read(PWN::Plugins::REPL.method(:add_commands).source_location.first) }
138
+ let(:block) do
139
+ start = repl_src.index("Pry::Commands.create_command 'toggle-pwn-ai-debug'")
140
+ stop = repl_src.index("Pry::Commands.create_command 'toggle-pwn-ai-speaks'")
141
+ repl_src[start...stop]
142
+ end
143
+
144
+ it 'starts and stops PWN::Plugins::Log debug session on the TUI toggle' do
145
+ expect(block).to include('PWN::Plugins::Log.start_debug')
146
+ expect(block).to include('PWN::Plugins::Log.stop_debug')
147
+ expect(block).to include('pwn-ai-DEBUG')
148
+ end
149
+ end
150
+
151
+ describe 'pwn-ai debug final answer placement' do
152
+ let(:repl_src) { File.read(PWN::Plugins::REPL.method(:add_commands).source_location.first) }
153
+ let(:hook) do
154
+ start = repl_src.index('Pry.config.hooks.add_hook(:after_read, :pwn_ai_hook)')
155
+ repl_src[start..]
156
+ end
157
+
158
+ it 'prints the green final after Loop.run and does not pp the session after it' do
159
+ expect(hook).to match(/Loop\.run\(/)
160
+ expect(hook).to match(/\\e\[32m\\002#\{final\}/)
161
+ native = hook[hook.index('final = PWN::AI::Agent::Loop.run')..hook.index("request.replace('nil')")]
162
+ expect(native).not_to match(/pp PWN::Sessions\.load/)
163
+ expect(native).to match(/\$stdout\.flush/)
164
+ end
165
+ end
@@ -13,10 +13,11 @@ describe PWN::Plugins::REPL do
13
13
  expect(help_response).to respond_to :help
14
14
  end
15
15
 
16
- it 'appends plan usage after the token budget in the pwn.ai PS1' do
16
+ it 'does not append plan usage to the pwn.ai PS1' do
17
17
  src = File.read(described_class.method(:refresh_ps1_proc).source_location.first)
18
- expect(src).to include('PWN::AI.plan_usage_glyph(engine: engine)')
19
- expect(src).to include("\#{current_context_length}/\#{plan_usage_glyph}")
18
+ expect(src).not_to include('plan_usage_glyph')
19
+ expect(src).not_to include('PWN::AI.plan_usage')
20
+ expect(src).to include('current_context_length')
20
21
  end
21
22
 
22
23
  it 'formats compact token counts for the PS1 budget' do
@@ -1,9 +1,6 @@
1
1
  {"messages":[{"role":"user","content":"PWN.help Usage"},{"role":"assistant","content":"`PWN.help`: "}]}
2
2
  {"messages":[{"role":"user","content":"PWN::AI.authors Usage"},{"role":"assistant","content":"`PWN::AI.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
3
3
  {"messages":[{"role":"user","content":"PWN::AI.help Usage"},{"role":"assistant","content":"`PWN::AI.help`: "}]}
4
- {"messages":[{"role":"user","content":"PWN::AI.normalize_plan_usage Usage"},{"role":"assistant","content":"`PWN::AI.normalize_plan_usage`: Supported Method Parameters\n\nusage = PWN::AI.normalize_plan_usage(\n\nused: 'required - numeric used amount',\nlimit: 'required - numeric limit / allowance',\nsource: 'optional - endpoint / origin label',\nengine: 'optional - engine symbol'\n\n)\n"}]}
5
- {"messages":[{"role":"user","content":"PWN::AI.plan_usage Usage"},{"role":"assistant","content":"`PWN::AI.plan_usage`: Supported Method Parameters\n\nusage = PWN::AI.plan_usage(\n\nengine: 'optional - engine symbol (defaults to PWN::Env[:ai][:active])',\nttl: 'optional - cache seconds (default 60)',\nforce: 'optional - bypass cache (default false)'\n\n)\n"}]}
6
- {"messages":[{"role":"user","content":"PWN::AI.plan_usage_glyph Usage"},{"role":"assistant","content":"`PWN::AI.plan_usage_glyph`: Supported Method Parameters\n\nglyph = PWN::AI.plan_usage_glyph(\n\nengine: 'optional - engine symbol (defaults to PWN::Env[:ai][:active])',\nusage: 'optional - precomputed usage hash'\n\n)\n\nReturns “19%” when used/limit are known, otherwise the infinity glyph. Local engines (ollama / openwebui) always return infinity.\n"}]}
7
4
  {"messages":[{"role":"user","content":"PWN::AI::Agent.authors Usage"},{"role":"assistant","content":"`PWN::AI::Agent.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
8
5
  {"messages":[{"role":"user","content":"PWN::AI::Agent.help Usage"},{"role":"assistant","content":"`PWN::AI::Agent.help`: "}]}
9
6
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Assembly.analyze Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Assembly.analyze`: Supported Method Parameters\n\nai_analysis = PWN::AI::Agent::Assembly.analyze(\n\nrequest: 'required - the assembly opcodes or instructions to be analyzed',\ntype: 'required - :opcodes_to_asm|:asm_to_opcodes - specify the type of analysis to perform',\narch: 'required - name of arch returned from `PWN::Plugins::Assembly.list_supported_archs` (e.g., :i386|:i686|:x86|:x64|:arm|:arm64, etc.)',\nendian: 'required - the endianness of the assembly code (e.g., :little|:big)'\n\n)\n"}]}
@@ -323,6 +320,8 @@
323
320
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.calibration_state Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.calibration_state`: "}]}
324
321
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.call_engine Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.call_engine`: Supported Method Parameters\n\nmsg = PWN::AI::Agent::Loop.call_engine(\n\nmessages: 'required - OpenAI-format messages array',\ntools: 'optional - OpenAI tools array'\n\n)\n\nReturns a normalised assistant message hash:\n\n{ role: 'assistant', content: String|nil,\n tool_calls: [ {id:, type:'function', function:{name:, arguments:}} ],\n _native_content: <provider raw> (when adapter needs round-trip) }\n"}]}
325
322
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.compact_history! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.compact_history!`: "}]}
323
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.debug_on? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.debug_on?`: "}]}
324
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.debug_progress Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.debug_progress`: "}]}
326
325
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.default_interactive_toolsets Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.default_interactive_toolsets`: "}]}
327
326
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.degrade_text_only Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.degrade_text_only`: "}]}
328
327
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.dispatch_fail_n Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.dispatch_fail_n`: "}]}
@@ -336,6 +335,7 @@
336
335
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.incomplete_final? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.incomplete_final?`: "}]}
337
336
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.inject_task_focus! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.inject_task_focus!`: "}]}
338
337
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.local_engine? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.local_engine?`: "}]}
338
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.loud_debug_tui! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.loud_debug_tui!`: "}]}
339
339
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.max_iters Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.max_iters`: "}]}
340
340
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.may_finalize? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.may_finalize?`: "}]}
341
341
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.maybe_extinguish_parked! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.maybe_extinguish_parked!`: "}]}
@@ -352,8 +352,8 @@
352
352
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.parse_tool_arguments Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.parse_tool_arguments`: "}]}
353
353
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.plan_first Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.plan_first`: "}]}
354
354
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.publish_usage Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.publish_usage`: "}]}
355
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.quiet_debug_tui! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.quiet_debug_tui!`: "}]}
355
356
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.recall_target Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.recall_target`: "}]}
356
- {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.recon_authorized? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.recon_authorized?`: "}]}
357
357
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.record_metrics Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.record_metrics`: "}]}
358
358
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.request_intent Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.request_intent`: "}]}
359
359
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.request_need Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.request_need`: "}]}
@@ -361,6 +361,7 @@
361
361
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.run Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.run`: Supported Method Parameters\n\nfinal = PWN::AI::Agent::Loop.run(\n\nrequest: 'required - what the human typed',\nsession_id: 'optional - PWN::Sessions id (transcript is appended to it)',\nenabled_toolsets: 'optional - subset of Registry.toolsets, or nil for all',\non_tool: 'optional - ->(name, args, result) callback for live UI',\nsystem_role_content: 'optional - override default system prompt (built from session_id if not provided)'\n\n)\n"}]}
362
362
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.should_auto_introspect? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.should_auto_introspect?`: "}]}
363
363
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.stamped_effect Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.stamped_effect`: "}]}
364
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.start_debug_session Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.start_debug_session`: "}]}
364
365
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.stringify_tool_arguments Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.stringify_tool_arguments`: "}]}
365
366
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.stub_outline? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.stub_outline?`: "}]}
366
367
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.task_summary_about_to! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.task_summary_about_to!`: "}]}
@@ -692,9 +693,6 @@
692
693
  {"messages":[{"role":"user","content":"PWN::AI::Agent::ToolGuard.invalid_payload Usage"},{"role":"assistant","content":"`PWN::AI::Agent::ToolGuard.invalid_payload`: "}]}
693
694
  {"messages":[{"role":"user","content":"PWN::AI::Agent::ToolGuard.placeholder? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::ToolGuard.placeholder?`: "}]}
694
695
  {"messages":[{"role":"user","content":"PWN::AI::Agent::ToolGuard.present? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::ToolGuard.present?`: "}]}
695
- {"messages":[{"role":"user","content":"PWN::AI::Agent::ToolGuard.recon_authorized? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::ToolGuard.recon_authorized?`: "}]}
696
- {"messages":[{"role":"user","content":"PWN::AI::Agent::ToolGuard.recon_blocked Usage"},{"role":"assistant","content":"`PWN::AI::Agent::ToolGuard.recon_blocked`: "}]}
697
- {"messages":[{"role":"user","content":"PWN::AI::Agent::ToolGuard.recon_text? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::ToolGuard.recon_text?`: "}]}
698
696
  {"messages":[{"role":"user","content":"PWN::AI::Agent::ToolGuard.shell_bash? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::ToolGuard.shell_bash?`: "}]}
699
697
  {"messages":[{"role":"user","content":"PWN::AI::Agent::ToolGuard.shell_name Usage"},{"role":"assistant","content":"`PWN::AI::Agent::ToolGuard.shell_name`: "}]}
700
698
  {"messages":[{"role":"user","content":"PWN::AI::Agent::TransparentBrowser.analyze Usage"},{"role":"assistant","content":"`PWN::AI::Agent::TransparentBrowser.analyze`: Supported Method Parameters\n\nai_analysis = PWN::AI::Agent::TransparentBrowser.analyze(\n\nrequest: 'required - current step in the JavaScript debugging session to analyze',\nsource_to_review: 'required - the block of JavaScript code in which the current step resides'\n\n)\n"}]}
@@ -721,21 +719,16 @@
721
719
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.authors Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
722
720
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.chat Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.chat`: Supported Method Parameters\n\nresponse = PWN::AI::Anthropic.chat(\n\nrequest: 'required - message to Anthropic',\nmodel: 'optional - model to use for text generation (defaults to PWN::Env[:ai][:anthropic][:model])',\ntemp: 'optional - creative response float (defaults to PWN::Env[:ai][:anthropic][:temp])',\nsystem_role_content: 'optional - context to set up the model behavior for conversation (Default: PWN::Env[:ai][:anthropic][:system_role_content])',\nresponse_history: 'optional - pass response back in to have a conversation',\nspeak_answer: 'optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
723
721
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.chat_with_tools Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.chat_with_tools`: Supported Method Parameters\n\nresponse = PWN::AI::Anthropic.chat_with_tools(\n\nmessages: 'required - OpenAI-format messages array (system/user/assistant/tool)',\ntools: 'optional - OpenAI tools array [{type:\"function\", function:{...}}]',\ntool_choice: 'optional - \"auto\" | \"none\" | \"required\" | {type:\"function\", function:{name:..}}',\nmodel: 'optional - overrides PWN::Env[:ai][:anthropic][:model]',\ntemp: 'optional - temperature (defaults to PWN::Env[:ai][:anthropic][:temp] || 1)',\nmax_tokens: 'optional - defaults to PWN::Env[:ai][:anthropic][:max_tokens] || 128_000',\ntimeout: 'optional - seconds (default 900)',\nspinner: 'optional - display spinner (default false)'\n\n)\n"}]}
724
- {"messages":[{"role":"user","content":"PWN::AI::Anthropic.first_rate_limit Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.first_rate_limit`: "}]}
725
722
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.get_models Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.get_models`: Supported Method Parameters\n\nmodels = PWN::AI::Anthropic.get_models\n"}]}
726
- {"messages":[{"role":"user","content":"PWN::AI::Anthropic.get_plan_usage Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.get_plan_usage`: Supported Method Parameters\n\nusage = PWN::AI::Anthropic.get_plan_usage(\n\ntimeout: 'optional - seconds (default 8)'\n\n)\n\nAdmin Usage API (organizations/usage_report/messages) yields tokens used; organizations/rate_limits yields the configured ceiling so the PS1 can show a percent. Individual accounts without an Admin key return {available:false}. Never prompts for credentials.\n"}]}
727
723
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.help Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.help`: "}]}
728
724
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.jwt_exp Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.jwt_exp`: "}]}
729
725
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.oa_messages_to_anthropic Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.oa_messages_to_anthropic`: "}]}
730
726
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.oauth_token_expiring? Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.oauth_token_expiring?`: "}]}
731
727
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.obtain_oauth_bearer_token Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.obtain_oauth_bearer_token`: Supported Method Parameters\n\nbearer = PWN::AI::Anthropic.obtain_oauth_bearer_token(\n\nclient_id: 'optional - Claude Code public client id',\nscope: 'optional - space-delimited scopes',\nredirect_uri: 'optional - must match registered callback',\nauthorize_uri:'optional - claude.ai authorize endpoint',\ntoken_uri: 'optional - platform.claude.com token endpoint'\n\n)\n\nRuns the OAuth 2.0 Authorization Code + PKCE (S256) flow against Anthropic’s public Claude Code client. The hosted redirect returns a pasteable code (code=true) so this works over SSH with no localhost listener – same UX class as the Grok device flow.\n"}]}
732
- {"messages":[{"role":"user","content":"PWN::AI::Anthropic.parse_plan_usage_json Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.parse_plan_usage_json`: "}]}
733
728
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.persist_oauth_to_vault Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.persist_oauth_to_vault`: "}]}
734
729
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.pkce_pair Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.pkce_pair`: "}]}
735
- {"messages":[{"role":"user","content":"PWN::AI::Anthropic.plan_usage_credentials? Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.plan_usage_credentials?`: "}]}
736
730
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.real_config_value? Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.real_config_value?`: "}]}
737
731
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.refresh_oauth_bearer_token Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.refresh_oauth_bearer_token`: Supported Method Parameters\n\naccess_token = PWN::AI::Anthropic.refresh_oauth_bearer_token(\n\nrefresh_token: 'required - Anthropic OAuth refresh_token',\nclient_id: 'optional - defaults to Claude Code public client',\ntoken_uri: 'optional - defaults to platform.claude.com token endpoint'\n\n) On success, writes :bearer_token (and a rotated :refresh_token if returned) back into the passed opts/oauth Hash so the live PWN::Env stays warm for the rest of the process. Also mirrors those values onto PWN::Env[:anthropic] when that Hash is available, then attempts to re-encrypt the updated tokens into ~/.pwn/pwn.yaml when the matching decryptor (key + iv) is present.\n"}]}
738
- {"messages":[{"role":"user","content":"PWN::AI::Anthropic.sum_usage_tokens Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.sum_usage_tokens`: "}]}
739
732
  {"messages":[{"role":"user","content":"PWN::AI::Anthropic.sync_oauth_into_env Usage"},{"role":"assistant","content":"`PWN::AI::Anthropic.sync_oauth_into_env`: "}]}
740
733
  {"messages":[{"role":"user","content":"PWN::AI::Gemini.authors Usage"},{"role":"assistant","content":"`PWN::AI::Gemini.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
741
734
  {"messages":[{"role":"user","content":"PWN::AI::Gemini.chat Usage"},{"role":"assistant","content":"`PWN::AI::Gemini.chat`: Supported Method Parameters\n\nresponse = PWN::AI::Gemini.chat(\n\nrequest: 'required - message to Gemini',\nmodel: 'optional - model to use for text generation (defaults to PWN::Env[:ai][:gemini][:model])',\ntemp: 'optional - creative response float (defaults to PWN::Env[:ai][:gemini][:temp])',\nsystem_role_content: 'optional - context to set up the model behavior for conversation (Default: PWN::Env[:ai][:gemini][:system_role_content])',\nresponse_history: 'optional - pass response back in to have a conversation',\nspeak_answer: 'optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
@@ -744,28 +737,21 @@
744
737
  {"messages":[{"role":"user","content":"PWN::AI::Gemini.gemini_rest_call Usage"},{"role":"assistant","content":"`PWN::AI::Gemini.gemini_rest_call`: Supported Method Parameters\n\ngemini_rest_call(\n\nhttp_method: 'optional HTTP method (defaults to GET)',\nrest_call: 'required rest call to make per the schema',\nparams: 'optional params passed in the URI or HTTP Headers',\nhttp_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
745
738
  {"messages":[{"role":"user","content":"PWN::AI::Gemini.gemini_tool_config Usage"},{"role":"assistant","content":"`PWN::AI::Gemini.gemini_tool_config`: "}]}
746
739
  {"messages":[{"role":"user","content":"PWN::AI::Gemini.get_models Usage"},{"role":"assistant","content":"`PWN::AI::Gemini.get_models`: Supported Method Parameters\n\nmodels = PWN::AI::Gemini.get_models\n"}]}
747
- {"messages":[{"role":"user","content":"PWN::AI::Gemini.get_plan_usage Usage"},{"role":"assistant","content":"`PWN::AI::Gemini.get_plan_usage`: Supported Method Parameters\n\nusage = PWN::AI::Gemini.get_plan_usage(\n\ntimeout: 'optional - seconds (default 8)'\n\n)\n\nGemini Generative Language has no subscription-usage endpoint that returns used-vs-limit for an API key. Cached-miss / unavailable so the PS1 shows ∞ unless the operator later injects used/limit.\n"}]}
748
740
  {"messages":[{"role":"user","content":"PWN::AI::Gemini.help Usage"},{"role":"assistant","content":"`PWN::AI::Gemini.help`: "}]}
749
741
  {"messages":[{"role":"user","content":"PWN::AI::Gemini.oa_messages_to_gemini Usage"},{"role":"assistant","content":"`PWN::AI::Gemini.oa_messages_to_gemini`: "}]}
750
742
  {"messages":[{"role":"user","content":"PWN::AI::Grok.authors Usage"},{"role":"assistant","content":"`PWN::AI::Grok.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
751
- {"messages":[{"role":"user","content":"PWN::AI::Grok.cents_val Usage"},{"role":"assistant","content":"`PWN::AI::Grok.cents_val`: "}]}
752
743
  {"messages":[{"role":"user","content":"PWN::AI::Grok.chat Usage"},{"role":"assistant","content":"`PWN::AI::Grok.chat`: Supported Method Parameters\n\nresponse = PWN::AI::Grok.chat(\n\nrequest: 'required - message to Grok'\nmodel: 'optional - model to use for text generation (defaults to PWN::Env[:ai][:grok][:model])',\ntemp: 'optional - creative response float (deafults to PWN::Env[:ai][:grok][:temp])',\nsystem_role_content: 'optional - context to set up the model behavior for conversation (Default: PWN::Env[:ai][:grok][:system_role_content])',\nresponse_history: 'optional - pass response back in to have a conversation',\nspeak_answer: 'optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
753
744
  {"messages":[{"role":"user","content":"PWN::AI::Grok.chat_with_tools Usage"},{"role":"assistant","content":"`PWN::AI::Grok.chat_with_tools`: Supported Method Parameters\n\nresponse = PWN::AI::Grok.chat_with_tools(\n\nmessages: 'required - full OpenAI-format messages array (system/user/assistant/tool)',\ntools: 'optional - OpenAI tools array [{type:\"function\", function:{...}}]',\ntool_choice: 'optional - \"auto\" | \"none\" | \"required\" | {type:\"function\", function:{name:..}}',\nmodel: 'optional - overrides PWN::Env[:ai][:grok][:model]',\ntemp: 'optional - temperature (defaults to PWN::Env[:ai][:grok][:temp] || 1)',\ntimeout: 'optional - seconds (default 900)',\nspinner: 'optional - display spinner (default false)'\n\n)\n\nReturns the raw chat/completions response Hash with :choices intact (including :message) — used by PWN::AI::Agent::Loop. xAI’s API is OpenAI-compatible for tool calling, so the request and response shapes are identical to PWN::AI::OpenAI.chat_with_tools.\n"}]}
754
- {"messages":[{"role":"user","content":"PWN::AI::Grok.first_numeric Usage"},{"role":"assistant","content":"`PWN::AI::Grok.first_numeric`: "}]}
755
745
  {"messages":[{"role":"user","content":"PWN::AI::Grok.get_models Usage"},{"role":"assistant","content":"`PWN::AI::Grok.get_models`: Supported Method Parameters\n\nmodels = PWN::AI::Grok.get_models\n"}]}
756
- {"messages":[{"role":"user","content":"PWN::AI::Grok.get_plan_usage Usage"},{"role":"assistant","content":"`PWN::AI::Grok.get_plan_usage`: Supported Method Parameters\n\nusage = PWN::AI::Grok.get_plan_usage(\n\ntimeout: 'optional - seconds (default 8)'\n\n)\n\nSubscription / team usage for the PS1 percent suffix. GET /v1/api-key yields team_id; then billing preview / spending-limits / prepaid balance compute used vs limit. GET /v1/me is also tried (OAuth personal-team payload).\n"}]}
757
746
  {"messages":[{"role":"user","content":"PWN::AI::Grok.grok_rest_call Usage"},{"role":"assistant","content":"`PWN::AI::Grok.grok_rest_call`: Supported Method Parameters\n\ngrok_ai_rest_call(\n\ntoken: 'required - grok_ai bearer token',\nhttp_method: 'optional HTTP method (defaults to GET)\nbase_uri: 'optional base grok api URI (defaults to https://api.x.ai/v1)',\nrest_call: 'required rest call to make per the schema',\nparams: 'optional params passed in the URI or HTTP Headers',\nhttp_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
758
747
  {"messages":[{"role":"user","content":"PWN::AI::Grok.help Usage"},{"role":"assistant","content":"`PWN::AI::Grok.help`: "}]}
759
748
  {"messages":[{"role":"user","content":"PWN::AI::Grok.jwt_exp Usage"},{"role":"assistant","content":"`PWN::AI::Grok.jwt_exp`: "}]}
760
749
  {"messages":[{"role":"user","content":"PWN::AI::Grok.oauth_token_expiring? Usage"},{"role":"assistant","content":"`PWN::AI::Grok.oauth_token_expiring?`: "}]}
761
750
  {"messages":[{"role":"user","content":"PWN::AI::Grok.obtain_oauth_bearer_token Usage"},{"role":"assistant","content":"`PWN::AI::Grok.obtain_oauth_bearer_token`: Supported Method Parameters\n\nbearer = PWN::AI::Grok.obtain_oauth_bearer_token(\n\nclient_id: 'optional - xAI OAuth Client ID (defaults to public Grok-CLI client)',\nscope: 'optional - space-delimited scopes (defaults to XAI_OAUTH_SCOPE)',\ntimeout: 'optional - seconds to wait for user consent (default 300)'\n\n)\n\nRuns the RFC 8628 OAuth 2.0 Device Authorization Grant against auth.x.ai using xAI’s public Grok-CLI client (no client_secret). This is the same identity path ‘hermes auth add xai-oauth` uses – a SuperGrok / X Premium+ subscription on the account is what grants api:access at consent time.\n\n1. POST /oauth2/device/code -> device_code, user_code, verification_uri\n2. User opens verification_uri_complete in a browser and approves.\n3. Poll POST /oauth2/token (grant_type=device_code) until access_token.\n\nOn success the access_token + refresh_token are written back into the passed opts/oauth Hash (so PWN::Env[:grok] is live-cached) and the operator is told exactly what to persist via pwn-vault.\n"}]}
762
- {"messages":[{"role":"user","content":"PWN::AI::Grok.parse_plan_usage_json Usage"},{"role":"assistant","content":"`PWN::AI::Grok.parse_plan_usage_json`: "}]}
763
751
  {"messages":[{"role":"user","content":"PWN::AI::Grok.persist_oauth_to_vault Usage"},{"role":"assistant","content":"`PWN::AI::Grok.persist_oauth_to_vault`: "}]}
764
- {"messages":[{"role":"user","content":"PWN::AI::Grok.plan_usage_credentials? Usage"},{"role":"assistant","content":"`PWN::AI::Grok.plan_usage_credentials?`: "}]}
765
752
  {"messages":[{"role":"user","content":"PWN::AI::Grok.real_config_value? Usage"},{"role":"assistant","content":"`PWN::AI::Grok.real_config_value?`: "}]}
766
753
  {"messages":[{"role":"user","content":"PWN::AI::Grok.refresh_oauth_bearer_token Usage"},{"role":"assistant","content":"`PWN::AI::Grok.refresh_oauth_bearer_token`: Supported Method Parameters\n\naccess_token = PWN::AI::Grok.refresh_oauth_bearer_token(\n\nrefresh_token: 'required - xAI OAuth refresh_token',\nclient_id: 'optional - defaults to public Grok-CLI client',\ntoken_uri: 'optional - defaults to https://auth.x.ai/oauth2/token'\n\n)\n\nExchanges a refresh_token for a fresh access_token at auth.x.ai. On success, writes :bearer_token (and a rotated :refresh_token if returned) back into the passed opts/oauth Hash so the live PWN::Env stays warm for the rest of the process. Also mirrors those values onto PWN::Env[:grok] when that Hash is available, then attempts to re-encrypt the updated tokens into ~/.pwn/pwn.yaml when the matching decryptor (key + iv) is present.\n"}]}
767
754
  {"messages":[{"role":"user","content":"PWN::AI::Grok.sync_oauth_into_env Usage"},{"role":"assistant","content":"`PWN::AI::Grok.sync_oauth_into_env`: "}]}
768
- {"messages":[{"role":"user","content":"PWN::AI::Grok.to_f_or_nil Usage"},{"role":"assistant","content":"`PWN::AI::Grok.to_f_or_nil`: "}]}
769
755
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.assemble_native_chat_stream Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.assemble_native_chat_stream`: "}]}
770
756
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.assemble_ollama_stream Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.assemble_ollama_stream`: "}]}
771
757
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.assemble_openai_compat_stream Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.assemble_openai_compat_stream`: "}]}
@@ -773,7 +759,6 @@
773
759
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.chat Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.chat`: Supported Method Parameters\n\nresponse = PWN::AI::Ollama.chat(\n\nrequest: 'required - message to Ollama'\nmodel: 'optional - model to use for text generation (defaults to PWN::Env[:ai][:ollama][:model])',\ntemp: 'optional - creative response float (defaults to PWN::Env[:ai][:ollama][:temp])',\nsystem_role_content: 'optional - context to set up the model behavior for conversation (Default: PWN::Env[:ai][:ollama][:system_role_content])',\nresponse_history: 'optional - pass response back in to have a conversation',\nspeak_answer: 'optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
774
760
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.chat_with_tools Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.chat_with_tools`: Supported Method Parameters\n\nresponse = PWN::AI::Ollama.chat_with_tools(\n\nmessages: 'required - full OpenAI-format messages array (system/user/assistant/tool)',\ntools: 'optional - OpenAI tools array [{type:\"function\", function:{...}}]',\ntool_choice: 'optional - \"auto\" | \"none\" | {type:\"function\", function:{name:..}}',\nmodel: 'optional - overrides PWN::Env[:ai][:ollama][:model]',\ntemp: 'optional - temperature (defaults to PWN::Env[:ai][:ollama][:temp] || 1)',\ntimeout: 'optional - seconds (default 900)',\nspinner: 'optional - display spinner (default false)'\n\n)\n\nHits Ollama NATIVE POST /api/chat so options.num_ctx / num_predict / keep_alive take effect. Streaming is ON; ollama_rest_call assembles NDJSON chunks back into a single response.\n"}]}
775
761
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.get_models Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.get_models`: Supported Method Parameters\n\nresponse = PWN::AI::Ollama.get_models\n"}]}
776
- {"messages":[{"role":"user","content":"PWN::AI::Ollama.get_plan_usage Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.get_plan_usage`: Supported Method Parameters\n\nusage = PWN::AI::Ollama.get_plan_usage\n\nLocal Ollama has no subscription / plan-usage endpoint. Always unavailable so the PS1 shows the infinity glyph.\n"}]}
777
762
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.help Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.help`: "}]}
778
763
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.normalize_messages_for_ollama Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.normalize_messages_for_ollama`: "}]}
779
764
  {"messages":[{"role":"user","content":"PWN::AI::Ollama.ollama_rest_call Usage"},{"role":"assistant","content":"`PWN::AI::Ollama.ollama_rest_call`: Supported Method Parameters\n\nollama_rest_call(\n\nhttp_method: 'optional HTTP method (defaults to GET)',\nrest_call: 'required rest call path relative to base_uri (e.g. api/chat)',\nparams: 'optional params passed in the URI or HTTP Headers',\nhttp_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
@@ -791,7 +776,6 @@
791
776
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.get_fine_tune_events Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.get_fine_tune_events`: Supported Method Parameters\n\nresponse = PWN::AI::OpenAI.get_fine_tune_events(\n\nfine_tune_id: 'required - respective :id value returned from #list_fine_tunes',\ntimeout: 'optional - timeout in seconds (defaults to 900)'\n\n)\n"}]}
792
777
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.get_fine_tune_status Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.get_fine_tune_status`: Supported Method Parameters\n\nresponse = PWN::AI::OpenAI.get_fine_tune_status(\n\nfine_tune_id: 'required - respective :id value returned from #list_fine_tunes',\ntimeout: 'optional - timeout in seconds (defaults to 900)'\n\n)\n"}]}
793
778
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.get_models Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.get_models`: Supported Method Parameters\n\nmodels = PWN::AI::OpenAI.get_models\n"}]}
794
- {"messages":[{"role":"user","content":"PWN::AI::OpenAI.get_plan_usage Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.get_plan_usage`: Supported Method Parameters\n\nusage = PWN::AI::OpenAI.get_plan_usage(\n\ntimeout: 'optional - seconds (default 8)'\n\n)\n\nSubscription / billing usage for the PS1 percent suffix. Tries (1) dashboard billing hard-limit vs month-to-date spend, then (2) Admin organization costs. Returns {available:false} when neither yields used+limit (never prompts for credentials).\n"}]}
795
779
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.help Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.help`: "}]}
796
780
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.img_gen Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.img_gen`: Supported Method Parameters\n\nresponse = PWN::AI::OpenAI.img_gen(\n\nrequest: 'required - message to ChatGPT',\nn: 'optional - number of images to generate (defaults to 1)',\nsize: 'optional - size of image (defaults to \"1024x1024\")',\ntimeout: 'optional - timeout in seconds (defaults to 900)'\n\n)\n"}]}
797
781
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.jwt_exp Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.jwt_exp`: "}]}
@@ -800,9 +784,7 @@
800
784
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.oauth_token_expiring? Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.oauth_token_expiring?`: "}]}
801
785
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.obtain_oauth_bearer_token Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.obtain_oauth_bearer_token`: Supported Method Parameters\n\nbearer = PWN::AI::OpenAI.obtain_oauth_bearer_token(\n\nclient_id: 'optional - Codex public client id',\nissuer: 'optional - defaults to https://auth.openai.com',\ntimeout: 'optional - seconds to wait for user consent (default 900)'\n\n)\n\nRuns the Codex device-code login:\n\n1. POST /api/accounts/deviceauth/usercode -> device_auth_id, user_code\n2. User opens https://auth.openai.com/codex/device and enters code\n3. Poll POST /api/accounts/deviceauth/token until authorization_code + pkce\n4. POST /oauth/token authorization_code grant -> access/refresh/id tokens\n"}]}
802
786
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.open_ai_rest_call Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.open_ai_rest_call`: Supported Method Parameters\n\nopen_ai_rest_call(\n\nhttp_method: 'optional HTTP method (defaults to GET)\nrest_call: 'required rest call to make per the schema',\nparams: 'optional params passed in the URI or HTTP Headers',\nhttp_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
803
- {"messages":[{"role":"user","content":"PWN::AI::OpenAI.parse_plan_usage_json Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.parse_plan_usage_json`: "}]}
804
787
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.persist_oauth_to_vault Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.persist_oauth_to_vault`: "}]}
805
- {"messages":[{"role":"user","content":"PWN::AI::OpenAI.plan_usage_credentials? Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.plan_usage_credentials?`: "}]}
806
788
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.real_config_value? Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.real_config_value?`: "}]}
807
789
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.reasoning_model? Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.reasoning_model?`: "}]}
808
790
  {"messages":[{"role":"user","content":"PWN::AI::OpenAI.refresh_oauth_bearer_token Usage"},{"role":"assistant","content":"`PWN::AI::OpenAI.refresh_oauth_bearer_token`: Supported Method Parameters\n\naccess_token = PWN::AI::OpenAI.refresh_oauth_bearer_token(\n\nrefresh_token: 'required - OpenAI/ChatGPT OAuth refresh_token',\nclient_id: 'optional - defaults to Codex public client',\ntoken_uri: 'optional - defaults to https://auth.openai.com/oauth/token'\n\n)\n\nCodex posts JSON (not form-urlencoded) to the refresh endpoint. On success, writes :bearer_token (and a rotated :refresh_token if returned) back into the passed opts/oauth Hash so the live PWN::Env stays warm for the rest of the process. Also mirrors those values onto PWN::Env[:openai] when that Hash is available, then attempts to re-encrypt the updated tokens into ~/.pwn/pwn.yaml when the matching decryptor (key + iv) is present.\n"}]}
@@ -817,7 +799,6 @@
817
799
  {"messages":[{"role":"user","content":"PWN::AI::OpenWebUI.chat Usage"},{"role":"assistant","content":"`PWN::AI::OpenWebUI.chat`: Supported Method Parameters\n\nresponse = PWN::AI::OpenWebUI.chat(\n\nrequest: 'required - message to Open WebUI'\nmodel: 'optional - model to use for text generation (defaults to PWN::Env[:ai][:openwebui][:model])',\ntemp: 'optional - creative response float (deafults to PWN::Env[:ai][:openwebui][:temp])',\nsystem_role_content: 'optional - context to set up the model behavior for conversation (Default: PWN::Env[:ai][:openwebui][:system_role_content])',\nresponse_history: 'optional - pass response back in to have a conversation',\nspeak_answer: 'optional speak answer using PWN::Plugins::Voice.text_to_speech (Default: nil)',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
818
800
  {"messages":[{"role":"user","content":"PWN::AI::OpenWebUI.chat_with_tools Usage"},{"role":"assistant","content":"`PWN::AI::OpenWebUI.chat_with_tools`: Supported Method Parameters\n\nresponse = PWN::AI::OpenWebUI.chat_with_tools(\n\nmessages: 'required - full OpenAI-format messages array (system/user/assistant/tool)',\ntools: 'optional - OpenAI tools array [{type:\"function\", function:{...}}]',\ntool_choice: 'optional - \"auto\" | \"none\" | {type:\"function\", function:{name:..}}',\nmodel: 'optional - overrides PWN::Env[:ai][:openwebui][:model]',\ntemp: 'optional - temperature (defaults to PWN::Env[:ai][:openwebui][:temp] || 1)',\ntimeout: 'optional - seconds (default 900)',\nspinner: 'optional - display spinner (default false)'\n\n)\n\nHits Open WebUI’s PROXIED Ollama POST /ollama/api/chat so options.num_ctx / num_predict / keep_alive take effect. Streaming is ON; openwebui_rest_call assembles NDJSON chunks back into a single response. Bare POST /api/chat is not an API route on stock Open WebUI (405).\n"}]}
819
801
  {"messages":[{"role":"user","content":"PWN::AI::OpenWebUI.get_models Usage"},{"role":"assistant","content":"`PWN::AI::OpenWebUI.get_models`: Supported Method Parameters\n\nresponse = PWN::AI::OpenWebUI.get_models\n"}]}
820
- {"messages":[{"role":"user","content":"PWN::AI::OpenWebUI.get_plan_usage Usage"},{"role":"assistant","content":"`PWN::AI::OpenWebUI.get_plan_usage`: Supported Method Parameters\n\nusage = PWN::AI::OpenWebUI.get_plan_usage\n\nOpen WebUI is a local gateway with no subscription / plan-usage endpoint. Always unavailable so the PS1 shows the infinity glyph.\n"}]}
821
802
  {"messages":[{"role":"user","content":"PWN::AI::OpenWebUI.help Usage"},{"role":"assistant","content":"`PWN::AI::OpenWebUI.help`: "}]}
822
803
  {"messages":[{"role":"user","content":"PWN::AI::OpenWebUI.normalize_messages_for_ollama Usage"},{"role":"assistant","content":"`PWN::AI::OpenWebUI.normalize_messages_for_ollama`: "}]}
823
804
  {"messages":[{"role":"user","content":"PWN::AI::OpenWebUI.openwebui_rest_call Usage"},{"role":"assistant","content":"`PWN::AI::OpenWebUI.openwebui_rest_call`: Supported Method Parameters\n\nopenwebui_rest_call(\n\nhttp_method: 'optional HTTP method (defaults to GET)',\nrest_call: 'required rest call path relative to base_uri',\nparams: 'optional params passed in the URI or HTTP Headers',\nhttp_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST',\ntimeout: 'optional timeout in seconds (defaults to 900)',\nspinner: 'optional - display spinner (defaults to false)'\n\n)\n"}]}
@@ -1326,9 +1307,12 @@
1326
1307
  {"messages":[{"role":"user","content":"PWN::Config.authors Usage"},{"role":"assistant","content":"`PWN::Config.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1327
1308
  {"messages":[{"role":"user","content":"PWN::Config.deep_fill! Usage"},{"role":"assistant","content":"`PWN::Config.deep_fill!`: "}]}
1328
1309
  {"messages":[{"role":"user","content":"PWN::Config.default_env Usage"},{"role":"assistant","content":"`PWN::Config.default_env`: Supported Method Parameters\n\nenv = PWN::Config.default_env(\n\npwn_env_path: 'optional - Path to pwn.yaml file. Defaults to ~/.pwn/pwn.yaml'\n\n)\n"}]}
1310
+ {"messages":[{"role":"user","content":"PWN::Config.default_skill_names Usage"},{"role":"assistant","content":"`PWN::Config.default_skill_names`: "}]}
1311
+ {"messages":[{"role":"user","content":"PWN::Config.default_skills_dir Usage"},{"role":"assistant","content":"`PWN::Config.default_skills_dir`: "}]}
1329
1312
  {"messages":[{"role":"user","content":"PWN::Config.env_template Usage"},{"role":"assistant","content":"`PWN::Config.env_template`: Supported Method Parameters\n\ntmpl = PWN::Config.env_template\n\nThe canonical current-release ~/.pwn/pwn.yaml shape as a pure Hash (no I/O, no vault write, no puts). Single source of truth used by:\n\n* PWN::Config.default_env — seed a fresh ~/.pwn/pwn.yaml\n* PWN::Migrate.vault_drift — diff a user vault against this release\n* PWN::Migrate.backfill_vault — deep-merge missing keys UNDER the\n user values on `pwn setup --migrate --fix`\n"}]}
1330
1313
  {"messages":[{"role":"user","content":"PWN::Config.help Usage"},{"role":"assistant","content":"`PWN::Config.help`: "}]}
1331
1314
  {"messages":[{"role":"user","content":"PWN::Config.init_driver_options Usage"},{"role":"assistant","content":"`PWN::Config.init_driver_options`: Supported Method Parameters\n\nenv = PWN::Config.init_driver_options\n"}]}
1315
+ {"messages":[{"role":"user","content":"PWN::Config.install_default_skills Usage"},{"role":"assistant","content":"`PWN::Config.install_default_skills`: "}]}
1332
1316
  {"messages":[{"role":"user","content":"PWN::Config.load_memory Usage"},{"role":"assistant","content":"`PWN::Config.load_memory`: Supported Method Parameters\n\nPWN::Config.load_memory\n"}]}
1333
1317
  {"messages":[{"role":"user","content":"PWN::Config.load_skills Usage"},{"role":"assistant","content":"`PWN::Config.load_skills`: Supported Method Parameters\n\nskills = PWN::Config.load_skills(\n\npwn_skills_path: 'optional - Path to skills folder. Defaults to ~/.pwn/skills'\n\n)\n\nLoads skills into the PWN::Skills constant. Two on-disk shapes are accepted so upgrades are seamless:\n\nagentskills.io → <root>/<name>/SKILL.md (preferred; written by write_skill)\nlegacy flat → <root>/<name>.{md,txt,rb,skill,yml,yaml}\n\nEach entry: { type:, format:, path:, dir:, content:, description:,\n\nreferences:, frontmatter:, loaded:?, error:? }\n"}]}
1334
1318
  {"messages":[{"role":"user","content":"PWN::Config.merge_ai_defaults! Usage"},{"role":"assistant","content":"`PWN::Config.merge_ai_defaults!`: "}]}
@@ -1897,7 +1881,28 @@
1897
1881
  {"messages":[{"role":"user","content":"PWN::Plugins::JiraDataCenter.update_issue Usage"},{"role":"assistant","content":"`PWN::Plugins::JiraDataCenter.update_issue`: Supported Method Parameters\n\nissue_resp = PWN::Plugins::JiraDataCenter.update_issue(\n\nfields: 'required - fields to update in the issue (e.g. summary, description, labels, components, custom fields, etc.)',\nattachments: 'optional - array of attachment paths to upload to the issue (e.g. [\"/tmp/file1.txt\", \"/tmp/file2.txt\"])',\n\n)\n"}]}
1898
1882
  {"messages":[{"role":"user","content":"PWN::Plugins::Log.append Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.append`: Supported Method Parameters\n\nPWN::Log.create( )\n"}]}
1899
1883
  {"messages":[{"role":"user","content":"PWN::Plugins::Log.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1884
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.color_progress Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.color_progress`: "}]}
1885
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.debug_enabled? Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.debug_enabled?`: "}]}
1886
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.debug_log_path Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.debug_log_path`: "}]}
1887
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.debug_path_parts Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.debug_path_parts`: "}]}
1888
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.format_debug_hash Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.format_debug_hash`: "}]}
1889
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.format_progress Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.format_progress`: "}]}
1890
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.format_trace_call Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.format_trace_call`: "}]}
1900
1891
  {"messages":[{"role":"user","content":"PWN::Plugins::Log.help Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.help`: "}]}
1892
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.inspect_debug Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.inspect_debug`: "}]}
1893
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.loud_tui! Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.loud_tui!`: "}]}
1894
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.progress Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.progress`: "}]}
1895
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.quiet_tui! Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.quiet_tui!`: "}]}
1896
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.roll_debug_log! Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.roll_debug_log!`: "}]}
1897
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.sanitize_debug_text Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.sanitize_debug_text`: "}]}
1898
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.secret_key? Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.secret_key?`: "}]}
1899
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.start_debug Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.start_debug`: "}]}
1900
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.start_trace! Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.start_trace!`: "}]}
1901
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.stop_debug Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.stop_debug`: "}]}
1902
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.stop_trace! Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.stop_trace!`: "}]}
1903
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.trace_arguments Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.trace_arguments`: "}]}
1904
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.trace_module_name Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.trace_module_name`: "}]}
1905
+ {"messages":[{"role":"user","content":"PWN::Plugins::Log.traceable? Usage"},{"role":"assistant","content":"`PWN::Plugins::Log.traceable?`: "}]}
1901
1906
  {"messages":[{"role":"user","content":"PWN::Plugins::MSR206.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::MSR206.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1902
1907
  {"messages":[{"role":"user","content":"PWN::Plugins::MSR206.backup_card Usage"},{"role":"assistant","content":"`PWN::Plugins::MSR206.backup_card`: Supported Method Parameters\n\nPWN::Plugins::MSR206.backup_card(\n\nmsr206_obj: 'required - msr206_obj returned from #connect method'\n\n)\n"}]}
1903
1908
  {"messages":[{"role":"user","content":"PWN::Plugins::MSR206.binary Usage"},{"role":"assistant","content":"`PWN::Plugins::MSR206.binary`: Supported Method Parameters\n\nparsed_cmd_resp_arr = binary(\n\nraw_byte_arr: 'required - raw_byte_arr produced in #parse_responses'\n\n)\n"}]}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.684
4
+ version: 0.5.686
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -1441,7 +1441,6 @@ files:
1441
1441
  - documentation/Mistakes.md
1442
1442
  - documentation/NmapIt.md
1443
1443
  - documentation/PWN.png
1444
- - documentation/PWN_Contributors_and_Users.png
1445
1444
  - documentation/Persistence.md
1446
1445
  - documentation/Plugins.md
1447
1446
  - documentation/Reinforcement-Learning.md
@@ -1527,6 +1526,17 @@ files:
1527
1526
  - documentation/pwn_wallpaper.jpg
1528
1527
  - documentation/ringing-spectrogram.png
1529
1528
  - documentation/ringing-waveform.png
1529
+ - etc/default_skills/bug-bounty-hunting/SKILL.md
1530
+ - etc/default_skills/deep-exploitation/SKILL.md
1531
+ - etc/default_skills/hardware-and-firmware-testing/SKILL.md
1532
+ - etc/default_skills/osint/SKILL.md
1533
+ - etc/default_skills/penetration-testing/SKILL.md
1534
+ - etc/default_skills/red-teaming/SKILL.md
1535
+ - etc/default_skills/reverse-engineering-binaries/SKILL.md
1536
+ - etc/default_skills/sast-code-scans/SKILL.md
1537
+ - etc/default_skills/social-engineering/SKILL.md
1538
+ - etc/default_skills/vulnerability-research-fundamentals/SKILL.md
1539
+ - etc/default_skills/web-application-penetration-testing/SKILL.md
1530
1540
  - etc/osint/social_sites.json
1531
1541
  - etc/systemd/msfrpcd.service
1532
1542
  - etc/systemd/openvas.service