Commit 16699cc

mo khan <mo@mokhan.ca>
2025-08-14 21:29:33
chore: move state classes into a separate file
1 parent 7e576c2
lib/elelem/states/working/error.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Elelem
+  module States
+    module Working
+      class Error < State
+        def initialize(agent, error_message)
+          super(agent, "X", :red)
+          @error_message = error_message
+        end
+
+        def process(_message)
+          agent.tui.say("\nTool execution failed: #{@error_message}", colour: :red)
+          Waiting.new(agent)
+        end
+      end
+    end
+  end
+end
lib/elelem/states/working/executing.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Elelem
+  module States
+    module Working
+      class Executing < State
+        def process(message)
+          if message["tool_calls"]&.any?
+            message["tool_calls"].each do |tool_call|
+              agent.conversation.add(role: :tool, content: agent.execute(tool_call))
+            end
+          end
+
+          Waiting.new(agent)
+        end
+      end
+    end
+  end
+end
lib/elelem/states/working/state.rb
@@ -17,75 +17,6 @@ module Elelem
           self.class.name.split("::").last
         end
       end
-
-      class Waiting < State
-        def initialize(agent)
-          super(agent, ".", :cyan)
-        end
-
-        def process(message)
-          state_for(message)&.process(message)
-        end
-
-        private
-
-        def state_for(message)
-          if message["thinking"] && !message["thinking"].empty?
-            Thinking.new(agent, "*", :yellow)
-          elsif message["tool_calls"]&.any?
-            Executing.new(agent, ">", :magenta)
-          elsif message["content"] && !message["content"].empty?
-            Talking.new(agent, "~", :white)
-          end
-        end
-      end
-
-      class Thinking < State
-        def process(message)
-          if message["thinking"] && !message["thinking"]&.empty?
-            agent.tui.say(message["thinking"], colour: :gray, newline: false)
-            self
-          else
-            Waiting.new(agent).process(message)
-          end
-        end
-      end
-
-      class Executing < State
-        def process(message)
-          if message["tool_calls"]&.any?
-            message["tool_calls"].each do |tool_call|
-              agent.conversation.add(role: :tool, content: agent.execute(tool_call))
-            end
-          end
-
-          Waiting.new(agent)
-        end
-      end
-
-      class Error < State
-        def initialize(agent, error_message)
-          super(agent, "X", :red)
-          @error_message = error_message
-        end
-
-        def process(_message)
-          agent.tui.say("\nTool execution failed: #{@error_message}", colour: :red)
-          Waiting.new(agent)
-        end
-      end
-
-      class Talking < State
-        def process(message)
-          if message["content"] && !message["content"]&.empty?
-            agent.conversation.add(role: message["role"], content: message["content"])
-            agent.tui.say(message["content"], colour: :default, newline: false)
-            self
-          else
-            Waiting.new(agent).process(message)
-          end
-        end
-      end
     end
   end
 end
lib/elelem/states/working/talking.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Elelem
+  module States
+    module Working
+      class Talking < State
+        def process(message)
+          if message["content"] && !message["content"]&.empty?
+            agent.conversation.add(role: message["role"], content: message["content"])
+            agent.tui.say(message["content"], colour: :default, newline: false)
+            self
+          else
+            Waiting.new(agent).process(message)
+          end
+        end
+      end
+    end
+  end
+end
lib/elelem/states/working/thinking.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Elelem
+  module States
+    module Working
+      class Thinking < State
+        def process(message)
+          if message["thinking"] && !message["thinking"]&.empty?
+            agent.tui.say(message["thinking"], colour: :gray, newline: false)
+            self
+          else
+            Waiting.new(agent).process(message)
+          end
+        end
+      end
+    end
+  end
+end
lib/elelem/states/working/waiting.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Elelem
+  module States
+    module Working
+      class Waiting < State
+        def initialize(agent)
+          super(agent, ".", :cyan)
+        end
+
+        def process(message)
+          state_for(message)&.process(message)
+        end
+
+        private
+
+        def state_for(message)
+          if message["thinking"] && !message["thinking"].empty?
+            Thinking.new(agent, "*", :yellow)
+          elsif message["tool_calls"]&.any?
+            Executing.new(agent, ">", :magenta)
+          elsif message["content"] && !message["content"].empty?
+            Talking.new(agent, "~", :white)
+          end
+        end
+      end
+    end
+  end
+end
lib/elelem.rb
@@ -19,6 +19,11 @@ require_relative "elelem/mcp_client"
 require_relative "elelem/states/idle"
 require_relative "elelem/states/working"
 require_relative "elelem/states/working/state"
+require_relative "elelem/states/working/error"
+require_relative "elelem/states/working/executing"
+require_relative "elelem/states/working/talking"
+require_relative "elelem/states/working/thinking"
+require_relative "elelem/states/working/waiting"
 require_relative "elelem/tool"
 require_relative "elelem/toolbox/bash"
 require_relative "elelem/toolbox/mcp"
elelem.gemspec
@@ -42,7 +42,12 @@ Gem::Specification.new do |spec|
     "lib/elelem/mcp_client.rb",
     "lib/elelem/states/idle.rb",
     "lib/elelem/states/working.rb",
+    "lib/elelem/states/working/error.rb",
+    "lib/elelem/states/working/executing.rb",
     "lib/elelem/states/working/state.rb",
+    "lib/elelem/states/working/talking.rb",
+    "lib/elelem/states/working/thinking.rb",
+    "lib/elelem/states/working/waiting.rb",
     "lib/elelem/system_prompt.erb",
     "lib/elelem/tool.rb",
     "lib/elelem/toolbox/bash.rb",