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