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.



30
31
32
33
# File 'lib/clacky/server/http_server.rb', line 30

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



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

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

Instance Method Details

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

Returns:

  • (Boolean)


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

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

#show_assistant_message(content, files:) ⇒ Object



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

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

  # Rewrite local image paths to /api/local-image proxy URLs for browser rendering
  rewritten = Utils::FileProcessor.rewrite_local_image_urls(content.to_s)
  @events << { type: "assistant_message", session_id: @session_id, content: rewritten }
end

#show_feedback_request(question, context, options) ⇒ Object



93
94
95
96
# File 'lib/clacky/server/http_server.rb', line 93

def show_feedback_request(question, context, options)
  @events << { type: "request_feedback", session_id: @session_id,
               question: question, context: context, options: options }
end

#show_token_usage(token_data) ⇒ Object



87
88
89
90
91
# File 'lib/clacky/server/http_server.rb', line 87

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



66
67
68
69
70
# File 'lib/clacky/server/http_server.rb', line 66

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



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

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



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

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