omp (Oh My Pi)

FieldValue
FormatJSONL transcript
Default store path~/.omp/agent/sessions/<encoded-project>/<ISO-timestamp>_<uuid>.jsonl
Env overrideDEJA_OMP_ROOT
deja parserinternal/sources/omp.go
Last verified2026-08-21

Discovery

omp (Oh My Pi, github.com/can1357/oh-my-pi) stores session transcripts under

~/.omp/agent/sessions/. Each project directory uses Claude Code's single-dash

path encoding, e.g. -Code-pleasure-course for /Users/halo/Code/pleasure-course.

Within each project directory, session files are named

<ISO-timestamp>_<uuid>.jsonl.

That is the default profile's store, and it is not the only one. A named

profile (omp --profile <name>, OMP_PROFILE, or the legacy PI_PROFILE)

relocates omp's whole user scope, sessions included, and an omp directory

under XDG_DATA_HOME relocates it again — with no agent segment there. deja

reads all four:

WhereSessions
Default profile~/.omp/agent/sessions/
Named profile~/.omp/profiles/<name>/agent/sessions/
XDG$XDG_DATA_HOME/omp/sessions/
XDG, named profile$XDG_DATA_HOME/omp/profiles/<name>/sessions/

DEJA_OMP_ROOT overrides all of them: with it set, that directory is the only

one read. XDG counts only when $XDG_DATA_HOME/omp exists, since the variable

itself is set on most Linux desktops whether or not omp lives there.

Verified by running omp 17.4.1 each way and following where the transcript

landed.

File layout

Each .jsonl file is a single session. The first line is a session header:

{"type":"session","version":3,"id":"<uuid>","timestamp":"<ISO-8601>","cwd":"<absolute-path>","title":"..."}

Subsequent lines are typed events:

typeDescription
sessionSession header (first line only)
title / title_changeTitle metadata
model_changeModel/provider switch
thinking_level_changeThinking level adjustment
messageUser prompt, assistant response, or tool result
customTool execution lifecycle events (skipped)

Message records

Messages use a wrapper envelope:

{
  "type": "message",
  "id": "<hex>",
  "parentId": "<hex-or-null>",
  "timestamp": "<ISO-8601>",
  "message": {
    "role": "user|assistant|toolResult|developer",
    "content": [{"type": "text", "text": "..."}],
    "timestamp": 1786964225859
  }
}

Roles

message.roledeja maps to
useruser
assistantassistant
toolResulttool output (RoleToolOutput)
developerskipped

Content

message.content is an array of typed blocks. deja extracts text from blocks

where "type": "text". Blocks with "type": "thinking", "type": "toolCall",

or "type": "image" are skipped.

Timestamps

Both ISO-8601 strings ("timestamp" in the envelope) and Unix milliseconds

("timestamp" inside message) are observed. The parser uses the envelope

timestamp.

Session identity

The id field from the session header line is used as the session ID. The UUID

also appears in the filename.

Project attribution

omp's session header carries a real cwd, which is promoted to the project key

(useHeaderCwd=true in the shared pi-lineage parser). This is more accurate

than decoding the single-dash directory name, which drops the leading path

segment (-Code-pleasure-course would otherwise decode to pleasure/course).

MCP, skill, command

deja install omp writes ~/.omp/agent/mcp.json with the standard mcpServers

shape — the file upstream documents as the primary user-scope MCP config. After

it, omp lists deja's tools itself (mcp__deja_recall, recall_context,

remember, blame, fix, how).

The skill is the shared ~/.agents/skills/deja-history/SKILL.md: omp's agents

provider reads that directory, so it needs no file of its own. Checked by asking

a running omp to list its skills.

The command is ~/.omp/agent/commands/deja.md. Typing /deja <question> runs

recall and answers from the result — verified end to end against a live omp

answering from an earlier omp session.

A named profile reads its own mcp.json and commands/ under

~/.omp/profiles/<name>/agent/; install writes the default profile's, which is

what a person on the default profile reads.

Auto-recall: deja install omp-auto writes an extension module at

~/.omp/agent/extensions/deja/index.js. It handles omp's context event —

the one seam that reaches the model before it answers — runs deja hook-prompt

with the last user message, and prepends the block to that message. input

never fires in print mode and before_agent_start carries the prompt without

the context to change, which is why context and not either of them; all three

were watched with a probe extension against omp 17.4.1.

Known quirks and drift

  • Project directory encoding uses Claude Code's single - prefix (e.g.

-Code-foo) rather than pi's -- prefix/suffix. The shared

resolveEncodedPath handles both, but omp relies on the header cwd instead.

  • toolResult messages carry a toolCallId/toolName and a content array of

text blocks; deja indexes the text as tool output.

  • The parentId chain forms a tree, not a flat list; deja ignores the tree

structure and processes messages in file order.

Last verified: 2026-08-21


deja reads this format and nineteen others, and turns what it finds into memory your agents can search. See the harness matrix for what is wired where, or install it and search your own history.