Commit c34aa3e

mo khan <mo@mokhan.ca>
2025-08-14 18:28:29
refactor: delegate to tui
1 parent 31973f6
Changed files (3)
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