Class: KairosMcp::SkillsConfig

Inherits:
Object
  • Object
show all
Defined in:
lib/kairos_mcp/skills_config.rb

Constant Summary collapse

DEFAULTS =
{
  'enabled' => true,
  'evolution_enabled' => false,
  'max_evolutions_per_session' => 3,
  'require_human_approval' => true,
  'immutable_skills' => ['core_safety'],
  'layers' => {
    'L0_constitution' => { 'enabled' => true, 'mutable' => false },
    'L0_law' => { 'enabled' => true, 'mutable' => true, 'require_blockchain' => 'full' },
    'L1' => { 'enabled' => true, 'mutable' => true, 'require_blockchain' => 'hash_only' },
    'L2' => { 'enabled' => true, 'mutable' => true, 'require_blockchain' => 'none' }
  },
  'kairos_meta_skills' => %w[core_safety evolution_rules self_inspection chain_awareness]
}.freeze

Class Method Summary collapse

Class Method Details

.config_pathObject



22
23
24
# File 'lib/kairos_mcp/skills_config.rb', line 22

def self.config_path
  KairosMcp.skills_config_path
end

.disable!Object



47
48
49
50
51
# File 'lib/kairos_mcp/skills_config.rb', line 47

def self.disable!
  config = load
  config['enabled'] = false
  save(config)
end

.enabled?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'lib/kairos_mcp/skills_config.rb', line 39

def self.enabled?
  load['enabled']
end

.evolution_enabled?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/kairos_mcp/skills_config.rb', line 43

def self.evolution_enabled?
  load['evolution_enabled'] && enabled?
end

.file_configObject



148
149
150
# File 'lib/kairos_mcp/skills_config.rb', line 148

def self.file_config
  storage_config['file'] || {}
end

.immutable_skill?(skill_id) ⇒ Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/kairos_mcp/skills_config.rb', line 126

def self.immutable_skill?(skill_id)
  immutable_skills.include?(skill_id.to_s)
end

.immutable_skillsObject

Get immutable skills - prefers l0_governance skill if available



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/kairos_mcp/skills_config.rb', line 107

def self.immutable_skills
  if defined?(Kairos) && Kairos.respond_to?(:skill)
    governance_skill = Kairos.skill(:l0_governance)
    if governance_skill&.behavior
      begin
        config = governance_skill.behavior.call
        if config[:immutable_skills]
          return config[:immutable_skills].map(&:to_s)
        end
      rescue StandardError
        # Fall through to config.yml
      end
    end
  end
  
  # Fallback to config.yml
  load['immutable_skills'] || DEFAULTS['immutable_skills']
end

.kairos_meta_skill?(skill_id) ⇒ Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/kairos_mcp/skills_config.rb', line 102

def self.kairos_meta_skill?(skill_id)
  kairos_meta_skills.include?(skill_id.to_s)
end

.kairos_meta_skillsObject

Get allowed L0 skills - prefers l0_governance skill if available This implements Pure Agent Skill principle: L0 rules are in L0



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/kairos_mcp/skills_config.rb', line 82

def self.kairos_meta_skills
  # Try to get from l0_governance skill first (canonical source)
  if defined?(Kairos) && Kairos.respond_to?(:skill)
    governance_skill = Kairos.skill(:l0_governance)
    if governance_skill&.behavior
      begin
        config = governance_skill.behavior.call
        if config[:allowed_skills]
          return config[:allowed_skills].map(&:to_s)
        end
      rescue StandardError
        # Fall through to config.yml
      end
    end
  end
  
  # Fallback to config.yml (for bootstrapping)
  load['kairos_meta_skills'] || DEFAULTS['kairos_meta_skills']
end

.layer_blockchain_mode(layer) ⇒ Object



70
71
72
73
# File 'lib/kairos_mcp/skills_config.rb', line 70

def self.layer_blockchain_mode(layer)
  config = layer_config(layer)
  (config['require_blockchain'] || 'none').to_sym
end

.layer_config(layer) ⇒ Object

Layer-specific configuration methods



55
56
57
58
# File 'lib/kairos_mcp/skills_config.rb', line 55

def self.layer_config(layer)
  layers = load['layers'] || {}
  layers[layer.to_s] || {}
end

.layer_enabled?(layer) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
63
# File 'lib/kairos_mcp/skills_config.rb', line 60

def self.layer_enabled?(layer)
  config = layer_config(layer)
  config['enabled'] != false
end

.layer_mutable?(layer) ⇒ Boolean

Returns:

  • (Boolean)


65
66
67
68
# File 'lib/kairos_mcp/skills_config.rb', line 65

def self.layer_mutable?(layer)
  config = layer_config(layer)
  config['mutable'] == true
end

.layer_requires_approval?(layer) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
78
# File 'lib/kairos_mcp/skills_config.rb', line 75

def self.layer_requires_approval?(layer)
  config = layer_config(layer)
  config['require_human_approval'] == true
end

.loadObject



26
27
28
29
30
31
32
# File 'lib/kairos_mcp/skills_config.rb', line 26

def self.load
  return DEFAULTS.dup unless File.exist?(config_path)
  loaded = YAML.safe_load(File.read(config_path)) || {}
  DEFAULTS.merge(loaded)
rescue StandardError
  DEFAULTS.dup
end

.save(config) ⇒ Object



34
35
36
37
# File 'lib/kairos_mcp/skills_config.rb', line 34

def self.save(config)
  FileUtils.mkdir_p(File.dirname(config_path))
  File.write(config_path, config.to_yaml)
end

.sqlite_configObject



144
145
146
# File 'lib/kairos_mcp/skills_config.rb', line 144

def self.sqlite_config
  storage_config['sqlite'] || {}
end

.state_commit_auto_configObject



162
163
164
# File 'lib/kairos_mcp/skills_config.rb', line 162

def self.state_commit_auto_config
  state_commit_config['auto_commit'] || {}
end

.state_commit_auto_enabled?Boolean

Returns:

  • (Boolean)


166
167
168
# File 'lib/kairos_mcp/skills_config.rb', line 166

def self.state_commit_auto_enabled?
  state_commit_auto_config['enabled'] == true
end

.state_commit_configObject

State commit configuration



154
155
156
# File 'lib/kairos_mcp/skills_config.rb', line 154

def self.state_commit_config
  load['state_commit'] || {}
end

.state_commit_enabled?Boolean

Returns:

  • (Boolean)


158
159
160
# File 'lib/kairos_mcp/skills_config.rb', line 158

def self.state_commit_enabled?
  state_commit_config['enabled'] != false
end

.state_commit_max_snapshotsObject



174
175
176
# File 'lib/kairos_mcp/skills_config.rb', line 174

def self.state_commit_max_snapshots
  state_commit_config['max_snapshots'] || 100
end

.state_commit_snapshot_dirObject



170
171
172
# File 'lib/kairos_mcp/skills_config.rb', line 170

def self.state_commit_snapshot_dir
  state_commit_config['snapshot_dir'] || 'storage/snapshots'
end

.storage_backendObject



136
137
138
# File 'lib/kairos_mcp/skills_config.rb', line 136

def self.storage_backend
  storage_config['backend'] || 'file'
end

.storage_backend_sqlite?Boolean

Returns:

  • (Boolean)


140
141
142
# File 'lib/kairos_mcp/skills_config.rb', line 140

def self.storage_backend_sqlite?
  storage_backend == 'sqlite'
end

.storage_configObject

Storage backend configuration



132
133
134
# File 'lib/kairos_mcp/skills_config.rb', line 132

def self.storage_config
  load['storage'] || { 'backend' => 'file' }
end