Skip to main content

Capabilities matrix

Archived comparison document. Preserved for historical context; not part of the current normative reference/ contract.

One-glance view of which features each built-in adapter supports. Every row is the adapter's declared capabilities record — the same data you get at runtime via client.adapter(agent).capabilities.

Legend: ✓ supported · · not supported · ~ partial / virtual-only.

Feature / Agentclaudecodexgeminicopilotcursoropencodeopencode-httpopenclawhermespiompqwenagent-mux-remote
Resume session
Fork session~·~~~···~
Multi-turn
Text streaming
Thinking streaming·········~~
Tool-call streaming~~~~
Native tools
Parallel tool calls·····~
MCP plugins····~
Native hooks·~~~~···~·
Virtual hooks
Subagent dispatch··········~
Skills / AGENTS.md···········
Image input········~~
File attachments
Approval (yolo/prompt)~
PTY required·············
Session persistencefilefilefilefilefilefilefilefilefilefilefilefiletransport
Cost events·~~~····~~
Invocation modeslocal, docker, ssh, k8s — all adapters (chosen per-run via RunOptions.invocation).

Advanced Orchestration & Streaming Modes

This matrix covers the detailed discovery for how each adapter handles streaming, interactivity, and queueing across the 16 mode combinations (Interactive/Non-Interactive × JSONL/Text × Stream/Non-Stream).

Execution Modes

ModeFormatStreamclaudecodexgeminicopilotcursoropencodeopencode-httpopenclawhermespiompqwenagent-mux-remote
InteractiveTextStream
TextNon-Str
JSONLStream··········~
JSONLNon-Str···········~
Non-InteractiveTextStream
TextNon-Str
JSONLStream··········~
JSONLNon-Str···········~

Steering & Queueing Support

Steering (injecting messages mid-run) and Queueing (queuing async messages) capabilities depend on the execution mode selected above.

Feature / ModeFormatStreamclaudecodexgeminicopilotcursoropencodeopencode-httpopenclawhermespiompqwenagent-mux-remote
Steering (Interactive)TextStream·········~
TextNon-Str·········~
JSONLStream··········~
JSONLNon-Str···········~
Queueing (Interactive)TextStream··········~
TextNon-Str··········~
JSONLStream···········~
JSONLNon-Str············~

(Non-Interactive support matches the Interactive table above identically for Steering and Queueing)

Current runtime note: the concrete RunHandle.queue() / RunHandle.steer() implementation is wired through the stdin-backed live-run path. Deferred delivery currently flushes on observed tool_result / tool_error, message_stop, and turn_end events. Adapters that are modeled as remote or programmatic transports still need dedicated transport-native wiring before this matrix can be treated as fully enforced runtime behavior for those paths.

Feature / Agentclaudecodexgeminicopilotcursoropencodeopencode-httpopenclawhermespiompqwenagent-mux-remote
Async Loop Tools···········~

How this is derived

Each adapter declares AgentCapabilities (see packages/agent-mux/core/src/capabilities.ts) and ModelCapabilities[]. The matrix above is a human-readable summary; treat the declared capability objects as the source of truth for runtime feature gating:

const caps = client.adapter('claude-code').capabilities;
if (caps.supportsThinking) { /* render thinking UI */ }
if (caps.supportsMCP) { /* expose MCP plugin settings */ }

Session persistence

file adapters store transcripts as JSONL (or equivalent) under the harness's own session directory — agent-mux reads them back via sessions.list() / sessions.read() without re-parsing through the harness binary.

transport (agent-mux-remote) delegates persistence to the remote endpoint: sessions live on the remote host and are fetched on demand.

Partial (~) notes

  • thinking streaming — qwen: emitted as a distinct block but not byte-incrementally; the UI sees one delta per reasoning turn.
  • MCP — agent-mux-remote: routed over the transport; supported iff the remote endpoint is running an adapter that supports MCP.
  • virtual hooks: implemented by agent-mux off the event stream for every adapter. Use them when native hooks aren't available or when you want the same hook to fire across multiple harnesses.
  • cost — cursor / opencode / qwen: tokens reported, USD not always. The cost event still fires with totalUsd: 0 in that case.