6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'lib/claude_swarm/commands/show.rb', line 6
def execute(session_id)
session_path = find_session_path(session_id)
unless session_path
puts "Session not found: #{session_id}"
exit(1)
end
config = YamlLoader.load_config_file(File.join(session_path, "config.yml"))
main_instance_name = config.dig("swarm", "main")
log_file = File.join(session_path, "session.log.json")
instances = SessionCostCalculator.parse_instance_hierarchy(log_file)
total_cost = instances.values.sum { |i| i[:cost] }
cost_display = if instances[main_instance_name] && instances[main_instance_name][:has_cost_data]
format("$%.4f", total_cost)
else
"#{format("$%.4f", total_cost)} (excluding main instance)"
end
puts "Session: #{session_id}"
puts "Session Path: #{session_path}"
puts "Swarm: #{config.dig("swarm", "name")}"
runtime_info = get_runtime_info(session_path)
puts "Runtime: #{runtime_info}" if runtime_info
puts "Total Cost: #{cost_display}"
root_dir_file = File.join(session_path, "root_directory")
puts "Root Directory: #{File.read(root_dir_file).strip}" if File.exist?(root_dir_file)
puts
puts "Instance Hierarchy:"
puts "-" * 50
roots = instances.values.select { |i| i[:called_by].empty? }
roots.each do |instance|
display_instance_tree(instance, instances, 0, main_instance_name)
end
return if instances[main_instance_name]&.dig(:has_cost_data)
puts
puts "Note: Main instance (#{main_instance_name}) cost is not tracked in interactive mode."
puts " View costs directly in the Claude interface."
end
|