Class: RubyAgent::Agent

Inherits:
Object
  • Object
show all
Includes:
CallbackSupport
Defined in:
lib/ruby_agent/agent.rb

Defined Under Namespace

Classes: ConnectionError

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from CallbackSupport

included, #run_callbacks

Constructor Details

#initialize(name: "MyName", system_prompt: nil, model: nil, sandbox_dir: nil) ⇒ Agent

Each callback fires only for its specific event type, while on_event callbacks fires for all events. This follows the Single Responsibility Principle and makes the code more maintainable.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/ruby_agent/agent.rb', line 51

def initialize(name: "MyName", system_prompt: nil, model: nil, sandbox_dir: nil)
  @name = name
  @system_prompt = system_prompt || config.system_prompt
  @model = model || config.model
  @sandbox_dir = sandbox_dir || config.sandbox_dir
  @stdin = nil
  @stdout = nil
  @stderr = nil
  @wait_thr = nil
  @parsed_lines = []
  @parsed_lines_mutex = Mutex.new

  return unless @session_key.nil?

  Time.now.utc.strftime("%Y%m%d%H%M%S")
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def context
  @context
end

#conversation_historyObject (readonly)

Returns the value of attribute conversation_history.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def conversation_history
  @conversation_history
end

#mcp_serversObject (readonly)

Returns the value of attribute mcp_servers.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def mcp_servers
  @mcp_servers
end

#modelObject (readonly)

Returns the value of attribute model.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def model
  @model
end

#nameObject (readonly)

Returns the value of attribute name.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def name
  @name
end

#sandbox_dirObject (readonly)

Returns the value of attribute sandbox_dir.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def sandbox_dir
  @sandbox_dir
end

#session_keyObject (readonly)

Returns the value of attribute session_key.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def session_key
  @session_key
end

#skip_permissionsObject (readonly)

Returns the value of attribute skip_permissions.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def skip_permissions
  @skip_permissions
end

#system_promptObject (readonly)

Returns the value of attribute system_prompt.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def system_prompt
  @system_prompt
end

#timezoneObject (readonly)

Returns the value of attribute timezone.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def timezone
  @timezone
end

#verboseObject (readonly)

Returns the value of attribute verbose.



10
11
12
# File 'lib/ruby_agent/agent.rb', line 10

def verbose
  @verbose
end

Instance Method Details

#ask(message) ⇒ Object



106
107
108
109
110
111
# File 'lib/ruby_agent/agent.rb', line 106

def ask(message)
  return if message.nil? || message.strip.empty?

  send_message(message)
  read_response
end

#closeObject



113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/ruby_agent/agent.rb', line 113

def close
  return unless @stdin

  @stdin.close unless @stdin.closed?
  @stdout.close unless @stdout.closed?
  @stderr.close unless @stderr.closed?
  @wait_thr&.join
ensure
  @stdin = nil
  @stdout = nil
  @stderr = nil
  @wait_thr = nil
end

#configObject



68
69
70
# File 'lib/ruby_agent/agent.rb', line 68

def config
  RubyAgent.configuration ||= RubyAgent::Configuration.new
end

#connect(timezone: "Eastern Time (US & Canada)", skip_permissions: true, verbose: true, mcp_servers: nil, session_key: nil, resume_session: false, **additional_context) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/ruby_agent/agent.rb', line 72

def connect(
  timezone: "Eastern Time (US & Canada)",
  skip_permissions: true,
  verbose: true,
  mcp_servers: nil,
  session_key: nil,
  resume_session: false,
  **additional_context
)
  @timezone = timezone
  @skip_permissions = skip_permissions
  @verbose = verbose
  @mcp_servers = mcp_servers
  @session_key = session_key
  @resume_session = resume_session
  @context = additional_context
  @conversation_history = []

  ensure_sandbox_exists

  command = build_claude_command

  @stdin, @stdout, @stderr, @wait_thr = spawn_process(command, @sandbox_dir)

  sleep 0.5
  unless @wait_thr.alive?
    error_output = @stderr.read
    raise ConnectionError, "Claude process failed to start. Error: #{error_output}"
  end

  puts "Claude process started successfully (PID: #{@wait_thr.pid})"
  self
end