What’s new here
Trajectory takes raw transcripts from Claude Code, Codex, Cursor, OpenHands, Gemini CLI, Copilot CLI, and nine other runtimes, each with its own incompatible format, and produces one validated JSON record array. The output schema is documented and versioned; every conversational record carries an ISO timestamp and a typed role.
What it does
Call normalizeTranscript with a transcript string and a source identifier. You get back a records array and a diagnostics array. Records follow a fixed schema: one leading meta record, then user, assistant, tool, reasoning, and observation records in session order. Tool calls carry stable IDs and stringified JSON arguments. Tool results include an ok boolean when the source exposes a reliable success/error signal.
A companion listTrajectories function pages through a source’s local session store so you can discover transcripts before normalizing them. The Deep Agents adapter reads directly from a LangGraph SQLite store by thread ID; all other adapters accept a transcript string.
A separate normalizeConversation API handles Slack channel exports, which are multi-party conversations rather than agent execution traces, using an independent schema.
Who it’s for
Teams building training pipelines, evaluation harnesses, or analysis and inference systems on top of agents that run across multiple runtimes. If you collect Claude Code sessions on one machine, Codex rollouts on another, and OpenHands traces from CI, trajectory gives you one parsing layer instead of 15. Available as an npm package (@letta-ai/trajectory) and a Python wrapper (agent-trajectory).
Try it
npm install @letta-ai/trajectorypip install agent-trajectoryimport { normalizeTranscript } from "@letta-ai/trajectory";
const { records, diagnostics } = normalizeTranscript({
source: "codex",
transcript: rawJsonl,
});How mature is it
274 stars, 26 forks, 12 contributors. 13 releases; latest is v0.4.3, tagged 2026-09-25. 97 commits in the last 90 days. Created 2026-07-10. 1 open issue and 8 open pull requests. Apache-2.0.