legion-gaia 0.9.55 → 0.9.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab8bf4d2db554a118e3fb0b149bebb11d89474cf67896cfe1a2442636813694b
4
- data.tar.gz: 714d3941f76f84a5aab4e3f470b1c920de508514a2e2e02f00beee827eff2cc7
3
+ metadata.gz: adef7a7efb85417b7c5dca3f0918816897d66ad1b31c4b2db0f3d7eabfc01292
4
+ data.tar.gz: a06ed381354edf16234c55c41c9d378fc7146ed45775a8cd2bbeb9d9080a1bf0
5
5
  SHA512:
6
- metadata.gz: c8d260c1ffcd8d8e05a68169d3d7522131214232feeb44a2a2b5b5f16eef1bef59cda3e367d44bb4bf528ba2692ad057d093ed0eaee284b7254725f251405260
7
- data.tar.gz: f9d88b523709c8cac921300da1b863a24184ed31b1c2a32ec3a2272fa88d013b1c8dabc0c5e8922a67150d79f7a959bd275da9fa624b44915d0c5ccee9b134b5
6
+ metadata.gz: a0d096fc5d3ebd918074d517346b6d1a208909056a3b9c9b12048496f5255a3babb00ceb0b661b8bb389d1d13a17236dc1373dea64bd486297cfcaa08c528e45
7
+ data.tar.gz: 4e66482277f45c9ff1676c956b8f11cba50d88200a24ad04ec08b55ece4fd6b2e694aea4894e1ca0caca5cf24193662279c1e8e9a03c6cf941068445e955f884
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.56] - 2026-05-15
4
+
5
+ ### Fixed
6
+ - Preserve GAIA defaults while overlaying loaded `:gaia` settings so partial config hashes do not erase required keys like `heartbeat_interval` or `router`.
7
+ - Record partner interaction traces with scalar affect fields and separate structured valence context, preventing `String`/`Hash` values from crashing trace storage during ingest.
8
+
3
9
  ## [0.9.55] - 2026-05-11
4
10
 
5
11
  ### Fixed
@@ -79,11 +79,7 @@ module Legion
79
79
  end
80
80
 
81
81
  def offline_threshold
82
- if Legion.const_defined?(:Settings, false)
83
- Legion::Settings.dig(:gaia, :offline_threshold) || 60
84
- else
85
- 60
86
- end
82
+ Legion::Settings.dig(:gaia, :offline_threshold) || 60
87
83
  rescue StandardError => e
88
84
  handle_exception(e, level: :debug, operation: 'gaia.offline_handler.offline_threshold')
89
85
  60
@@ -285,7 +285,7 @@ module Legion
285
285
  end
286
286
 
287
287
  def knowledge_setting(key, default)
288
- return default unless defined?(Legion::Settings) && !Legion::Settings[:gaia].nil?
288
+ return default if Legion::Settings[:gaia].nil?
289
289
 
290
290
  Legion::Settings[:gaia].dig(:knowledge, key) || default
291
291
  rescue StandardError => e
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Gaia
5
- VERSION = '0.9.55'
5
+ VERSION = '0.9.56'
6
6
  end
7
7
  end
data/lib/legion/gaia.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'legion/json'
4
+ require 'legion/logging'
5
+ require 'legion/settings'
3
6
  require 'legion/gaia/version'
4
7
  require 'legion/gaia/tick_history'
5
8
  require 'legion/gaia/workflow'
@@ -133,11 +136,11 @@ module Legion
133
136
  end
134
137
 
135
138
  def settings
136
- if Legion.const_defined?('Settings', false)
137
- Legion::Settings[:gaia] || Legion::Gaia::Settings.default
138
- else
139
- Legion::Gaia::Settings.default
140
- end
139
+ defaults = Legion::Gaia::Settings.default
140
+ loaded = Legion::Settings[:gaia]
141
+ return defaults unless loaded.is_a?(Hash)
142
+
143
+ merge_settings_hashes(defaults, loaded)
141
144
  end
142
145
 
143
146
  def heartbeat(**)
@@ -539,6 +542,7 @@ module Legion
539
542
  def record_interaction_trace(observation)
540
543
  return unless defined?(Legion::Extensions::Agentic::Memory::Trace::Runners::Traces)
541
544
 
545
+ emotional_context = interaction_trace_emotional_context
542
546
  runner = Object.new
543
547
  runner.extend(Legion::Extensions::Agentic::Memory::Trace::Runners::Traces)
544
548
  trace_result = runner.store_trace(
@@ -548,11 +552,13 @@ module Legion
548
552
  channel: observation[:channel],
549
553
  direct_address: observation[:direct_address],
550
554
  bond_role: observation[:bond_role]
551
- },
555
+ }.tap do |payload|
556
+ payload[:emotional_context] = emotional_context if emotional_context
557
+ end,
552
558
  domain_tags: ['partner_interaction', observation[:channel].to_s],
553
559
  origin: :direct_experience,
554
- emotional_valence: @last_valences&.first&.inspect,
555
- emotional_intensity: 0.5,
560
+ emotional_valence: interaction_trace_emotional_valence(emotional_context),
561
+ emotional_intensity: interaction_trace_emotional_intensity(emotional_context),
556
562
  confidence: 0.8
557
563
  )
558
564
  log.info("[gaia] memory+ episodic trace=#{trace_result[:trace_id].to_s[0, 8]} " \
@@ -604,6 +610,33 @@ module Legion
604
610
  (Time.now.utc - @last_response_at).to_f
605
611
  end
606
612
 
613
+ def interaction_trace_emotional_context
614
+ context = @last_valences&.first
615
+ context.is_a?(Hash) ? context.dup : nil
616
+ end
617
+
618
+ def interaction_trace_emotional_valence(emotional_context)
619
+ raw = emotional_context || @last_valences&.first
620
+ return raw.to_f.clamp(-1.0, 1.0) if raw.is_a?(Numeric)
621
+
622
+ numeric = Float(raw)
623
+ numeric.clamp(-1.0, 1.0)
624
+ rescue ArgumentError, TypeError
625
+ 0.0
626
+ end
627
+
628
+ def interaction_trace_emotional_intensity(emotional_context)
629
+ compute_arousal(emotional_context) || 0.5
630
+ end
631
+
632
+ def merge_settings_hashes(base, override)
633
+ return override unless base.is_a?(Hash) && override.is_a?(Hash)
634
+
635
+ base.merge(override) do |_key, base_value, override_value|
636
+ merge_settings_hashes(base_value, override_value)
637
+ end
638
+ end
639
+
607
640
  def check_partner_absence(observations, phase_handlers)
608
641
  has_partner = observations.any? { |o| o[:bond_role] == :partner }
609
642
 
@@ -742,8 +775,8 @@ module Legion
742
775
  store = apollo_local_store
743
776
  return unless store
744
777
 
745
- TrackerPersistence.hydrate_all(store: store) if defined?(TrackerPersistence)
746
- BondRegistry.hydrate_from_apollo(store: store) if defined?(BondRegistry)
778
+ TrackerPersistence.hydrate_all(store: store)
779
+ BondRegistry.hydrate_from_apollo(store: store)
747
780
  log.info('Legion::Gaia hydrated trackers and bond registry from Apollo Local')
748
781
  rescue StandardError => e
749
782
  handle_exception(e, level: :warn, operation: 'gaia.hydrate_from_apollo_local')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legion-gaia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.55
4
+ version: 0.9.56
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity