Module: RubyLLM::MCP::Extensions::Registry

Defined in:
lib/ruby_llm/mcp/extensions/registry.rb

Class Method Summary collapse

Class Method Details

.canonicalize_id(id) ⇒ Object



9
10
11
12
13
14
15
16
# File 'lib/ruby_llm/mcp/extensions/registry.rb', line 9

def canonicalize_id(id)
  return nil if id.nil?

  normalized = id.to_s.strip
  return nil if normalized.empty?

  Constants::EXTENSION_ALIASES.fetch(normalized, normalized)
end

.deep_merge_hashes(base_hash, override_hash) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/ruby_llm/mcp/extensions/registry.rb', line 69

def deep_merge_hashes(base_hash, override_hash)
  merged = base_hash.dup

  override_hash.each do |key, value|
    merged[key] = if merged[key].is_a?(Hash) && value.is_a?(Hash)
                    deep_merge_hashes(merged[key], value)
                  else
                    deep_stringify_keys(value)
                  end
  end

  merged
end

.deep_merge_values(base_value, override_value) ⇒ Object



37
38
39
40
41
42
43
# File 'lib/ruby_llm/mcp/extensions/registry.rb', line 37

def deep_merge_values(base_value, override_value)
  if base_value.is_a?(Hash) && override_value.is_a?(Hash)
    deep_merge_hashes(base_value, override_value)
  else
    normalize_value(override_value)
  end
end

.deep_stringify_keys(value) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/ruby_llm/mcp/extensions/registry.rb', line 56

def deep_stringify_keys(value)
  case value
  when Hash
    value.each_with_object({}) do |(key, nested_value), acc|
      acc[key.to_s] = deep_stringify_keys(nested_value)
    end
  when Array
    value.map { |item| deep_stringify_keys(item) }
  else
    value
  end
end

.merge(global_extensions, client_extensions) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/ruby_llm/mcp/extensions/registry.rb', line 29

def merge(global_extensions, client_extensions)
  merged = normalize_map(global_extensions)
  normalize_map(client_extensions).each do |id, config|
    merged[id] = deep_merge_values(merged[id], config)
  end
  merged
end

.normalize_map(value) ⇒ Object



18
19
20
21
22
23
24
25
26
27
# File 'lib/ruby_llm/mcp/extensions/registry.rb', line 18

def normalize_map(value)
  return {} unless value.is_a?(Hash)

  value.each_with_object({}) do |(id, config), acc|
    canonical_id = canonicalize_id(id)
    next if canonical_id.nil?

    acc[canonical_id] = normalize_value(config)
  end
end

.normalize_value(value) ⇒ Object



45
46
47
48
49
50
51
52
53
54
# File 'lib/ruby_llm/mcp/extensions/registry.rb', line 45

def normalize_value(value)
  case value
  when nil
    {}
  when Hash
    deep_stringify_keys(value)
  else
    value
  end
end