Module: Kward::CLITranscriptFormatter

Defined in:
lib/kward/cli_transcript_formatter.rb

Class Method Summary collapse

Class Method Details

.content_part_text(part) ⇒ Object



91
92
93
94
95
96
97
98
99
100
# File 'lib/kward/cli_transcript_formatter.rb', line 91

def content_part_text(part)
  type = MessageAccess.value(part, :type)
  if type == "text"
    MessageAccess.value(part, :text)
  elsif type == "image"
    path = MessageAccess.value(part, :path)
    media_type = MessageAccess.value(part, :media_type) || MessageAccess.value(part, :mimeType) || "image"
    "[#{media_type}#{path ? ": #{path}" : ""}]"
  end
end

.content_text(content) ⇒ Object



24
25
26
27
28
29
30
31
# File 'lib/kward/cli_transcript_formatter.rb', line 24

def content_text(content)
  case content
  when Array
    content.filter_map { |part| content_part_text(part) }.join("\n")
  else
    content.to_s
  end
end

.decoded_image_size(data) ⇒ Object



116
117
118
119
120
121
122
# File 'lib/kward/cli_transcript_formatter.rb', line 116

def decoded_image_size(data)
  return nil if data.to_s.empty?

  Base64.decode64(data.to_s.gsub(/\s+/, "")).bytesize
rescue ArgumentError
  nil
end

.display_text(message) ⇒ Object



33
34
35
36
37
38
# File 'lib/kward/cli_transcript_formatter.rb', line 33

def display_text(message)
  display_content = MessageAccess.display_content(message)
  return display_content.to_s unless display_content.nil?

  content_text(MessageAccess.content(message))
end

.full_text(message) ⇒ Object



81
82
83
84
85
86
87
88
89
# File 'lib/kward/cli_transcript_formatter.rb', line 81

def full_text(message)
  content = MessageAccess.content(message)
  text = if content.is_a?(Array)
           content.filter_map { |part| MessageAccess.value(part, :text) }.join("\n")
         else
           content.to_s
         end
  text.strip
end

.image_part_reference(part) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/kward/cli_transcript_formatter.rb', line 102

def image_part_reference(part)
  data = MessageAccess.value(part, :data)
  path = MessageAccess.value(part, :path)
  media_type = MessageAccess.value(part, :media_type) || MessageAccess.value(part, :mimeType) || "image"
  {
    status: :attached,
    type: "image",
    label: path.to_s.empty? ? "pasted image" : File.basename(path),
    media_type: media_type,
    size_bytes: decoded_image_size(data),
    path: path
  }
end

.image_parts(message) ⇒ Object



62
63
64
65
66
67
# File 'lib/kward/cli_transcript_formatter.rb', line 62

def image_parts(message)
  content = MessageAccess.content(message)
  return [] unless content.is_a?(Array)

  content.select { |part| MessageAccess.value(part, :type) == "image" }
end

.image_references(message) ⇒ Object



69
70
71
# File 'lib/kward/cli_transcript_formatter.rb', line 69

def image_references(message)
  image_parts(message).map { |part| image_part_reference(part) }
end

.reasoning(message) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/kward/cli_transcript_formatter.rb', line 9

def reasoning(message)
  direct = MessageAccess.value(message, :reasoning_summary)
  return direct.to_s unless direct.to_s.empty?

  content = MessageAccess.content(message)
  return "" unless content.is_a?(Array)

  content.filter_map do |part|
    type = MessageAccess.value(part, :type)
    next unless ["thinking", "reasoning"].include?(type)

    MessageAccess.value(part, :thinking) || MessageAccess.value(part, :reasoning) || MessageAccess.value(part, :text)
  end.join("\n")
end

.synthetic_tool_call(name, id) ⇒ Object



73
74
75
76
77
78
79
# File 'lib/kward/cli_transcript_formatter.rb', line 73

def synthetic_tool_call(name, id)
  {
    "id" => id || "restored_tool",
    "type" => "function",
    "function" => { "name" => name || "tool", "arguments" => "{}" }
  }
end

.user_display_text(message) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/kward/cli_transcript_formatter.rb', line 40

def user_display_text(message)
  display_content = MessageAccess.display_content(message)
  return display_content.to_s unless display_content.nil?

  content = MessageAccess.content(message)
  return content.to_s unless content.is_a?(Array)

  text = content.filter_map do |part|
    next unless MessageAccess.value(part, :type) == "text"

    MessageAccess.value(part, :text)
  end.join("\n")
  ImageAttachments.display_text_without_references(text, ImageAttachments.references_from_text(text).select { |reference| reference[:status] == :attached })
end

.user_transcript_input(message) ⇒ Object



55
56
57
58
59
60
# File 'lib/kward/cli_transcript_formatter.rb', line 55

def user_transcript_input(message)
  content = MessageAccess.content(message)
  return content.to_s unless content.is_a?(Array)

  user_display_text(message)
end