lex-tick 0.1.0 → 0.1.2

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: 4a3808a8152389198268ec0a2064aee1a4acdcf8fc7aa5593118e1cd7f82deda
4
- data.tar.gz: 770f22284ee087b9319597ebe194b34bcc4e1b17b901db13f4bc8d45b38a6d3c
3
+ metadata.gz: 2c43d91e3e248e80edb50cd4ce88df3bf8c3ec2e5e0c3c2d61d96d593aa2d971
4
+ data.tar.gz: 700731bed7b0c25f358eec18241d8b0f1265c0ce055eeffdebb9c4193f684cff
5
5
  SHA512:
6
- metadata.gz: 80498e4cfb7859876f8efb0e72ad89bad390f307d56f7a27dea617092f946d828db57522591af4629a3fe00e6c1ae279e7effca892a35cb5d14fe4085ad5eb3d
7
- data.tar.gz: f9a62ee7072446e4c0caf5b55c05fff8d12323ab3619fb7d9c923e0e252649ec9acab3d287f46a1358b6298ecb7285e519499838bf6e6c0b3c1f66b36c7662a6
6
+ metadata.gz: 0b4431b0b4cee44228b8d6adb96044b219160b2415a144912d97fd3d95e24dcf245836e482d2edccd48e3e5d59dbef1201f01d86bbe7db23010db1817462fca4
7
+ data.tar.gz: ebb2a1f9835e8749d23c96e24a266a78ddcbd04af712e9b77d4fb775a0e6fa84243f914ff53b529624b332ef304f94b4f7d8f179349507a0903973dc6d4bfad1
data/Gemfile CHANGED
@@ -7,4 +7,4 @@ gemspec
7
7
  gem 'rspec', '~> 3.13'
8
8
  gem 'rubocop', '~> 1.75', require: false
9
9
 
10
- gem 'legion-gaia', path: '../../legion-gaia'
10
+ gem 'legion-gaia'
data/lex-tick.gemspec CHANGED
@@ -25,5 +25,4 @@ Gem::Specification.new do |spec|
25
25
  Dir.glob('{lib,spec}/**/*') + %w[lex-tick.gemspec Gemfile]
26
26
  end
27
27
  spec.require_paths = ['lib']
28
- spec.add_development_dependency 'legion-gaia'
29
28
  end
@@ -9,37 +9,16 @@ module Legion
9
9
  Legion::Extensions::Helpers.const_defined?(:Lex)
10
10
 
11
11
  def execute_tick(signals: [], phase_handlers: {}, **)
12
- state = tick_state
13
- state.increment_tick
14
-
15
- max_salience = signals.map { |s| s.is_a?(Hash) ? (s[:salience] || 0.0) : 0.0 }.max || 0.0
16
- state.record_signal(salience: max_salience) unless signals.empty?
17
-
18
- Legion::Logging.debug "[tick] ##{state.tick_count} starting | mode=#{state.mode} signals=#{signals.size} max_salience=#{max_salience.round(2)}"
19
-
20
- transition = evaluate_mode_transition(signals: signals)
21
- if transition[:transitioned]
22
- Legion::Logging.info "[tick] mode transition: #{transition[:previous_mode]} -> #{transition[:new_mode]} (#{transition[:reason]})"
12
+ if defined?(Legion::Telemetry::OpenInference)
13
+ state = tick_state
14
+ Legion::Telemetry::OpenInference.agent_span(
15
+ name: "tick-#{state.tick_count + 1}", mode: state.mode,
16
+ phase_count: Helpers::Constants.phases_for_mode(state.mode).size,
17
+ budget_ms: (Helpers::Constants.tick_budget(state.mode) * 1000).round
18
+ ) { |_span| execute_tick_impl(signals: signals, phase_handlers: phase_handlers) }
19
+ else
20
+ execute_tick_impl(signals: signals, phase_handlers: phase_handlers)
23
21
  end
24
-
25
- phases = Helpers::Constants.phases_for_mode(state.mode)
26
- budget = Helpers::Constants.tick_budget(state.mode)
27
- start_time = Time.now.utc
28
- ctx = { budget: budget, start_time: start_time, phase_handlers: phase_handlers, signals: signals }
29
- results = run_phases(phases, state, ctx)
30
-
31
- total_elapsed = Time.now.utc - start_time
32
- skipped = phases - results.keys
33
- log_tick_complete(state, results, phases, total_elapsed, skipped)
34
-
35
- {
36
- tick_number: state.tick_count,
37
- mode: state.mode,
38
- phases_executed: results.keys,
39
- phases_skipped: skipped,
40
- results: results,
41
- elapsed: total_elapsed
42
- }
43
22
  end
44
23
 
45
24
  def evaluate_mode_transition(signals: [], emergency: nil, dream_complete: false, **) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@@ -121,6 +100,40 @@ module Legion
121
100
 
122
101
  private
123
102
 
103
+ def execute_tick_impl(signals:, phase_handlers:)
104
+ state = tick_state
105
+ state.increment_tick
106
+
107
+ max_salience = signals.map { |s| s.is_a?(Hash) ? (s[:salience] || 0.0) : 0.0 }.max || 0.0
108
+ state.record_signal(salience: max_salience) unless signals.empty?
109
+
110
+ Legion::Logging.debug "[tick] ##{state.tick_count} starting | mode=#{state.mode} signals=#{signals.size} max_salience=#{max_salience.round(2)}"
111
+
112
+ transition = evaluate_mode_transition(signals: signals)
113
+ if transition[:transitioned]
114
+ Legion::Logging.info "[tick] mode transition: #{transition[:previous_mode]} -> #{transition[:new_mode]} (#{transition[:reason]})"
115
+ end
116
+
117
+ phases = Helpers::Constants.phases_for_mode(state.mode)
118
+ budget = Helpers::Constants.tick_budget(state.mode)
119
+ start_time = Time.now.utc
120
+ ctx = { budget: budget, start_time: start_time, phase_handlers: phase_handlers, signals: signals }
121
+ results = run_phases(phases, state, ctx)
122
+
123
+ total_elapsed = Time.now.utc - start_time
124
+ skipped = phases - results.keys
125
+ log_tick_complete(state, results, phases, total_elapsed, skipped)
126
+
127
+ {
128
+ tick_number: state.tick_count,
129
+ mode: state.mode,
130
+ phases_executed: results.keys,
131
+ phases_skipped: skipped,
132
+ results: results,
133
+ elapsed: total_elapsed
134
+ }
135
+ end
136
+
124
137
  def run_phases(phases, state, ctx)
125
138
  results = {}
126
139
  budget = ctx[:budget]
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Tick
6
- VERSION = '0.1.0'
6
+ VERSION = '0.1.2'
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe 'Orchestrator OpenInference instrumentation' do
6
+ let(:host) { Object.new.extend(Legion::Extensions::Tick::Runners::Orchestrator) }
7
+
8
+ before do
9
+ stub_const('Legion::Telemetry::OpenInference', Module.new do
10
+ def self.open_inference_enabled?
11
+ true
12
+ end
13
+
14
+ def self.agent_span(**)
15
+ yield(nil)
16
+ end
17
+ end)
18
+ end
19
+
20
+ describe '#execute_tick' do
21
+ it 'wraps tick execution in agent_span' do
22
+ expect(Legion::Telemetry::OpenInference).to receive(:agent_span)
23
+ .with(hash_including(name: kind_of(String), mode: kind_of(Symbol)))
24
+ .and_yield(nil)
25
+
26
+ host.execute_tick(signals: [], phase_handlers: {})
27
+ end
28
+
29
+ it 'works without OpenInference loaded' do
30
+ hide_const('Legion::Telemetry::OpenInference')
31
+ result = host.execute_tick(signals: [], phase_handlers: {})
32
+ expect(result[:tick_number]).to eq(1)
33
+ end
34
+ end
35
+ end
metadata CHANGED
@@ -1,28 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-tick
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
8
8
  bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
- dependencies:
12
- - !ruby/object:Gem::Dependency
13
- name: legion-gaia
14
- requirement: !ruby/object:Gem::Requirement
15
- requirements:
16
- - - ">="
17
- - !ruby/object:Gem::Version
18
- version: '0'
19
- type: :development
20
- prerelease: false
21
- version_requirements: !ruby/object:Gem::Requirement
22
- requirements:
23
- - - ">="
24
- - !ruby/object:Gem::Version
25
- version: '0'
11
+ dependencies: []
26
12
  description: Atomic cognitive processing cycle (11 phases, 3 modes) for brain-modeled
27
13
  agentic AI
28
14
  email:
@@ -44,6 +30,7 @@ files:
44
30
  - spec/legion/extensions/tick/client_spec.rb
45
31
  - spec/legion/extensions/tick/helpers/constants_spec.rb
46
32
  - spec/legion/extensions/tick/helpers/state_spec.rb
33
+ - spec/legion/extensions/tick/runners/orchestrator_open_inference_spec.rb
47
34
  - spec/legion/extensions/tick/runners/orchestrator_spec.rb
48
35
  - spec/spec_helper.rb
49
36
  homepage: https://github.com/LegionIO/lex-tick