Skip to content

Repository files navigation

OAR - programming interface for all agent harnesses

OAR logo

OAR (Open Agent Runtime) is a provider-independent programming interface for coding-agent runtimes: a solid foundation for building agent workspaces and other applications.

Delete harness logic and focus on outcomes and UX.

Supported runtimes


Claude Code

Codex

Grok Build

Kimi Code

Pi

Docs

Read To answer
docs/design/ Why oar exists and which design problems it treats as load-bearing
docs/spec/ Record-stream and query contracts
Conversation projection Build a conversation UI from requests, responses and native messages
docs/spec/inventory.md Independent native skills, MCP server and tool queries
docs/development.md Working in this repo: validate changes, add a runtime, conventions
packages/cli/ The oar executable, published separately as @botiverse/oar-cli
docs/design/system.md How the library, evidence layer, projections, and continuation form one agent-facing system
docs/prior-arts/feature-comparison.md Surveyed projects compared by concrete features and evidence
docs/design/decisions.md Design decisions, their evidence, and conditions for reconsideration
docs/design/roadmap.md Which system improvements are next, and what evidence gates them

Library

import { promptAndWait, runtimes } from "@botiverse/oar";

const grok = runtimes.require("grok");
const installation = await grok.installation?.();

if (installation?.kind === "available") {
  const session = await grok.session(installation, { cwd: process.cwd() });
  session.events((event) => {
    switch (event.kind) {
      case "text_delta": process.stdout.write(event.text); break;
      case "tool_call_started": console.log(`[${event.tool}]`); break;
      case "turn_ended": console.log(event.outcome.kind); break;
    }
  });
  const run = await promptAndWait(session, "Inspect this repository");
  console.log(run.kind === "ended" ? run.outcome : run.reason);
  await session.dispose();
}

events() is the flat, attributed reading of the session: one Event per fact (text, reasoning, tool call start / progress / end, turn start and end, usage, model, compaction, retry, app requests, control rejections, the process exit), with seq and agentPath on each. Pass { coalesceText: true } to get text in blocks instead of pieces. When the runtime's own frame matters, session.rawEvents() and session.records() expose the underlying record stream with every native payload verbatim.

CLI

npx @botiverse/oar-cli list
oar run claude "What does this repo do?" --record run.jsonl

ESM-only, requires Node.js 24+, Apache-2.0.

About

oar (Open Agent Runtime): programming interface for all agent harnesses

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages