Class: Legion::TTY::Components::MessageStream
- Inherits:
-
Object
- Object
- Legion::TTY::Components::MessageStream
- Defined in:
- lib/legion/tty/components/message_stream.rb
Overview
rubocop:disable Metrics/ClassLength
Constant Summary collapse
- HIGHLIGHT_COLOR =
"\e[1;33m"- HIGHLIGHT_RESET =
"\e[0m"
Instance Attribute Summary collapse
-
#highlights ⇒ Object
Returns the value of attribute highlights.
-
#messages ⇒ Object
readonly
Returns the value of attribute messages.
-
#mute_system ⇒ Object
Returns the value of attribute mute_system.
-
#scroll_offset ⇒ Object
readonly
Returns the value of attribute scroll_offset.
Instance Method Summary collapse
- #add_message(role:, content:) ⇒ Object
- #add_tool_call(name:, args: {}, status: :running) ⇒ Object
- #add_tool_panel(panel) ⇒ Object
- #append_streaming(text) ⇒ Object
-
#initialize ⇒ MessageStream
constructor
A new instance of MessageStream.
- #render(width:, height:) ⇒ Object
- #scroll_down(lines = 1) ⇒ Object
- #scroll_position ⇒ Object
- #scroll_up(lines = 1) ⇒ Object
- #update_tool_call(name:, status:, duration: nil, result: nil, error: nil) ⇒ Object
Constructor Details
#initialize ⇒ MessageStream
Returns a new instance of MessageStream.
17 18 19 20 21 22 |
# File 'lib/legion/tty/components/message_stream.rb', line 17 def initialize @messages = [] @scroll_offset = 0 @mute_system = false @highlights = [] end |
Instance Attribute Details
#highlights ⇒ Object
Returns the value of attribute highlights.
12 13 14 |
# File 'lib/legion/tty/components/message_stream.rb', line 12 def highlights @highlights end |
#messages ⇒ Object (readonly)
Returns the value of attribute messages.
11 12 13 |
# File 'lib/legion/tty/components/message_stream.rb', line 11 def @messages end |
#mute_system ⇒ Object
Returns the value of attribute mute_system.
12 13 14 |
# File 'lib/legion/tty/components/message_stream.rb', line 12 def mute_system @mute_system end |
#scroll_offset ⇒ Object (readonly)
Returns the value of attribute scroll_offset.
11 12 13 |
# File 'lib/legion/tty/components/message_stream.rb', line 11 def scroll_offset @scroll_offset end |
Instance Method Details
#add_message(role:, content:) ⇒ Object
24 25 26 |
# File 'lib/legion/tty/components/message_stream.rb', line 24 def (role:, content:) @messages << { role: role, content: content, tool_panels: [], timestamp: Time.now } end |
#add_tool_call(name:, args: {}, status: :running) ⇒ Object
40 41 42 43 44 |
# File 'lib/legion/tty/components/message_stream.rb', line 40 def add_tool_call(name:, args: {}, status: :running) require_relative 'tool_panel' panel = ToolPanel.new(name: name, args: args, status: status) @messages << { role: :tool, content: panel, tool_panel: true } end |
#add_tool_panel(panel) ⇒ Object
34 35 36 37 38 |
# File 'lib/legion/tty/components/message_stream.rb', line 34 def add_tool_panel(panel) return if @messages.empty? @messages.last[:tool_panels] << panel end |
#append_streaming(text) ⇒ Object
28 29 30 31 32 |
# File 'lib/legion/tty/components/message_stream.rb', line 28 def append_streaming(text) return if @messages.empty? @messages.last[:content] = @messages.last[:content] + text end |
#render(width:, height:) ⇒ Object
63 64 65 66 67 68 69 70 71 |
# File 'lib/legion/tty/components/message_stream.rb', line 63 def render(width:, height:) all_lines = build_all_lines(width) total = all_lines.size start_idx = [total - height - @scroll_offset, 0].max start_idx = [start_idx, total].min result = all_lines[start_idx, height] || [] @last_visible_count = result.size result end |
#scroll_down(lines = 1) ⇒ Object
59 60 61 |
# File 'lib/legion/tty/components/message_stream.rb', line 59 def scroll_down(lines = 1) @scroll_offset = [@scroll_offset - lines, 0].max end |
#scroll_position ⇒ Object
73 74 75 |
# File 'lib/legion/tty/components/message_stream.rb', line 73 def scroll_position { current: @scroll_offset, total: @messages.size, visible: @last_visible_count || 0 } end |
#scroll_up(lines = 1) ⇒ Object
55 56 57 |
# File 'lib/legion/tty/components/message_stream.rb', line 55 def scroll_up(lines = 1) @scroll_offset += lines end |
#update_tool_call(name:, status:, duration: nil, result: nil, error: nil) ⇒ Object
46 47 48 49 50 51 52 53 |
# File 'lib/legion/tty/components/message_stream.rb', line 46 def update_tool_call(name:, status:, duration: nil, result: nil, error: nil) tool_msg = @messages.reverse.find do |m| m[:tool_panel] && m[:content].is_a?(ToolPanel) && m[:content].instance_variable_get(:@name) == name end return unless tool_msg apply_tool_panel_update(tool_msg[:content], status: status, duration: duration, result: result, error: error) end |