Module: Legion::Gaia::PhaseWiring

Defined in:
lib/legion/gaia/phase_wiring.rb

Constant Summary collapse

PHASE_MAP =
{
  sensory_processing: { ext: :Attention, runner: :Attention, fn: :filter_signals },
  emotional_evaluation: { ext: :Emotion, runner: :Valence,       fn: :evaluate_valence },
  memory_retrieval: { ext: :Memory, runner: :Traces, fn: :retrieve_and_reinforce },
  knowledge_retrieval: { ext: :Apollo, runner: :Knowledge, fn: :retrieve_relevant },
  identity_entropy_check: { ext: :Identity, runner: :Identity, fn: :check_entropy },
  working_memory_integration: [
    { ext: :Curiosity, runner: :Curiosity,   fn: :detect_gaps },
    { ext: :Synapse,   runner: :GaiaReport,  fn: :gaia_summary }
  ],
  procedural_check: { ext: :Coldstart, runner: :Coldstart, fn: :coldstart_progress },
  prediction_engine: { ext: :Prediction, runner: :Prediction, fn: :predict },
  mesh_interface: { ext: :Mesh, runner: :Mesh, fn: :mesh_status },
  gut_instinct: { ext: :Emotion, runner: :Gut, fn: :gut_instinct },
  action_selection: { ext: :Volition, runner: :Volition, fn: :form_intentions },
  memory_consolidation: { ext: :Memory, runner: :Consolidation, fn: :decay_cycle },
  post_tick_reflection: [
    { ext: :Reflection, runner: :Reflection,  fn: :reflect },
    { ext: :Synapse,    runner: :GaiaReport,  fn: :gaia_reflection }
  ],

  # Dream cycle phases
  memory_audit: { ext: :Memory, runner: :Traces, fn: :retrieve_ranked },
  association_walk: { ext: :Memory, runner: :Consolidation, fn: :hebbian_link },
  contradiction_resolution: { ext: :Conflict, runner: :Conflict, fn: :active_conflicts },
  agenda_formation: { ext: :Curiosity, runner: :Curiosity, fn: :form_agenda },
  consolidation_commit: { ext: :Memory, runner: :Consolidation, fn: :migrate_tier },
  dream_reflection: { ext: :Reflection, runner: :Reflection, fn: :reflect },
  dream_narration: { ext: :Narrator, runner: :Narrator, fn: :narrate }
}.freeze
PHASE_ARGS =
{
  sensory_processing: lambda { |ctx|
    { signals: ctx[:signals] || [],
      active_wonders: ctx.dig(:prior_results, :agenda_formation, :agenda) || [] }
  },
  emotional_evaluation: ->(ctx) { { signal: ctx[:current_signal] || {}, source_type: :ambient } },
  memory_retrieval: ->(_ctx) { { limit: 10 } },
  knowledge_retrieval: lambda { |ctx|
    current_signal = ctx[:signals]&.last
    memory_results = ctx.dig(:prior_results, :memory_retrieval)

    if current_signal.nil? || (memory_results.is_a?(Hash) &&
       memory_results[:traces]&.any? { |t| t[:strength].to_f > 0.8 })
      return { skip: true }
    end

    {
      query: current_signal[:content] || current_signal.to_s,
      limit: 5,
      min_confidence: 0.3,
      tags: current_signal[:tags]
    }
  },
  identity_entropy_check: ->(_ctx) { {} },
  procedural_check: ->(_ctx) { {} },
  prediction_engine: ->(ctx) { { mode: :functional_mapping, context: ctx[:prior_results] || {} } },
  mesh_interface: ->(_ctx) { {} },
  gut_instinct: ->(ctx) { { valences: ctx[:valences] || [] } },
  action_selection: ->(ctx) { { tick_results: ctx[:prior_results] || {}, cognitive_state: {} } },
  working_memory_integration: ->(ctx) { { prior_results: ctx[:prior_results] || {} } },
  memory_consolidation: ->(_ctx) { {} },
  post_tick_reflection: ->(ctx) { { tick_results: ctx[:prior_results] || {} } },
  memory_audit: ->(_ctx) { { limit: 20 } },
  association_walk: lambda { |ctx|
    audit = ctx.dig(:prior_results, :memory_audit)
    traces = audit.is_a?(Hash) ? audit[:traces] : nil
    traces = [] unless traces.is_a?(Array) && traces.size >= 2
    { trace_id_a: traces.dig(0, :trace_id), trace_id_b: traces.dig(1, :trace_id) }
  },
  contradiction_resolution: ->(_ctx) { {} },
  agenda_formation: ->(_ctx) { {} },
  consolidation_commit: ->(_ctx) { {} },
  dream_reflection: ->(ctx) { { tick_results: ctx[:prior_results] || {} } },
  dream_narration: lambda { |ctx|
    { tick_results: ctx[:prior_results] || {}, cognitive_state: { source: :dream } }
  }
}.freeze

Class Method Summary collapse

Class Method Details

.build_phase_handlers(runner_instances) ⇒ Object



103
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
# File 'lib/legion/gaia/phase_wiring.rb', line 103

def build_phase_handlers(runner_instances)
  handlers = {}

  PHASE_MAP.each do |phase, value|
    next if value.nil?

    maps = mappings_for(value)
    active = maps.filter_map do |mapping|
      instance_key = :"#{mapping[:ext]}_#{mapping[:runner]}"
      instance = runner_instances[instance_key]
      next unless instance

      { instance: instance, fn: mapping[:fn] }
    end
    next if active.empty?

    arg_builder = PHASE_ARGS[phase]

    handlers[phase] = lambda { |state:, signals:, prior_results:|
      ctx = { state: state, signals: signals, prior_results: prior_results,
              current_signal: signals&.last, valences: collect_valences(prior_results) }
      args = arg_builder ? arg_builder.call(ctx) : {}
      results = active.map { |h| h[:instance].send(h[:fn], **args) }
      results.size == 1 ? results.first : results
    }
  end

  handlers
end

.collect_valences(prior_results) ⇒ Object



151
152
153
154
155
156
157
158
# File 'lib/legion/gaia/phase_wiring.rb', line 151

def collect_valences(prior_results)
  return [] unless prior_results.is_a?(Hash)

  valence_result = prior_results[:emotional_evaluation]
  return [] unless valence_result.is_a?(Hash) && valence_result[:valence]

  [valence_result[:valence]]
end

.discover_available_extensionsObject



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/legion/gaia/phase_wiring.rb', line 133

def discover_available_extensions
  available = {}

  PHASE_MAP.each_value do |value|
    next if value.nil?

    mappings_for(value).each do |mapping|
      key = :"#{mapping[:ext]}_#{mapping[:runner]}"
      next if available.key?(key)

      runner_class = resolve_runner_class(mapping[:ext], mapping[:runner])
      available[key] = { ext: mapping[:ext], runner: mapping[:runner], loaded: !runner_class.nil? }
    end
  end

  available
end

.mappings_for(value) ⇒ Object



99
100
101
# File 'lib/legion/gaia/phase_wiring.rb', line 99

def mappings_for(value)
  value.is_a?(Array) ? value : [value]
end

.resolve_runner_class(ext_sym, runner_sym) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/legion/gaia/phase_wiring.rb', line 87

def resolve_runner_class(ext_sym, runner_sym)
  return nil unless Legion::Extensions.const_defined?(ext_sym)

  ext_mod = Legion::Extensions.const_get(ext_sym)
  return nil unless ext_mod.const_defined?(:Runners)

  runners_mod = ext_mod.const_get(:Runners)
  return nil unless runners_mod.const_defined?(runner_sym)

  runners_mod.const_get(runner_sym)
end