Connectors
A snapshot is assembled by independent connectors. Each one is separately failable: a broken connector degrades to an error entry in meta.connectors. It never crashes the snapshot.
file
Walks the project from your configured root, .gitignore-aware, honoring your include/exclude patterns. Denied paths (.env*, key files, credential files) are never read at all. Files are selected by rank (plan docs → README → manifests → entry points → recently modified), capped per file at maxFileTokens with head+tail truncation, and greedily fitted to the snapshot's tokenBudget. Every file's content passes redaction before it enters the snapshot.
git
Reads repository state: current branch, staged / modified / untracked files, ahead/behind counts against the upstream, recent commits, and a diff summary. Read-only. It never touches your working tree, index, or history.
notion: opt-in
Off until you set the NOTION_TOKEN environment variable and list explicit notion.pageIds in config. It fetches only the pages you named (no workspace crawling) and each page is processed in isolation, redacted like everything else.
ollama summarizer: opt-in
Off until you set ollama.summarize: true. Produces a digest of the working session using a model running on your machine via local Ollama (ollama.baseUrl, default http://localhost:11434). No cloud involved.
Session connectors: Pro
Eight tools' local session histories flow into the snapshot as redacted digests, so an agent in one tool picks up where an agent in another left off. All of them are read-only over the source tool's data, scope a global store down to this project, and cap each digest by filling a token budget from the newest turns backwards.
| Connector | Reads | Scoped by |
|---|---|---|
| claude-code-sessions | ~/.claude/projects/<encoded-path>/*.jsonl | Per-project directory; subagent sidechains skipped |
| cursor-sessions | ~/.cursor project transcripts, else the global state.vscdb SQLite | Project slug; SQLite fallback flagged "workspace unverified" |
| codex-sessions | $CODEX_HOME/sessions/YYYY/MM/DD/rollout-*.jsonl (Codex CLI / ChatGPT's coding agent) | Session header cwd; huge rollouts are tail-read, never slurped |
| opencode-sessions | $XDG_DATA_HOME/opencode/opencode.db (SQLite, WAL) | session.directory or the project worktree row |
| gemini-sessions | ~/.gemini/tmp/*/chats/*.jsonl and legacy .json | Session metadata directories/projectHash (folder naming changed across versions) |
| aider-sessions | .aider.chat.history.md at the repo root | Already project-local; sessions split on chat headers |
| openclaw-sessions | $OPENCLAW_STATE_DIR/agents/*/sessions/*.jsonl | Transcript header cwd; backup/reset/deleted variants skipped |
| hermes-sessions | $HERMES_HOME/state.db (Hermes Agent's SQLite, WAL) | sessions.git_repo_root / cwd columns; archived and compacted rows skipped |
SQLite-backed stores (Cursor, OpenCode, Hermes) may be locked by the live tool mid-write, so the connector copies the database (with its WAL/SHM sidecars where present), opens the copy read-only, and deletes it afterwards. Tool output, reasoning traces, and system/injected turns are excluded from digests everywhere; only real user and assistant turns count.
How session connectors degrade
Strictly best-effort: unknown formats, unreadable files, and schema drift degrade to an error status in meta.connectors (or an empty result) rather than ever failing a snapshot. Session content passes the same redaction as files. See Pro.
And when a parser can't deliver, or your harness isn't on the list at all, the fallback is agent-assisted ingest (free core): the agent pushes its own session digest through the ingest_context tool. Parsers are rung 1 of the ladder; ingest is the floor that covers every harness ever made.
Connector status in the snapshot
"meta": {
"connectors": [
{ "name": "file", "status": "ok", "ms": 947 },
{ "name": "git", "status": "ok", "ms": 512 },
{ "name": "notion", "status": "skipped" } // not configured
]
}skipped means an opt-in wasn't enabled; error means the connector failed and the snapshot proceeded without it.