Module: Legion::Settings::AgentLoader

Extended by:
Logging::Helper
Defined in:
lib/legion/settings/agent_loader.rb

Constant Summary collapse

EXTENSIONS =
%w[.yaml .yml .json].freeze
GLOB =
'*.{yaml,yml,json}'

Class Method Summary collapse

Class Method Details

.load_agents(directory) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/legion/settings/agent_loader.rb', line 16

def load_agents(directory)
  return [] unless directory && Dir.exist?(directory)

  Dir.glob(File.join(directory, GLOB)).filter_map do |path|
    definition = load_file(path)
    next unless definition && valid?(definition)

    log.debug("Agent loaded: #{definition[:name]} (#{path})")
    definition.merge(_source_path: path, _source_mtime: File.mtime(path))
  end
end

.load_file(path) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# File 'lib/legion/settings/agent_loader.rb', line 28

def load_file(path)
  content = File.read(path)
  case File.extname(path).downcase
  when '.yaml', '.yml' then YAML.safe_load(content, symbolize_names: true)
  when '.json'         then ::JSON.parse(content, symbolize_names: true)
  end
rescue StandardError => e
  log.warn("Failed to parse agent file #{path}: #{e.message}")
  nil
end

.valid?(definition) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
44
45
46
# File 'lib/legion/settings/agent_loader.rb', line 39

def valid?(definition)
  return false unless definition.is_a?(Hash)
  return false unless definition[:name].is_a?(String) && !definition[:name].empty?
  return false unless definition.dig(:runner, :functions).is_a?(Array)
  return false if definition[:runner][:functions].empty?

  true
end