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

SurfaceCommandFor
TerminaloharnessA full-screen TUI
Headlessoharness-headlessJSONL on stdout, for scripts
Browseroharness-webHTTP + 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