II.
Page JSON
Structured · livepage:docs-agent-mux-archive-comparisons-19-capabilities-matrix
Capabilities matrix json
Inspect the normalized record payload exactly as the atlas UI reads it.
{
"id": "page:docs-agent-mux-archive-comparisons-19-capabilities-matrix",
"_kind": "Page",
"_file": "wiki/docs/agent-mux/archive/comparisons/19-capabilities-matrix.md",
"_cluster": "wiki",
"attributes": {
"nodeKind": "Page",
"sourcePath": "docs/agent-mux/archive/comparisons/19-capabilities-matrix.md",
"sourceKind": "repo-docs",
"title": "Capabilities matrix",
"displayName": "Capabilities matrix",
"slug": "docs/agent-mux/archive/comparisons/19-capabilities-matrix",
"articlePath": "wiki/docs/agent-mux/archive/comparisons/19-capabilities-matrix.md",
"article": "\n# Capabilities matrix\n\n> Archived comparison document. Preserved for historical context; not part of the current normative `reference/` contract.\n\nOne-glance view of which features each built-in adapter supports. Every row\nis the adapter's declared `capabilities` record — the same data you get at\nruntime via `client.adapter(agent).capabilities`.\n\nLegend: ✓ supported · · not supported · ~ partial / virtual-only.\n\n| Feature / Agent | claude | codex | gemini | copilot | cursor | opencode | opencode-http | openclaw | hermes | pi | omp | qwen | agent-mux-remote |\n|------------------------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n| Resume session | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| Fork session | ✓ | ✓ | ~ | · | ~ | ~ | ✓ | ~ | · | · | · | ~ | ✓ |\n| Multi-turn | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| Text streaming | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| Thinking streaming | ✓ | ✓ | · | · | · | · | · | · | · | · | · | ~ | ~ |\n| Tool-call streaming | ✓ | ✓ | ✓ | ~ | ✓ | ✓ | ✓ | ✓ | ~ | ~ | ~ | ✓ | ✓ |\n| Native tools | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| Parallel tool calls | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | · | · | · | · | ✓ | ~ |\n| MCP plugins | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | · | · | · | ✓ | ~ |\n| Native hooks | ✓ | ✓ | ✓ | · | ~ | ~ | ~ | ~ | · | · | · | ~ | · |\n| Virtual hooks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| Subagent dispatch | ✓ | · | · | · | · | · | ✓ | · | · | · | · | · | ~ |\n| Skills / AGENTS.md | ✓ | · | · | · | · | · | ✓ | · | · | · | · | · | · |\n| Image input | ✓ | · | ✓ | · | · | · | ✓ | · | · | · | · | ~ | ~ |\n| File attachments | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| Approval (yolo/prompt) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ~ |\n| PTY required | · | · | · | · | · | · | · | · | · | · | · | · | · |\n| Session persistence | file | file | file | file | file | file | file | file | file | file | file | file | transport |\n| Cost events | ✓ | ✓ | ✓ | · | ~ | ~ | ~ | · | · | · | · | ~ | ~ |\n| Invocation modes | local, docker, ssh, k8s — all adapters (chosen per-run via `RunOptions.invocation`). |\n\n## Advanced Orchestration & Streaming Modes\n\nThis 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).\n\n### Execution Modes\n\n| Mode | Format | Stream | claude | codex | gemini | copilot | cursor | opencode | opencode-http | openclaw | hermes | pi | omp | qwen | agent-mux-remote |\n|:---:|:---:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n| **Interactive** | Text | **Stream** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| | Text | **Non-Str** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| | JSONL | **Stream** | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | ~ |\n| | JSONL | **Non-Str** | ✓ | · | · | · | · | · | · | · | · | · | · | · | ~ |\n| **Non-Interactive** | Text | **Stream** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| | Text | **Non-Str** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |\n| | JSONL | **Stream** | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | ~ |\n| | JSONL | **Non-Str** | ✓ | · | · | · | · | · | · | · | · | · | · | · | ~ |\n\n### Steering & Queueing Support\n\nSteering (injecting messages mid-run) and Queueing (queuing async messages) capabilities depend on the execution mode selected above.\n\n| Feature / Mode | Format | Stream | claude | codex | gemini | copilot | cursor | opencode | opencode-http | openclaw | hermes | pi | omp | qwen | agent-mux-remote |\n|:---:|:---:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n| **Steering** (Interactive) | Text | **Stream** | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | ~ |\n| | Text | **Non-Str** | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | ~ |\n| | JSONL | **Stream** | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | ~ |\n| | JSONL | **Non-Str** | ✓ | · | · | · | · | · | · | · | · | · | · | · | ~ |\n| **Queueing** (Interactive) | Text | **Stream** | · | ✓ | ✓ | · | · | · | · | · | · | · | · | · | ~ |\n| | Text | **Non-Str** | · | ✓ | ✓ | · | · | · | · | · | · | · | · | · | ~ |\n| | JSONL | **Stream** | · | ✓ | · | · | · | · | · | · | · | · | · | · | ~ |\n| | JSONL | **Non-Str** | · | · | · | · | · | · | · | · | · | · | · | · | ~ |\n\n*(Non-Interactive support matches the Interactive table above identically for Steering and Queueing)*\n\nCurrent runtime note: the concrete `RunHandle.queue()` / `RunHandle.steer()`\nimplementation is wired through the stdin-backed live-run path. Deferred\ndelivery currently flushes on observed `tool_result` / `tool_error`,\n`message_stop`, and `turn_end` events. Adapters that are modeled as remote or\nprogrammatic transports still need dedicated transport-native wiring before\nthis matrix can be treated as fully enforced runtime behavior for those paths.\n\n| Feature / Agent | claude | codex | gemini | copilot | cursor | opencode | opencode-http | openclaw | hermes | pi | omp | qwen | agent-mux-remote |\n|-------------------------------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n| **Async Loop Tools** | ✓ | · | · | · | · | · | · | · | · | · | · | · | ~ |\n\n## How this is derived\n\nEach adapter declares `AgentCapabilities` (see\n`packages/agent-mux/core/src/capabilities.ts`)\nand `ModelCapabilities[]`. The matrix above is a human-readable summary;\ntreat the declared capability objects as the source of truth for runtime\nfeature gating:\n\n```ts\nconst caps = client.adapter('claude-code').capabilities;\nif (caps.supportsThinking) { /* render thinking UI */ }\nif (caps.supportsMCP) { /* expose MCP plugin settings */ }\n```\n\n## Session persistence\n\n`file` adapters store transcripts as JSONL (or equivalent) under the\nharness's own session directory — agent-mux reads them back via\n`sessions.list()` / `sessions.read()` without re-parsing through the\nharness binary.\n\n`transport` (agent-mux-remote) delegates persistence to the remote\nendpoint: sessions live on the remote host and are fetched on demand.\n\n## Partial (~) notes\n\n- **thinking streaming — qwen**: emitted as a distinct block but not\n byte-incrementally; the UI sees one delta per reasoning turn.\n- **MCP — agent-mux-remote**: routed over the transport; supported iff the\n remote endpoint is running an adapter that supports MCP.\n- **virtual hooks**: implemented by agent-mux off the event stream for\n every adapter. Use them when native hooks aren't available or when you\n want the same hook to fire across multiple harnesses.\n- **cost — cursor / opencode / qwen**: tokens reported, USD not always.\n The `cost` event still fires with `totalUsd: 0` in that case.\n",
"documents": []
},
"outgoingEdges": [],
"incomingEdges": [
{
"from": "page:docs-agent-mux-archive-comparisons",
"to": "page:docs-agent-mux-archive-comparisons-19-capabilities-matrix",
"kind": "contains_page"
}
]
}