ares-runtime 2.0.1

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 (39) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +10 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +110 -0
  5. data/config/models.yml +25 -0
  6. data/config/ollama.yml +4 -0
  7. data/config/workspaces.yml +6 -0
  8. data/exe/ares +75 -0
  9. data/lib/ares/cli.rb +37 -0
  10. data/lib/ares/runtime/adapters/base_adapter.rb +68 -0
  11. data/lib/ares/runtime/adapters/claude_adapter.rb +35 -0
  12. data/lib/ares/runtime/adapters/codex_adapter.rb +35 -0
  13. data/lib/ares/runtime/adapters/cursor_adapter.rb +32 -0
  14. data/lib/ares/runtime/adapters/ollama_adapter.rb +37 -0
  15. data/lib/ares/runtime/config_cli.rb +18 -0
  16. data/lib/ares/runtime/config_manager.rb +137 -0
  17. data/lib/ares/runtime/context_loader.rb +45 -0
  18. data/lib/ares/runtime/core_subsystem.rb +36 -0
  19. data/lib/ares/runtime/diagnostic_parser.rb +159 -0
  20. data/lib/ares/runtime/doctor.rb +34 -0
  21. data/lib/ares/runtime/engine_chain.rb +108 -0
  22. data/lib/ares/runtime/git_manager.rb +26 -0
  23. data/lib/ares/runtime/initializer.rb +30 -0
  24. data/lib/ares/runtime/logs_cli.rb +35 -0
  25. data/lib/ares/runtime/model_selector.rb +36 -0
  26. data/lib/ares/runtime/ollama_client_factory.rb +43 -0
  27. data/lib/ares/runtime/planner/ollama_planner.rb +51 -0
  28. data/lib/ares/runtime/planner/tiny_task_processor.rb +129 -0
  29. data/lib/ares/runtime/prompt_builder.rb +52 -0
  30. data/lib/ares/runtime/quota_manager.rb +48 -0
  31. data/lib/ares/runtime/router.rb +285 -0
  32. data/lib/ares/runtime/task_logger.rb +37 -0
  33. data/lib/ares/runtime/task_manager.rb +9 -0
  34. data/lib/ares/runtime/terminal_runner.rb +37 -0
  35. data/lib/ares/runtime/tui.rb +211 -0
  36. data/lib/ares/runtime/version.rb +7 -0
  37. data/lib/ares/runtime.rb +5 -0
  38. data/lib/ares_runtime.rb +63 -0
  39. metadata +240 -0
@@ -0,0 +1,211 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tty-box'
4
+ require 'tty-screen'
5
+ require 'tty-cursor'
6
+ require 'tty-table'
7
+ require 'tty-prompt'
8
+ require_relative 'router'
9
+ require_relative 'task_logger'
10
+ require_relative 'quota_manager'
11
+ require_relative 'config_manager'
12
+
13
+ module Ares
14
+ module Runtime
15
+ class Tui
16
+ def self.start
17
+ new.run
18
+ end
19
+
20
+ def initialize
21
+ @cursor = TTY::Cursor
22
+ @prompt = TTY::Prompt.new(interrupt: :exit)
23
+ @logger = TaskLogger.new
24
+ @router = Router.new
25
+ @log_dir = File.expand_path('../../logs', __dir__)
26
+ end
27
+
28
+ def run
29
+ loop do
30
+ render_dashboard
31
+ handle_input
32
+ rescue StandardError => e
33
+ system('clear')
34
+ puts "TUI Error: #{e.message}"
35
+ puts e.backtrace.first(5)
36
+ @prompt.keypress('Press any key to exit...')
37
+ exit 1
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def render_dashboard
44
+ system('clear')
45
+ width = TTY::Screen.width
46
+ height = TTY::Screen.height
47
+
48
+ # Header
49
+ header_box = TTY::Box.frame(
50
+ width: width,
51
+ height: 3,
52
+ align: :center,
53
+ padding: 0,
54
+ title: { top_left: " ARES ORCHESTRATOR v#{Ares::Runtime::VERSION} ",
55
+ bottom_right: " #{Time.now.strftime('%H:%M:%S')} " },
56
+ style: { border: { fg: :cyan } }
57
+ ) { 'Deterministic Multi-Agent Runtime' }
58
+ print header_box
59
+
60
+ # Stats & Quota
61
+ stats_box = TTY::Box.frame(
62
+ width: width / 2,
63
+ height: 6,
64
+ top: 3,
65
+ title: { top_left: ' SYSTEM STATS ' },
66
+ style: { border: { fg: :yellow } }
67
+ ) do
68
+ [
69
+ "Claude Quota: #{QuotaManager.usage[:claude]}/#{QuotaManager::LIMITS[:claude]}",
70
+ "Codex Quota: #{QuotaManager.usage[:codex]}/#{QuotaManager::LIMITS[:codex]}",
71
+ "Tasks Run: #{Dir.glob(File.join(@log_dir, '*.json')).count}"
72
+ ].join("\n")
73
+ end
74
+ print stats_box
75
+
76
+ # Recent History
77
+ history = Dir.glob(File.join(@log_dir, '*.json')).sort_by { |f| File.mtime(f) }.last(3).reverse
78
+ history_box = TTY::Box.frame(
79
+ width: width / 2,
80
+ height: 6,
81
+ top: 3,
82
+ left: width / 2,
83
+ title: { top_left: ' RECENT HISTORY ' },
84
+ style: { border: { fg: :magenta } }
85
+ ) do
86
+ if history.empty?
87
+ 'No tasks run yet.'
88
+ else
89
+ history.map { |f| "#{File.basename(f, '.json')[0..20]}..." }.join("\n")
90
+ end
91
+ end
92
+ print history_box
93
+
94
+ # Footer / Instructions
95
+ print @cursor.move_to(0, height - 1)
96
+ print 'Press [Enter] to start a new task, [T] to run tests, [Q] to quit.'
97
+ end
98
+
99
+ def handle_input
100
+ case @prompt.keypress('')
101
+ when 'q', 'Q', "\u0003"
102
+ system('clear')
103
+ exit
104
+ when 't', 'T'
105
+ @router.run('run tests')
106
+ @prompt.keypress('Press any key to return to dashboard...')
107
+ when "\r"
108
+ task = @prompt.ask('Enter task description:')
109
+ if task && !task.empty?
110
+ @router.run(task)
111
+ @prompt.keypress('Press any key to return to dashboard...')
112
+ end
113
+ when 'l', 'L'
114
+ begin
115
+ @router.run('lint', git: false)
116
+ rescue StandardError => e
117
+ puts "\n❌ Error during linting: #{e.message}"
118
+ ensure
119
+ @prompt.keypress('Press any key to return to dashboard...')
120
+ end
121
+ when 'c', 'C'
122
+ configure_settings
123
+ end
124
+ end
125
+
126
+ def configure_settings
127
+ loop do
128
+ system('clear')
129
+ puts '--- ⚙️ ARES CONFIGURATION MODE ---'
130
+
131
+ config_type = @prompt.select('What would you like to configure?',
132
+ ['Model Allocations (Task-based)', 'Ollama Server Settings',
133
+ 'Exit to Dashboard'])
134
+ break if config_type == 'Exit to Dashboard'
135
+
136
+ if config_type == 'Model Allocations (Task-based)'
137
+ configure_models
138
+ else
139
+ configure_ollama_server
140
+ end
141
+ end
142
+ end
143
+
144
+ def configure_models
145
+ loop do
146
+ system('clear')
147
+ puts '--- 🤖 MODEL ALLOCATIONS ---'
148
+ task_types = ConfigManager.task_types
149
+ task_type = @prompt.select('Select task type:', task_types + ['Back'])
150
+ break if task_type == 'Back'
151
+
152
+ current_config = ConfigManager.load_models[task_type]
153
+ puts "\nCurrent: #{current_config[:engine]} (#{current_config[:model] || 'default'})"
154
+
155
+ engine = @prompt.select('Select engine:', %w[claude codex cursor ollama Back])
156
+ next if engine == 'Back'
157
+
158
+ model = case engine
159
+ when 'claude'
160
+ @prompt.select('Select model:', %w[opus sonnet haiku Back])
161
+ when 'ollama'
162
+ OllamaAdapter.new.send(:best_available_model) # Trigger discovery
163
+ available = Ollama::Client.new.list_model_names
164
+ @prompt.select('Select model (discovered):', available + ['Back'])
165
+ else
166
+ @prompt.ask('Enter model name (or leave empty, type "back" to cancel):')
167
+ end
168
+
169
+ next if model == 'Back' || model.to_s.downcase == 'back'
170
+
171
+ model = nil if model.to_s.strip.empty?
172
+
173
+ ConfigManager.update_task_config(task_type, engine, model)
174
+ puts "\n✅ Updated #{task_type}!"
175
+ sleep 1
176
+ end
177
+ end
178
+
179
+ def configure_ollama_server
180
+ loop do
181
+ system('clear')
182
+ puts '--- 🔌 OLLAMA SERVER SETTINGS ---'
183
+ config = ConfigManager.load_ollama
184
+
185
+ puts "Base URL: #{config[:base_url]}"
186
+ puts "Timeout: #{config[:timeout]}s"
187
+ puts "Ctx Size: #{config[:num_ctx]}"
188
+
189
+ field = @prompt.select('Select setting to change:',
190
+ ['Base URL', 'Timeout', 'Context Size', 'Retries', 'Back'])
191
+ break if field == 'Back'
192
+
193
+ case field
194
+ when 'Base URL'
195
+ config[:base_url] = @prompt.ask('Enter Ollama Base URL:', default: config[:base_url])
196
+ when 'Timeout'
197
+ config[:timeout] = @prompt.ask('Enter Timeout (seconds):', default: config[:timeout].to_s).to_i
198
+ when 'Context Size'
199
+ config[:num_ctx] = @prompt.ask('Enter Context Window Size:', default: config[:num_ctx].to_s).to_i
200
+ when 'Retries'
201
+ config[:retries] = @prompt.ask('Enter Retry Count:', default: config[:retries].to_s).to_i
202
+ end
203
+
204
+ ConfigManager.save_ollama(config)
205
+ puts "\n✅ Server settings updated!"
206
+ sleep 1
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ares
4
+ module Runtime
5
+ VERSION = '2.0.1'
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'runtime/router'
4
+ require_relative 'runtime/tui'
5
+ require_relative 'runtime/planner/ollama_planner'
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tty-spinner'
4
+ require 'tty-prompt'
5
+ require 'tty-table'
6
+ require 'tty-box'
7
+ require 'tty-screen'
8
+ require 'tty-cursor'
9
+ require 'tty-command'
10
+ require 'dotenv'
11
+ require 'json'
12
+ require 'yaml'
13
+ require 'fileutils'
14
+ require 'securerandom'
15
+
16
+ # Load Dotenv
17
+ begin
18
+ Dotenv.load
19
+ rescue StandardError
20
+ nil
21
+ end
22
+
23
+ require_relative 'ares/runtime/version'
24
+
25
+ # Core
26
+ require_relative 'ares/runtime/config_manager'
27
+ require_relative 'ares/runtime/context_loader'
28
+ require_relative 'ares/runtime/diagnostic_parser'
29
+ require_relative 'ares/runtime/git_manager'
30
+ require_relative 'ares/runtime/model_selector'
31
+ require_relative 'ares/runtime/quota_manager'
32
+ require_relative 'ares/runtime/prompt_builder'
33
+ require_relative 'ares/runtime/engine_chain'
34
+ require_relative 'ares/runtime/core_subsystem'
35
+ require_relative 'ares/runtime/router'
36
+ require_relative 'ares/runtime/task_logger'
37
+ require_relative 'ares/runtime/task_manager'
38
+ require_relative 'ares/runtime/terminal_runner'
39
+ require_relative 'ares/runtime/tui'
40
+
41
+ # Planner
42
+ require_relative 'ares/runtime/planner/ollama_planner'
43
+ require_relative 'ares/runtime/planner/tiny_task_processor'
44
+
45
+ # Adapters
46
+ require_relative 'ares/runtime/adapters/claude_adapter'
47
+ require_relative 'ares/runtime/adapters/codex_adapter'
48
+ require_relative 'ares/runtime/adapters/cursor_adapter'
49
+ require_relative 'ares/runtime/adapters/ollama_adapter'
50
+
51
+ # Runtime CLI Commands
52
+ require_relative 'ares/runtime'
53
+ require_relative 'ares/cli'
54
+ require_relative 'ares/runtime/config_cli'
55
+ require_relative 'ares/runtime/doctor'
56
+ require_relative 'ares/runtime/initializer'
57
+ require_relative 'ares/runtime/logs_cli'
58
+
59
+ # The Ares Orchestrator Runtime
60
+ module Ares
61
+ # Root namespace for the Ares Orchestrator CLI.
62
+ # All core logic is contained within Ares::Runtime.
63
+ end
metadata ADDED
@@ -0,0 +1,240 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ares-runtime
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Antigravity
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2026-02-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dotenv
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ollama-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-box
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-command
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: tty-cursor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: tty-prompt
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: tty-screen
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: tty-spinner
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: tty-table
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: yaml
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: A production-grade control plane for routing tasks to Claude, Codex,
168
+ and Cursor with local planning.
169
+ email:
170
+ - shubhamtaywade82@gmail.com
171
+ executables:
172
+ - ares
173
+ extensions: []
174
+ extra_rdoc_files: []
175
+ files:
176
+ - CHANGELOG.md
177
+ - LICENSE.txt
178
+ - README.md
179
+ - config/models.yml
180
+ - config/ollama.yml
181
+ - config/workspaces.yml
182
+ - exe/ares
183
+ - lib/ares/cli.rb
184
+ - lib/ares/runtime.rb
185
+ - lib/ares/runtime/adapters/base_adapter.rb
186
+ - lib/ares/runtime/adapters/claude_adapter.rb
187
+ - lib/ares/runtime/adapters/codex_adapter.rb
188
+ - lib/ares/runtime/adapters/cursor_adapter.rb
189
+ - lib/ares/runtime/adapters/ollama_adapter.rb
190
+ - lib/ares/runtime/config_cli.rb
191
+ - lib/ares/runtime/config_manager.rb
192
+ - lib/ares/runtime/context_loader.rb
193
+ - lib/ares/runtime/core_subsystem.rb
194
+ - lib/ares/runtime/diagnostic_parser.rb
195
+ - lib/ares/runtime/doctor.rb
196
+ - lib/ares/runtime/engine_chain.rb
197
+ - lib/ares/runtime/git_manager.rb
198
+ - lib/ares/runtime/initializer.rb
199
+ - lib/ares/runtime/logs_cli.rb
200
+ - lib/ares/runtime/model_selector.rb
201
+ - lib/ares/runtime/ollama_client_factory.rb
202
+ - lib/ares/runtime/planner/ollama_planner.rb
203
+ - lib/ares/runtime/planner/tiny_task_processor.rb
204
+ - lib/ares/runtime/prompt_builder.rb
205
+ - lib/ares/runtime/quota_manager.rb
206
+ - lib/ares/runtime/router.rb
207
+ - lib/ares/runtime/task_logger.rb
208
+ - lib/ares/runtime/task_manager.rb
209
+ - lib/ares/runtime/terminal_runner.rb
210
+ - lib/ares/runtime/tui.rb
211
+ - lib/ares/runtime/version.rb
212
+ - lib/ares_runtime.rb
213
+ homepage: https://github.com/shubhamtaywade82/agent-orchestrator
214
+ licenses:
215
+ - MIT
216
+ metadata:
217
+ rubygems_mfa_required: 'true'
218
+ homepage_uri: https://github.com/shubhamtaywade82/agent-orchestrator
219
+ source_code_uri: https://github.com/shubhamtaywade82/agent-orchestrator
220
+ changelog_uri: https://github.com/shubhamtaywade82/agent-orchestrator/blob/main/CHANGELOG.md
221
+ post_install_message:
222
+ rdoc_options: []
223
+ require_paths:
224
+ - lib
225
+ required_ruby_version: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: 2.7.0
230
+ required_rubygems_version: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ requirements: []
236
+ rubygems_version: 3.5.11
237
+ signing_key:
238
+ specification_version: 4
239
+ summary: Deterministic Multi-Agent Orchestrator
240
+ test_files: []