Merged via squash.
Prepared head SHA: b5e6e13afe
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
8.4 KiB
OpenClaw ACP Bridge
This document describes how the OpenClaw ACP (Agent Client Protocol) bridge works, how it maps ACP sessions to Gateway sessions, and how IDEs should invoke it.
Overview
openclaw acp exposes an ACP agent over stdio and forwards prompts to a running
OpenClaw Gateway over WebSocket. It keeps ACP session ids mapped to Gateway
session keys so IDEs can reconnect to the same agent transcript or reset it on
request.
Key goals:
- Minimal ACP surface area (stdio, NDJSON).
- Stable session mapping across reconnects.
- Works with existing Gateway session store (list/resolve/reset).
- Safe defaults (isolated ACP session keys by default).
Bridge Scope
openclaw acp is a Gateway-backed ACP bridge, not a full ACP-native editor
runtime. It is designed to route IDE prompts into an existing OpenClaw Gateway
session with predictable session mapping and basic streaming updates.
Compatibility Matrix
| ACP area | Status | Notes |
|---|---|---|
initialize, newSession, prompt, cancel |
Implemented | Core bridge flow over stdio to Gateway chat/send + abort. |
listSessions, slash commands |
Implemented | Session list works against Gateway session state; commands are advertised via available_commands_update. |
loadSession |
Partial | Rebinds the ACP session to a Gateway session key. Stored history is not replayed yet. |
Prompt content (text, embedded resource, images) |
Partial | Text/resources are flattened into chat input; images become Gateway attachments. |
| Session modes | Partial | session/set_mode is supported, but this bridge does not yet expose broader ACP-native mode or config surfaces. |
| Tool streaming | Partial | Tool start and result updates are forwarded, but without ACP-native terminal or richer editor metadata. |
Per-session MCP servers (mcpServers) |
Unsupported | Bridge mode rejects per-session MCP server requests. Configure MCP on the OpenClaw gateway or agent instead. |
Client filesystem methods (fs/read_text_file, fs/write_text_file) |
Unsupported | The bridge does not call ACP client filesystem methods. |
Client terminal methods (terminal/*) |
Unsupported | The bridge does not create ACP client terminals or stream terminal ids through tool calls. |
| Session plans / thought streaming | Unsupported | The bridge currently emits output text and tool status, not ACP plan or thought updates. |
Known Limitations
loadSessionrebinds to an existing Gateway session, but it does not replay prior user or assistant history yet.- If multiple ACP clients share the same Gateway session key, event and cancel
routing are best-effort rather than strictly isolated per client. Prefer the
default isolated
acp:<uuid>sessions when you need clean editor-local turns. - Gateway stop states are translated into ACP stop reasons, but that mapping is less expressive than a fully ACP-native runtime.
- Tool follow-along data is intentionally narrow in bridge mode. The bridge does not yet emit ACP terminals, file locations, or structured diffs.
How can I use this
Use ACP when an IDE or tooling speaks Agent Client Protocol and you want it to drive a OpenClaw Gateway session.
Quick steps:
- Run a Gateway (local or remote).
- Configure the Gateway target (
gateway.remote.url+ auth) or pass flags. - Point the IDE to run
openclaw acpover stdio.
Example config:
openclaw config set gateway.remote.url wss://gateway-host:18789
openclaw config set gateway.remote.token <token>
Example run:
openclaw acp --url wss://gateway-host:18789 --token <token>
Selecting agents
ACP does not pick agents directly. It routes by the Gateway session key.
Use agent-scoped session keys to target a specific agent:
openclaw acp --session agent:main:main
openclaw acp --session agent:design:main
openclaw acp --session agent:qa:bug-123
Each ACP session maps to a single Gateway session key. One agent can have many
sessions; ACP defaults to an isolated acp:<uuid> session unless you override
the key or label.
Zed editor setup
Add a custom ACP agent in ~/.config/zed/settings.json:
{
"agent_servers": {
"OpenClaw ACP": {
"type": "custom",
"command": "openclaw",
"args": ["acp"],
"env": {}
}
}
}
To target a specific Gateway or agent:
{
"agent_servers": {
"OpenClaw ACP": {
"type": "custom",
"command": "openclaw",
"args": [
"acp",
"--url",
"wss://gateway-host:18789",
"--token",
"<token>",
"--session",
"agent:design:main"
],
"env": {}
}
}
}
In Zed, open the Agent panel and select “OpenClaw ACP” to start a thread.
Execution Model
- ACP client spawns
openclaw acpand speaks ACP messages over stdio. - The bridge connects to the Gateway using existing auth config (or CLI flags).
- ACP
prompttranslates to Gatewaychat.send. - Gateway streaming events are translated back into ACP streaming events.
- ACP
cancelmaps to Gatewaychat.abortfor the active run.
Session Mapping
By default each ACP session is mapped to a dedicated Gateway session key:
acp:<uuid>unless overridden.
You can override or reuse sessions in two ways:
- CLI defaults
openclaw acp --session agent:main:main
openclaw acp --session-label "support inbox"
openclaw acp --reset-session
- ACP metadata per session
{
"_meta": {
"sessionKey": "agent:main:main",
"sessionLabel": "support inbox",
"resetSession": true,
"requireExisting": false
}
}
Rules:
sessionKey: direct Gateway session key.sessionLabel: resolve an existing session by label.resetSession: mint a new transcript for the key before first use.requireExisting: fail if the key/label does not exist.
Session Listing
ACP listSessions maps to Gateway sessions.list and returns a filtered
summary suitable for IDE session pickers. _meta.limit can cap the number of
sessions returned.
Prompt Translation
ACP prompt inputs are converted into a Gateway chat.send:
textandresourceblocks become prompt text.resource_linkwith image mime types become attachments.- The working directory can be prefixed into the prompt (default on, can be
disabled with
--no-prefix-cwd).
Gateway streaming events are translated into ACP message and tool_call
updates. Terminal Gateway states map to ACP done with stop reasons:
complete->stopaborted->cancelerror->error
Auth + Gateway Discovery
openclaw acp resolves the Gateway URL and auth from CLI flags or config:
--url/--token/--passwordtake precedence.- Otherwise use configured
gateway.remote.*settings.
Operational Notes
- ACP sessions are stored in memory for the bridge process lifetime.
- Gateway session state is persisted by the Gateway itself.
--verboselogs ACP/Gateway bridge events to stderr (never stdout).- ACP runs can be canceled and the active run id is tracked per session.
Compatibility
- ACP bridge uses
@agentclientprotocol/sdk(currently 0.13.x). - Works with ACP clients that implement
initialize,newSession,loadSession,prompt,cancel, andlistSessions.
Testing
- Unit:
src/acp/session.test.tscovers run id lifecycle. - Full gate:
pnpm build && pnpm check && pnpm test && pnpm docs:build.
Related Docs
- CLI usage:
docs/cli/acp.md - Session model:
docs/concepts/session.md - Session management internals:
docs/reference/session-management-compaction.md