Class: Clacky::Server::HistoryCollector

Inherits:
Object
  • Object
show all
Defined in:
lib/clacky/server/http_server.rb

Overview

Lightweight UI collector used by api_session_messages to capture events emitted by Agent#replay_history without broadcasting over WebSocket. Implements the same show_* interface as WebUIController.

Instance Method Summary collapse

Constructor Details

#initialize(session_id, events) ⇒ HistoryCollector

Returns a new instance of HistoryCollector.



27
28
29
30
# File 'lib/clacky/server/http_server.rb', line 27

def initialize(session_id, events)
  @session_id = session_id
  @events     = events
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, **kwargs) ⇒ Object

Ignore all other UI methods (progress, errors, etc.) during history replay



89
# File 'lib/clacky/server/http_server.rb', line 89

def method_missing(name, *args, **kwargs); end

Instance Method Details

#respond_to_missing?(name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


90
# File 'lib/clacky/server/http_server.rb', line 90

def respond_to_missing?(name, include_private = false); true; end

#show_assistant_message(content, files:) ⇒ Object



55
56
57
58
59
# File 'lib/clacky/server/http_server.rb', line 55

def show_assistant_message(content, files:)
  return if content.nil? || content.to_s.strip.empty?

  @events << { type: "assistant_message", session_id: @session_id, content: content }
end

#show_token_usage(token_data) ⇒ Object



82
83
84
85
86
# File 'lib/clacky/server/http_server.rb', line 82

def show_token_usage(token_data)
  return unless token_data.is_a?(Hash)

  @events << { type: "token_usage", session_id: @session_id }.merge(token_data)
end

#show_tool_call(name, args) ⇒ Object



61
62
63
64
65
# File 'lib/clacky/server/http_server.rb', line 61

def show_tool_call(name, args)
  args_data = args.is_a?(String) ? (JSON.parse(args) rescue args) : args
  summary   = tool_call_summary(name, args_data)
  @events << { type: "tool_call", session_id: @session_id, name: name, args: args_data, summary: summary }
end

#show_tool_result(result) ⇒ Object



78
79
80
# File 'lib/clacky/server/http_server.rb', line 78

def show_tool_result(result)
  @events << { type: "tool_result", session_id: @session_id, result: result }
end

#show_user_message(content, created_at: nil, files: []) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/clacky/server/http_server.rb', line 32

def show_user_message(content, created_at: nil, files: [])
  ev = { type: "history_user_message", session_id: @session_id, content: content }
  ev[:created_at] = created_at if created_at
  rendered = Array(files).filter_map do |f|
    url  = f[:data_url] || f["data_url"]
    name = f[:name]     || f["name"]
    path = f[:path]     || f["path"]

    if url
      url
    elsif path && File.exist?(path.to_s)
      # Reconstruct data_url from the tmp file (still present on disk)
      Utils::FileProcessor.image_path_to_data_url(path) rescue "expired:#{name}"
    elsif name
      # File badge for non-image disk files, or image whose tmp file is gone
      type = f[:type] || f["type"] || ""
      type.to_s == "image" ? "expired:#{name}" : "pdf:#{name}"
    end
  end
  ev[:images] = rendered unless rendered.empty?
  @events << ev
end