lex-mesh 0.1.1 → 0.2.4

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/lex-mesh.gemspec +3 -1
  4. data/lib/legion/extensions/mesh/actors/pending_expiry.rb +37 -0
  5. data/lib/legion/extensions/mesh/actors/preference_listener.rb +44 -0
  6. data/lib/legion/extensions/mesh/actors/silence_watchdog.rb +37 -0
  7. data/lib/legion/extensions/mesh/client.rb +7 -2
  8. data/lib/legion/extensions/mesh/helpers/delegation.rb +126 -0
  9. data/lib/legion/extensions/mesh/helpers/peer_verify.rb +79 -0
  10. data/lib/legion/extensions/mesh/helpers/pending_requests.rb +57 -0
  11. data/lib/legion/extensions/mesh/helpers/registry.rb +12 -0
  12. data/lib/legion/extensions/mesh/runners/delegation.rb +87 -0
  13. data/lib/legion/extensions/mesh/runners/mesh.rb +20 -0
  14. data/lib/legion/extensions/mesh/runners/preferences.rb +120 -0
  15. data/lib/legion/extensions/mesh/transport/messages/mesh_departure.rb +34 -0
  16. data/lib/legion/extensions/mesh/transport/messages/preference_query.rb +34 -0
  17. data/lib/legion/extensions/mesh/transport/messages/preference_response.rb +34 -0
  18. data/lib/legion/extensions/mesh/transport/queues/preference.rb +27 -0
  19. data/lib/legion/extensions/mesh/version.rb +1 -1
  20. data/lib/legion/extensions/mesh.rb +12 -0
  21. data/spec/legion/extensions/mesh/actors/pending_expiry_spec.rb +57 -0
  22. data/spec/legion/extensions/mesh/actors/preference_listener_spec.rb +87 -0
  23. data/spec/legion/extensions/mesh/actors/silence_watchdog_spec.rb +55 -0
  24. data/spec/legion/extensions/mesh/client_spec.rb +40 -1
  25. data/spec/legion/extensions/mesh/helpers/delegation_spec.rb +125 -0
  26. data/spec/legion/extensions/mesh/helpers/peer_verify_spec.rb +76 -0
  27. data/spec/legion/extensions/mesh/helpers/pending_requests_spec.rb +80 -0
  28. data/spec/legion/extensions/mesh/helpers/registry_spec.rb +41 -0
  29. data/spec/legion/extensions/mesh/runners/delegation_spec.rb +84 -0
  30. data/spec/legion/extensions/mesh/runners/mesh_spec.rb +25 -0
  31. data/spec/legion/extensions/mesh/runners/preferences_spec.rb +164 -0
  32. data/spec/legion/extensions/mesh/transport/messages/mesh_departure_spec.rb +81 -0
  33. data/spec/legion/extensions/mesh/transport/messages/preference_query_spec.rb +85 -0
  34. data/spec/legion/extensions/mesh/transport/messages/preference_response_spec.rb +85 -0
  35. data/spec/legion/extensions/mesh/transport/queues/preference_spec.rb +61 -0
  36. metadata +41 -3
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ unless defined?(Legion::Transport::Message)
6
+ module Legion
7
+ module Transport
8
+ class Message
9
+ def initialize(**options)
10
+ @options = options
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ unless defined?(Legion::Transport::Exchanges::Agent)
18
+ module Legion
19
+ module Transport
20
+ module Exchanges
21
+ class Agent
22
+ def self.name
23
+ 'Legion::Transport::Exchanges::Agent'
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ require 'legion/extensions/mesh/transport/messages/preference_response'
32
+
33
+ RSpec.describe Legion::Extensions::Mesh::Transport::Messages::PreferenceResponse do
34
+ subject(:msg) do
35
+ described_class.new(
36
+ target_agent_id: 'agent-1',
37
+ responding_agent_id: 'agent-42',
38
+ profile: { verbosity: :concise, tone: :professional }
39
+ )
40
+ end
41
+
42
+ describe '#exchange' do
43
+ it 'returns the Agent exchange' do
44
+ expect(msg.exchange).to eq(Legion::Transport::Exchanges::Agent)
45
+ end
46
+ end
47
+
48
+ describe '#routing_key' do
49
+ it 'routes to target agent' do
50
+ expect(msg.routing_key).to eq('agent.agent-1.preferences')
51
+ end
52
+ end
53
+
54
+ describe '#message' do
55
+ it 'includes type preference_response' do
56
+ expect(msg.message[:type]).to eq('preference_response')
57
+ end
58
+
59
+ it 'includes responding_agent_id' do
60
+ expect(msg.message[:responding_agent_id]).to eq('agent-42')
61
+ end
62
+
63
+ it 'includes profile' do
64
+ expect(msg.message[:profile]).to eq({ verbosity: :concise, tone: :professional })
65
+ end
66
+
67
+ it 'includes responded_at timestamp' do
68
+ expect(msg.message[:responded_at]).to be_a(String)
69
+ end
70
+ end
71
+
72
+ describe '#type' do
73
+ it 'returns preference_response' do
74
+ expect(msg.type).to eq('preference_response')
75
+ end
76
+ end
77
+
78
+ describe 'empty profile default' do
79
+ subject(:msg_no_profile) { described_class.new(target_agent_id: 'x', responding_agent_id: 'y') }
80
+
81
+ it 'defaults profile to empty hash' do
82
+ expect(msg_no_profile.message[:profile]).to eq({})
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ unless defined?(Legion::Transport::Queues::Agent)
6
+ module Legion
7
+ module Transport
8
+ module Queues
9
+ class Agent
10
+ def initialize(agent_id: nil, **)
11
+ @agent_id = agent_id
12
+ end
13
+
14
+ def queue_name
15
+ @agent_id ? "agent.#{@agent_id}" : 'agent.default'
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ require 'legion/extensions/mesh/transport/queues/preference'
24
+
25
+ RSpec.describe Legion::Extensions::Mesh::Transport::Queues::Preference do
26
+ describe 'with explicit agent_id' do
27
+ subject(:queue) { described_class.allocate.tap { |q| q.instance_variable_set(:@agent_id, 'worker-1') } }
28
+
29
+ describe '#queue_name' do
30
+ it 'appends .preferences to the agent queue name' do
31
+ expect(queue.queue_name).to eq('agent.worker-1.preferences')
32
+ end
33
+ end
34
+
35
+ describe '#bind_routing_key' do
36
+ it 'returns the preferences routing key' do
37
+ expect(queue.bind_routing_key).to eq('agent.worker-1.preferences')
38
+ end
39
+ end
40
+ end
41
+
42
+ describe 'with default agent_id from settings' do
43
+ subject(:queue) { described_class.allocate.tap { |q| q.instance_variable_set(:@agent_id, nil) } }
44
+
45
+ before do
46
+ stub_const('Legion::Settings', { 'client' => { 'name' => 'my-agent' } })
47
+ end
48
+
49
+ describe '#queue_name' do
50
+ it 'uses settings for the agent name' do
51
+ expect(queue.queue_name).to eq('agent.my-agent.preferences')
52
+ end
53
+ end
54
+
55
+ describe '#bind_routing_key' do
56
+ it 'uses settings for the routing key' do
57
+ expect(queue.bind_routing_key).to eq('agent.my-agent.preferences')
58
+ end
59
+ end
60
+ end
61
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-mesh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -10,19 +10,33 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: legion-gaia
13
+ name: base64
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
18
  version: '0'
19
- type: :development
19
+ type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ed25519
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.3'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.3'
26
40
  description: Agent-to-agent mesh communication protocol for brain-modeled agentic
27
41
  AI
28
42
  email:
@@ -35,18 +49,42 @@ files:
35
49
  - lex-mesh.gemspec
36
50
  - lib/legion/extensions/mesh.rb
37
51
  - lib/legion/extensions/mesh/actors/heartbeat.rb
52
+ - lib/legion/extensions/mesh/actors/pending_expiry.rb
53
+ - lib/legion/extensions/mesh/actors/preference_listener.rb
54
+ - lib/legion/extensions/mesh/actors/silence_watchdog.rb
38
55
  - lib/legion/extensions/mesh/client.rb
56
+ - lib/legion/extensions/mesh/helpers/delegation.rb
57
+ - lib/legion/extensions/mesh/helpers/peer_verify.rb
58
+ - lib/legion/extensions/mesh/helpers/pending_requests.rb
39
59
  - lib/legion/extensions/mesh/helpers/preference_profile.rb
40
60
  - lib/legion/extensions/mesh/helpers/registry.rb
41
61
  - lib/legion/extensions/mesh/helpers/topology.rb
62
+ - lib/legion/extensions/mesh/runners/delegation.rb
42
63
  - lib/legion/extensions/mesh/runners/mesh.rb
64
+ - lib/legion/extensions/mesh/runners/preferences.rb
65
+ - lib/legion/extensions/mesh/transport/messages/mesh_departure.rb
66
+ - lib/legion/extensions/mesh/transport/messages/preference_query.rb
67
+ - lib/legion/extensions/mesh/transport/messages/preference_response.rb
68
+ - lib/legion/extensions/mesh/transport/queues/preference.rb
43
69
  - lib/legion/extensions/mesh/version.rb
44
70
  - spec/legion/extensions/mesh/actors/heartbeat_spec.rb
71
+ - spec/legion/extensions/mesh/actors/pending_expiry_spec.rb
72
+ - spec/legion/extensions/mesh/actors/preference_listener_spec.rb
73
+ - spec/legion/extensions/mesh/actors/silence_watchdog_spec.rb
45
74
  - spec/legion/extensions/mesh/client_spec.rb
75
+ - spec/legion/extensions/mesh/helpers/delegation_spec.rb
76
+ - spec/legion/extensions/mesh/helpers/peer_verify_spec.rb
77
+ - spec/legion/extensions/mesh/helpers/pending_requests_spec.rb
46
78
  - spec/legion/extensions/mesh/helpers/preference_profile_spec.rb
47
79
  - spec/legion/extensions/mesh/helpers/registry_spec.rb
48
80
  - spec/legion/extensions/mesh/helpers/topology_spec.rb
81
+ - spec/legion/extensions/mesh/runners/delegation_spec.rb
49
82
  - spec/legion/extensions/mesh/runners/mesh_spec.rb
83
+ - spec/legion/extensions/mesh/runners/preferences_spec.rb
84
+ - spec/legion/extensions/mesh/transport/messages/mesh_departure_spec.rb
85
+ - spec/legion/extensions/mesh/transport/messages/preference_query_spec.rb
86
+ - spec/legion/extensions/mesh/transport/messages/preference_response_spec.rb
87
+ - spec/legion/extensions/mesh/transport/queues/preference_spec.rb
50
88
  - spec/spec_helper.rb
51
89
  homepage: https://github.com/LegionIO/lex-mesh
52
90
  licenses: