A self-owned multi-agent orchestration layer for OpenCode v2.
REEVE handles three things, and together they are the name:
| What it does | Historical meaning of "reeve" |
|---|---|
| Dispatch work to specialist agents | to assign work |
| Keep its own ledger of child tasks — who is running, who died | to keep accounts |
| Verify the artifacts itself instead of trusting a subagent's report | to inspect the work |
(shire reeve → sheriff: the official who supervises and keeps the accounts.)
REEVE is a single OpenCode v2 plugin plus an optional OpenChamber panel. It fills
the gaps v2 leaves open — child-task status, silent child death, concurrency
limits, wall-clock timeouts — without writing agents.*.model (that key belongs
to the OpenChamber panel).
GATE in-process proxy: routing, fallback chains, ledger, catalog
Orchestration 8 subagents + 1 visible foreman, review skill, dispatch rules
Ledger child-task ledger, concurrency gate, timeouts, reconciliation
Review independent diff review with a fixed rubric
Panel OpenChamber extension: chains, stats, ledger, free lane
GATE is plain JavaScript inside the plugin. There is no proxy binary, no separate service, and no Bifrost/9router dependency — those were retired in 0.1.8/0.1.5 respectively.
- Node.js >= 22
- OpenCode v2 (tested against 2.0.32 and 2.1.3)
- OpenChamber >= 2.3.3 for the panel extension (2.5.0 tested)
- One or more provider credentials in
~/.local/share/opencode/auth.json
Add the plugin to ~/.config/opencode/opencode.jsonc (or opencode.json):
modelis required. Without it, a bareopencode run/ a fresh composer session can use the engine's default model and silently bypass GATE.reeve/standardis the cost-first default; choosereeve/pro,reeve/flash, orreeve/multimodalif you want a different one. 0.2.0 removed thereeve/manualsingle-target tier — pick a model directly in the composer instead.- The plugin registers four tiers and all agents itself, and on first start adds
providers.reeve(http://127.0.0.1:18080/v1) to the config if it is missing. The write is additive, backed up, and comment-preserving. - GATE listens on 18080 by default when the plugin starts it. If 8080 is occupied on your host, set the port explicitly:
{
"model": "reeve/standard",
"plugins": [
{ "package": "@bd7pil/reeve@0.2.3", "options": { "gate": { "enabled": true, "port": 18080 } } }
],
"providers": {
"reeve": {
"package": "@ai-sdk/openai-compatible",
"settings": { "baseURL": "http://127.0.0.1:18080/v1" }
}
}
}Settings → Extensions → install one of:
- self-updating (git):
https://github.com/BD7PIL/reeve#reeve - fixed zip:
https://github.com/BD7PIL/reeve/releases/download/reeve-latest/reeve.zip
Grant sessions + filesystem after installation. The panel reads the plugin
snapshot and GATE config; it never starts sessions or prompts.
| Tier | Chain | Agents | Purpose |
|---|---|---|---|
reeve/pro |
reasoning |
planner, advisor, critic | strongest reasoning; text-first |
reeve/standard |
standard |
executor, reviewer | general-purpose mid tier, image-capable |
reeve/flash |
free-first |
scout, librarian | free-first, then paid fallback |
reeve/multimodal |
vision |
looker | image/PDF via files on disk; also the image route |
foreman is the visible primary orchestrator; it follows the session's model
selection (top-level default reeve/standard).
looker is a hidden, read-only subagent for images/PDFs on disk. Pasted
images are handled by GATE directly (see below).
Default chains (editable in the panel; config at
~/.config/opencode/reeve/fallback.jsonc):
standard: zhipu glm-5.3-flash → lmuai glm-5.3-flash → free → deepseekreasoning: zhipu glm-5.3 → deepseek → lmuai glm-5.3-flash → freefree-first: free → zhipu glm-5.3-flash → lmuai → deepseekvision: zhipu glm-5.3-flash → lmuai → free → deepseek
All four tiers declare image input so the engine does not strip attachments
before GATE sees them. When a request to reasoning contains an image, GATE
routes that request only to the vision chain; the session model and
composer selection do not change. Text requests to reeve/pro still use
GLM-5.3.
Pasted images have no filesystem path in OpenCode v2; they are stored inline in
the session database. A text-only model can see only an error text, and the
built-in subagent tool cannot carry attachments. REEVE therefore routes pasted
images at the proxy layer, and uses looker only for file paths.
Chains can contain @free. At request time GATE discovers free models from
OpenCode Zen and OpenRouter, filters them by modalities.input from
https://models.dev/api.json (6-hour TTL, last-good cache), and expands up to
free.max candidates. With require_image: true, only image-capable free
models are eligible; if the metadata is unavailable, the request falls back to
paid instead of using a text-only model. Failed free models cool down globally
(3 failures → 600s by default).
Bifrost and 9router are retired; free routing is implemented natively.
| Path | What |
|---|---|
~/.config/opencode/opencode.jsonc |
engine config (plugin + model) |
~/.config/opencode/reeve/fallback.jsonc |
GATE chains/providers/free policy (panel-editable) |
~/.reeve/ledger.json |
read-only snapshot for the panel |
~/.reeve/gate.jsonl |
GATE request ledger (no keys) |
- Remove any per-agent
modeloverrides; the plugin owns the agent definitions. reeve/codingno longer exists — usereeve/standard.- 0.2.0 removed the
reeve/manualtier and its chain. Usereeve/standardas the default and pick a model directly in the composer when you want a specific one. Remove themanualchain,agents.foreman, and thechain_for_model["reeve/manual"]entry from yourfallback.jsonc, and change any"model": "reeve/manual"line toreeve/standard. The plugin logs a warning when it still sees a stale manual registration. - Remove the old
free.image_modelsstatic list; image filtering is dynamic. - Bifrost/9router config, binaries, and autostart entries are obsolete; delete them.
- A top-level
modelline is still required.
npm install
npm --prefix plugin test # plugin suite (194 assertions across 10 files)
npm run test:coverage # coverage hard floor
npm run lint
npm --prefix extensions/reeve run build
node extensions/reeve/scripts/audit.mjs --fixture # 40 UI audit itemsCI runs lint, plugin tests on Ubuntu 22/24 and Windows 24, coverage, the extension build/byte-identical check, the UI audit, the config sample, and the public-tree gate. Releases use npm Trusted Publishing (OIDC) and SLSA provenance. See CHANGELOG.md for release notes.
Development records (PLAN, HANDOFF, PROGRESS, research notes) are kept in
the private development tree and are not part of the public repository. Public
references point only to files in this tree.
- Free-model catalogs and rate limits change; availability is best-effort.
- Third-party relays can have quota/cache surprises; the default chains keep auditable official providers as the paid backstop.
- Image routing requires GATE to be enabled. PDF/video are not declared by the tiers; convert or extract text first.
- Review false-positive rate is not yet measured over a long window.
REEVE is MIT. See LICENSE and NOTICE.md for the two
pieces of outside material (MIT ledger implementation; Apache-2.0 review rules).
No code or prompt literal from oh-my-openagent (SUL-1.0) is included.
{ "model": "reeve/standard", "plugins": ["@bd7pil/reeve@0.2.3"] }