@penclipai/adapter-openclaw-gateway
v2026.608.0
Published
This document describes how `@penclipai/adapter-openclaw-gateway` invokes OpenClaw over the Gateway protocol.
Readme
OpenClaw Gateway Adapter
This document describes how @penclipai/adapter-openclaw-gateway invokes OpenClaw over the Gateway protocol.
Transport
This adapter always uses WebSocket gateway transport.
- URL must be
ws://orwss:// - Protocol negotiation advertises
minProtocol=3,maxProtocol=4 - A gateway that omits the returned
protocolis treated as protocol 3 for backward compatibility - Connect flow follows gateway protocol:
- receive
connect.challenge - send
req connect(protocol range, client, caps, commands, permissions, locale, auth, and device payload) - send
req agent - wait for completion via
req agent.wait - stream
event agentframes into Paperclip logs/transcript parsing
Gateway Protocol v3/v4
@penclipai/adapter-openclaw-gateway supports OpenClaw Gateway protocol v3 and v4.
- v3 gateways continue to receive the same core connect fields (
client,role,scopes,auth,device) plus extra v4 declaration fields that should be ignored by tolerant v3 implementations. - v4 gateways receive conservative capability declarations:
caps:agent,agent.waitcommands:agent,agent.waitpermissions.scopes:true- top-level
scopes: the configured scope names localeanduserAgent
- The adapter does not claim support for gateway commands it does not call.
- The
hello-ok.policyobject may include fields such asmaxPayload,maxBufferedBytes, ortickIntervalMs; these are parsed safely and unknown policy fields are tolerated.
If you see PROTOCOL_MISMATCH, compare the details:
expectedProtocol=4withclientMinProtocol=3,clientMaxProtocol=3means the Paperclip adapter is too old; use a build that advertises protocol3..4.expectedProtocolgreater than 4 means the OpenClaw Gateway is newer than this adapter; upgrade Paperclip.expectedProtocollower than 3 means the gateway is older than this adapter's supported range; upgrade OpenClaw Gateway or run a v3/v4 compatible gateway.
The adapter includes gateway details in the returned error message so operators can distinguish adapter-version issues from auth or pairing problems.
Auth Modes
Gateway credentials can be provided in any of these ways:
authToken/tokenin adapter configheaders.x-openclaw-tokenheaders.x-openclaw-auth(legacy)password(shared password mode)
When a token is present and authorization header is missing, the adapter derives Authorization: Bearer <token>.
Device Auth
By default the adapter sends a signed device payload in connect params.
- set
disableDeviceAuth=trueto omit device signing - set
devicePrivateKeyPemto pin a stable signing key - without
devicePrivateKeyPem, the adapter generates an ephemeral Ed25519 keypair per run - when
autoPairOnFirstConnectis enabled (default), the adapter handles one initialpairing requiredby callingdevice.pair.list+device.pair.approveover shared auth, then retries once. - device auth remains nonce-bound to
connect.challenge; current v4 gateways accept the same top-leveldevice.signatureshape used by v3 and reject extradevice.signaturesfields.
Session Strategy
The adapter supports the same session routing model as HTTP OpenClaw mode:
sessionKeyStrategy=issue|fixed|runsessionKeyis used when strategy isfixed
Resolved session key is sent as agent.sessionKey.
Payload Mapping
The agent request is built as:
- required fields:
message(wake text plus optionalpayloadTemplate.message/payloadTemplate.textprefix)idempotencyKey(PapercliprunId)sessionKey(resolved strategy)
- optional additions:
- all
payloadTemplatefields merged in agentIdfrom config if set and not already in template
- all
- protocol-specific Paperclip context:
- protocol 3 receives root-level
paperclipstructured context for backward compatibility - protocol 4 omits root-level
paperclipbecause current v4 gateways strictly reject unknownagentparams; the same operational context remains embedded inmessage
- protocol 3 receives root-level
Timeouts
timeoutSeccontrols adapter-level request budgetwaitTimeoutMscontrolsagent.wait.timeoutMs
If agent.wait returns timeout, adapter returns openclaw_gateway_wait_timeout.
Troubleshooting
openclaw_gateway_protocol_mismatch: inspectexpectedProtocol,clientMinProtocol, andclientMaxProtocolin the error details. Upgrade/downgrade Paperclip or OpenClaw Gateway so the supported ranges overlap.openclaw_gateway_invalid_request: the gateway rejected connect or request params. Check URL, role, scopes, v4 capability fields, and strictagentschema errors such asunexpected property.openclaw_gateway_auth_failed: token/password is missing or wrong. VerifyauthToken,headers.x-openclaw-token, orheaders.x-openclaw-auth.openclaw_gateway_pairing_required: device auth reached the gateway but the device is not paired. Approve the pending OpenClaw device or ensureautoPairOnFirstConnecthas a valid shared token/password.openclaw_gateway_timeout: the WebSocket, connect.challenge, request, or wait step timed out. Confirm the URL points at the Gateway WebSocket endpoint and that the gateway is healthy.
Log Format
Structured gateway event logs use:
[openclaw-gateway] ...for lifecycle/system logs[openclaw-gateway:event] run=<id> stream=<stream> data=<json>forevent agentframes
UI/CLI parsers consume these lines to render transcript updates.
No-remote-git contract
Like every Paperclip adapter, this one must treat the local execution-workspace
cwd as the only persistence boundary across runs — no git push from runtime
code, no assuming a git remote exists. The gateway transport here doesn't
touch the workspace directly, but if you extend the adapter to ship code to
the OpenClaw side, use the round-trip helpers in @paperclipai/adapter-utils
(prepareWorkspaceForSshExecution → restoreWorkspaceFromSshExecution)
rather than reaching for a git remote. See
packages/adapters/AUTHORING.md
for the full contract and the pinning test at
packages/adapter-utils/src/ssh-fixture.test.ts.
