Overview
A model-agnostic agent harness: the agent loop, tool execution, context management and permissions as one layer, with the model as a replaceable backend.
Three runtime dependencies: zod, plus ink and react for the terminal frontend. Every provider is reached over raw fetch and SSE — no vendor SDKs, and the engine itself still depends only on zod.
What it is
The pivot is that conversation history is stored in a provider-neutral format. The adapter layer renders it into a vendor's wire format at the moment a request goes out, which is why switching models mid-session needs no migration: the next request simply uses a different renderer.
Three frontends, one engine
| Surface | Command | For |
|---|---|---|
| Terminal | oharness | A full-screen TUI |
| Headless | oharness-headless | JSONL on stdout, for scripts |
| Browser | oharness-web | HTTP + SSE, and the desktop shell |
The engine never writes to stdout and never touches the terminal, which is what lets a second frontend exist without changing it. That boundary is enforced by tests, not by convention.
Where to go next
- Getting started — install, keys, first run
- Architecture — the layering and why it holds
- Providers and models — the catalog, discovery, auth
- Permissions — modes, rules, the audit trail
- Frontends — terminal, headless, browser, desktop