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.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/lex-mesh.gemspec +3 -1
- data/lib/legion/extensions/mesh/actors/pending_expiry.rb +37 -0
- data/lib/legion/extensions/mesh/actors/preference_listener.rb +44 -0
- data/lib/legion/extensions/mesh/actors/silence_watchdog.rb +37 -0
- data/lib/legion/extensions/mesh/client.rb +7 -2
- data/lib/legion/extensions/mesh/helpers/delegation.rb +126 -0
- data/lib/legion/extensions/mesh/helpers/peer_verify.rb +79 -0
- data/lib/legion/extensions/mesh/helpers/pending_requests.rb +57 -0
- data/lib/legion/extensions/mesh/helpers/registry.rb +12 -0
- data/lib/legion/extensions/mesh/runners/delegation.rb +87 -0
- data/lib/legion/extensions/mesh/runners/mesh.rb +20 -0
- data/lib/legion/extensions/mesh/runners/preferences.rb +120 -0
- data/lib/legion/extensions/mesh/transport/messages/mesh_departure.rb +34 -0
- data/lib/legion/extensions/mesh/transport/messages/preference_query.rb +34 -0
- data/lib/legion/extensions/mesh/transport/messages/preference_response.rb +34 -0
- data/lib/legion/extensions/mesh/transport/queues/preference.rb +27 -0
- data/lib/legion/extensions/mesh/version.rb +1 -1
- data/lib/legion/extensions/mesh.rb +12 -0
- data/spec/legion/extensions/mesh/actors/pending_expiry_spec.rb +57 -0
- data/spec/legion/extensions/mesh/actors/preference_listener_spec.rb +87 -0
- data/spec/legion/extensions/mesh/actors/silence_watchdog_spec.rb +55 -0
- data/spec/legion/extensions/mesh/client_spec.rb +40 -1
- data/spec/legion/extensions/mesh/helpers/delegation_spec.rb +125 -0
- data/spec/legion/extensions/mesh/helpers/peer_verify_spec.rb +76 -0
- data/spec/legion/extensions/mesh/helpers/pending_requests_spec.rb +80 -0
- data/spec/legion/extensions/mesh/helpers/registry_spec.rb +41 -0
- data/spec/legion/extensions/mesh/runners/delegation_spec.rb +84 -0
- data/spec/legion/extensions/mesh/runners/mesh_spec.rb +25 -0
- data/spec/legion/extensions/mesh/runners/preferences_spec.rb +164 -0
- data/spec/legion/extensions/mesh/transport/messages/mesh_departure_spec.rb +81 -0
- data/spec/legion/extensions/mesh/transport/messages/preference_query_spec.rb +85 -0
- data/spec/legion/extensions/mesh/transport/messages/preference_response_spec.rb +85 -0
- data/spec/legion/extensions/mesh/transport/queues/preference_spec.rb +61 -0
- 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.
|
|
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:
|
|
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: :
|
|
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:
|