Commit fb36cd1

mo khan <mo@mokhan.ca>
2026-01-14 18:45:32
feat: add a spinner when waiting for feedback
1 parent d0cc6f8
Changed files (2)
lib/elelem/agent.rb
@@ -39,9 +39,9 @@ module Elelem
     def default_terminal
       Terminal.new(
         commands: COMMANDS,
-        env_vars: ENV_VARS
+        env_vars: ENV_VARS,
         modes: MODES,
-        providers: PROVIDERS,
+        providers: PROVIDERS
       )
     end
 
@@ -238,7 +238,7 @@ module Elelem
         content = ""
         tool_calls = []
 
-        terminal.write "Thinking... "
+        terminal.waiting
         begin
           client.fetch(messages + turn_context, tools) do |chunk|
             case chunk[:type]
lib/elelem/terminal.rb
@@ -7,6 +7,7 @@ module Elelem
       @modes = modes
       @providers = providers
       @env_vars = env_vars
+      @spinner_thread = nil
       setup_completion
     end
 
@@ -15,13 +16,28 @@ module Elelem
     end
 
     def say(message)
+      stop_spinner
       $stdout.puts message
     end
 
     def write(message)
+      stop_spinner
       $stdout.print message
     end
 
+    def waiting
+      @spinner_thread = Thread.new do
+        frames = %w[| / - \\]
+        i = 0
+        loop do
+          $stdout.print "\r#{frames[i % frames.length]} "
+          $stdout.flush
+          i += 1
+          sleep 0.1
+        end
+      end
+    end
+
     def select(question, options, &block)
       CLI::UI::Prompt.ask(question) do |handler|
         options.each do |option|
@@ -32,6 +48,14 @@ module Elelem
 
     private
 
+    def stop_spinner
+      return unless @spinner_thread
+
+      @spinner_thread.kill
+      @spinner_thread = nil
+      $stdout.print "\r  \r"
+    end
+
     def setup_completion
       Reline.autocompletion = true
       Reline.completion_proc = ->(target, preposing) { complete(target, preposing) }