Class: Events::Subscribers::MessageCollector

Inherits:
Object
  • Object
show all
Includes:
Events::Subscriber
Defined in:
lib/events/subscribers/message_collector.rb

Overview

Collects chat-displayable events in-memory for the current session. Provides the message list that the TUI renders and the LLM client consumes.

Only user_message and agent_message events are collected — system_message, tool_call, and tool_response are internal and not part of the chat display.

Examples:

collector = Events::Subscribers::MessageCollector.new
Events::Bus.subscribe(collector)
collector.messages # => [{role: "user", content: "hi"}, ...]

Constant Summary collapse

DISPLAYABLE_TYPES =
%w[user_message agent_message].freeze
ROLE_MAP =

Maps event types to LLM-compatible role identifiers

{
  "user_message" => "user",
  "agent_message" => "assistant"
}.freeze

Instance Method Summary collapse

Constructor Details

#initializeMessageCollector

Returns a new instance of MessageCollector.



26
27
28
29
# File 'lib/events/subscribers/message_collector.rb', line 26

def initialize
  @messages = []
  @mutex = Mutex.new
end

Instance Method Details

#clearObject



59
60
61
# File 'lib/events/subscribers/message_collector.rb', line 59

def clear
  @mutex.synchronize { @messages = [] }
end

#emit(event) ⇒ Object

Receives a Rails.event notification hash.

Parameters:

  • event (Hash)

    with :payload containing :type and :content keys



38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/events/subscribers/message_collector.rb', line 38

def emit(event)
  type = event.dig(:payload, :type)
  return unless DISPLAYABLE_TYPES.include?(type)

  content = event.dig(:payload, :content)
  return if content.nil?

  @mutex.synchronize do
    @messages << {
      role: ROLE_MAP.fetch(type),
      content: content
    }
  end
end

#messagesArray<Hash>

Returns thread-safe copy of collected messages.

Returns:

  • (Array<Hash>)

    thread-safe copy of collected messages



32
33
34
# File 'lib/events/subscribers/message_collector.rb', line 32

def messages
  @mutex.synchronize { @messages.dup }
end

#messages_push(message) ⇒ Object

Directly push a pre-built message hash (used for loading persisted events).

Parameters:

  • message (Hash)

    with :role and :content keys



55
56
57
# File 'lib/events/subscribers/message_collector.rb', line 55

def messages_push(message)
  @mutex.synchronize { @messages << message }
end