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.
- checksums.yaml +4 -4
- data/documentation/pwn-ai-Agent.md +44 -10
- data/etc/default_skills/pwn/banner/SKILL.md +1 -1
- data/lib/pwn/banner.rb +593 -53
- data/lib/pwn/plugins/repl/ai_console.rb +46 -9
- data/lib/pwn/version.rb +1 -1
- data/spec/lib/pwn/banner_spec.rb +428 -20
- data/spec/lib/pwn/plugins/repl/ai_console_spec.rb +167 -6
- data/third_party/pwn_rdoc.jsonl +23 -2
- metadata +1 -1
|
@@ -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 =
|
|
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([:
|
|
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: :
|
|
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
|
|
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[
|
|
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
|
-
|
|
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])
|
data/third_party/pwn_rdoc.jsonl
CHANGED
|
@@ -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.
|
|
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,
|
|
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`: "}]}
|