lex-apollo 0.4.15 → 0.4.17

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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/lib/legion/extensions/apollo/actors/entity_watchdog.rb +2 -2
  4. data/lib/legion/extensions/apollo/actors/gas_subscriber.rb +3 -3
  5. data/lib/legion/extensions/apollo/actors/ingest.rb +3 -3
  6. data/lib/legion/extensions/apollo/actors/query_responder.rb +3 -3
  7. data/lib/legion/extensions/apollo/actors/writeback_store.rb +3 -3
  8. data/lib/legion/extensions/apollo/actors/writeback_vectorize.rb +3 -3
  9. data/lib/legion/extensions/apollo/helpers/capability.rb +1 -5
  10. data/lib/legion/extensions/apollo/helpers/confidence.rb +1 -5
  11. data/lib/legion/extensions/apollo/helpers/entity_watchdog.rb +1 -5
  12. data/lib/legion/extensions/apollo/helpers/similarity.rb +1 -5
  13. data/lib/legion/extensions/apollo/helpers/tag_normalizer.rb +1 -2
  14. data/lib/legion/extensions/apollo/helpers/writeback.rb +2 -6
  15. data/lib/legion/extensions/apollo/runners/entity_extractor.rb +1 -1
  16. data/lib/legion/extensions/apollo/runners/gas.rb +2 -6
  17. data/lib/legion/extensions/apollo/runners/knowledge.rb +15 -3
  18. data/lib/legion/extensions/apollo/runners/request.rb +2 -2
  19. data/lib/legion/extensions/apollo/transport/exchanges/apollo.rb +1 -1
  20. data/lib/legion/extensions/apollo/transport/exchanges/llm_audit.rb +1 -1
  21. data/lib/legion/extensions/apollo/transport/messages/ingest.rb +1 -1
  22. data/lib/legion/extensions/apollo/transport/messages/query.rb +1 -1
  23. data/lib/legion/extensions/apollo/transport/messages/writeback.rb +1 -1
  24. data/lib/legion/extensions/apollo/transport/queues/gas.rb +1 -1
  25. data/lib/legion/extensions/apollo/transport/queues/ingest.rb +1 -1
  26. data/lib/legion/extensions/apollo/transport/queues/query.rb +1 -1
  27. data/lib/legion/extensions/apollo/transport/queues/writeback_store.rb +1 -1
  28. data/lib/legion/extensions/apollo/transport/queues/writeback_vectorize.rb +1 -1
  29. data/lib/legion/extensions/apollo/version.rb +1 -1
  30. data/lib/legion/extensions/apollo.rb +2 -2
  31. metadata +19 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ceca94720adfd43b767ffce39d56db196ffd80f058e2ba1b2cea418a3c3352d
4
- data.tar.gz: f1bc79617fc28b3ab4694d0a588e6181bdcd3383e2ef67495aca98561769601d
3
+ metadata.gz: be66d0b628a4cb32bbc6c0b1c5bb31ee780ee22891713e860caddd324b61a507
4
+ data.tar.gz: a6355f876338f4a13ada80c6c9757e0b278d5060e3ef1fc1c4a3ca01005d120e
5
5
  SHA512:
6
- metadata.gz: d748fb7df989fb6021b0fcb2085f87adc651c6105c31ec15f55e6e2633abb9d5d7e0ffa01f71e62e6ee74e00ca55f60f223c382633c598ba4d49b0f4ef4816fb
7
- data.tar.gz: 8dfdeb0f6496bbad0cb63f8d90f0dae65b0e794b23b8a61b6a0bbfd486bbfac9565b95e3534a50cf50739a8ecb440d5620d79f05c18c6c1f1d690253f140698c
6
+ metadata.gz: a8f20b26534a6d71c82bdbc83a1e6cd0f9f6a058d938a488ea23185063d9f0f608e13df1751ac6c9f21bba744ff55607f658d152fe9aa77ead6d874cbc357920
7
+ data.tar.gz: dfa3e978328c63519a850aedaa66a9a45941755e70dfd9e903498469dac0d43fc436ed76c49721fa76cfd0a22831d96376f985f0365442d6aeb0ee21df73ff0b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.17] - 2026-04-03
4
+
5
+ ### Changed
6
+ - resolve rubocop Style/IfUnlessModifier offense in runners/knowledge.rb
7
+
8
+ ## [0.4.16] - 2026-03-30
9
+
10
+ ### Changed
11
+ - update to rubocop-legion 0.1.7, resolve all offenses
12
+
3
13
  ## [0.4.15] - 2026-03-28
4
14
 
5
15
  ### Changed
@@ -24,9 +24,9 @@ module Legion
24
24
  def check_subtask? = false
25
25
  def generate_task? = false
26
26
 
27
- def enabled?
27
+ def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
28
28
  defined?(Legion::Extensions::Apollo::Runners::EntityExtractor) &&
29
- defined?(Legion::Transport)
29
+ Legion.const_defined?(:Transport, false)
30
30
  rescue StandardError => e
31
31
  log.warn("EntityWatchdog enabled? check failed: #{e.message}")
32
32
  false
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/extensions/actors/subscription' if defined?(Legion::Extensions::Actors::Subscription)
3
+ require 'legion/extensions/actors/subscription'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -13,9 +13,9 @@ module Legion
13
13
  def generate_task? = false
14
14
  def use_runner? = false
15
15
 
16
- def enabled?
16
+ def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
17
17
  defined?(Legion::Extensions::Apollo::Runners::Gas) &&
18
- defined?(Legion::Transport)
18
+ Legion.const_defined?(:Transport, false)
19
19
  rescue StandardError => e
20
20
  log.warn("GasSubscriber enabled? check failed: #{e.message}")
21
21
  false
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/extensions/actors/subscription' if defined?(Legion::Extensions::Actors::Subscription)
3
+ require 'legion/extensions/actors/subscription'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -12,9 +12,9 @@ module Legion
12
12
  def check_subtask? = false
13
13
  def generate_task? = false
14
14
 
15
- def enabled?
15
+ def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
16
16
  defined?(Legion::Extensions::Apollo::Runners::Knowledge) &&
17
- defined?(Legion::Transport)
17
+ Legion.const_defined?(:Transport, false)
18
18
  rescue StandardError => e
19
19
  log.warn("Ingest enabled? check failed: #{e.message}")
20
20
  false
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/extensions/actors/subscription' if defined?(Legion::Extensions::Actors::Subscription)
3
+ require 'legion/extensions/actors/subscription'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -12,9 +12,9 @@ module Legion
12
12
  def check_subtask? = false
13
13
  def generate_task? = false
14
14
 
15
- def enabled?
15
+ def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
16
16
  defined?(Legion::Extensions::Apollo::Runners::Knowledge) &&
17
- defined?(Legion::Transport)
17
+ Legion.const_defined?(:Transport, false)
18
18
  rescue StandardError => e
19
19
  log.warn("QueryResponder enabled? check failed: #{e.message}")
20
20
  false
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/extensions/actors/subscription' if defined?(Legion::Extensions::Actors::Subscription)
3
+ require 'legion/extensions/actors/subscription'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -12,9 +12,9 @@ module Legion
12
12
  def check_subtask? = false
13
13
  def generate_task? = false
14
14
 
15
- def enabled?
15
+ def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
16
16
  defined?(Legion::Extensions::Apollo::Runners::Knowledge) &&
17
- defined?(Legion::Transport) &&
17
+ Legion.const_defined?(:Transport, false) &&
18
18
  Helpers::Capability.apollo_write_enabled?
19
19
  rescue StandardError => e
20
20
  log.warn("WritebackStore enabled? check failed: #{e.message}")
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/extensions/actors/subscription' if defined?(Legion::Extensions::Actors::Subscription)
3
+ require 'legion/extensions/actors/subscription'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -32,8 +32,8 @@ module Legion
32
32
  { success: false, error: e.message }
33
33
  end
34
34
 
35
- def enabled?
36
- defined?(Legion::Transport) && Helpers::Capability.can_embed?
35
+ def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
36
+ Legion.const_defined?(:Transport, false) && Helpers::Capability.can_embed?
37
37
  rescue StandardError => e
38
38
  log.warn("WritebackVectorize enabled? check failed: #{e.message}")
39
39
  false
@@ -10,11 +10,7 @@ module Legion
10
10
  module_function
11
11
 
12
12
  def log
13
- return Legion::Logging if defined?(Legion::Logging)
14
-
15
- @log ||= Object.new.tap do |nl|
16
- %i[debug info warn error fatal].each { |m| nl.define_singleton_method(m) { |*| nil } }
17
- end
13
+ Legion::Logging
18
14
  end
19
15
 
20
16
  def can_embed?
@@ -21,11 +21,7 @@ module Legion
21
21
  module_function
22
22
 
23
23
  def log
24
- return Legion::Logging if defined?(Legion::Logging)
25
-
26
- @log ||= Object.new.tap do |nl|
27
- %i[debug info warn error fatal].each { |m| nl.define_singleton_method(m) { |*| nil } }
28
- end
24
+ Legion::Logging
29
25
  end
30
26
 
31
27
  def apollo_setting(*keys, default:)
@@ -13,11 +13,7 @@ module Legion
13
13
 
14
14
  class << self
15
15
  def log
16
- return Legion::Logging if defined?(Legion::Logging)
17
-
18
- @log ||= Object.new.tap do |nl|
19
- %i[debug info warn error fatal].each { |m| nl.define_singleton_method(m) { |*| nil } }
20
- end
16
+ Legion::Logging
21
17
  end
22
18
 
23
19
  def detect_entities(text:, types: nil)
@@ -10,11 +10,7 @@ module Legion
10
10
  module_function
11
11
 
12
12
  def log
13
- return Legion::Logging if defined?(Legion::Logging)
14
-
15
- @log ||= Object.new.tap do |nl|
16
- %i[debug info warn error fatal].each { |m| nl.define_singleton_method(m) { |*| nil } }
17
- end
13
+ Legion::Logging
18
14
  end
19
15
 
20
16
  def cosine_similarity(vec_a:, vec_b:, **)
@@ -16,8 +16,7 @@ module Legion
16
16
  tag = raw.to_s.strip.downcase
17
17
  tag = ALIASES[tag] if ALIASES.key?(tag)
18
18
  tag = tag.gsub(/[^a-z0-9\- ]/, '')
19
- .gsub(/\s+/, '-')
20
- .gsub(/-+/, '-')
19
+ .gsub(/\s+/, '-').squeeze('-')
21
20
  .sub(/^-/, '')
22
21
  .sub(/-$/, '')
23
22
  tag.empty? ? nil : tag
@@ -15,11 +15,7 @@ module Legion
15
15
  module_function
16
16
 
17
17
  def log
18
- return Legion::Logging if defined?(Legion::Logging)
19
-
20
- @log ||= Object.new.tap do |nl|
21
- %i[debug info warn error fatal].each { |m| nl.define_singleton_method(m) { |*| nil } }
22
- end
18
+ Legion::Logging
23
19
  end
24
20
 
25
21
  def evaluate_and_route(request:, response:, enrichments: {})
@@ -96,7 +92,7 @@ module Legion
96
92
  end
97
93
 
98
94
  def publish_to_transport(payload, has_embedding: false)
99
- return unless defined?(Legion::Transport)
95
+ return unless Legion.const_defined?(:Transport, false)
100
96
 
101
97
  Transport::Messages::Writeback.new(
102
98
  **payload, has_embedding: has_embedding
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Apollo
6
6
  module Runners
7
- module EntityExtractor
7
+ module EntityExtractor # rubocop:disable Legion/Extension/RunnerIncludeHelpers
8
8
  DEFAULT_ENTITY_TYPES = %w[person service repository concept].freeze
9
9
  DEFAULT_MIN_CONFIDENCE = 0.7
10
10
 
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Apollo
6
6
  module Runners
7
- module Gas
7
+ module Gas # rubocop:disable Legion/Extension/RunnerIncludeHelpers
8
8
  RELATION_TYPES = %w[
9
9
  similar_to contradicts depends_on causes
10
10
  part_of supersedes supports_by extends
@@ -17,11 +17,7 @@ module Legion
17
17
  module_function
18
18
 
19
19
  def log
20
- return Legion::Logging if defined?(Legion::Logging)
21
-
22
- @log ||= Object.new.tap do |nl|
23
- %i[debug info warn error fatal].each { |m| nl.define_singleton_method(m) { |*| nil } }
24
- end
20
+ Legion::Logging
25
21
  end
26
22
 
27
23
  def json_load(str)
@@ -118,9 +118,10 @@ module Legion
118
118
  { success: false, error: e.message }
119
119
  end
120
120
 
121
- def handle_query(query:, limit: Helpers::GraphQuery.default_query_limit, min_confidence: Helpers::GraphQuery.default_query_min_confidence, status: [:confirmed], tags: nil, domain: nil, agent_id: 'unknown', **) # rubocop:disable Metrics/ParameterLists, Layout/LineLength
121
+ def handle_query(query:, limit: Helpers::GraphQuery.default_query_limit, min_confidence: Helpers::GraphQuery.default_query_min_confidence, status: [:confirmed], tags: nil, domain: nil, agent_id: 'unknown', **) # rubocop:disable Layout/LineLength
122
122
  return { success: false, error: 'apollo_data_not_available' } unless defined?(Legion::Data::Model::ApolloEntry)
123
123
 
124
+ query = normalize_text_input(query)
124
125
  embedding = embed_text(query)
125
126
  sql = Helpers::GraphQuery.build_semantic_search_sql(
126
127
  limit: limit, min_confidence: min_confidence,
@@ -223,14 +224,15 @@ module Legion
223
224
  { success: false, error: e.message }
224
225
  end
225
226
 
226
- def retrieve_relevant(query: nil, limit: Helpers::Confidence.apollo_setting(:query, :retrieval_limit, default: 5), min_confidence: Helpers::GraphQuery.default_query_min_confidence, tags: nil, domain: nil, skip: false, **) # rubocop:disable Metrics/ParameterLists, Layout/LineLength
227
+ def retrieve_relevant(query: nil, limit: Helpers::Confidence.apollo_setting(:query, :retrieval_limit, default: 5), min_confidence: Helpers::GraphQuery.default_query_min_confidence, tags: nil, domain: nil, skip: false, **) # rubocop:disable Layout/LineLength
227
228
  return { status: :skipped } if skip
228
229
 
229
230
  return { success: false, error: 'apollo_data_not_available' } unless defined?(Legion::Data::Model::ApolloEntry)
230
231
 
232
+ query = normalize_text_input(query)
231
233
  return { success: true, entries: [], count: 0 } if query.nil? || query.to_s.strip.empty?
232
234
 
233
- embedding = embed_text(query.to_s)
235
+ embedding = embed_text(query)
234
236
  sql = Helpers::GraphQuery.build_semantic_search_sql(
235
237
  limit: limit, min_confidence: min_confidence,
236
238
  statuses: ['confirmed'], tags: tags, domain: domain
@@ -313,6 +315,7 @@ module Legion
313
315
  private
314
316
 
315
317
  def embed_text(text)
318
+ text = normalize_text_input(text)
316
319
  result = Legion::LLM::Embeddings.generate(text: text)
317
320
  vector = result.is_a?(Hash) ? result[:vector] : result
318
321
  vector.is_a?(Array) && vector.any? ? vector : Array.new(1024, 0.0)
@@ -321,6 +324,15 @@ module Legion
321
324
  Array.new(1024, 0.0)
322
325
  end
323
326
 
327
+ def normalize_text_input(value)
328
+ return Legion::Apollo.send(:normalize_text_input, value) if defined?(Legion::Apollo) && Legion::Apollo.respond_to?(:normalize_text_input, true)
329
+
330
+ value.to_s
331
+ rescue StandardError => e
332
+ log.warn("Apollo Knowledge.normalize_text_input failed: #{e.message}")
333
+ value.to_s
334
+ end
335
+
324
336
  def allowed_domains_for(target_domain)
325
337
  rules = if defined?(Legion::Settings) && Legion::Settings.dig(:apollo, :domain_isolation)
326
338
  Legion::Settings.dig(:apollo, :domain_isolation)
@@ -11,7 +11,7 @@ module Legion
11
11
  false
12
12
  end
13
13
 
14
- def query(text:, limit: Helpers::GraphQuery.default_query_limit, min_confidence: Helpers::GraphQuery.default_query_min_confidence, tags: nil, # rubocop:disable Metrics/ParameterLists
14
+ def query(text:, limit: Helpers::GraphQuery.default_query_limit, min_confidence: Helpers::GraphQuery.default_query_min_confidence, tags: nil,
15
15
  domain: nil, agent_id: 'unknown', **)
16
16
  if local_service_available?
17
17
  knowledge_host.handle_query(query: text, limit: limit, min_confidence: min_confidence,
@@ -72,7 +72,7 @@ module Legion
72
72
  end
73
73
 
74
74
  def transport_available?
75
- defined?(Legion::Transport) &&
75
+ Legion.const_defined?(:Transport, false) &&
76
76
  Legion::Transport.respond_to?(:connected?) &&
77
77
  Legion::Transport.connected?
78
78
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/exchange' if defined?(Legion::Transport)
3
+ require 'legion/transport/exchange'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/exchange' if defined?(Legion::Transport)
3
+ require 'legion/transport/exchange'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/message' if defined?(Legion::Transport)
3
+ require 'legion/transport/message'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/message' if defined?(Legion::Transport)
3
+ require 'legion/transport/message'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/message' if defined?(Legion::Transport)
3
+ require 'legion/transport/message'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/queue' if defined?(Legion::Transport)
3
+ require 'legion/transport/queue'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/queue' if defined?(Legion::Transport)
3
+ require 'legion/transport/queue'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/queue' if defined?(Legion::Transport)
3
+ require 'legion/transport/queue'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/queue' if defined?(Legion::Transport)
3
+ require 'legion/transport/queue'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'legion/transport/queue' if defined?(Legion::Transport)
3
+ require 'legion/transport/queue'
4
4
 
5
5
  module Legion
6
6
  module Extensions
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Apollo
6
- VERSION = '0.4.15'
6
+ VERSION = '0.4.17'
7
7
  end
8
8
  end
9
9
  end
@@ -16,7 +16,7 @@ require 'legion/extensions/apollo/runners/request'
16
16
 
17
17
  require 'legion/extensions/apollo/api' if defined?(Sinatra)
18
18
 
19
- if defined?(Legion::Transport)
19
+ if Legion.const_defined?(:Transport, false)
20
20
  require 'legion/extensions/apollo/transport/exchanges/apollo'
21
21
  require 'legion/extensions/apollo/transport/exchanges/llm_audit'
22
22
  require 'legion/extensions/apollo/transport/queues/ingest'
@@ -32,7 +32,7 @@ end
32
32
  module Legion
33
33
  module Extensions
34
34
  module Apollo
35
- extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
35
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core, false
36
36
 
37
37
  def self.remote_invocable?
38
38
  false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-apollo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.15
4
+ version: 0.4.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -125,16 +125,30 @@ dependencies:
125
125
  name: rubocop
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - "~>"
128
+ - - ">="
129
129
  - !ruby/object:Gem::Version
130
- version: '1.0'
130
+ version: '0'
131
131
  type: :development
132
132
  prerelease: false
133
133
  version_requirements: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - "~>"
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: rubocop-legion
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
136
150
  - !ruby/object:Gem::Version
137
- version: '1.0'
151
+ version: '0'
138
152
  description: Durable shared knowledge with vector search, concept graph, and expertise
139
153
  tracking
140
154
  email: