Class: Agents::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/agents/registry.rb

Overview

Loads named agent definitions from Markdown files and provides lookup. Scans two directories:

1. Built-in agents shipped with Anima (agents/ in the gem root)
2. User-defined agents (~/.anima/agents/)

User agents override built-in ones when names collide.

Constant Summary collapse

BUILTIN_DIR =
File.expand_path("../../agents", __dir__).freeze
USER_DIR =
File.expand_path("~/.anima/agents").freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRegistry

Returns a new instance of Registry.



16
17
18
# File 'lib/agents/registry.rb', line 16

def initialize
  @agents = {}
end

Instance Attribute Details

#agentsHash{String => Definition} (readonly)

Returns loaded definitions keyed by name.

Returns:

  • (Hash{String => Definition})

    loaded definitions keyed by name



11
12
13
# File 'lib/agents/registry.rb', line 11

def agents
  @agents
end

Class Method Details

.instanceRegistry

Returns the global registry, lazily loaded on first access.

Returns:



23
24
25
# File 'lib/agents/registry.rb', line 23

def self.instance
  @instance ||= new.load_all
end

.reload!Registry

Reloads the global registry from disk.

Returns:



30
31
32
# File 'lib/agents/registry.rb', line 30

def self.reload!
  @instance = new.load_all
end

Instance Method Details

#any?Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/agents/registry.rb', line 81

def any?
  @agents.any?
end

#catalogHash{String => String}

Agent names and descriptions for inclusion in tool documentation.

Returns:

  • (Hash{String => String})

    name => description



71
72
73
# File 'lib/agents/registry.rb', line 71

def catalog
  @agents.transform_values(&:description)
end

#get(name) ⇒ Definition?

Looks up a named agent definition.

Parameters:

  • name (String)

    agent name

Returns:



64
65
66
# File 'lib/agents/registry.rb', line 64

def get(name)
  @agents[name]
end

#load_allself

Loads definitions from both built-in and user directories. User definitions override built-in ones with the same name.

Returns:

  • (self)


38
39
40
41
42
# File 'lib/agents/registry.rb', line 38

def load_all
  load_directory(BUILTIN_DIR)
  load_directory(USER_DIR) unless Rails.env.test?
  self
end

#load_directory(dir) ⇒ void

This method returns an undefined value.

Loads agent definitions from a single directory.

Parameters:

  • dir (String)

    directory path to scan for .md files



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/agents/registry.rb', line 48

def load_directory(dir)
  return unless Dir.exist?(dir)

  Dir.glob(File.join(dir, "*.md")).sort.each do |path|
    definition = Definition.from_file(path)
    validate_tools!(definition.name, definition.tools)
    @agents[definition.name] = definition
  rescue InvalidDefinitionError => error
    warn "Skipping invalid agent definition #{path}: #{error.message}"
  end
end

#namesArray<String>

Returns registered agent names.

Returns:

  • (Array<String>)

    registered agent names



76
77
78
# File 'lib/agents/registry.rb', line 76

def names
  @agents.keys
end

#sizeInteger

Returns:

  • (Integer)


86
87
88
# File 'lib/agents/registry.rb', line 86

def size
  @agents.size
end