activematrix 0.0.5 → 0.0.8
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/README.md +96 -28
- data/app/jobs/active_matrix/application_job.rb +11 -0
- data/app/models/active_matrix/agent/jobs/memory_reaper.rb +87 -0
- data/app/models/active_matrix/agent.rb +166 -0
- data/app/models/active_matrix/agent_store.rb +80 -0
- data/app/models/active_matrix/application_record.rb +15 -0
- data/app/models/active_matrix/chat_session.rb +105 -0
- data/app/models/active_matrix/knowledge_base.rb +100 -0
- data/exe/activematrix +7 -0
- data/lib/active_matrix/agent_manager.rb +160 -121
- data/lib/active_matrix/agent_registry.rb +25 -21
- data/lib/active_matrix/api.rb +8 -2
- data/lib/active_matrix/async_query.rb +58 -0
- data/lib/active_matrix/bot/base.rb +3 -3
- data/lib/active_matrix/bot/builtin_commands.rb +188 -0
- data/lib/active_matrix/bot/command_parser.rb +175 -0
- data/lib/active_matrix/cli.rb +273 -0
- data/lib/active_matrix/client.rb +21 -6
- data/lib/active_matrix/client_pool.rb +38 -27
- data/lib/active_matrix/daemon/probe_server.rb +118 -0
- data/lib/active_matrix/daemon/signal_handler.rb +156 -0
- data/lib/active_matrix/daemon/worker.rb +109 -0
- data/lib/active_matrix/daemon.rb +236 -0
- data/lib/active_matrix/engine.rb +18 -0
- data/lib/active_matrix/errors.rb +1 -1
- data/lib/active_matrix/event_router.rb +61 -49
- data/lib/active_matrix/events.rb +1 -0
- data/lib/active_matrix/instrumentation.rb +148 -0
- data/lib/active_matrix/memory/agent_memory.rb +7 -21
- data/lib/active_matrix/memory/conversation_memory.rb +4 -20
- data/lib/active_matrix/memory/global_memory.rb +15 -30
- data/lib/active_matrix/message_dispatcher.rb +197 -0
- data/lib/active_matrix/metrics.rb +424 -0
- data/lib/active_matrix/presence_manager.rb +181 -0
- data/lib/active_matrix/railtie.rb +8 -0
- data/lib/active_matrix/telemetry.rb +134 -0
- data/lib/active_matrix/version.rb +1 -1
- data/lib/active_matrix.rb +18 -11
- data/lib/generators/active_matrix/install/install_generator.rb +3 -22
- data/lib/generators/active_matrix/install/templates/README +5 -2
- metadata +191 -31
- data/lib/generators/active_matrix/install/templates/agent_memory.rb +0 -47
- data/lib/generators/active_matrix/install/templates/conversation_context.rb +0 -72
- data/lib/generators/active_matrix/install/templates/create_agent_memories.rb +0 -17
- data/lib/generators/active_matrix/install/templates/create_conversation_contexts.rb +0 -21
- data/lib/generators/active_matrix/install/templates/create_global_memories.rb +0 -20
- data/lib/generators/active_matrix/install/templates/create_matrix_agents.rb +0 -26
- data/lib/generators/active_matrix/install/templates/global_memory.rb +0 -70
- data/lib/generators/active_matrix/install/templates/matrix_agent.rb +0 -127
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
class MatrixAgent < ApplicationRecord
|
|
4
|
-
# Associations
|
|
5
|
-
has_many :agent_memories, dependent: :destroy
|
|
6
|
-
has_many :conversation_contexts, dependent: :destroy
|
|
7
|
-
|
|
8
|
-
# Validations
|
|
9
|
-
validates :name, presence: true, uniqueness: true
|
|
10
|
-
validates :homeserver, presence: true
|
|
11
|
-
validates :username, presence: true
|
|
12
|
-
validates :bot_class, presence: true
|
|
13
|
-
validate :valid_bot_class?
|
|
14
|
-
|
|
15
|
-
# Scopes
|
|
16
|
-
scope :active, -> { where.not(state: %i[offline error]) }
|
|
17
|
-
scope :online, -> { where(state: %i[online_idle online_busy]) }
|
|
18
|
-
scope :offline, -> { where(state: :offline) }
|
|
19
|
-
|
|
20
|
-
# Encrypts password before saving
|
|
21
|
-
before_save :encrypt_password, if: :password_changed?
|
|
22
|
-
|
|
23
|
-
# State machine for agent lifecycle
|
|
24
|
-
state_machine :state, initial: :offline do
|
|
25
|
-
state :offline
|
|
26
|
-
state :connecting
|
|
27
|
-
state :online_idle
|
|
28
|
-
state :online_busy
|
|
29
|
-
state :error
|
|
30
|
-
state :paused
|
|
31
|
-
|
|
32
|
-
event :connect do
|
|
33
|
-
transition %i[offline error paused] => :connecting
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
event :connection_established do
|
|
37
|
-
transition connecting: :online_idle
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
after_transition to: :online_idle do |agent|
|
|
41
|
-
agent.update(last_active_at: Time.current)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
event :start_processing do
|
|
45
|
-
transition online_idle: :online_busy
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
event :finish_processing do
|
|
49
|
-
transition online_busy: :online_idle
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
event :disconnect do
|
|
53
|
-
transition %i[connecting online_idle online_busy] => :offline
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
event :encounter_error do
|
|
57
|
-
transition any => :error
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
event :pause do
|
|
61
|
-
transition %i[online_idle online_busy] => :paused
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
event :resume do
|
|
65
|
-
transition paused: :connecting
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Instance methods
|
|
70
|
-
def bot_instance
|
|
71
|
-
@bot_instance ||= bot_class.constantize.new(client) if running?
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def client
|
|
75
|
-
@client ||= if access_token.present?
|
|
76
|
-
ActiveMatrix::Client.new(homeserver, access_token: access_token)
|
|
77
|
-
else
|
|
78
|
-
ActiveMatrix::Client.new(homeserver)
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def running?
|
|
83
|
-
%i[online_idle online_busy].include?(state.to_sym)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def memory
|
|
87
|
-
@memory ||= ActiveMatrix::Memory::AgentMemory.new(self)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def increment_messages_handled!
|
|
91
|
-
increment!(:messages_handled)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def update_activity!
|
|
95
|
-
update(last_active_at: Time.current)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# Password handling
|
|
99
|
-
attr_accessor :password
|
|
100
|
-
|
|
101
|
-
def authenticate(password)
|
|
102
|
-
return false unless encrypted_password.present?
|
|
103
|
-
|
|
104
|
-
BCrypt::Password.new(encrypted_password) == password
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
private
|
|
108
|
-
|
|
109
|
-
def password_changed?
|
|
110
|
-
password.present?
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def encrypt_password
|
|
114
|
-
self.encrypted_password = BCrypt::Password.create(password) if password.present?
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def valid_bot_class?
|
|
118
|
-
return false if bot_class.blank?
|
|
119
|
-
|
|
120
|
-
begin
|
|
121
|
-
klass = bot_class.constantize
|
|
122
|
-
errors.add(:bot_class, 'must inherit from ActiveMatrix::Bot::Base') unless klass < ActiveMatrix::Bot::Base
|
|
123
|
-
rescue NameError
|
|
124
|
-
errors.add(:bot_class, 'must be a valid class name')
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|