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
Instance Attribute Summary collapse
-
#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.
13 14 15 16 17 |
# File 'lib/legion/tty/components/message_stream.rb', line 13 def initialize @messages = [] @scroll_offset = 0 @mute_system = false end |
Instance Attribute Details
#messages ⇒ Object (readonly)
Returns the value of attribute messages.
10 11 12 |
# File 'lib/legion/tty/components/message_stream.rb', line 10 def @messages end |
#mute_system ⇒ Object
Returns the value of attribute mute_system.
11 12 13 |
# File 'lib/legion/tty/components/message_stream.rb', line 11 def mute_system @mute_system end |
#scroll_offset ⇒ Object (readonly)
Returns the value of attribute scroll_offset.
10 11 12 |
# File 'lib/legion/tty/components/message_stream.rb', line 10 def scroll_offset @scroll_offset end |
Instance Method Details
#add_message(role:, content:) ⇒ Object
19 20 21 |
# File 'lib/legion/tty/components/message_stream.rb', line 19 def (role:, content:) @messages << { role: role, content: content, tool_panels: [], timestamp: Time.now } end |
#add_tool_call(name:, args: {}, status: :running) ⇒ Object
35 36 37 38 39 |
# File 'lib/legion/tty/components/message_stream.rb', line 35 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
29 30 31 32 33 |
# File 'lib/legion/tty/components/message_stream.rb', line 29 def add_tool_panel(panel) return if @messages.empty? @messages.last[:tool_panels] << panel end |
#append_streaming(text) ⇒ Object
23 24 25 26 27 |
# File 'lib/legion/tty/components/message_stream.rb', line 23 def append_streaming(text) return if @messages.empty? @messages.last[:content] = @messages.last[:content] + text end |
#render(width:, height:) ⇒ Object
58 59 60 61 62 63 64 65 66 |
# File 'lib/legion/tty/components/message_stream.rb', line 58 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
54 55 56 |
# File 'lib/legion/tty/components/message_stream.rb', line 54 def scroll_down(lines = 1) @scroll_offset = [@scroll_offset - lines, 0].max end |
#scroll_position ⇒ Object
68 69 70 |
# File 'lib/legion/tty/components/message_stream.rb', line 68 def scroll_position { current: @scroll_offset, total: @messages.size, visible: @last_visible_count || 0 } end |
#scroll_up(lines = 1) ⇒ Object
50 51 52 |
# File 'lib/legion/tty/components/message_stream.rb', line 50 def scroll_up(lines = 1) @scroll_offset += lines end |
#update_tool_call(name:, status:, duration: nil, result: nil, error: nil) ⇒ Object
41 42 43 44 45 46 47 48 |
# File 'lib/legion/tty/components/message_stream.rb', line 41 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 |