Module: OllamaAgent::Session::Store

Defined in:
lib/ollama_agent/session/store.rb

Overview

NDJSON-based session persistence under <root>/.ollama_agent/sessions/. Each call to .save appends one JSON line — crash-safe by design.

Class Method Summary collapse

Class Method Details

.list(root:) ⇒ Object

List sessions for a root, newest first.



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ollama_agent/session/store.rb', line 49

def list(root:)
  dir = sessions_dir(root)
  return [] unless Dir.exist?(dir)

  Dir.glob(File.join(dir, "*.ndjson"))
     .sort_by { |f| -File.mtime(f).to_f }
     .map do |path|
       id    = File.basename(path, ".ndjson")
       mtime = File.mtime(path).utc.strftime("%Y-%m-%dT%H:%M:%SZ")
       SessionMeta.new(session_id: id, path: path, started_at: mtime)
     end
end

.load(session_id:, root:) ⇒ Object

Load all saved messages for a session.



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/ollama_agent/session/store.rb', line 31

def load(session_id:, root:)
  path = session_path(sessions_dir(root), session_id)
  return [] unless File.file?(path)

  File.readlines(path, encoding: Encoding::UTF_8)
      .map(&:chomp)
      .reject(&:empty?)
      .map { |line| JSON.parse(line) }
rescue StandardError
  []
end

.resume(session_id:, root:) ⇒ Object

Load messages ready to seed Agent#run.



44
45
46
# File 'lib/ollama_agent/session/store.rb', line 44

def resume(session_id:, root:)
  load(session_id: session_id, root: root)
end

.save(session_id:, root:, message:) ⇒ Object

Append one message to a session file.



19
20
21
22
23
24
25
26
27
28
# File 'lib/ollama_agent/session/store.rb', line 19

def save(session_id:, root:, message:)
  dir = sessions_dir(root)
  FileUtils.mkdir_p(dir)
  path = session_path(dir, session_id)
  File.open(path, "a", encoding: Encoding::UTF_8) do |f|
    f.puts(JSON.generate(message.transform_keys(&:to_s)))
  end
rescue StandardError
  nil # best-effort; never crash the agent
end

.session_path(dir, session_id) ⇒ Object



62
63
64
65
# File 'lib/ollama_agent/session/store.rb', line 62

def session_path(dir, session_id)
  safe_id = session_id.to_s.gsub(/[^a-zA-Z0-9_-]/, "_")
  File.join(dir, "#{safe_id}.ndjson")
end

.sessions_dir(root) ⇒ Object



14
15
16
# File 'lib/ollama_agent/session/store.rb', line 14

def sessions_dir(root)
  File.join(root, ".ollama_agent", "sessions")
end