Module: Ask::Terminal::Renderer
- Defined in:
- lib/ask/terminal/renderer.rb
Overview
Renders canonical session events as ANSI terminal output. Accepts either a wire hash ({ "type" =>, "seq" =>, "payload" => }) or an Ask::SessionProtocol::Events::Event.
Constant Summary collapse
- DIM =
ANSI helpers.
"\e[2m"- CYAN =
"\e[36m"- YELLOW =
"\e[33m"- GREEN =
"\e[32m"- RED =
"\e[31m"- MAGENTA =
"\e[35m"- RESET =
"\e[0m"- MAX_OUTPUT_LINES =
How many lines of tool output to show inline.
20- MAX_ARG_CHARS =
120
Class Method Summary collapse
-
.render(event, io: $stdout) ⇒ Object
Render one event to
io.
Class Method Details
.render(event, io: $stdout) ⇒ Object
Render one event to io. Streaming deltas (model.streaming,
tool.delta) print without a trailing newline; everything else
prints a complete line.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/ask/terminal/renderer.rb', line 30 def self.render(event, io: $stdout) hash = event.respond_to?(:to_h) ? event.to_h : event payload = hash["payload"] || {} case hash["type"] when "model.streaming" io.print payload["delta"].to_s when "model.thinking" io.print "#{DIM}#{payload["delta"]}#{RESET}" when "tool.use" args = truncate(JSON.generate(payload["args"])) io.puts "\n#{CYAN}› #{payload["name"]}#{args.empty? ? "" : " #{args}"}#{RESET}" when "tool.delta" io.print payload["partial"].to_s when "tool.result" render_tool_result(payload, io) when "approval.required" io.puts "#{YELLOW}✋ #{payload["toolName"]} requires approval (#{payload["id"]})#{RESET}" io.puts "#{DIM}#{payload["message"]}#{RESET}" if payload["message"] when "approval.updated" mark = payload["status"] == "approved" ? "#{GREEN}✓#{RESET}" : "#{RED}✗#{RESET}" io.puts "#{mark} #{payload["status"]} (#{payload["id"]})" when "plan.proposed" io.puts "\n#{MAGENTA}📋 Plan proposal (#{payload["id"]}):#{RESET}" io.puts payload["plan"].to_s io.puts "#{DIM}plan/approve or plan/reject to continue#{RESET}" when "plan.approved" io.puts "#{GREEN}✓ plan approved#{RESET}" when "plan.rejected" io.puts "#{RED}✗ plan rejected#{RESET}" when "todos.updated" render_todos(payload["todos"], io) when "turn.started" io.puts "#{DIM}── turn started ──#{RESET}" when "turn.completed" io.puts "\n#{DIM}── turn completed ──#{RESET}" when "turn.failed" io.puts "\n#{RED}✗ turn failed: #{payload["error"]}#{RESET}" when "turn.aborted" io.puts "\n#{DIM}── turn aborted ──#{RESET}" when "error" io.puts "#{RED}⚠ #{payload["error"]}#{RESET}" when "session.created" io.puts "#{DIM}session #{payload["sessionId"]} created#{RESET}" when "session.ended" io.puts "#{DIM}session #{payload["sessionId"]} ended (#{payload["reason"]})#{RESET}" end io.flush end |