Class: Events::Subscribers::MessageCollector
- Inherits:
-
Object
- Object
- Events::Subscribers::MessageCollector
- 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.
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
- #clear ⇒ Object
-
#emit(event) ⇒ Object
Receives a Rails.event notification hash.
-
#initialize ⇒ MessageCollector
constructor
A new instance of MessageCollector.
-
#messages ⇒ Array<Hash>
Thread-safe copy of collected messages.
-
#messages_push(message) ⇒ Object
Directly push a pre-built message hash (used for loading persisted events).
Constructor Details
#initialize ⇒ MessageCollector
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
#clear ⇒ Object
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.
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 |
#messages ⇒ Array<Hash>
Returns thread-safe copy of collected messages.
32 33 34 |
# File 'lib/events/subscribers/message_collector.rb', line 32 def @mutex.synchronize { @messages.dup } end |
#messages_push(message) ⇒ Object
Directly push a pre-built message hash (used for loading persisted events).
55 56 57 |
# File 'lib/events/subscribers/message_collector.rb', line 55 def () @mutex.synchronize { @messages << } end |