Metadata-Version: 2.4
Name: runopsy-collector
Version: 0.1.8
Summary: Append-only local ingest and queryable storage for Runopsy traces
Project-URL: Homepage, https://github.com/vahit19/runopsy
Project-URL: Repository, https://github.com/vahit19/runopsy
Project-URL: Issues, https://github.com/vahit19/runopsy/issues
Project-URL: Changelog, https://github.com/vahit19/runopsy/blob/main/CHANGELOG.md
Author-email: Vahit Feryad <vahit.feryat@gmail.com>
License-Expression: Apache-2.0
Keywords: agent,duckdb,observability,tracing
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Debuggers
Classifier: Topic :: Software Development :: Quality Assurance
Classifier: Topic :: System :: Monitoring
Classifier: Typing :: Typed
Requires-Python: >=3.12
Requires-Dist: duckdb>=1.1
Requires-Dist: orjson>=3.10
Requires-Dist: runopsy-core==0.1.8
Description-Content-Type: text/markdown

# runopsy-collector

Local, append-only ingest for normalized trace events.

Storage has two layers and they are not equal partners. The **JSONL journal is the
source of truth**: one append-only file per run, written with sorted keys so the same
run always serializes to the same bytes. **DuckDB is a derived index** built from those
journals to make runs queryable, and it can be thrown away and rebuilt at any time with
`Collector.rebuild()`.

That asymmetry is deliberate. An agent run fails at unpredictable moments, often taking
the process with it, and a half-written database is a far more likely outcome than a
half-written append. Keeping the plain log authoritative means a crashed run is still
diagnosable, a corrupted index is a one-command repair rather than lost history, and a
user can read their own trace with nothing but a text editor.

Ingest is idempotent on `event_id`, so an adapter that retries a write cannot duplicate
a step and inflate a loop detector's count.

Nothing here reaches the network. Content is referenced by hash, and the
`contains_secret` flag travels with each event so export and payload minimization can
consult it before anything leaves the machine.
