Commit 5a8c718

mo khan <mo@mokhan.ca>
2026-09-07 20:22:16
add Terminal subclass with glow/bat/transcript, moved out of core
1 parent cafe700
lib/elelem/builtins/terminal.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Elelem
+  module Builtins
+    class Terminal < Elelem::Terminal
+      def display_file(path, fallback: nil)
+        system("bat", "--paging=never", path) || say(fallback || path)
+      end
+
+      private
+
+      def render(text, as)
+        return super unless as == :markdown
+
+        gap
+        width = $stdout.winsize[1] rescue 80
+        IO.popen(["glow", "-s", "dark", "-w", width.to_s, "-"], "r+") do |io|
+          io.write(text)
+          io.close_write
+          io.read
+        end
+      rescue Errno::ENOENT
+        text
+      end
+
+      def write(text)
+        super
+        (@transcript ||= open_transcript).print text
+      end
+
+      def open_transcript
+        state_dir = File.join(ENV.fetch("XDG_STATE_HOME", File.expand_path("~/.local/state")), "elelem", "sessions")
+        FileUtils.mkdir_p(state_dir)
+        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
+    end
+  end
+end
+
+Elelem.configure { |config| config.output { Elelem::Builtins::Terminal.new } }
lib/elelem/builtins.rb
@@ -70,3 +70,4 @@ require_relative "builtins/tools"
 require_relative "builtins/read"
 require_relative "builtins/write"
 require_relative "builtins/execute"
+require_relative "builtins/terminal"
elelem-builtins.gemspec
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
   end
   spec.require_paths = ["lib"]
 
-  spec.add_dependency "elelem", "~> 0.12"
+  spec.add_dependency "elelem", "~> 0.13"
   spec.add_dependency "fileutils", "~> 1.8"
   spec.add_dependency "json", "~> 2.21"
   spec.add_dependency "open3", "~> 0.2"
Gemfile.lock
@@ -2,7 +2,7 @@ PATH
   remote: .
   specs:
     elelem-builtins (0.1.0)
-      elelem (~> 0.11)
+      elelem (~> 0.13)
       fileutils (~> 1.8)
       json (~> 2.21)
       open3 (~> 0.2)
@@ -14,9 +14,8 @@ GEM
   specs:
     bigdecimal (4.1.2)
     diff-lcs (1.6.2)
-    elelem (0.11.0)
+    elelem (0.13.0)
       erb (~> 6.0)
-      fileutils (~> 1.8)
       io-console (~> 0.9)
       json (~> 2.21)
       json_schemer (~> 2.5)
@@ -26,8 +25,6 @@ GEM
       pathname (~> 0.5)
       reline (~> 0.7)
       shellwords (~> 0.2)
-      stringio (~> 3.2)
-      tempfile (~> 0.3)
       uri (~> 1.0)
     erb (6.0.7)
     fileutils (1.8.0)
@@ -99,7 +96,7 @@ CHECKSUMS
   bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
   bundler (4.0.20) sha256=7978a8ac648767f5e635bc522445b79e80a52b907a39a36c2d8085ed6bc762ae
   diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
-  elelem (0.11.0)
+  elelem (0.13.0)
   elelem-builtins (0.1.0)
   erb (6.0.7) sha256=c5ca6dc25b0ef974a44dc8f59fe847577122483b1968a38dec305c60bf91ee92
   fileutils (1.8.0) sha256=8c6b1df54e2540bdb2f39258f08af78853aa70bad52b4d394bbc6424593c6e02