pub enum SessionSource {
ClaudeCode,
Codex,
OpenCode,
Pi,
Grok,
Gemini,
Goose,
Native,
}Expand description
Which tool produced a session log.
This is read-provenance: a fact recovered when a log is loaded (stored
in SessionMeta::source, filled in by auto-detection in
detect_source), describing which tool originally wrote the file on
disk. It answers “where did this session come from?” — e.g. for
inspect/convert display in the CLI.
It is deliberately distinct from SessionFormat, even though the two
enums’ variant lists currently coincide: SessionFormat selects a
serialization codec (what to parse/export as), while SessionSource
records history (what wrote the file). The pair is intentionally kept
separate rather than merged — a session loaded from one tool’s log can
still be exported in the other tool’s format, and the two concepts could
diverge further (e.g. a format that is readable but not attributable, or
multiple versioned formats sharing one source).
Variants§
ClaudeCode
A ~/.claude/projects/.../<id>.jsonl transcript.
Codex
A ~/.codex/sessions/.../rollout-*.jsonl file.
OpenCode
An OpenCode session — multi-file JSON tree(s) or SQLite opencode*.db
(docs/interop/opencode-pi-spec.md §1.2). Detection and loading are
wave B; this variant exists now so SessionSource/SessionFormat stay
1:1 per the frozen interop spec (§0).
Pi
A ~/.pi/agent/sessions/--<enc-cwd>--/<iso>_<sessionId>.jsonl
transcript (docs/interop/opencode-pi-spec.md §1.1) — line-oriented
JSONL like Claude Code/Codex, so it shares their byte-lossless native
round-trip property.
Grok
A Grok session transcript stored as
~/.grok/sessions/<percent-encoded-cwd>/<session-id>/chat_history.jsonl.
Gemini
A Gemini CLI transcript stored under
~/.gemini/tmp/<project>/chats/session-*.jsonl.
Goose
A Goose session exported through _goose/unstable/session/export, or
reconstructed from Goose’s sessions/sessions.db native store.
Native
P5-3 safety-hardening fix (Fable-5 review, LOW “translation-fidelity
cosmetic”): a session that was never imported from ANY foreign
tool’s log at all — authored directly by supercode’s own agent loop,
with no foreign-tool prefix (Session.raw starts empty). Currently
only crate::agent::Agent’s persist_subagent_transcript (P5-3,
natively-spawned spawn_subagent children) uses this — before this
variant existed, that call site built its blank Session via
Session::from_claude_code_str("") purely as an “empty parser to
get a blank skeleton” trick, which left meta.source == SessionSource::ClaudeCode even though nothing Claude-Code-shaped
was ever involved, mislabeling a native supercode spawn as an
imported CC session on disk (and in any inspect/convert reading
it back). Never produced by auto-detection (detect_source) or any
from_<tool>_str loader — only by code that explicitly constructs
a SessionMeta with this source, so no existing imported-session
path can ever observe this variant appearing where it didn’t before.
Trait Implementations§
Source§impl Clone for SessionSource
impl Clone for SessionSource
Source§fn clone(&self) -> SessionSource
fn clone(&self) -> SessionSource
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more