Getting started
This tutorial takes you from zero to listing and prompting a real agent session through sepia. You will need Rust (cargo) and at least one supported coding agent with existing sessions — Devin, Cline, Claude Code, or Cursor.
Install
cargo install --path crates/sepia-cliOr, inside a checkout, cargo xtask install builds release sepia and the store drivers into ~/.local — the same layout an installed release uses, so driver discovery works identically.
See your sessions
sepia list # the Devin store — the default source
sepia list --from cline # any other agent's storeYou'll see a row per session — id, title, and working directory. One IR over every agent: that is the point of sepia.
Inspect one
sepia export <session-id> --from devin | head -c 400export prints the canonical session IR as JSON — title, history, tool calls, checkpoints — regardless of which agent produced it.
Move it to another agent
sepia install <session-id> --from devin --to claudeThat copies the session through the IR into Claude Code's store and prints the id to resume with; without --to it lands in the Cline store, ready for cline --id <id>. Same session, different agent — see convert a session for ids, --force, and where each agent keeps the files.
The service surface
sepia servesepia serve exposes the whole session plane as ndjson JSON-RPC over stdio — the surface peregrin and other orchestrators spawn and drive. Try it by hand:
echo '{"jsonrpc":"2.0","id":1,"method":"manifest","params":{}}' | sepia serveYou should get back a manifest naming the protocol version and the method list — sessions.list, sessions.attach, sessions.prompt, and friends.
Where next
- Architecture — why mechanism and policy are separate, and what belongs where.
- Convert a session — move a session into another agent's store, ids and
--forceincluded. - Driver protocol — the wire drivers and
sepia serveshare. - Write a store driver — add a new agent.