Class: Agentic::Extension::PluginManager

Inherits:
Object
  • Object
show all
Defined in:
lib/agentic/extension/plugin_manager.rb

Overview

The PluginManager coordinates third-party extension loading, registration, and lifecycle management. It provides a central registry for all extensions and ensures they conform to the extension contracts.

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ PluginManager

Initialize a new PluginManager

Parameters:

  • options (Hash) (defaults to: {})

    Configuration options for the plugin manager

Options Hash (options):

  • :logger (Logger)

    Custom logger instance

  • :auto_discovery (Boolean)

    Whether to automatically discover plugins

  • :plugin_paths (Array<String>)

    Additional paths to search for plugins



15
16
17
18
19
20
21
22
23
24
# File 'lib/agentic/extension/plugin_manager.rb', line 15

def initialize(options = {})
  @logger = options[:logger] || Agentic.logger
  @auto_discovery = options.fetch(:auto_discovery, true)
  @plugin_paths = options[:plugin_paths] || []
  @plugin_paths << default_plugin_path
  @plugins = {}
  @hooks = Hash.new { |h, k| h[k] = [] }

  discover_plugins if @auto_discovery
end

Instance Method Details

#disable(name) ⇒ Boolean

Disable a registered plugin

Parameters:

  • name (String)

    The name of the plugin to disable

Returns:

  • (Boolean)

    True if the plugin was disabled



80
81
82
83
84
85
86
# File 'lib/agentic/extension/plugin_manager.rb', line 80

def disable(name)
  return false unless @plugins.key?(name)

  @plugins[name][:enabled] = false
  @logger.info("Plugin '#{name}' disabled")
  true
end

#discover_pluginsInteger

Discover plugins in configured paths

Returns:

  • (Integer)

    The number of plugins discovered



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/agentic/extension/plugin_manager.rb', line 127

def discover_plugins
  return 0 unless @auto_discovery

  discovered = 0
  @plugin_paths.each do |path|
    Dir.glob(File.join(path, "*.rb")).each do |file|
      require file
      discovered += 1
    rescue => e
      @logger.error("Failed to load plugin from #{file}: #{e.message}")
    end
  end

  @logger.info("Discovered #{discovered} plugins")
  discovered
end

#enable(name) ⇒ Boolean

Enable a registered plugin

Parameters:

  • name (String)

    The name of the plugin to enable

Returns:

  • (Boolean)

    True if the plugin was enabled



68
69
70
71
72
73
74
# File 'lib/agentic/extension/plugin_manager.rb', line 68

def enable(name)
  return false unless @plugins.key?(name)

  @plugins[name][:enabled] = true
  @logger.info("Plugin '#{name}' enabled")
  true
end

#get(name) ⇒ Object?

Get a registered plugin by name

Parameters:

  • name (String)

    The name of the plugin to retrieve

Returns:

  • (Object, nil)

    The plugin or nil if not found or disabled



92
93
94
95
96
# File 'lib/agentic/extension/plugin_manager.rb', line 92

def get(name)
  return nil unless @plugins.key?(name) && @plugins[name][:enabled]

  @plugins[name][:instance]
end

#list(only_enabled: false) ⇒ Hash

List all registered plugins

Parameters:

  • only_enabled (Boolean) (defaults to: false)

    Only return enabled plugins

Returns:

  • (Hash)

    A hash of all registered plugins and their metadata



102
103
104
105
106
107
108
# File 'lib/agentic/extension/plugin_manager.rb', line 102

def list(only_enabled: false)
  if only_enabled
    @plugins.select { |_, data| data[:enabled] }
  else
    @plugins
  end
end

#register(name, plugin, metadata = {}) ⇒ Boolean

Register a plugin with the manager

Parameters:

  • name (String)

    The unique name of the plugin

  • plugin (Object)

    The plugin instance

  • metadata (Hash) (defaults to: {})

    Additional information about the plugin

Returns:

  • (Boolean)

    True if registration was successful



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/agentic/extension/plugin_manager.rb', line 32

def register(name, plugin,  = {})
  if @plugins.key?(name)
    @logger.warn("Plugin '#{name}' is already registered. Use force: true to override.")
    return false
  end

  unless valid_plugin?(plugin)
    @logger.error("Plugin '#{name}' does not conform to the plugin contract")
    return false
  end

  @plugins[name] = {
    instance: plugin,
    metadata: .merge(registered_at: Time.now),
    enabled: true
  }

  @logger.info("Plugin '#{name}' registered successfully")
  true
end

#register!(name, plugin, metadata = {}) ⇒ Boolean

Register a plugin with the manager, overriding any existing plugin with the same name

Parameters:

  • name (String)

    The unique name of the plugin

  • plugin (Object)

    The plugin instance

  • metadata (Hash) (defaults to: {})

    Additional information about the plugin

Returns:

  • (Boolean)

    True if registration was successful



59
60
61
62
# File 'lib/agentic/extension/plugin_manager.rb', line 59

def register!(name, plugin,  = {})
  @plugins.delete(name) if @plugins.key?(name)
  register(name, plugin, )
end

#register_hook(event) {|name, plugin| ... } ⇒ Boolean

Register a hook for plugin events

Parameters:

  • event (Symbol)

    The event to hook into (:after_register, :before_enable, :after_enable, :before_disable, :after_disable)

Yields:

  • (name, plugin)

    The callback to execute when the event occurs

Yield Parameters:

  • name (String)

    The name of the plugin

  • plugin (Object)

    The plugin instance

Returns:

  • (Boolean)

    True if the hook was registered



117
118
119
120
121
122
# File 'lib/agentic/extension/plugin_manager.rb', line 117

def register_hook(event, &callback)
  return false unless callback

  @hooks[event] << callback
  true
end