Commit 16699cc
Changed files (8)
lib
elelem
states
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",