Class: KairosMcp::StateCommit::ManifestBuilder
- Inherits:
-
Object
- Object
- KairosMcp::StateCommit::ManifestBuilder
- Defined in:
- lib/kairos_mcp/state_commit/manifest_builder.rb
Overview
ManifestBuilder: Generates manifests for L0/L1/L2 layers
A manifest contains:
-
List of skills/knowledge/contexts with their hashes
-
Combined hash for the entire layer
-
Metadata about the layer state
Instance Method Summary collapse
-
#build_full_manifest ⇒ Hash
Build full manifest for all layers.
-
#build_l0_manifest ⇒ Hash
Build manifest for L0 (Kairos meta-skills).
-
#build_l1_manifest ⇒ Hash
Build manifest for L1 (Knowledge layer).
-
#build_l2_manifest ⇒ Hash
Build manifest for L2 (Context layer).
-
#initialize(user_context: nil) ⇒ ManifestBuilder
constructor
A new instance of ManifestBuilder.
Constructor Details
#initialize(user_context: nil) ⇒ ManifestBuilder
Returns a new instance of ManifestBuilder.
18 19 20 21 22 |
# File 'lib/kairos_mcp/state_commit/manifest_builder.rb', line 18 def initialize(user_context: nil) @user_context = user_context @knowledge_provider = nil @context_manager = nil end |
Instance Method Details
#build_full_manifest ⇒ Hash
Build full manifest for all layers
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/kairos_mcp/state_commit/manifest_builder.rb', line 139 def build_full_manifest l0 = build_l0_manifest l1 = build_l1_manifest l2 = build_l2_manifest manifest = { layers: { L0: l0, L1: l1, L2: l2 }, generated_at: Time.now.iso8601 } # Calculate combined hash from all layer manifest hashes combined_input = [ l0[:manifest_hash], l1[:manifest_hash], l2[:manifest_hash] ].join(':') manifest[:combined_hash] = Digest::SHA256.hexdigest(combined_input) manifest end |
#build_l0_manifest ⇒ Hash
Build manifest for L0 (Kairos meta-skills)
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/kairos_mcp/state_commit/manifest_builder.rb', line 27 def build_l0_manifest skills = [] # Parse skills from kairos.rb if File.exist?(KairosMcp.dsl_path) require_relative '../kairos' Kairos.skills.each do |skill| skills << { id: skill.id.to_s, version: skill.version, hash: calculate_skill_hash(skill) } end end # Calculate file hashes dsl_file_hash = file_hash(KairosMcp.dsl_path) md_file_hash = file_hash(KairosMcp.md_path) # Build manifest manifest = { dsl_file_hash: dsl_file_hash, md_file_hash: md_file_hash, skill_count: skills.size, skills: skills.sort_by { |s| s[:id] } } # Calculate combined manifest hash manifest[:manifest_hash] = calculate_manifest_hash(manifest) manifest end |
#build_l1_manifest ⇒ Hash
Build manifest for L1 (Knowledge layer)
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/kairos_mcp/state_commit/manifest_builder.rb', line 62 def build_l1_manifest knowledge_items = [] if File.directory?(KairosMcp.knowledge_dir) knowledge_provider.list.each do |item| skill = knowledge_provider.get(item[:name]) next unless skill content_hash = file_hash(skill.md_file_path) knowledge_items << { name: item[:name], version: item[:version], hash: content_hash, tags: item[:tags] || [] } end end # Also check for archived knowledge archived_items = [] knowledge_provider.list_archived.each do |item| archived_items << { name: item[:name], archived_at: item[:archived_at], hash: item[:content_hash] } end manifest = { knowledge_count: knowledge_items.size, archived_count: archived_items.size, knowledge: knowledge_items.sort_by { |k| k[:name] }, archived: archived_items.sort_by { |a| a[:name] } } manifest[:manifest_hash] = calculate_manifest_hash(manifest) manifest end |
#build_l2_manifest ⇒ Hash
Build manifest for L2 (Context layer)
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/kairos_mcp/state_commit/manifest_builder.rb', line 104 def build_l2_manifest sessions = [] if File.directory?(KairosMcp.context_dir) context_manager.list_sessions.each do |session| contexts = context_manager.list_contexts_in_session(session[:session_id]) # Calculate hash for session contents session_content = contexts.map do |ctx| { name: ctx[:name], description: ctx[:description] } end.sort_by { |c| c[:name] } sessions << { id: session[:session_id], context_count: contexts.size, hash: Digest::SHA256.hexdigest(session_content.to_json) } end end manifest = { session_count: sessions.size, sessions: sessions.sort_by { |s| s[:id] } } manifest[:manifest_hash] = calculate_manifest_hash(manifest) manifest end |