Class: Legion::TTY::SessionStore

Inherits:
Object
  • Object
show all
Includes:
Logging::Helper
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.



14
15
16
17
# File 'lib/legion/tty/session_store.rb', line 14

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

Instance Method Details

#auto_session_name(messages: []) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'lib/legion/tty/session_store.rb', line 58

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



53
54
55
56
# File 'lib/legion/tty/session_store.rb', line 53

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

#listObject

rubocop:disable Metrics/AbcSize



41
42
43
44
45
46
47
48
49
50
51
# File 'lib/legion/tty/session_store.rb', line 41

def list # rubocop:disable Metrics/AbcSize
  entries = Dir.glob(File.join(@dir, '*.json')).map do |path|
    name = File.basename(path, '.json')
    data = Legion::JSON.parse(File.read(path), symbolize_names: true)
    { name: name, saved_at: data[:saved_at], message_count: data[:messages]&.size || 0 }
  rescue StandardError => e
    log.warn { "session list entry failed: #{e.message}" }
    { name: name, saved_at: nil, message_count: 0 }
  end
  entries.sort_by { |s| s[:saved_at] || '' }.reverse
end

#load(name) ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/legion/tty/session_store.rb', line 30

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

  data = Legion::JSON.parse(File.read(path), symbolize_names: true)
  normalize_session(data)
rescue Legion::JSON::ParseError => e
  log.warn { "session load failed: #{e.message}" }
  nil
end

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



19
20
21
22
23
24
25
26
27
28
# File 'lib/legion/tty/session_store.rb', line 19

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), Legion::JSON.generate(data))
end