Ingestion
External systems write into Oliver by sending normalized POST /events
payloads to the Go API. The backend should be running before any ingestion pipeline pushes
events.
There are two ingestion paths:
pipelines/: finite Python fetch jobs for sources that can be polled.extensions/agent-hooks: local npm/Node collector for live Claude/Codex hook events.
Batch Pipelines
Pipeline jobs live at the repository root in pipelines/. They fetch source records,
normalize each record into an Oliver event, and post to the configured backend API.
They do not import Go backend packages or call Go batch jobs.
Dry runs do not need backend credentials. Pushing to the current multi-tenant API requires a bearer token and workspace slug:
cd backend
go run ./cmd/issue-token \
--kind system \
--display-name "Pipeline Runner" \
--workspace oliver \
--workspace-name "Oliver"
Use the printed token as OLIVER_TOKEN and the workspace slug as
OLIVER_WORKSPACE for clients that push events.
Current gap: the Python runner's push path still needs to be migrated to send those auth
headers. Use --dry-run to validate pipeline output against the multi-tenant backend
until that code path is updated.
From the repository root:
python3 pipelines/run_all.py --list
python3 pipelines/run_all.py --dry-run
python3 pipelines/run_all.py --api http://127.0.0.1:8081
Current finite fetch pipelines:
notion-pagesgoogle-docsslack-updatesgithub-updates
For per-source environment variables and examples, see
pipelines/README.md.
Local Claude/Codex Agent Hooks
Use the npm collector for live developer-agent events. It installs repo-local Claude and
Codex hook config and stores native hook payloads in .oliver/agent-hooks.
The uploader normalizes queued payloads into local_agent_event records and posts
them to authenticated POST /events. Browser login saves the local token and uses the
shared default workspace/project for the MVP.
Install the CLI, register hooks in the target repo, and sign in. The CLI defaults to
production; add --env local (or export OLIVER_ENV=local) to target a local stack:
npm install -g olivergraph
oliver install --env local
oliver login --env local
Environment variables still work for headless/dev fallback:
export OLIVER_API=http://127.0.0.1:8081
export OLIVER_TOKEN=usr_...
export OLIVER_WORKSPACE=default
extensions/agent-hooks/.env.example is the directory-local template for those
variables.
You can try a manual flush to inspect the current uploader behavior:
oliver flush
The periodic uploader runs every five minutes by default, or every
OLIVER_AGENT_PUSH_INTERVAL_SECONDS seconds when that environment variable is set.
oliver start
The older Go hook listener is still available for direct HTTP hook setups and dry-run inspection:
cd backend
go run ./cmd/agent-hook-listener \
--project oliver \
--port 8765 \
--dry-run \
--verbose
Run the compatibility listener:
go run ./cmd/agent-hook-listener \
--project oliver \
--port 8765 \
--verbose
For step-by-step Claude/Codex setup, verification, privacy notes, and troubleshooting, see Local Agent Hooks.
Event Shape
All ingestion paths emit the same backend event shape:
kind: source-specific event kind, such asnotion_eventorlocal_agent_eventsession_id: stable source/external-id groupingintent: short source/title lineoutput: source body, message text, or payload digesttargets:project,source, and source-specific target IDsidempotency_key: stable per source record/update for safe retries
Add --dry-run when changing a pipeline or hook listener setup so you can inspect the
exact event payloads before writing to the backend.