Module: Legion::Settings::Extensions

Defined in:
lib/legion/settings/extensions.rb,
lib/legion/settings/extensions/store.rb,
lib/legion/settings/extensions/filter.rb,
lib/legion/settings/extensions/normalizer.rb

Overview

Thread-safe runtime registry for extensions, runners, and tools.

Used by the LegionIO boot pipeline to register discovered extensions, their runner modules, and individual tools. Consumers (legion-mcp, legion-llm, legion-rbac, API) read from this registry at runtime.

Each store is a Concurrent::Map-backed Store instance. Read operations return frozen duplicates so callers cannot mutate registry internals.

Defined Under Namespace

Modules: Filter, Normalizer Classes: Store

Class Method Summary collapse

Class Method Details

.extension_countObject


Counts




116
117
118
# File 'lib/legion/settings/extensions.rb', line 116

def extension_count
  @extension_store.size
end

.extensionsObject


Query (called by legion-mcp, legion-llm, legion-rbac, API)




50
51
52
# File 'lib/legion/settings/extensions.rb', line 50

def extensions
  @extension_store.all
end

.filter_extensions(**criteria) ⇒ Object



81
82
83
84
85
86
# File 'lib/legion/settings/extensions.rb', line 81

def filter_extensions(**criteria)
  entries = @extension_store.all.map(&:dup)
  result = Filter.apply_extension_filters(entries, criteria)
  result.each(&:freeze)
  result.freeze
end

.filter_tools(**criteria) ⇒ Object



74
75
76
77
78
79
# File 'lib/legion/settings/extensions.rb', line 74

def filter_tools(**criteria)
  entries = @tool_store.all.map(&:dup)
  result = Filter.apply_tool_filters(entries, criteria, extension_store: @extension_store)
  result.each(&:freeze)
  result.freeze
end

.find_extension(name) ⇒ Object



62
63
64
# File 'lib/legion/settings/extensions.rb', line 62

def find_extension(name)
  @extension_store.find(name)
end

.find_runner(name) ⇒ Object



66
67
68
# File 'lib/legion/settings/extensions.rb', line 66

def find_runner(name)
  @runner_store.find(name)
end

.find_tool(name) ⇒ Object



70
71
72
# File 'lib/legion/settings/extensions.rb', line 70

def find_tool(name)
  @tool_store.find(name)
end

.register_extension(name, metadata = {}) ⇒ Object


Registration (called during LegionIO boot pipeline)




27
28
29
30
# File 'lib/legion/settings/extensions.rb', line 27

def register_extension(name,  = {})
  normalized = Normalizer.normalize_extension(name, )
  @extension_store.register(name, normalized)
end

.register_runner(name, metadata = {}) ⇒ Object



32
33
34
35
# File 'lib/legion/settings/extensions.rb', line 32

def register_runner(name,  = {})
  normalized = Normalizer.normalize_runner(name, )
  @runner_store.register(name, normalized)
end

.register_tool(name, metadata = {}) ⇒ Object



37
38
39
40
# File 'lib/legion/settings/extensions.rb', line 37

def register_tool(name,  = {})
  normalized = Normalizer.normalize_tool(name, )
  @tool_store.register(name, normalized)
end

.reset!Object



106
107
108
109
110
# File 'lib/legion/settings/extensions.rb', line 106

def reset!
  @extension_store.clear
  @runner_store.clear
  @tool_store.clear
end

.runner_countObject



120
121
122
# File 'lib/legion/settings/extensions.rb', line 120

def runner_count
  @runner_store.size
end

.runnersObject



54
55
56
# File 'lib/legion/settings/extensions.rb', line 54

def runners
  @runner_store.all
end

.tool_countObject



124
125
126
# File 'lib/legion/settings/extensions.rb', line 124

def tool_count
  @tool_store.size
end

.toolsObject



58
59
60
# File 'lib/legion/settings/extensions.rb', line 58

def tools
  @tool_store.all
end

.transition(name, state, **extra) ⇒ Object



42
43
44
# File 'lib/legion/settings/extensions.rb', line 42

def transition(name, state, **extra)
  @extension_store.update(name, state: state, transitioned_at: Time.now, **extra)
end

.unregister_extension(name) ⇒ Object


Lifecycle




92
93
94
95
96
97
98
99
100
# File 'lib/legion/settings/extensions.rb', line 92

def unregister_extension(name)
  removed = @extension_store.delete(name)
  return nil unless removed

  key = name.to_s
  @runner_store.delete_where { |v| v[:extension].to_s == key }
  @tool_store.delete_where { |v| v[:extension].to_s == key }
  removed
end

.unregister_tool(name) ⇒ Object



102
103
104
# File 'lib/legion/settings/extensions.rb', line 102

def unregister_tool(name)
  @tool_store.delete(name)
end