main
 1# frozen_string_literal: true
 2
 3require "base64"
 4require "date"
 5require "digest"
 6require "erb"
 7require "fileutils"
 8require "json"
 9require "json_schemer"
10require "logger"
11require "net/hippie"
12require "open3"
13require "optparse"
14require "pathname"
15require "reline"
16require "securerandom"
17require "shellwords"
18require "stringio"
19require "tempfile"
20require "uri"
21require "webrick"
22
23require_relative "elelem/agent"
24require_relative "elelem/commands"
25require_relative "elelem/conversation"
26require_relative "elelem/mcp"
27require_relative "elelem/net"
28require_relative "elelem/permissions"
29require_relative "elelem/plugins"
30require_relative "elelem/providers"
31require_relative "elelem/system_prompt"
32require_relative "elelem/terminal"
33require_relative "elelem/tool"
34require_relative "elelem/toolbox"
35require_relative "elelem/version"
36
37module Elelem
38  def self.sh(cmd, args: [], cwd: Dir.pwd, env: {})
39    output = StringIO.new
40
41    Open3.popen2e(env, cmd, *args, chdir: cwd) do |stdin, out, wait_thr|
42      stdin.close
43      out.each_line do |line|
44        yield line if block_given?
45        output.write(line)
46      end
47
48      { exit_status: wait_thr.value.exitstatus, content: output.string }
49    end
50  end
51
52  def self.start(provider: "ollama", toolbox: Toolbox.new)
53    client = Providers.build(provider)
54    agent = Agent.new(client, toolbox: toolbox)
55    Plugins.setup!(agent)
56    agent.terminal = Terminal.new(commands: agent.commands)
57    agent.repl
58  end
59
60  def self.ask(prompt, provider: "ollama", toolbox: Toolbox.new)
61    client = Providers.build(provider)
62    agent = Agent.new(client, toolbox: toolbox, terminal: Terminal.new(quiet: true))
63    Plugins.setup!(agent)
64    agent.turn(prompt)
65    agent.conversation.last[:content]
66  end
67end