Class: Woods::SessionTracer::FileStore
- Defined in:
- lib/woods/session_tracer/file_store.rb
Overview
File-backed session store using JSONL (one JSON object per line).
Sessions are stored as individual files in a configurable directory:
{base_dir}/{session_id}.jsonl
Append-only with file locking for concurrency safety. Zero external dependencies.
Instance Method Summary collapse
-
#clear(session_id) ⇒ void
Remove all data for a single session.
-
#clear_all ⇒ void
Remove all session data.
-
#initialize(base_dir:) ⇒ FileStore
constructor
A new instance of FileStore.
-
#read(session_id) ⇒ Array<Hash>
Read all request records for a session, ordered by file line order (timestamp).
-
#record(session_id, request_data) ⇒ void
Append a request record to a session’s JSONL file.
-
#sessions(limit: 20) ⇒ Array<Hash>
List recent session summaries, sorted by last modification time (newest first).
Constructor Details
#initialize(base_dir:) ⇒ FileStore
Returns a new instance of FileStore.
23 24 25 26 27 |
# File 'lib/woods/session_tracer/file_store.rb', line 23 def initialize(base_dir:) super() @base_dir = base_dir FileUtils.mkdir_p(@base_dir) end |
Instance Method Details
#clear(session_id) ⇒ void
This method returns an undefined value.
Remove all data for a single session.
82 83 84 85 |
# File 'lib/woods/session_tracer/file_store.rb', line 82 def clear(session_id) path = session_path(session_id) FileUtils.rm_f(path) end |
#clear_all ⇒ void
This method returns an undefined value.
Remove all session data.
90 91 92 93 |
# File 'lib/woods/session_tracer/file_store.rb', line 90 def clear_all pattern = File.join(@base_dir, '*.jsonl') Dir.glob(pattern).each { |f| File.delete(f) } end |
#read(session_id) ⇒ Array<Hash>
Read all request records for a session, ordered by file line order (timestamp).
50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/woods/session_tracer/file_store.rb', line 50 def read(session_id) path = session_path(session_id) return [] unless File.exist?(path) File.readlines(path).filter_map do |line| stripped = line.strip next if stripped.empty? JSON.parse(stripped) rescue JSON::ParserError nil end end |
#record(session_id, request_data) ⇒ void
This method returns an undefined value.
Append a request record to a session’s JSONL file.
Uses file locking (LOCK_EX) for concurrency safety.
36 37 38 39 40 41 42 43 44 |
# File 'lib/woods/session_tracer/file_store.rb', line 36 def record(session_id, request_data) path = session_path(session_id) line = "#{JSON.generate(request_data)}\n" File.open(path, 'a') do |f| f.flock(File::LOCK_EX) f.write(line) end end |
#sessions(limit: 20) ⇒ Array<Hash>
List recent session summaries, sorted by last modification time (newest first).
68 69 70 71 72 73 74 75 76 |
# File 'lib/woods/session_tracer/file_store.rb', line 68 def sessions(limit: 20) pattern = File.join(@base_dir, '*.jsonl') files = Dir.glob(pattern).sort_by { |f| -File.mtime(f).to_f } files.first(limit).map do |file| session_id = File.basename(file, '.jsonl') session_summary(session_id, read(session_id)) end end |