main
 1# frozen_string_literal: true
 2
 3require "cli/ui"
 4require "erb"
 5require "fileutils"
 6require "json"
 7require "json-schema"
 8require "logger"
 9require "net/llm"
10require "open3"
11require "pathname"
12require "reline"
13require "set"
14require "thor"
15require "timeout"
16
17require_relative "elelem/agent"
18require_relative "elelem/application"
19require_relative "elelem/conversation"
20require_relative "elelem/tool"
21require_relative "elelem/toolbox"
22require_relative "elelem/version"
23
24Reline.input = $stdin
25Reline.output = $stdout
26
27module Elelem
28  class Error < StandardError; end
29
30  class Shell
31    def execute(command, args: [], env: {}, cwd: Dir.pwd, stdin: nil)
32      cmd = command.is_a?(Array) ? command.first : command
33      cmd_args = command.is_a?(Array) ? command[1..] + args : args
34      stdout, stderr, status = Open3.capture3(
35        env,
36        cmd,
37        *cmd_args,
38        chdir: cwd,
39        stdin_data: stdin
40      )
41      {
42        "exit_status" => status.exitstatus,
43        "stdout" => stdout.to_s,
44        "stderr" => stderr.to_s
45      }
46    end
47  end
48
49  class << self
50    def shell
51      @shell ||= Shell.new
52    end
53  end
54end