Commit c57d8ee
Changed files (9)
bin
bin/lint
@@ -5,4 +5,4 @@ set -e
cd "$(dirname "$0")/.."
-bundle exec rake rubocop
+bundle exec rubocop $@
lib/elelem/api.rb
@@ -8,7 +8,7 @@ module Elelem
@configuration = configuration
end
- def chat(messages)
+ def chat(messages, &block)
body = {
messages: messages,
model: configuration.model,
@@ -28,9 +28,7 @@ module Elelem
configuration.http.request(req) do |response|
raise response.inspect unless response.code == "200"
- response.read_body do |chunk|
- yield(chunk)
- end
+ response.read_body(&block)
end
end
end
lib/elelem/application.rb
@@ -4,29 +4,29 @@ module Elelem
class Application < Thor
desc "chat", "Start the REPL"
method_option :help,
- aliases: "-h",
- type: :boolean,
- desc: "Display usage information"
+ aliases: "-h",
+ type: :boolean,
+ desc: "Display usage information"
method_option :host,
- aliases: "--host",
- type: :string,
- desc: "Ollama host",
- default: ENV.fetch("OLLAMA_HOST", "localhost:11434")
+ aliases: "--host",
+ type: :string,
+ desc: "Ollama host",
+ default: ENV.fetch("OLLAMA_HOST", "localhost:11434")
method_option :model,
- aliases: "--model",
- type: :string,
- desc: "Ollama model",
- default: ENV.fetch("OLLAMA_MODEL", "gpt-oss")
+ aliases: "--model",
+ type: :string,
+ desc: "Ollama model",
+ default: ENV.fetch("OLLAMA_MODEL", "gpt-oss")
method_option :token,
- aliases: "--token",
- type: :string,
- desc: "Ollama token",
- default: ENV.fetch("OLLAMA_API_KEY", nil)
+ aliases: "--token",
+ type: :string,
+ desc: "Ollama token",
+ default: ENV.fetch("OLLAMA_API_KEY", nil)
method_option :debug,
- aliases: "--debug",
- type: :boolean,
- desc: "Debug mode",
- default: false
+ aliases: "--debug",
+ type: :boolean,
+ desc: "Debug mode",
+ default: false
def chat(*)
if options[:help]
invoke :help, ["chat"]
@@ -35,10 +35,10 @@ module Elelem
host: options[:host],
model: options[:model],
token: options[:token],
- debug: options[:debug],
+ debug: options[:debug]
)
say "Agent (#{configuration.model})", :green
- say "#{configuration.tools.banner}", :green
+ say configuration.tools.banner.to_s, :green
agent = Agent.new(configuration)
agent.repl
lib/elelem/configuration.rb
@@ -28,7 +28,7 @@ module Elelem
def logger
@logger ||= Logger.new(debug ? "elelem.log" : "/dev/null").tap do |logger|
- logger.formatter = ->(_, _, _, message) { message.to_s.strip + "\n" }
+ logger.formatter = ->(_, _, _, message) { "#{message.to_s.strip}\n" }
end
end
lib/elelem/conversation.rb
@@ -2,14 +2,14 @@
module Elelem
class Conversation
- SYSTEM_MESSAGE = <<~SYS
+ SYSTEM_MESSAGE = <<~SYS.freeze
You are ChatGPT, a helpful assistant with reasoning capabilities.
Current date: #{Time.now.strftime("%Y-%m-%d")}.
System info: `uname -a` output: #{`uname -a`.strip}
Reasoning: high
SYS
- ROLES = [:system, :assistant, :user, :tool].freeze
+ ROLES = %i[system assistant user tool].freeze
def initialize(items = [{ role: "system", content: SYSTEM_MESSAGE }])
@items = items
lib/elelem/mcp_client.rb
@@ -9,7 +9,7 @@ module Elelem
@stdin, @stdout, @stderr, @worker_thread = Open3.popen3(*serena_command, pgroup: true)
# 1. Send initialize request
- init_result = send_request(
+ send_request(
method: "initialize",
params: {
protocolVersion: "2024-11-05",
@@ -46,8 +46,7 @@ module Elelem
private
- attr_reader :stdin, :stdout, :stderr, :worker_thread
- attr_reader :configuration
+ attr_reader :stdin, :stdout, :stderr, :worker_thread, :configuration
def serena_command
[
@@ -58,7 +57,7 @@ module Elelem
"start-mcp-server",
"--transport", "stdio",
"--context", "ide-assistant",
- "--project", Dir.pwd,
+ "--project", Dir.pwd
]
end
@@ -66,7 +65,7 @@ module Elelem
request = {
jsonrpc: "2.0",
id: Time.now.to_i,
- method: method,
+ method: method
}
request[:params] = params unless params.empty?
configuration.logger.debug(JSON.pretty_generate(request))
@@ -86,7 +85,7 @@ module Elelem
def send_notification(method:, params: {})
notification = {
jsonrpc: "2.0",
- method: method,
+ method: method
}
notification[:params] = params unless params.empty?
configuration.logger.debug("Sending notification: #{JSON.pretty_generate(notification)}")
lib/elelem/state.rb
@@ -27,17 +27,13 @@ module Elelem
class Waiting < State
def process(message)
- state = self
-
- if message["thinking"] && !message["thinking"].empty?
- state = Thinking.new(agent)
- elsif message["tool_calls"]&.any?
- state = Executing.new(agent)
- elsif message["content"] && !message["content"].empty?
- state = Talking.new(agent)
- else
- state = nil
- end
+ state = if message["thinking"] && !message["thinking"].empty?
+ Thinking.new(agent)
+ elsif message["tool_calls"]&.any?
+ Executing.new(agent)
+ elsif message["content"] && !message["content"].empty?
+ Talking.new(agent)
+ end
state&.process(message)
end
lib/elelem/tools.rb
@@ -11,7 +11,7 @@ module Elelem
parameters: {
type: "object",
properties: {
- command: { type: "string" },
+ command: { type: "string" }
},
required: ["command"]
}
@@ -19,9 +19,9 @@ module Elelem
handler: lambda { |args|
stdout, stderr, _status = Open3.capture3("/bin/sh", "-c", args["command"])
stdout + stderr
- },
- },
- ]
+ }
+ }
+ ].freeze
def initialize(configuration, tools = DEFAULT_TOOLS)
@configuration = configuration
@@ -39,8 +39,8 @@ module Elelem
result = client.call_tool(tool["name"], args)
output = result.dig("content", 0, "text") || result.to_s
configuration.tui.say(output)
- return output
- },
+ output
+ }
}
end
end
lib/elelem/tui.rb
@@ -32,7 +32,7 @@ module Elelem
end
def clear_line
- stdout.print("\r" + " " * 80 + "\r")
+ stdout.print("\r#{" " * 80}\r")
stdout.flush
end