Commit c34aa3e
lib/elelem/agent.rb
@@ -2,10 +2,11 @@
module Elelem
class Agent
- attr_reader :api, :conversation, :logger, :model
+ attr_reader :api, :conversation, :logger, :model, :tui
def initialize(configuration)
@api = configuration.api
+ @tui = configuration.tui
@configuration = configuration
@model = configuration.model
@conversation = configuration.conversation
@@ -24,31 +25,11 @@ module Elelem
@current_state = next_state
end
- def prompt(message)
- configuration.tui.prompt(message)
- end
-
- def say(message, colour: :default, newline: false)
- configuration.tui.say(message, colour: colour, newline: newline)
- end
-
def execute(tool_call)
logger.debug("Execute: #{tool_call}")
configuration.tools.execute(tool_call)
end
- def show_progress(message, prefix = "[.]", colour: :gray)
- configuration.tui.show_progress(message, prefix, colour: colour)
- end
-
- def clear_line
- configuration.tui.clear_line
- end
-
- def complete_progress(message = "Completed")
- configuration.tui.complete_progress(message)
- end
-
def quit
logger.debug("Exiting...")
exit
lib/elelem/state.rb
@@ -4,8 +4,8 @@ module Elelem
class Idle
def run(agent)
agent.logger.debug("Idling...")
- agent.say("#{Dir.pwd} (#{agent.model}) [#{git_branch}]", colour: :magenta, newline: true)
- input = agent.prompt("モ ")
+ agent.tui.say("#{Dir.pwd} (#{agent.model}) [#{git_branch}]", colour: :magenta, newline: true)
+ input = agent.tui.prompt("モ ")
agent.quit if input.nil? || input.empty? || input == "exit" || input == "quit"
agent.conversation.add(role: :user, content: input)
@@ -27,8 +27,7 @@ module Elelem
@agent = agent
agent.logger.debug("#{display_name}...")
- agent.show_progress("#{display_name}...", "[#{icon}]", colour: colour)
- agent.say("\n\n", newline: false)
+ agent.tui.show_progress("#{display_name}...", icon, colour: colour)
end
def display_name
@@ -61,10 +60,9 @@ module Elelem
class Thinking < State
def process(message)
if message["thinking"] && !message["thinking"]&.empty?
- agent.say(message["thinking"], colour: :gray, newline: false)
+ agent.tui.say(message["thinking"], colour: :gray, newline: false)
self
else
- agent.say("\n\n", newline: false)
Waiting.new(agent).process(message)
end
end
@@ -89,7 +87,7 @@ module Elelem
end
def process(_message)
- agent.say("\nTool execution failed: #{@error_message}", colour: :red)
+ agent.tui.say("\nTool execution failed: #{@error_message}", colour: :red)
Waiting.new(agent)
end
end
@@ -98,7 +96,7 @@ module Elelem
def process(message)
if message["content"] && !message["content"]&.empty?
agent.conversation.add(role: message["role"], content: message["content"])
- agent.say(message["content"], colour: :default, newline: false)
+ agent.tui.say(message["content"], colour: :default, newline: false)
self
else
Waiting.new(agent).process(message)
lib/elelem/tui.rb
@@ -14,41 +14,30 @@ module Elelem
end
def say(message, colour: :default, newline: false)
- formatted_message = colourize(message, colour: colour)
if newline
- stdout.puts(formatted_message)
+ stdout.puts(colourize(message, colour: colour))
else
- stdout.print(formatted_message)
+ stdout.print(colourize(message, colour: colour))
end
stdout.flush
end
- def show_progress(message, prefix = "[.]", colour: :gray)
- timestamp = current_time_string
- formatted_message = colourize("#{prefix} #{timestamp} #{message}", colour: colour)
- stdout.print(formatted_message)
- stdout.flush
+ def show_progress(message, icon = ".", colour: :gray)
+ timestamp = Time.now.strftime("%H:%M:%S")
+ say("[#{icon}] #{timestamp} #{message}", colour: colour, newline: false)
end
def clear_line
- stdout.print("\r#{" " * 80}\r")
- stdout.flush
+ say("\r#{" " * 80}\r", newline: false)
end
def complete_progress(message = "Completed")
clear_line
- timestamp = current_time_string
- formatted_message = colourize("[✓] #{timestamp} #{message}", colour: :green)
- stdout.puts(formatted_message)
- stdout.flush
+ show_progress(message, "✓", colour: :green)
end
private
- def current_time_string
- Time.now.strftime("%H:%M:%S")
- end
-
def colourize(text, colour: :default)
case colour
when :black