Class: AIA::Utility

Inherits:
Object
  • Object
show all
Defined in:
lib/aia/utility.rb

Class Method Summary collapse

Class Method Details

.connected_mcp_servers?Boolean

Returns true if there are any connected MCP servers

Returns:

  • (Boolean)


32
33
34
35
# File 'lib/aia/utility.rb', line 32

def connected_mcp_servers?
  connected = AIA.config&.connected_mcp_servers
  connected && !connected.empty?
end

.failed_mcp_serversObject

Returns list of failed MCP servers with their errors



38
39
40
# File 'lib/aia/utility.rb', line 38

def failed_mcp_servers
  AIA.config&.failed_mcp_servers || []
end

.mcp_server_namesObject

Returns only successfully connected MCP server names



21
22
23
24
25
26
27
28
29
# File 'lib/aia/utility.rb', line 21

def mcp_server_names
  # Use connected_mcp_servers if available (populated during MCP setup)
  connected = AIA.config&.connected_mcp_servers
  return connected if connected && !connected.empty?

  # Fallback to configured servers if connection status not yet known
  return [] unless mcp_servers?
  AIA.config.mcp_servers.map { |s| s[:name] || s["name"] }.compact
end

.mcp_servers?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/aia/utility.rb', line 16

def mcp_servers?
  AIA.config&.mcp_servers && !AIA.config.mcp_servers.empty?
end

.models_last_refreshObject

Returns the last refresh date from models.json modification time



47
48
49
50
51
52
53
54
55
# File 'lib/aia/utility.rb', line 47

def models_last_refresh
  aia_dir = AIA.config&.paths&.aia_dir
  return nil if aia_dir.nil?

  models_file = File.join(File.expand_path(aia_dir), 'models.json')
  return nil unless File.exist?(models_file)

  File.mtime(models_file).strftime('%Y-%m-%d %H:%M')
end

.robotObject

Displays the AIA robot ASCII art Yes, its slightly frivolous but it does contain some useful configuration information.



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/aia/utility.rb', line 60

def robot
  indent  = 18
  spaces  = " "*indent
  width   = TTY::Screen.width - indent - 2

  mcp_version = defined?(RubyLLM::MCP::VERSION) ? " MCP v" + RubyLLM::MCP::VERSION : ''

  # Extract model names from config (handles ModelSpec objects or Hashes)
  model_display = if AIA.config&.models && !AIA.config.models.empty?
    models = AIA.config.models
    models.map do |spec|
      if spec.is_a?(AIA::ModelSpec)
        spec.name
      elsif spec.is_a?(Hash)
        spec[:name] || spec['name'] || spec.to_s
      else
        spec.to_s
      end
    end.join(', ')
  else
    'unknown-model'
  end

  # Build MCP line based on connection status
  mcp_line = if !mcp_servers?
    ''  # No MCP servers configured
  elsif connected_mcp_servers?
    "MCP: #{mcp_server_names.join(', ')}"
  else
    "MCP: (none connected)"
  end

  puts <<-ROBOT

 ,      ,
 (\\____/) AI Assistant (v#{AIA::VERSION}) is Online
  (_oo_)   #{model_display}#{supports_tools? ? ' (supports tools)' : ''}
   (O)       using ruby_llm (v#{RubyLLM::VERSION}#{mcp_version})
 __||__    \\) model db was last refreshed on
     [/______\\]  /    #{models_last_refresh || 'unknown'}
    / \\__AI__/ \\/      #{user_tools? ? 'I will also use your tools' : (tools? ? 'You can share my tools' : 'I did not bring any tools')}
   /    /__\\              #{mcp_line}
  (\\   /____\\   #{user_tools? && tools? ? 'My Toolbox contains:' : ''}
  ROBOT
  if user_tools? && tools?
    tool_names = AIA.config.tool_names
    if tool_names && !tool_names.to_s.empty?
      puts WordWrapper::MinimumRaggedness.new(
          width,
          tool_names.to_s # String of tool names, comma separated
        ).wrap
        .split("\n")
        .map{|s| spaces+s+"\n"}
        .join
    end
  end
end

.supports_tools?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/aia/utility.rb', line 42

def supports_tools?
  AIA.client&.model&.supports_functions? || false
end

.tools?Boolean

Returns:

  • (Boolean)


8
9
10
# File 'lib/aia/utility.rb', line 8

def tools?
  AIA.config&.tool_names && !AIA.config.tool_names.empty?
end

.user_tools?Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/aia/utility.rb', line 12

def user_tools?
  AIA.config&.tools&.paths && !AIA.config.tools.paths.empty?
end