rails_ai 0.1.0

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 (82) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec_status +96 -0
  3. data/AGENT_GUIDE.md +513 -0
  4. data/Appraisals +49 -0
  5. data/COMMERCIAL_LICENSE_TEMPLATE.md +92 -0
  6. data/FEATURES.md +204 -0
  7. data/LEGAL_PROTECTION_GUIDE.md +222 -0
  8. data/LICENSE +62 -0
  9. data/LICENSE_SUMMARY.md +74 -0
  10. data/MIT-LICENSE +62 -0
  11. data/PERFORMANCE.md +300 -0
  12. data/PROVIDERS.md +495 -0
  13. data/README.md +454 -0
  14. data/Rakefile +11 -0
  15. data/SPEED_OPTIMIZATIONS.md +217 -0
  16. data/STRUCTURE.md +139 -0
  17. data/USAGE_GUIDE.md +288 -0
  18. data/app/channels/ai_stream_channel.rb +33 -0
  19. data/app/components/ai/prompt_component.rb +25 -0
  20. data/app/controllers/concerns/ai/context_aware.rb +77 -0
  21. data/app/controllers/concerns/ai/streaming.rb +41 -0
  22. data/app/helpers/ai_helper.rb +164 -0
  23. data/app/jobs/ai/generate_embedding_job.rb +25 -0
  24. data/app/jobs/ai/generate_summary_job.rb +25 -0
  25. data/app/models/concerns/ai/embeddable.rb +38 -0
  26. data/app/views/rails_ai/dashboard/index.html.erb +51 -0
  27. data/config/routes.rb +19 -0
  28. data/lib/generators/rails_ai/install/install_generator.rb +38 -0
  29. data/lib/rails_ai/agents/agent_manager.rb +258 -0
  30. data/lib/rails_ai/agents/agent_team.rb +243 -0
  31. data/lib/rails_ai/agents/base_agent.rb +331 -0
  32. data/lib/rails_ai/agents/collaboration.rb +238 -0
  33. data/lib/rails_ai/agents/memory.rb +116 -0
  34. data/lib/rails_ai/agents/message_bus.rb +95 -0
  35. data/lib/rails_ai/agents/specialized_agents.rb +391 -0
  36. data/lib/rails_ai/agents/task_queue.rb +111 -0
  37. data/lib/rails_ai/cache.rb +14 -0
  38. data/lib/rails_ai/config.rb +40 -0
  39. data/lib/rails_ai/context.rb +7 -0
  40. data/lib/rails_ai/context_analyzer.rb +86 -0
  41. data/lib/rails_ai/engine.rb +48 -0
  42. data/lib/rails_ai/events.rb +9 -0
  43. data/lib/rails_ai/image_context.rb +110 -0
  44. data/lib/rails_ai/performance.rb +231 -0
  45. data/lib/rails_ai/provider.rb +8 -0
  46. data/lib/rails_ai/providers/anthropic_adapter.rb +256 -0
  47. data/lib/rails_ai/providers/base.rb +60 -0
  48. data/lib/rails_ai/providers/dummy_adapter.rb +29 -0
  49. data/lib/rails_ai/providers/gemini_adapter.rb +509 -0
  50. data/lib/rails_ai/providers/openai_adapter.rb +535 -0
  51. data/lib/rails_ai/providers/secure_anthropic_adapter.rb +206 -0
  52. data/lib/rails_ai/providers/secure_openai_adapter.rb +284 -0
  53. data/lib/rails_ai/railtie.rb +48 -0
  54. data/lib/rails_ai/redactor.rb +12 -0
  55. data/lib/rails_ai/security/api_key_manager.rb +82 -0
  56. data/lib/rails_ai/security/audit_logger.rb +46 -0
  57. data/lib/rails_ai/security/error_handler.rb +62 -0
  58. data/lib/rails_ai/security/input_validator.rb +176 -0
  59. data/lib/rails_ai/security/secure_file_handler.rb +45 -0
  60. data/lib/rails_ai/security/secure_http_client.rb +177 -0
  61. data/lib/rails_ai/security.rb +0 -0
  62. data/lib/rails_ai/version.rb +5 -0
  63. data/lib/rails_ai/window_context.rb +103 -0
  64. data/lib/rails_ai.rb +502 -0
  65. data/monitoring/ci_setup_guide.md +214 -0
  66. data/monitoring/enhanced_monitoring_script.rb +237 -0
  67. data/monitoring/google_alerts_setup.md +42 -0
  68. data/monitoring_log_20250921.txt +0 -0
  69. data/monitoring_script.rb +161 -0
  70. data/rails_ai.gemspec +54 -0
  71. data/scripts/security_scanner.rb +353 -0
  72. data/setup_monitoring.sh +163 -0
  73. data/wiki/API-Documentation.md +734 -0
  74. data/wiki/Architecture-Overview.md +672 -0
  75. data/wiki/Contributing-Guide.md +407 -0
  76. data/wiki/Development-Setup.md +532 -0
  77. data/wiki/Home.md +278 -0
  78. data/wiki/Installation-Guide.md +527 -0
  79. data/wiki/Quick-Start.md +186 -0
  80. data/wiki/README.md +135 -0
  81. data/wiki/Release-Process.md +467 -0
  82. metadata +385 -0
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'net/http'
5
+ require 'json'
6
+ require 'uri'
7
+ require 'date'
8
+ require 'csv'
9
+
10
+ class EnhancedRailsAIMonitor
11
+ def initialize
12
+ @search_terms = [
13
+ '"rails_ai" gem commercial',
14
+ '"rails_ai" business usage',
15
+ '"rails_ai" enterprise',
16
+ '"rails_ai" license commercial',
17
+ '"Rails AI" gem commercial',
18
+ '"Rails AI" business usage',
19
+ '"Rails AI" enterprise',
20
+ '"Rails AI" license commercial'
21
+ ]
22
+
23
+ @exclude_terms = [
24
+ 'rails_ai_tag',
25
+ 'rails-ai-tag',
26
+ 'rails_ai_image_tag',
27
+ 'rails_ai_helper'
28
+ ]
29
+
30
+ @results = []
31
+ @log_file = "monitoring_log_#{Date.today.strftime('%Y%m%d')}.txt"
32
+ @csv_file = "monitoring_results_#{Date.today.strftime('%Y%m%d')}.csv"
33
+ end
34
+
35
+ def run_enhanced_checks
36
+ puts "🔍 Starting Enhanced Rails AI monitoring checks..."
37
+ puts "📅 Date: #{Date.today}"
38
+ puts "🎯 Monitoring: rails_ai gem (excluding rails_ai_tag)"
39
+ puts "=" * 50
40
+
41
+ check_rubygems_enhanced
42
+ check_github_enhanced
43
+ check_web_mentions
44
+ check_social_media_mentions
45
+ check_competitor_analysis
46
+
47
+ save_results
48
+ generate_csv_report
49
+ send_alerts_if_needed
50
+
51
+ puts "✅ Enhanced monitoring checks completed."
52
+ puts "📊 Results saved to: #{@log_file}"
53
+ puts "📈 CSV report saved to: #{@csv_file}"
54
+ end
55
+
56
+ private
57
+
58
+ def check_rubygems_enhanced
59
+ puts "🔍 Enhanced RubyGems monitoring..."
60
+
61
+ begin
62
+ # Check for your gem specifically
63
+ uri = URI('https://rubygems.org/api/v1/gems/rails_ai.json')
64
+ response = Net::HTTP.get_response(uri)
65
+
66
+ if response.code == '200'
67
+ gem_info = JSON.parse(response.body)
68
+ puts " 📦 Your gem stats:"
69
+ puts " - Downloads: #{gem_info['downloads']}"
70
+ puts " - Version: #{gem_info['version']}"
71
+ puts " - Info: #{gem_info['info']}"
72
+
73
+ @results << {
74
+ type: 'rubygems_own',
75
+ name: 'rails_ai',
76
+ downloads: gem_info['downloads'],
77
+ version: gem_info['version'],
78
+ timestamp: Time.now
79
+ }
80
+ end
81
+
82
+ # Check for similar gems
83
+ uri = URI('https://rubygems.org/api/v1/search.json')
84
+ params = { query: 'rails_ai' }
85
+ uri.query = URI.encode_www_form(params)
86
+
87
+ response = Net::HTTP.get_response(uri)
88
+ if response.code == '200'
89
+ gems = JSON.parse(response.body)
90
+
91
+ suspicious_gems = gems.select do |gem|
92
+ name = gem['name'].downcase
93
+ (name.include?('rails') && name.include?('ai') &&
94
+ !@exclude_terms.any? { |exclude| name.include?(exclude) } &&
95
+ name != 'rails_ai')
96
+ end
97
+
98
+ if suspicious_gems.any?
99
+ puts " ⚠️ Found potentially related gems:"
100
+ suspicious_gems.each do |gem|
101
+ puts " - #{gem['name']}: #{gem['info']}"
102
+ @results << {
103
+ type: 'rubygems_similar',
104
+ name: gem['name'],
105
+ info: gem['info'],
106
+ downloads: gem['downloads'],
107
+ timestamp: Time.now
108
+ }
109
+ end
110
+ else
111
+ puts " ✅ No suspicious gems found"
112
+ end
113
+ end
114
+ rescue => e
115
+ puts " ❌ Error checking RubyGems: #{e.message}"
116
+ end
117
+ end
118
+
119
+ def check_github_enhanced
120
+ puts "🔍 Enhanced GitHub monitoring..."
121
+
122
+ # This would use GitHub API with authentication
123
+ # For now, we'll simulate the check
124
+ puts " 📝 GitHub API check would go here"
125
+ puts " 🔑 Add GITHUB_PAT secret for full functionality"
126
+ end
127
+
128
+ def check_web_mentions
129
+ puts "🔍 Checking web mentions..."
130
+
131
+ # This would use web scraping or APIs
132
+ # For now, we'll simulate the check
133
+ puts " 📝 Web mention check would go here"
134
+ puts " 🔑 Add GOOGLE_API_KEY secret for full functionality"
135
+ end
136
+
137
+ def check_social_media_mentions
138
+ puts "�� Checking social media mentions..."
139
+
140
+ # This would use social media APIs
141
+ # For now, we'll simulate the check
142
+ puts " 📝 Social media check would go here"
143
+ puts " 🔑 Add social media API keys for full functionality"
144
+ end
145
+
146
+ def check_competitor_analysis
147
+ puts "🔍 Competitor analysis..."
148
+
149
+ # Check for similar AI gems
150
+ similar_gems = [
151
+ 'openai-ruby',
152
+ 'anthropic-ruby',
153
+ 'gemini-ruby',
154
+ 'ai-ruby',
155
+ 'rails-ai-tools'
156
+ ]
157
+
158
+ similar_gems.each do |gem_name|
159
+ begin
160
+ uri = URI("https://rubygems.org/api/v1/gems/#{gem_name}.json")
161
+ response = Net::HTTP.get_response(uri)
162
+
163
+ if response.code == '200'
164
+ gem_info = JSON.parse(response.body)
165
+ puts " 📊 Competitor: #{gem_name} - #{gem_info['downloads']} downloads"
166
+
167
+ @results << {
168
+ type: 'competitor',
169
+ name: gem_name,
170
+ downloads: gem_info['downloads'],
171
+ version: gem_info['version'],
172
+ timestamp: Time.now
173
+ }
174
+ end
175
+ rescue => e
176
+ puts " ⚠️ Could not check #{gem_name}: #{e.message}"
177
+ end
178
+ end
179
+ end
180
+
181
+ def save_results
182
+ return if @results.empty?
183
+
184
+ File.open(@log_file, 'a') do |file|
185
+ file.puts "\n" + "=" * 50
186
+ file.puts "Enhanced Rails AI Monitoring Results - #{Time.now}"
187
+ file.puts "Excluding: rails_ai_tag and similar legitimate products"
188
+ file.puts "=" * 50
189
+
190
+ @results.each do |result|
191
+ file.puts "Type: #{result[:type]}"
192
+ file.puts "Name: #{result[:name]}"
193
+ file.puts "Info: #{result[:info]}" if result[:info]
194
+ file.puts "Downloads: #{result[:downloads]}" if result[:downloads]
195
+ file.puts "Version: #{result[:version]}" if result[:version]
196
+ file.puts "Timestamp: #{result[:timestamp]}"
197
+ file.puts "-" * 30
198
+ end
199
+ end
200
+ end
201
+
202
+ def generate_csv_report
203
+ return if @results.empty?
204
+
205
+ CSV.open(@csv_file, 'w') do |csv|
206
+ csv << ['Type', 'Name', 'Info', 'Downloads', 'Version', 'Timestamp']
207
+
208
+ @results.each do |result|
209
+ csv << [
210
+ result[:type],
211
+ result[:name],
212
+ result[:info] || '',
213
+ result[:downloads] || '',
214
+ result[:version] || '',
215
+ result[:timestamp]
216
+ ]
217
+ end
218
+ end
219
+ end
220
+
221
+ def send_alerts_if_needed
222
+ return if @results.empty?
223
+
224
+ puts "🚨 ALERT: Found #{@results.length} potential issues!"
225
+ puts "Check #{@log_file} for details"
226
+ puts "📈 CSV report available: #{@csv_file}"
227
+
228
+ # Here you could add email notifications
229
+ # send_email_alert(@results)
230
+ end
231
+ end
232
+
233
+ # Run the enhanced monitor
234
+ if __FILE__ == $0
235
+ monitor = EnhancedRailsAIMonitor.new
236
+ monitor.run_enhanced_checks
237
+ end
@@ -0,0 +1,42 @@
1
+ # Google Alerts Setup for Rails AI Gem
2
+
3
+ ## Step 1: Go to Google Alerts
4
+ Visit: https://www.google.com/alerts
5
+
6
+ ## Step 2: Create Alerts for These Terms (Focused on YOUR gem):
7
+ - "rails_ai" gem commercial
8
+ - "rails_ai" business usage
9
+ - "rails_ai" enterprise
10
+ - "rails_ai" license commercial
11
+ - "Rails AI" gem commercial
12
+ - "Rails AI" business usage
13
+ - "Rails AI" enterprise
14
+ - "Rails AI" license commercial
15
+
16
+ ## Step 3: Exclude These Terms (Legitimate Products):
17
+ - rails_ai_tag
18
+ - rails-ai-tag
19
+ - rails_ai_image_tag
20
+ - rails_ai_helper
21
+
22
+ ## Step 4: Configure Each Alert:
23
+ - Frequency: As-it-happens
24
+ - Sources: Everything
25
+ - Language: English
26
+ - Region: Any region
27
+ - Delivery: Your email
28
+
29
+ ## Step 5: Test Alerts
30
+ Search for your terms manually to ensure alerts work.
31
+
32
+ ## What You're Looking For:
33
+ - Companies using YOUR rails_ai gem commercially
34
+ - Code copied from YOUR rails_ai gem
35
+ - Modified versions of YOUR rails_ai gem being sold
36
+ - API services using YOUR rails_ai gem code
37
+
38
+ ## What You're NOT Looking For:
39
+ - rails_ai_tag (different product)
40
+ - rails-ai-tag (different product)
41
+ - rails_ai_image_tag (different product)
42
+ - Other legitimate AI-related gems
File without changes
@@ -0,0 +1,161 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'net/http'
5
+ require 'json'
6
+ require 'uri'
7
+ require 'date'
8
+
9
+ class RailsAIMonitor
10
+ def initialize
11
+ # Focus on YOUR specific gem, not rails_ai_tag
12
+ @search_terms = [
13
+ '"rails_ai" gem commercial',
14
+ '"rails_ai" business usage',
15
+ '"rails_ai" enterprise',
16
+ '"rails_ai" license commercial',
17
+ '"rails_ai" ruby gem',
18
+ '"Rails AI" gem commercial',
19
+ '"Rails AI" business usage',
20
+ '"Rails AI" enterprise',
21
+ '"Rails AI" license commercial'
22
+ ]
23
+
24
+ # Exclude rails_ai_tag and similar legitimate products
25
+ @exclude_terms = [
26
+ 'rails_ai_tag',
27
+ 'rails-ai-tag',
28
+ 'rails_ai_image_tag',
29
+ 'rails_ai_helper'
30
+ ]
31
+
32
+ @results = []
33
+ @log_file = "monitoring_log_#{Date.today.strftime('%Y%m%d')}.txt"
34
+ end
35
+
36
+ def run_daily_checks
37
+ puts "🔍 Starting Rails AI monitoring checks..."
38
+ puts "📅 Date: #{Date.today}"
39
+ puts "🎯 Monitoring: rails_ai gem (excluding rails_ai_tag)"
40
+ puts "=" * 50
41
+
42
+ check_github
43
+ check_rubygems
44
+ check_google_search
45
+
46
+ save_results
47
+ send_alerts_if_needed
48
+
49
+ puts "✅ Monitoring checks completed."
50
+ puts "📊 Results saved to: #{@log_file}"
51
+ end
52
+
53
+ private
54
+
55
+ def check_github
56
+ puts "🔍 Checking GitHub repositories..."
57
+
58
+ # Search for repositories using YOUR rails_ai gem specifically
59
+ search_queries = [
60
+ 'rails_ai gem language:ruby',
61
+ 'Rails AI gem language:ruby',
62
+ 'rails-ai gem language:ruby',
63
+ 'rails_ai provider language:ruby',
64
+ 'rails_ai agent language:ruby'
65
+ ]
66
+
67
+ search_queries.each do |query|
68
+ puts " Searching: #{query}"
69
+ # Note: GitHub API requires authentication for search
70
+ # You would need to add your GitHub token here
71
+ end
72
+ end
73
+
74
+ def check_rubygems
75
+ puts "🔍 Checking RubyGems.org..."
76
+
77
+ begin
78
+ uri = URI('https://rubygems.org/api/v1/search.json')
79
+ params = { query: 'rails_ai' }
80
+ uri.query = URI.encode_www_form(params)
81
+
82
+ response = Net::HTTP.get_response(uri)
83
+ if response.code == '200'
84
+ gems = JSON.parse(response.body)
85
+
86
+ # Filter out rails_ai_tag and similar legitimate products
87
+ suspicious_gems = gems.select do |gem|
88
+ name = gem['name'].downcase
89
+ # Look for your specific gem or potential infringements
90
+ (name.include?('rails') && name.include?('ai') &&
91
+ !@exclude_terms.any? { |exclude| name.include?(exclude) } &&
92
+ name != 'rails_ai') # Exclude your own gem
93
+ end
94
+
95
+ if suspicious_gems.any?
96
+ puts " ⚠️ Found potentially related gems:"
97
+ suspicious_gems.each do |gem|
98
+ puts " - #{gem['name']}: #{gem['info']}"
99
+ @results << {
100
+ type: 'rubygems',
101
+ name: gem['name'],
102
+ info: gem['info'],
103
+ downloads: gem['downloads'],
104
+ timestamp: Time.now
105
+ }
106
+ end
107
+ else
108
+ puts " ✅ No suspicious gems found"
109
+ end
110
+ end
111
+ rescue => e
112
+ puts " ❌ Error checking RubyGems: #{e.message}"
113
+ end
114
+ end
115
+
116
+ def check_google_search
117
+ puts "🔍 Checking Google search results..."
118
+
119
+ @search_terms.each do |term|
120
+ puts " Searching: #{term}"
121
+ # Note: Google Search API requires API key
122
+ # You would need to add your Google API key here
123
+ end
124
+ end
125
+
126
+ def save_results
127
+ return if @results.empty?
128
+
129
+ File.open(@log_file, 'a') do |file|
130
+ file.puts "\n" + "=" * 50
131
+ file.puts "Rails AI Gem Monitoring Results - #{Time.now}"
132
+ file.puts "Excluding: rails_ai_tag and similar legitimate products"
133
+ file.puts "=" * 50
134
+
135
+ @results.each do |result|
136
+ file.puts "Type: #{result[:type]}"
137
+ file.puts "Name: #{result[:name]}"
138
+ file.puts "Info: #{result[:info]}"
139
+ file.puts "Downloads: #{result[:downloads]}" if result[:downloads]
140
+ file.puts "Timestamp: #{result[:timestamp]}"
141
+ file.puts "-" * 30
142
+ end
143
+ end
144
+ end
145
+
146
+ def send_alerts_if_needed
147
+ return if @results.empty?
148
+
149
+ puts "🚨 ALERT: Found #{@results.length} potential issues!"
150
+ puts "Check #{@log_file} for details"
151
+
152
+ # Here you could add email notifications
153
+ # send_email_alert(@results)
154
+ end
155
+ end
156
+
157
+ # Run the monitor
158
+ if __FILE__ == $0
159
+ monitor = RailsAIMonitor.new
160
+ monitor.run_daily_checks
161
+ end
data/rails_ai.gemspec ADDED
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/rails_ai/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rails_ai"
7
+ s.version = RailsAi::VERSION
8
+ s.authors = ["Daniel Amah"]
9
+ s.email = ["amahdanieljack@gmail.com"]
10
+ s.summary = "AI toolkit deeply integrated into Rails applications"
11
+ s.description = "A comprehensive AI toolkit for Rails with multi-provider support, context awareness, and performance optimizations"
12
+ s.homepage = "https://github.com/DanielAmah/rails_ai"
13
+ s.license = "Nonstandard"
14
+ s.licenses = ["Nonstandard"]
15
+ s.required_ruby_version = ">= 2.7.0"
16
+
17
+ s.metadata["homepage_uri"] = s.homepage
18
+ s.metadata["source_code_uri"] = s.homepage
19
+ s.metadata["changelog_uri"] = "#{s.homepage}/blob/main/CHANGELOG.md"
20
+
21
+ s.files = Dir.chdir(__dir__) do
22
+ `git ls-files -z`.split("\x0").reject do |f|
23
+ (File.expand_path(f) == __FILE__) ||
24
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
25
+ end
26
+ end
27
+ s.bindir = "exe"
28
+ s.executables = s.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
+ s.require_paths = ["lib"]
30
+
31
+ # Core dependencies
32
+ s.add_dependency "rails", ">= 5.2", "< 9"
33
+ s.add_dependency "concurrent-ruby", "~> 1.0"
34
+
35
+ # Performance dependencies
36
+ s.add_dependency "benchmark-ips", "~> 2.10"
37
+ s.add_dependency "connection_pool", "~> 2.4"
38
+ s.add_dependency "memory_profiler", "~> 1.0"
39
+
40
+ # Development dependencies
41
+ s.add_development_dependency "rspec", "~> 3.12"
42
+ s.add_development_dependency "rspec-rails", "~> 6.0"
43
+ s.add_development_dependency "standard", "~> 1.0"
44
+ s.add_development_dependency "appraisal", "~> 2.4"
45
+ s.add_development_dependency "pry", "~> 0.14"
46
+ s.add_development_dependency "pry-byebug", "~> 3.10"
47
+ s.add_development_dependency "webmock", "~> 3.19"
48
+ s.add_development_dependency "vcr", "~> 6.2"
49
+ s.add_development_dependency "simplecov", "~> 0.22"
50
+ s.add_development_dependency "rubocop", "~> 1.50"
51
+ s.add_development_dependency "rubocop-rspec", "~> 2.20"
52
+ s.add_development_dependency "rubocop-performance", "~> 1.17"
53
+ s.add_development_dependency "rubocop-rails", "~> 2.20"
54
+ end