Class: PromptObjects::MessageBus

Inherits:
Object
  • Object
show all
Defined in:
lib/prompt_objects/message_bus.rb

Overview

Message bus for routing and logging all inter-capability communication. This makes the semantic binding visible - you can see natural language being transformed into capability calls.

Each entry stores the full message content and a truncated summary. Use :summary for compact log displays, :message for full inspection.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(session_store: nil) ⇒ MessageBus

Returns a new instance of MessageBus.

Parameters:

  • session_store (Session::Store, nil) (defaults to: nil)

    Optional store for persistent event logging



14
15
16
17
18
# File 'lib/prompt_objects/message_bus.rb', line 14

def initialize(session_store: nil)
  @log = []
  @subscribers = []
  @store = session_store
end

Instance Attribute Details

#logObject (readonly)

Returns the value of attribute log.



11
12
13
# File 'lib/prompt_objects/message_bus.rb', line 11

def log
  @log
end

Instance Method Details

#clearObject

Clear the log.



61
62
63
# File 'lib/prompt_objects/message_bus.rb', line 61

def clear
  @log.clear
end

#format_log(count = 20) ⇒ String

Format log entries for compact display.

Parameters:

  • count (Integer) (defaults to: 20)

    Number of entries to format

Returns:

  • (String)


68
69
70
71
72
73
74
75
76
77
# File 'lib/prompt_objects/message_bus.rb', line 68

def format_log(count = 20)
  recent(count).map do |entry|
    time = entry[:timestamp].strftime("%H:%M:%S")
    from = entry[:from]
    to = entry[:to]
    msg = entry[:summary]

    "#{time}  #{from}#{to}: #{msg}"
  end.join("\n")
end

#publish(from:, to:, message:, session_id: nil) ⇒ Hash

Log a message between capabilities.

Parameters:

  • from (String)

    Source capability name

  • to (String)

    Destination capability name

  • message (String, Hash)

    The message content (stored in full)

  • session_id (String, nil) (defaults to: nil)

    Optional session ID for event persistence

Returns:

  • (Hash)

    The log entry



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/prompt_objects/message_bus.rb', line 26

def publish(from:, to:, message:, session_id: nil)
  entry = {
    timestamp: Time.now,
    from: from,
    to: to,
    message: message,
    summary: summarize(message)
  }

  @log << entry
  persist_event(entry, session_id: session_id)
  notify_subscribers(entry)
  entry
end

#recent(count = 20) ⇒ Array<Hash>

Get recent log entries.

Parameters:

  • count (Integer) (defaults to: 20)

    Number of entries to return

Returns:

  • (Array<Hash>)


56
57
58
# File 'lib/prompt_objects/message_bus.rb', line 56

def recent(count = 20)
  @log.last(count)
end

#subscribe {|Hash| ... } ⇒ Object

Subscribe to message events.

Yields:

  • (Hash)

    Called with each new message entry



43
44
45
# File 'lib/prompt_objects/message_bus.rb', line 43

def subscribe(&block)
  @subscribers << block
end

#unsubscribe(block) ⇒ Object

Unsubscribe from message events.

Parameters:

  • block (Proc)

    The subscriber to remove



49
50
51
# File 'lib/prompt_objects/message_bus.rb', line 49

def unsubscribe(block)
  @subscribers.delete(block)
end