pwn 0.5.760 → 0.5.761

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.
@@ -259,7 +259,7 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
259
259
  end
260
260
 
261
261
  it 'leaves a provider blocked in native IO without waiting for that read to return' do
262
- started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
262
+ started = nil
263
263
  allow(PWN::AI::Agent::Loop).to receive(:call_engine) do
264
264
  Thread.handle_interrupt(Exception => :never) { sleep 8 }
265
265
  end
@@ -268,6 +268,8 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
268
268
  launch(keys) do
269
269
  if !cancelled && @paint.any? { |row| row.include?('Elapsed') }
270
270
  cancelled = true
271
+ # Time cancellation, not typing, cold artwork or mock screen painting.
272
+ started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
271
273
  "\u0003"
272
274
  elsif @paint.any? { |row| row.include?('Request cancelled at a safe boundary') }
273
275
  "\u0004"
@@ -276,6 +278,7 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
276
278
  nil
277
279
  end
278
280
  end
281
+ expect(started).not_to be_nil
279
282
  expect(Process.clock_gettime(Process::CLOCK_MONOTONIC) - started).to be < 3
280
283
  end
281
284
 
@@ -503,11 +506,11 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
503
506
 
504
507
  it 'centers capped retro artwork inside a larger cell-square canvas' do
505
508
  console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
506
- allow(PWN::Banner).to receive(:mini_names).and_return([:pong])
509
+ allow(PWN::Banner).to receive(:mini_names).and_return([:pacman])
507
510
  allow(Process).to receive(:clock_gettime).with(Process::CLOCK_MONOTONIC).and_return(100.0)
508
511
  size = 24
509
512
  canvas = console.banner_frame(size)
510
- art = PWN::Banner.mini_frame(name: :pong, frame: 0, width: size, height: size, branding: false)
513
+ art = PWN::Banner.mini_frame(name: :pacman, frame: 0, width: size, height: size, branding: false)
511
514
  expect(canvas.length).to eq(size)
512
515
  expect(canvas.map(&:length)).to all(eq(size))
513
516
  top = (size - art.length) / 2
@@ -535,6 +538,7 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
535
538
  end
536
539
 
537
540
  it 'carves a themed cell-square banner pane only when all settings still fit, keeping bounds and draft' do
541
+ allow(PWN::Banner).to receive(:mini_names).and_return([:falling_blocks])
538
542
  PWN::Env[:ai] = { active: :ollama, tui: { theme: { category: 'magenta', header: 'white', border: 'blue', title: 'red' } },
539
543
  ollama: { model: 'fixture', system_role_content: 'Complete functional settings.', reasoning_effort: 'high' } }
540
544
  screen = double(erase: nil, refresh: nil, setpos: nil, addstr: nil)
@@ -577,7 +581,32 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
577
581
  expect([console.instance_variable_get(:@editor).text, console.instance_variable_get(:@editor).cursor]).to eq(['retained draft', 4])
578
582
  end
579
583
 
584
+ it 'keeps a full connected maze and one-cell actors in native minimum and typical console layouts' do
585
+ allow(PWN::Banner).to receive(:mini_names).and_return([:pacman])
586
+ PWN::Env[:ai] = { active: :ollama, ollama: { model: 'fixture' } }
587
+ [[100, 26], [120, 36]].each do |columns, rows|
588
+ console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
589
+ console.instance_variable_set(:@width, columns)
590
+ console.instance_variable_set(:@height, rows)
591
+ console.instance_variable_set(:@focus, :animation)
592
+ allow(console).to receive(:put)
593
+ allow(console).to receive(:box)
594
+ allow(console).to receive(:mark_active)
595
+ expect(console.draw_header('ollama', 'fixture')).to eq(10)
596
+ game = console.instance_variable_get(:@banner_game)
597
+ frame = game.step
598
+ maze = frame[:state][:maze]
599
+ expect(maze.length).to eq(8)
600
+ expect(maze.map(&:length)).to all(eq(8))
601
+ expect(maze[2...-2].map { |row| row[2...-2] }.join.count('#')).to be >= 4
602
+ expect(game.cells(frame).flatten.count { |cell| cell[:foreground] == :red }).to eq(1)
603
+ game.key(:right)
604
+ expect(game.step[:state][:pacman]).to eq([2, 6])
605
+ end
606
+ end
607
+
580
608
  it 'grows both game canvas dimensions with the header without recursively shrinking settings' do
609
+ allow(PWN::Banner).to receive(:mini_names).and_return([:falling_blocks])
581
610
  PWN::Env[:ai] = { active: :ollama, ollama: { model: 'fixture', system_role_content: 'operator ' * 100, reasoning_effort: 'high' } }
582
611
  console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
583
612
  console.instance_variable_set(:@width, 120)
@@ -669,9 +698,9 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
669
698
  expect(console.instance_variable_get(:@banner_seed)).not_to eq(seed)
670
699
  end
671
700
 
672
- it 'samples Asteroids or Pong once and caches their faster cadence outside the key path' do
701
+ it 'samples Asteroids or Pac-Man once and caches the game-specific cadence outside the key path' do
673
702
  allow(PWN::Banner).to receive(:mini_cells).and_call_original
674
- %i[pong asteroids].each do |name|
703
+ %i[pacman asteroids].each do |name|
675
704
  pry = Pry.new
676
705
  pry.config.pwn_ai_session_id = 'fast-colored-session'
677
706
  console = PWN::Plugins::REPL::AIConsole::Console.new(pry: pry, input: StringIO.new, curses: nil, getch: nil)
@@ -684,7 +713,11 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
684
713
  console.banner_frame(8, cells: true)
685
714
  seed = console.instance_variable_get(:@banner_seed)
686
715
  now += 1.21
687
- expect(PWN::Banner).to receive(:mini_cells).with(name: name, frame: 24, width: 8, height: 8, seed: seed, branding: false).twice.and_call_original
716
+ if name == :pacman
717
+ expect(console).to receive(:automatic_banner).with(8, now).twice.and_call_original
718
+ else
719
+ expect(PWN::Banner).to receive(:mini_cells).with(name: name, frame: 24, width: 8, height: 8, seed: seed, branding: false).twice.and_call_original
720
+ end
688
721
  2.times { console.banner_frame(8, cells: true) }
689
722
  end
690
723
  end
@@ -1078,6 +1111,111 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
1078
1111
  expect([editor.text, editor.cursor]).to eq(['kept draft', 4])
1079
1112
  end
1080
1113
 
1114
+ it 'paints an Asteroids turn on the next draw without waiting for its physics tick' do
1115
+ console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
1116
+ console.banner_frame(8, cells: true)
1117
+ console.instance_variable_set(:@banner_name, :asteroids)
1118
+ console.instance_variable_set(:@banner_frame_seconds, 0.05)
1119
+ console.instance_variable_set(:@focus, :animation)
1120
+ first = console.playable_banner(8, 10.001)
1121
+ console.handle(:left)
1122
+ expect(console.playable_banner(8, 10.002)).not_to eq(first)
1123
+ expect(console.playable_banner(8, 10.003)).to eq(console.playable_banner(8, 10.002))
1124
+ console.instance_variable_set(:@banner_game_frame, { state: { explosion: 12 } })
1125
+ game = console.instance_variable_get(:@banner_game)
1126
+ expect(game).not_to receive(:step)
1127
+ 16.times { console.handle(:up) }
1128
+ console.playable_banner(8, 10.004)
1129
+ end
1130
+
1131
+ it 'waits for Snake input and routes timed turns across the full pane instead of restarting' do
1132
+ console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
1133
+ console.banner_frame(8, cells: true)
1134
+ console.instance_variable_set(:@banner_name, :snake)
1135
+ console.instance_variable_set(:@banner_frame_seconds, 0.1)
1136
+ console.instance_variable_set(:@focus, :animation)
1137
+ first = console.playable_banner(8, 10.0)
1138
+ 40.times { |tick| expect(console.playable_banner(8, 10.05 + (tick * 0.1))).to eq(first) }
1139
+ game = console.instance_variable_get(:@banner_game)
1140
+ frames = []
1141
+ allow(game).to(receive(:step).and_wrap_original { |method| method.call.tap { |frame| frames << frame } })
1142
+ console.handle(:right)
1143
+ console.playable_banner(8, 15.0)
1144
+ head = frames.last[:state][:body].first
1145
+ console.handle(:up)
1146
+ console.playable_banner(8, 15.05)
1147
+ expect(frames.length).to eq(1)
1148
+ console.playable_banner(8, 15.21)
1149
+ expect(frames.last[:state][:body].first).to eq([head[0], head[1] - 1])
1150
+ console.handle(:right)
1151
+ console.playable_banner(8, 15.41)
1152
+ expect(frames.last[:state][:body].first).to eq([head[0] + 1, head[1] - 1])
1153
+ expect(game.instance_variable_get(:@width)).to eq(8)
1154
+ expect(frames.last[:rows].drop(1).map(&:length)).to all(eq(16))
1155
+ expect(console.instance_variable_get(:@editor).text).to eq('')
1156
+ end
1157
+
1158
+ it 'cycles games with Ctrl+G only in animation focus and preserves swarm and modal priorities' do
1159
+ console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
1160
+ console.banner_frame(8, cells: true)
1161
+ console.instance_variable_set(:@banner_name, :falling_blocks)
1162
+ console.instance_variable_set(:@focus, :animation)
1163
+ editor = console.instance_variable_get(:@editor)
1164
+ editor.place('kept draft', 4)
1165
+ %i[snake pacman asteroids galaga frogger falling_blocks].each do |name|
1166
+ console.handle("\u0007")
1167
+ expect(console.instance_variable_get(:@banner_name)).to eq(name)
1168
+ expect(console.instance_variable_get(:@workspace)).to be_nil
1169
+ console.banner_frame(8, cells: true)
1170
+ expect(console.instance_variable_get(:@banner_game).instance_variable_get(:@name)).to eq(name.to_s)
1171
+ expect(console.footer_text).to include('^G=next game')
1172
+ expect(console.footer_text).to include('↑↓←→ start/steer · ● power') if name == :pacman
1173
+ expect(console.footer_text).to include('↑↓←→ move · Space=fire') if name == :galaga
1174
+ expect(console.footer_text).to include('↑↓←→ hop · logs → goals') if name == :frogger
1175
+ expect(console.operation_lines.join).to include('^S swarm')
1176
+ end
1177
+ console.instance_variable_set(:@details, 0)
1178
+ expect(console).to receive(:handle_details).with("\u0007")
1179
+ console.handle("\u0007")
1180
+ console.instance_variable_set(:@details, nil)
1181
+ editor.search_history
1182
+ expect(console).to receive(:handle_search).with("\u0007")
1183
+ console.handle("\u0007")
1184
+ editor.finish_search
1185
+ console.handle("\u0013")
1186
+ expect(console.instance_variable_get(:@workspace)).to be_a(Hash)
1187
+ console.handle("\u0007")
1188
+ expect(console.instance_variable_get(:@workspace)).to be_nil
1189
+ expect(console.instance_variable_get(:@banner_name)).to eq(:falling_blocks)
1190
+ console.handle("\e")
1191
+ console.handle("\u0007")
1192
+ expect(console.instance_variable_get(:@workspace)).to be_a(Hash)
1193
+ expect([editor.text, editor.cursor]).to eq(['kept draft', 4])
1194
+ end
1195
+
1196
+ it 'delivers timed Pac-Man buffered arrows without consuming the mission draft or speeding up on repeats' do
1197
+ console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
1198
+ console.banner_frame(8, cells: true)
1199
+ console.instance_variable_set(:@banner_name, :pacman)
1200
+ console.instance_variable_set(:@banner_seed, 9)
1201
+ console.instance_variable_set(:@banner_frame_seconds, 0.1)
1202
+ console.instance_variable_set(:@focus, :animation)
1203
+ editor = console.instance_variable_get(:@editor)
1204
+ editor.place('kept draft', 4)
1205
+ console.playable_banner(7, 10.01)
1206
+ console.handle(:right)
1207
+ console.playable_banner(7, 10.11)
1208
+ expect(console.instance_variable_get(:@banner_game_frame)[:state][:pacman]).to eq([2, 5])
1209
+ console.handle(:up)
1210
+ 10.times { console.playable_banner(7, 10.12) }
1211
+ expect(console.instance_variable_get(:@banner_game_frame)[:state][:pacman]).to eq([2, 5])
1212
+ [10.21, 10.31, 10.41, 10.51, 10.61, 10.71].each { |time| console.playable_banner(7, time) }
1213
+ expect(console.instance_variable_get(:@banner_game_frame)[:state][:pacman]).to eq([3, 4])
1214
+ console.handle("\e")
1215
+ expect([editor.text, editor.cursor]).to eq(['kept draft', 4])
1216
+ expect(console.instance_variable_get(:@focus)).to eq(:mission)
1217
+ end
1218
+
1081
1219
  it 'returns to the unchanged automatic animation when focus leaves the game' do
1082
1220
  console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
1083
1221
  allow(Process).to receive(:clock_gettime).and_return(10.0)
@@ -1092,6 +1230,28 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
1092
1230
  expect(console.instance_variable_get(:@focus)).to eq(:mission)
1093
1231
  end
1094
1232
 
1233
+ it 'streams the new arcade demos on the UI owner without a synchronous full replay build' do
1234
+ %i[pacman galaga frogger].each do |name|
1235
+ console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
1236
+ allow(PWN::Banner).to receive(:mini_names).and_return([name])
1237
+ allow(Process).to receive(:clock_gettime).and_return(10.0)
1238
+ expect(PWN::Banner).not_to receive(:mini_cells)
1239
+ first = console.banner_frame(32, cells: true)
1240
+ demo = console.instance_variable_get(:@banner_demo)
1241
+ expect(demo).to be_a(PWN::Banner::MiniGame)
1242
+ expect(console.instance_variable_get(:@banner_demo_frame)[:state][:started]).to be true
1243
+ expect(first.map(&:length)).to all(eq(32))
1244
+ expect(console.banner_frame(32, cells: true)).to eq(first)
1245
+ allow(Process).to receive(:clock_gettime).and_return(10.2)
1246
+ console.banner_frame(32, cells: true)
1247
+ expect(console.instance_variable_get(:@banner_demo)).to equal(demo)
1248
+ console.instance_variable_set(:@focus, :animation)
1249
+ console.banner_frame(32, cells: true)
1250
+ expect(console.instance_variable_get(:@banner_game)).not_to equal(demo)
1251
+ expect(console.instance_variable_get(:@banner_game_frame)[:state][:started]).to be false
1252
+ end
1253
+ end
1254
+
1095
1255
  it 'keeps modal, search and cancellation priority above animation controls' do
1096
1256
  console = PWN::Plugins::REPL::AIConsole::Console.new(pry: Pry.new, input: StringIO.new, curses: nil, getch: nil)
1097
1257
  console.instance_variable_set(:@focus, :animation)
@@ -1488,6 +1648,7 @@ describe 'pwn-ai curses launch' do # rubocop:disable Metrics/BlockLength -- publ
1488
1648
 
1489
1649
  ["\e", "\u0003"].each do |cancel_key|
1490
1650
  it "keeps the rendered header and banner unchanged after reasoning cancellation #{cancel_key.inspect}" do
1651
+ allow(PWN::Banner).to receive(:mini_names).and_return([:falling_blocks])
1491
1652
  allow(PWN::Plugins::REPL).to receive(:persist_ai_selection).and_return(false)
1492
1653
  expect(PWN::Plugins::REPL).not_to receive(:pwn_ai_apply_model)
1493
1654
  original = Marshal.dump(PWN::Env[:ai])
@@ -1736,16 +1736,33 @@
1736
1736
  {"messages":[{"role":"user","content":"PWN::Banner.mini_asteroids_snapshot Usage"},{"role":"assistant","content":"`PWN::Banner.mini_asteroids_snapshot`: "}]}
1737
1737
  {"messages":[{"role":"user","content":"PWN::Banner.mini_block_board Usage"},{"role":"assistant","content":"`PWN::Banner.mini_block_board`: "}]}
1738
1738
  {"messages":[{"role":"user","content":"PWN::Banner.mini_block_plan Usage"},{"role":"assistant","content":"`PWN::Banner.mini_block_plan`: "}]}
1739
- {"messages":[{"role":"user","content":"PWN::Banner.mini_cells Usage"},{"role":"assistant","content":"`PWN::Banner.mini_cells`: Supported Method Parameters\n\nReturn rows of single-column Unicode block cells, with named terminal colors. Each fresh cell has glyph, foreground and background keys; no ANSI or IO. Square means terminal-cell dimensions, not physical pixels. Caller owns borders. Use mini_frame_seconds for cadence; 1800 frames span 90 or 180 seconds. Colored blocks fill the canvas with half-cell pieces; other games cap at 16. PWN::Banner.mini_cells(\n\nname: 'optional - falling_blocks, snake, pong, or asteroids; defaults to falling_blocks',\nframe: 'optional - integer index, defaults to zero and wraps at 1800',\nwidth: 'optional - columns clamped to 0..64 for blocks, 0..16 otherwise; defaults to 16',\nheight: 'optional - rows clamped to 0..64 for blocks, 0..16 otherwise; defaults to 16',\nseed: 'optional - integer local PRNG seed, defaults to 73; retain per session',\nbranding: 'optional - include the legacy wordmark, defaults to true; false reclaims its row'\n\n)\n"}]}
1739
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_cells Usage"},{"role":"assistant","content":"`PWN::Banner.mini_cells`: Supported Method Parameters\n\nReturn rows of single-column Unicode block cells, with named terminal colors. Each fresh cell has glyph, foreground and background keys; no ANSI or IO. Square means terminal-cell dimensions, not physical pixels. Caller owns borders. Use mini_frame_seconds for cadence; 1800 frames span 90 or 180 seconds. Blocks, Pac-Man, Galaga and Frogger fill up to 64 cells; other games cap at 16. PWN::Banner.mini_cells(\n\nname: 'optional - falling_blocks, snake, pacman, asteroids, galaga or frogger; legacy pong accepted; defaults to falling_blocks',\nframe: 'optional - integer index, defaults to zero and wraps at 1800',\nwidth: 'optional - columns clamped to 0..64 for blocks/Pac-Man/Galaga/Frogger, 0..16 otherwise; defaults to 16',\nheight: 'optional - rows clamped to 0..64 for blocks/Pac-Man/Galaga/Frogger, 0..16 otherwise; defaults to 16',\nseed: 'optional - integer local PRNG seed, defaults to 73; retain per session',\nbranding: 'optional - include the legacy wordmark, defaults to true; false reclaims its row'\n\n)\n"}]}
1740
1740
  {"messages":[{"role":"user","content":"PWN::Banner.mini_delta Usage"},{"role":"assistant","content":"`PWN::Banner.mini_delta`: "}]}
1741
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_dot Usage"},{"role":"assistant","content":"`PWN::Banner.mini_dot`: "}]}
1741
1742
  {"messages":[{"role":"user","content":"PWN::Banner.mini_emit Usage"},{"role":"assistant","content":"`PWN::Banner.mini_emit`: "}]}
1742
1743
  {"messages":[{"role":"user","content":"PWN::Banner.mini_falling_blocks Usage"},{"role":"assistant","content":"`PWN::Banner.mini_falling_blocks`: "}]}
1743
1744
  {"messages":[{"role":"user","content":"PWN::Banner.mini_fits? Usage"},{"role":"assistant","content":"`PWN::Banner.mini_fits?`: "}]}
1744
- {"messages":[{"role":"user","content":"PWN::Banner.mini_frame Usage"},{"role":"assistant","content":"`PWN::Banner.mini_frame`: Supported Method Parameters\n\nReturn fresh ASCII rows for decorative retro loops, not interactive games. Use equal width and height for a square; 5..16 retains the complete artwork. Smaller panes degrade to a wordmark. Caller owns randomness, clock and IO. PWN::Banner.mini_frame(\n\nname: 'optional - falling_blocks, snake, pong, or asteroids; defaults to falling_blocks',\nframe: 'optional - integer frame index, defaults to zero and wraps at 60',\nwidth: 'optional - output columns clamped to zero through 16, defaults to 16',\nheight: 'optional - output rows clamped to zero through 16, defaults to 16',\nbranding: 'optional - include the legacy wordmark, defaults to true; false reclaims its row'\n\n)\n"}]}
1745
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_frame Usage"},{"role":"assistant","content":"`PWN::Banner.mini_frame`: Supported Method Parameters\n\nReturn fresh ASCII rows for decorative retro loops, not interactive games. Use equal width and height for a square; 5..16 retains the complete artwork. Smaller panes degrade to a wordmark. Caller owns randomness, clock and IO. PWN::Banner.mini_frame(\n\nname: 'optional - falling_blocks, snake, pacman, asteroids, galaga or frogger; legacy pong accepted; defaults to falling_blocks',\nframe: 'optional - integer frame index, defaults to zero and wraps at 60',\nwidth: 'optional - output columns clamped to zero through 16, defaults to 16',\nheight: 'optional - output rows clamped to zero through 16, defaults to 16',\nbranding: 'optional - include the legacy wordmark, defaults to true; false reclaims its row'\n\n)\n"}]}
1745
1746
  {"messages":[{"role":"user","content":"PWN::Banner.mini_frame_seconds Usage"},{"role":"assistant","content":"`PWN::Banner.mini_frame_seconds`: Supported Method Parameters\n\nReturn the presentation interval; simulations preserve their gameplay speed. PWN::Banner.mini_frame_seconds(\n\nname: 'optional - animation name, defaults to falling_blocks'\n\n)\n"}]}
1746
1747
  {"messages":[{"role":"user","content":"PWN::Banner.mini_freeze Usage"},{"role":"assistant","content":"`PWN::Banner.mini_freeze`: "}]}
1748
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_frogger_contact Usage"},{"role":"assistant","content":"`PWN::Banner.mini_frogger_contact`: "}]}
1749
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_frogger_demo Usage"},{"role":"assistant","content":"`PWN::Banner.mini_frogger_demo`: "}]}
1750
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_frogger_move Usage"},{"role":"assistant","content":"`PWN::Banner.mini_frogger_move`: "}]}
1751
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_frogger_round Usage"},{"role":"assistant","content":"`PWN::Banner.mini_frogger_round`: "}]}
1752
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_frogger_snapshot Usage"},{"role":"assistant","content":"`PWN::Banner.mini_frogger_snapshot`: "}]}
1753
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_galaga_move Usage"},{"role":"assistant","content":"`PWN::Banner.mini_galaga_move`: "}]}
1754
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_galaga_round Usage"},{"role":"assistant","content":"`PWN::Banner.mini_galaga_round`: "}]}
1755
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_galaga_snapshot Usage"},{"role":"assistant","content":"`PWN::Banner.mini_galaga_snapshot`: "}]}
1747
1756
  {"messages":[{"role":"user","content":"PWN::Banner.mini_landing Usage"},{"role":"assistant","content":"`PWN::Banner.mini_landing`: "}]}
1748
1757
  {"messages":[{"role":"user","content":"PWN::Banner.mini_names Usage"},{"role":"assistant","content":"`PWN::Banner.mini_names`: Supported Method Parameters\n\nList animation names; callers may sample once and retain the session choice. PWN::Banner.mini_names\n"}]}
1758
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_pacman Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pacman`: "}]}
1759
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_pacman_contact Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pacman_contact`: "}]}
1760
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_pacman_ghosts Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pacman_ghosts`: "}]}
1761
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_pacman_move Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pacman_move`: "}]}
1762
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_pacman_neighbors Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pacman_neighbors`: "}]}
1763
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_pacman_round Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pacman_round`: "}]}
1764
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_pacman_route Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pacman_route`: "}]}
1765
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_pacman_snapshot Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pacman_snapshot`: "}]}
1749
1766
  {"messages":[{"role":"user","content":"PWN::Banner.mini_pixel Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pixel`: "}]}
1750
1767
  {"messages":[{"role":"user","content":"PWN::Banner.mini_play_piece Usage"},{"role":"assistant","content":"`PWN::Banner.mini_play_piece`: "}]}
1751
1768
  {"messages":[{"role":"user","content":"PWN::Banner.mini_pong Usage"},{"role":"assistant","content":"`PWN::Banner.mini_pong`: "}]}
@@ -1756,6 +1773,9 @@
1756
1773
  {"messages":[{"role":"user","content":"PWN::Banner.mini_rotations Usage"},{"role":"assistant","content":"`PWN::Banner.mini_rotations`: "}]}
1757
1774
  {"messages":[{"role":"user","content":"PWN::Banner.mini_simulate_asteroids Usage"},{"role":"assistant","content":"`PWN::Banner.mini_simulate_asteroids`: "}]}
1758
1775
  {"messages":[{"role":"user","content":"PWN::Banner.mini_simulate_falling_blocks Usage"},{"role":"assistant","content":"`PWN::Banner.mini_simulate_falling_blocks`: "}]}
1776
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_simulate_frogger Usage"},{"role":"assistant","content":"`PWN::Banner.mini_simulate_frogger`: "}]}
1777
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_simulate_galaga Usage"},{"role":"assistant","content":"`PWN::Banner.mini_simulate_galaga`: "}]}
1778
+ {"messages":[{"role":"user","content":"PWN::Banner.mini_simulate_pacman Usage"},{"role":"assistant","content":"`PWN::Banner.mini_simulate_pacman`: "}]}
1759
1779
  {"messages":[{"role":"user","content":"PWN::Banner.mini_simulate_pong Usage"},{"role":"assistant","content":"`PWN::Banner.mini_simulate_pong`: "}]}
1760
1780
  {"messages":[{"role":"user","content":"PWN::Banner.mini_simulate_snake Usage"},{"role":"assistant","content":"`PWN::Banner.mini_simulate_snake`: "}]}
1761
1781
  {"messages":[{"role":"user","content":"PWN::Banner.mini_snake Usage"},{"role":"assistant","content":"`PWN::Banner.mini_snake`: "}]}
@@ -3317,6 +3337,7 @@
3317
3337
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AIConsole::Console.new Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AIConsole::Console.new`: "}]}
3318
3338
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AIConsole::Console.accept_completion Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AIConsole::Console.accept_completion`: "}]}
3319
3339
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AIConsole::Console.add Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AIConsole::Console.add`: "}]}
3340
+ {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AIConsole::Console.automatic_banner Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AIConsole::Console.automatic_banner`: "}]}
3320
3341
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AIConsole::Console.banner_frame Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AIConsole::Console.banner_frame`: "}]}
3321
3342
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AIConsole::Console.begin_request_metrics Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AIConsole::Console.begin_request_metrics`: "}]}
3322
3343
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AIConsole::Console.bounded_event Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AIConsole::Console.bounded_event`: "}]}
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.760
4
+ version: 0.5.761
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.