pub struct SessionReader;Expand description
Reader for loading sessions from JSONL files.
Implementations§
Source§impl SessionReader
impl SessionReader
Sourcepub fn load_transcript(session_dir: &Path) -> Result<Vec<TranscriptEntry>>
pub fn load_transcript(session_dir: &Path) -> Result<Vec<TranscriptEntry>>
Load all transcript entries from a session directory.
If the JSONL contains a compact_boundary system entry (g157), all
entries before the last such boundary are discarded—they were
already summarised and the summary is the first entry after the
boundary. This makes resume O(post-compaction size).
Sourcepub fn load_full_history(session_dir: &Path) -> Result<Vec<LoadedEntry>>
pub fn load_full_history(session_dir: &Path) -> Result<Vec<LoadedEntry>>
Load the full on-disk history without discarding messages folded away by cross-turn compaction.
Unlike load_transcript / load_messages
(which drop everything before the last compact_boundary so the
model seed matches the post-compaction context), this keeps every
line and surfaces each compaction as a
LoadedEntry::CompactBoundary marker. Use this for
user-facing paths — TUI session resume, session show,
session export — where the user expects to see the whole
conversation, not just the post-compaction tail.
The model / resume-seed paths keep using load_messages; do not
feed load_full_history output into the runtime transcript.
Sourcepub fn load_transcript_indexed(
session_dir: &Path,
) -> Result<(Vec<TranscriptEntry>, HashMap<String, TranscriptEntry>)>
pub fn load_transcript_indexed( session_dir: &Path, ) -> Result<(Vec<TranscriptEntry>, HashMap<String, TranscriptEntry>)>
Load the transcript and build a UUID → TranscriptEntry index
alongside the ordered vec. Enables O(1) lookup by UUID (g155).
Sourcepub fn load_messages(session_dir: &Path) -> Result<Vec<Message>>
pub fn load_messages(session_dir: &Path) -> Result<Vec<Message>>
Load the transcript and convert each TranscriptEntry to a
runtime [Message]. Persistence-only fields (id,
parent_id, uuid, parent_uuid, timestamp, usage)
are dropped here. The result is what run_resumed expects
as its seed argument.
The system role is kept in the returned vec; callers
that want to rebuild the system prompt from Config can
filter it out manually.
Sourcepub fn scan_orphan_tool_calls(
session_dir: &Path,
registry: &ToolRegistry,
) -> Result<Vec<OrphanToolCall>>
pub fn scan_orphan_tool_calls( session_dir: &Path, registry: &ToolRegistry, ) -> Result<Vec<OrphanToolCall>>
Goal-153: scan the transcript for “orphan” tool calls — tool_calls
in the last assistant message that have no matching tool reply.
Returns an empty vec when the transcript is clean (no orphans).
Returns the orphan descriptions when one or more tool calls from the
last assistant message have no corresponding tool result message.
This is the detection side of durable execution; the handling
(skip / redo / abort) is done by the caller (cmd_resume).
registry is used to determine side_effect_at_call for orphans
(their AuditMeta was never written because the process died before
the call returned).
Sourcepub fn load_meta(session_dir: &Path) -> Result<SessionMeta>
pub fn load_meta(session_dir: &Path) -> Result<SessionMeta>
Load the session metadata from a session directory.
Refuses to deserialize a session whose schema_version is
newer than this build supports (Goal 269). Pre-Goal-269
session files have no schema_version field and load
successfully via the #[serde(default)] on the struct.
Sourcepub fn list_sessions(workspace: &Path) -> Result<Vec<PathBuf>>
pub fn list_sessions(workspace: &Path) -> Result<Vec<PathBuf>>
List all session directories for a given workspace.
Returns a list of session directories sorted by name (which is timestamp-prefixed, so chronological).
Sourcepub fn list_sessions_sorted_by_updated_at(
workspace: &Path,
) -> Result<Vec<(PathBuf, SessionMeta)>>
pub fn list_sessions_sorted_by_updated_at( workspace: &Path, ) -> Result<Vec<(PathBuf, SessionMeta)>>
List all session directories sorted by .meta.json
updated_at descending (most recently active first).
Used by recursive resume (g151) to pick the most-recent
session when no ID is given. Tiebreaks: when two sessions
share the same updated_at string (RFC3339 has 1-second
granularity, so ties happen during fast tests), fall back
to transcript.jsonl mtime, then session_id lexicographically.
Sessions whose .meta.json cannot be read are silently
excluded — they’re either being created or corrupted.