Class: Legion::TTY::SessionStore

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/tty/session_store.rb

Constant Summary collapse

SESSION_DIR =
File.expand_path('~/.legionio/sessions')

Instance Method Summary collapse

Constructor Details

#initialize(dir: SESSION_DIR) ⇒ SessionStore

Returns a new instance of SessionStore.



11
12
13
14
# File 'lib/legion/tty/session_store.rb', line 11

def initialize(dir: SESSION_DIR)
  @dir = dir
  FileUtils.mkdir_p(@dir)
end

Instance Method Details

#auto_session_name(messages: []) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/legion/tty/session_store.rb', line 54

def auto_session_name(messages: [])
  first_user = messages.find { |m| m[:role] == :user }
  return "session-#{Time.now.strftime('%H%M%S')}" unless first_user

  words = first_user[:content].to_s.downcase.gsub(/[^a-z0-9\s]/, '').split
  slug = words.first(4).join('-')
  slug = "session-#{Time.now.strftime('%H%M%S')}" if slug.empty?
  slug
end

#delete(name) ⇒ Object



49
50
51
52
# File 'lib/legion/tty/session_store.rb', line 49

def delete(name)
  path = session_path(name)
  FileUtils.rm_f(path)
end

#listObject



38
39
40
41
42
43
44
45
46
47
# File 'lib/legion/tty/session_store.rb', line 38

def list
  entries = Dir.glob(File.join(@dir, '*.json')).map do |path|
    name = File.basename(path, '.json')
    data = ::JSON.parse(File.read(path), symbolize_names: true)
    { name: name, saved_at: data[:saved_at], message_count: data[:messages]&.size || 0 }
  rescue StandardError
    { name: name, saved_at: nil, message_count: 0 }
  end
  entries.sort_by { |s| s[:saved_at] || '' }.reverse
end

#load(name) ⇒ Object



27
28
29
30
31
32
33
34
35
36
# File 'lib/legion/tty/session_store.rb', line 27

def load(name)
  path = session_path(name)
  return nil unless File.exist?(path)

  data = ::JSON.parse(File.read(path), symbolize_names: true)
  data[:messages] = data[:messages].map { |m| deserialize_message(m) }
  data
rescue ::JSON::ParserError
  nil
end

#save(name, messages:, metadata: {}) ⇒ Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/legion/tty/session_store.rb', line 16

def save(name, messages:, metadata: {})
  data = {
    name: name,
    messages: messages.map { |m| serialize_message(m) },
    metadata: ,
    saved_at: Time.now.iso8601,
    version: 1
  }
  File.write(session_path(name), ::JSON.generate(data))
end