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 moreimpl Copy for SessionSource
Source§impl Debug for SessionSource
impl Debug for SessionSource
impl Eq for SessionSource
Source§impl PartialEq for SessionSource
impl PartialEq for SessionSource
impl StructuralPartialEq for SessionSource
Auto Trait Implementations§
impl Freeze for SessionSource
impl RefUnwindSafe for SessionSource
impl Send for SessionSource
impl Sync for SessionSource
impl Unpin for SessionSource
impl UnsafeUnpin for SessionSource
impl UnwindSafe for SessionSource
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.