OpenCode
Default. Multi-provider (google / anthropic / openai). Dummy key in the container; Sandbox egress swaps in the AI Gateway credential.
Current behavior (as implemented): one image carries all three CLIs ([email protected], @anthropic-ai/[email protected], @openai/[email protected]), and a run picks its harness at approval time. The dashboard’s New Coding Task form has a harness picker; delegate_coding_task accepts optional harness and codingModel inputs, validated before a container starts. Only OpenCode has been exercised against a live CLI; the Claude Code and Codex event parsers are asserted from their documented stream formats and pinned by CLI version.
Specification target (GOAL / PLAN T22): API-key harnesses only. Subscription credentials are not proxied.
OpenCode
Default. Multi-provider (google / anthropic / openai). Dummy key in the container; Sandbox egress swaps in the AI Gateway credential.
Claude Code
anthropic/* models, e.g. anthropic/claude-sonnet-4-6. Stream format: --print --output-format stream-json.
Codex
openai/* models, e.g. openai/gpt-5.3-codex. Stream format: codex exec --json.
Per-run selection beats the deploy default: the dashboard harness picker (or the delegate tool’s harness input) overrides AGENT_HARNESS. An unsupported harness/model pair fails on the approval card, never inside a container the human already approved. registry.npmjs.org is not on the egress allowlist, so npm install inside a run is refused.