Sandbox API

Catalog and agents

Tier 1 curated catalog, Harbor factory breadth, and enforcement modes.

Tier 1 — Curated catalog

GET /sandbox/v1/catalog?kind=agent returns YAML-backed agents in infra/catalog/agents/.

Agent Runtime (POST /sandbox/agent/v1/runs) is always strict: unknown agent_id → 400.

Tier 2 — Harbor factory

GET /sandbox/agent/v1/agents returns catalog entries plus Harbor AgentFactory agents. Each item has source: catalog | harbor_factory.

Harbor datapoint uses SANDBOX_CATALOG_ENFORCE_AGENTS:

ModeHarbor datapointAgent Runtime
strictUnknown agent → 400strict
warn (prod default)Unknown catalog agent allowed if factory knows itstrict
offNo catalog checkstrict

Tier 3 — harbor_extensions

Power-user passthrough on datapoint agent blocks and Agent Runtime bodies. The platform maps these fields to Harbor CLI flags on the worker — consumers do not invoke harbor run directly.

JSON fieldHarbor CLIPurpose
agent_env--ae KEY=VALPer-agent environment (OpenCode, oracle, etc.)
sandbox-e <env>Sandbox driver hint: docker, daytona, k8s, …
n_concurrent-nConcurrent trials
custom_agent_import--custom-agent-importImport path for custom Harbor agents
agent_kwargs / agents[].params--ak key=valueAgent constructor kwargs (params + extensions; extensions win)
opencode_agent(not Harbor CLI)OpenCode default_agent in opencode.json (plan | build) when agent is opencode
opencode_config(not Harbor CLI)Deep-merge into opencode.json (e.g. agent.review.mode=subagent) — see Harbor and OpenCode flags

Top-level datapoint field sandbox (same values) selects the Harbor environment when not nested under harbor_extensions.

Daytona example (worker must have DAYTONA_API_KEY):

{
  "task_slug": "my-task",
  "sandbox": "daytona",
  "agents": [{ "name": "a", "harbor_agent": "oracle" }]
}

Full flag matrix + OpenCode Plan/Build: Harbor and OpenCode flags.

See Agent Runtime and Harbor datapoint.

opencode is the platform default for ad-hoc agent runs when no product-specific agent is required.