Comparing changes

v0.2.0 v0.3.0
2 commits 3 files changed
Changed files (3)
lib/elelem/builtins/terminal.rb
@@ -2,7 +2,50 @@
 
 module Elelem
   module Builtins
-    class Terminal < Elelem::Terminal
+    class Terminal
+      def initialize(stream: $stdout, **)
+        @stream = stream
+        @dots_thread = nil
+        @at_line_start = true
+      end
+
+      def say(text, as: nil)
+        stop_dots
+        return if blank?(text)
+
+        text = render(text, as) if as
+        write "#{text}\n"
+        @at_line_start = true
+      end
+
+      def print(text)
+        stop_dots
+        return if blank?(text)
+
+        write text
+        @at_line_start = false
+      end
+
+      def thinking(text)
+        print("\e[2;3m#{text}\e[0m") unless blank?(text)
+      end
+
+      def doing(name, args, state: "+")
+        gap
+        say "#{state} \e[36m#{name}\e[0m(#{args})"
+      end
+
+      def waiting
+        stop_dots
+        @dots_thread = Thread.new do
+          loop do
+            @stream.print "."
+            @stream.flush
+            sleep 0.1
+          end
+        end
+      end
+
       def display_file(path, fallback: nil)
         system("bat", "--paging=never", path) || say(fallback || path)
       end
@@ -10,7 +53,8 @@ module Elelem
       private
 
       def render(text, as)
-        return super unless as == :markdown
+        return "\n  ✗ #{text}" if as == :error
+        return text unless as == :markdown
 
         gap
         width = @stream.winsize[1] rescue 80
@@ -23,8 +67,23 @@ module Elelem
         text
       end
 
+      def gap
+        stop_dots
+        write("\n") unless @at_line_start
+        @at_line_start = true
+      end
+
+      def stop_dots
+        return unless @dots_thread
+
+        @dots_thread.kill
+        @dots_thread = nil
+        write("\n")
+        @at_line_start = true
+      end
+
       def write(text)
-        super
+        @stream.print text
         (@transcript ||= open_transcript).print text
       end
 
@@ -34,6 +93,10 @@ module Elelem
         session_id = "#{Time.now.utc.strftime("%Y%m%dT%H%M%SZ")}-#{Process.pid}"
         File.open(File.join(state_dir, "#{session_id}.transcript"), "a").tap { |f| f.sync = true }
       end
+
+      def blank?(text)
+        text.nil? || text.to_s.strip.empty?
+      end
     end
   end
 end
lib/elelem/builtins/version.rb
@@ -2,6 +2,6 @@
 
 module Elelem
   module Builtins
-    VERSION = "0.2.0"
+    VERSION = "0.3.0"
   end
 end
Gemfile.lock
@@ -1,7 +1,7 @@
 PATH
   remote: .
   specs:
-    elelem-builtins (0.2.0)
+    elelem-builtins (0.3.0)
       elelem (~> 0.13)
       fileutils (~> 1.8)
       json (~> 3.0)
@@ -97,7 +97,7 @@ CHECKSUMS
   bundler (4.0.20) sha256=7978a8ac648767f5e635bc522445b79e80a52b907a39a36c2d8085ed6bc762ae
   diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
   elelem (0.13.0)
-  elelem-builtins (0.2.0)
+  elelem-builtins (0.3.0)
   erb (6.0.7) sha256=c5ca6dc25b0ef974a44dc8f59fe847577122483b1968a38dec305c60bf91ee92
   fileutils (1.8.0) sha256=8c6b1df54e2540bdb2f39258f08af78853aa70bad52b4d394bbc6424593c6e02
   hana (1.3.7) sha256=5425db42d651fea08859811c29d20446f16af196308162894db208cac5ce9b0d