Class: ClaudeAgentServer::Services::SessionManager

Inherits:
Object
  • Object
show all
Defined in:
lib/claude_agent_server/services/session_manager.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSessionManager

Returns a new instance of SessionManager.



117
118
119
120
121
# File 'lib/claude_agent_server/services/session_manager.rb', line 117

def initialize
  @sessions = {}
  @mutex = Mutex.new
  @reaper_task = nil
end

Instance Attribute Details

#sessionsObject (readonly)

Returns the value of attribute sessions.



115
116
117
# File 'lib/claude_agent_server/services/session_manager.rb', line 115

def sessions
  @sessions
end

Instance Method Details

#create_session(options:, prompt: nil, id: nil) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/claude_agent_server/services/session_manager.rb', line 123

def create_session(options:, prompt: nil, id: nil)
  config = ClaudeAgentServer.config
  id ||= SecureRandom.uuid

  @mutex.synchronize do
    raise SessionAlreadyExistsError, "Session '#{id}' already exists" if @sessions.key?(id)

    if @sessions.size >= config.max_sessions
      raise SessionLimitError, "Maximum session limit (#{config.max_sessions}) reached"
    end
  end

  client = ClaudeAgentSDK::Client.new(options: options)
  client.connect(prompt)

  entry = SessionEntry.new(id: id, client: client)
  @mutex.synchronize { @sessions[id] = entry }

  entry.start_message_reader
  entry
end

#destroy_session(id) ⇒ Object



149
150
151
152
153
154
155
# File 'lib/claude_agent_server/services/session_manager.rb', line 149

def destroy_session(id)
  entry = @mutex.synchronize { @sessions.delete(id) }
  raise SessionNotFoundError, "Session '#{id}' not found" unless entry

  entry.disconnect
  entry
end

#get_session(id) ⇒ Object



145
146
147
# File 'lib/claude_agent_server/services/session_manager.rb', line 145

def get_session(id)
  @mutex.synchronize { @sessions[id] } || raise(SessionNotFoundError, "Session '#{id}' not found")
end

#list_sessionsObject



157
158
159
# File 'lib/claude_agent_server/services/session_manager.rb', line 157

def list_sessions
  @mutex.synchronize { @sessions.values.dup }
end

#shutdownObject



174
175
176
177
178
179
180
# File 'lib/claude_agent_server/services/session_manager.rb', line 174

def shutdown
  stop_reaper
  @mutex.synchronize do
    @sessions.each_value(&:disconnect)
    @sessions.clear
  end
end

#start_reaperObject



161
162
163
164
165
166
167
168
# File 'lib/claude_agent_server/services/session_manager.rb', line 161

def start_reaper
  @reaper_task = Async do |task|
    loop do
      task.sleep(60)
      reap_expired_sessions
    end
  end
end

#stop_reaperObject



170
171
172
# File 'lib/claude_agent_server/services/session_manager.rb', line 170

def stop_reaper
  @reaper_task&.stop
end