OpenAIDR
Session collection for AI coding agents.
OpenAIDR reads the session state AI coding agents already write to disk and normalises it into one session model with stable span identity.
Today it reads one kind: Claude Code. Codex and Cursor are the intended next kinds and are not read yet — a session from either is absent from the output entirely, not collected and marked. The parsing dependency supports more formats than this package instantiates, which is a distinction worth holding onto; what each additional kind would cost is measured in Agent kind coverage.
It answers what an agent did, never what that means. No scoring, no identity resolution, no findings, no upload path. Interpreting a session is a consumer's job; OpenAIDR takes no position on what a consumer concludes.
Why it is separate
Reading an agent's session log and normalising it is plumbing, and it runs on one machine — so it is open. Every new agent format is coverage a contributor can add without touching anything that interprets the result.
Session parsing itself comes from Uber's ADR project
(adr-sensor, Apache-2.0), confined behind an adapter: upstream types convert at
the boundary and never appear elsewhere. Any one agent kind can instead be backed
by an OpenAIDR-owned reader on the same contract — per kind, not all-or-nothing.
Install and run
uv tool install openaidr
That installs an openaidr command:
$ openaidr --version
openaidr 0.0.1
openaidr sessions prints what each agent on this machine actually did —
sessions, turns, tool calls, and how each one ended. Per-call timings come from
the transcript's own record of both ends of a call, not from the parsing
dependency's event schema, which carries no timestamp below the session.
For Claude Code it also reads the per-server MCP connection logs, which is the only place the transport, the server's advertised identity, and the outcome of an MCP call are written down. That enrichment is best-effort — the path is an undocumented cache — and every way it can fall short is reported rather than passed off as an absence.
$ uv run openaidr sessions --since 2d --detail
claude-code:96a1d0d4-d106-4cd1-9031-1e174593f8d0 [claude-code] 2026-08-29T05:11:38+00:00 86 turns
142c Read
79c Bash
rejected 41c github/create_issue
--format json emits the same account machine-readably, --agent-kind selects
one kind, and --since bounds the window. Nothing is resolved to a component
and nothing is judged: what a consumer concludes is the consumer's concern.
Design
docs/specs/session-collection.md — the
session model, span identity, per-agent-kind normalisation, and the collection
interface. Decisions in docs/adrs/.
Status
Pre-alpha. Session collection works for claude-code, backed by a reader of
our own over Claude Code's JSONL transcripts: sessions, turns, tool calls, and
span identity. The model has six outcome statuses; this reader emits five of
them (unknown, rejected, pending, ok, error) from Claude Code's own
transcripts and, for MCP calls, its per-server connection logs — interrupted
is modelled but not emitted, since neither source records it. One cold pass,
held in memory.
Not yet built: incremental collection over a watermark, and the six further
agent kinds that adr-sensor also parses — for claude-code the dependency's
parser is already in use, called one file at a time; the other six are simply
not read yet. Why this reader walks the tree and calls that parser itself,
rather than going through adr-sensor's own whole-tree walk, is recorded in
docs/specs/session-collection.md.
Licence
Apache-2.0. See LICENSE.
Metadata
Release files for openaidr 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openaidr-0.1.0.tar.gz | 171.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openaidr-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 234.6 kB
Release files / openaidr-0.1.0.tar.gz
| Download URL | openaidr-0.1.0.tar.gz |
|---|---|
| Size | 171.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b69aacfd2c06613da06fd55e021794adf81754764330a42169794e43e8d8d7e1
|
|
BLAKE2b-256 checksum How to use checksums |
8ad54291499a3918b94a60495ef51ff1e300ce65fc5399399e2c52a1ff9fbead
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / openaidr-0.1.0-py3-none-any.whl
| Download URL | openaidr-0.1.0-py3-none-any.whl |
|---|---|
| Size | 63.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cf46fd32f59efcfe3221bb44950e1e3423d9088054e99c64863591a11ef1161a
|
|
BLAKE2b-256 checksum How to use checksums |
f86e9232c43c5f166f3f7cdae94252c7efdbdbdcf46742936c70619a7a134287
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency log