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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +96 -28
  3. data/app/jobs/active_matrix/application_job.rb +11 -0
  4. data/app/models/active_matrix/agent/jobs/memory_reaper.rb +87 -0
  5. data/app/models/active_matrix/agent.rb +166 -0
  6. data/app/models/active_matrix/agent_store.rb +80 -0
  7. data/app/models/active_matrix/application_record.rb +15 -0
  8. data/app/models/active_matrix/chat_session.rb +105 -0
  9. data/app/models/active_matrix/knowledge_base.rb +100 -0
  10. data/exe/activematrix +7 -0
  11. data/lib/active_matrix/agent_manager.rb +160 -121
  12. data/lib/active_matrix/agent_registry.rb +25 -21
  13. data/lib/active_matrix/api.rb +8 -2
  14. data/lib/active_matrix/async_query.rb +58 -0
  15. data/lib/active_matrix/bot/base.rb +3 -3
  16. data/lib/active_matrix/bot/builtin_commands.rb +188 -0
  17. data/lib/active_matrix/bot/command_parser.rb +175 -0
  18. data/lib/active_matrix/cli.rb +273 -0
  19. data/lib/active_matrix/client.rb +21 -6
  20. data/lib/active_matrix/client_pool.rb +38 -27
  21. data/lib/active_matrix/daemon/probe_server.rb +118 -0
  22. data/lib/active_matrix/daemon/signal_handler.rb +156 -0
  23. data/lib/active_matrix/daemon/worker.rb +109 -0
  24. data/lib/active_matrix/daemon.rb +236 -0
  25. data/lib/active_matrix/engine.rb +18 -0
  26. data/lib/active_matrix/errors.rb +1 -1
  27. data/lib/active_matrix/event_router.rb +61 -49
  28. data/lib/active_matrix/events.rb +1 -0
  29. data/lib/active_matrix/instrumentation.rb +148 -0
  30. data/lib/active_matrix/memory/agent_memory.rb +7 -21
  31. data/lib/active_matrix/memory/conversation_memory.rb +4 -20
  32. data/lib/active_matrix/memory/global_memory.rb +15 -30
  33. data/lib/active_matrix/message_dispatcher.rb +197 -0
  34. data/lib/active_matrix/metrics.rb +424 -0
  35. data/lib/active_matrix/presence_manager.rb +181 -0
  36. data/lib/active_matrix/railtie.rb +8 -0
  37. data/lib/active_matrix/telemetry.rb +134 -0
  38. data/lib/active_matrix/version.rb +1 -1
  39. data/lib/active_matrix.rb +18 -11
  40. data/lib/generators/active_matrix/install/install_generator.rb +3 -22
  41. data/lib/generators/active_matrix/install/templates/README +5 -2
  42. metadata +191 -31
  43. data/lib/generators/active_matrix/install/templates/agent_memory.rb +0 -47
  44. data/lib/generators/active_matrix/install/templates/conversation_context.rb +0 -72
  45. data/lib/generators/active_matrix/install/templates/create_agent_memories.rb +0 -17
  46. data/lib/generators/active_matrix/install/templates/create_conversation_contexts.rb +0 -21
  47. data/lib/generators/active_matrix/install/templates/create_global_memories.rb +0 -20
  48. data/lib/generators/active_matrix/install/templates/create_matrix_agents.rb +0 -26
  49. data/lib/generators/active_matrix/install/templates/global_memory.rb +0 -70
  50. 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