* refactor: extract agent core package Introduce packages/agent-core as the OpenClaw-owned home for reusable agent loop, harness, session, prompt, and runtime dependency contracts. * refactor: extract shared llm runtime Move provider model registries, stream wrappers, OAuth helpers, and LLM utilities into src/llm with plugin-sdk barrels instead of depending on the old embedded runtime layout. * refactor: remove pi runtime internals Rename remaining Pi-shaped agent surfaces to OpenClaw agent runtime names, delete obsolete Pi docs and package graph checks, and add the third-party notice for incorporated code. * refactor: tighten agent session runtime Make agent-core/runtime dependencies explicit, consolidate compaction and session transcript helpers, and move model/session helpers behind OpenClaw-owned contracts. * refactor: remove static model and pi auth paths Drop static model catalogs and Pi auth bridges, move model/provider facts to manifest-owned runtime contracts, and harden internal embedded-agent utilities. * refactor: remove legacy provider compat paths * docs: remove agent parity notes * fix: skip provider wildcard metadata parsing * refactor: share session extension sdk loading * refactor: inline acpx proxy error formatter * refactor: fold edit recovery into edit tool * fix: accept extension batch separator * test: align startup provider plugin expectations * fix: restore provider-scoped release discovery * test: align static asset packaging expectations * fix: run static provider catalogs during scoped discovery * fix: add provider entry catalogs for scoped live discovery * fix: load lightweight provider catalog entries * fix: refresh provider-scoped plugin metadata * fix: keep provider catalog entries on release live path * fix: keep static manifest models in release live checks * fix: harden release model discovery * fix: reduce OpenAI live cache probe reasoning * fix: disable OpenAI cache probe reasoning * ci: extend OpenAI gateway live timeout * fix: extend live gateway model budget * fix: stabilize release validation regressions * fix: honor provider aliases in model rows * fix: stabilize release validation lanes * fix: stabilize release memory qa * ci: stabilize release validation lanes * ci: prefer ipv4 for live docker node calls * fix: restore shared tool-call stream wrapper * ci: remove legacy pi test shard alias * fix: clean up embedded agent test drift * fix: stabilize runtime alias status * fix: clean up embedded agent ci drift * fix: restore release ci invariants * fix: clean up post-rebase runtime drift * fix: restore release ci checks * fix: restore release ci after rebase * fix: remove stale pi runtime path * test: align compaction runtime expectations * test: update plugin prerelease expectations * fix: handle claude live tool approvals * fix: stabilize release validation gates * fix: finish agent runtime import * test: finish post-rebase agent runtime mocks * fix: keep codex compaction native * fix: stabilize codex app-server hook tests * test: isolate codex diagnostic active run * test: remove codex diagnostic completion race # Conflicts: # extensions/codex/src/app-server/run-attempt.test.ts * ci: fix full release manifest performance run id * refactor: narrow llm plugin sdk boundary * chore: drop generated google boundary stamps * fix: repair rebase fallout * fix: clean up rebased runtime references * fix: decode codex jwt payloads as base64url * fix: preserve shipped pi runtime alias * fix: add scoped sdk virtual modules * fix: decode llm codex oauth jwt as base64url * fix: avoid stale vertex adc negative cache * fix: harden tool arg decoding and codeql path * fix: keep vertex adc negative checks live * refactor: consolidate codex jwt and edit helpers * fix: await codex oauth node runtime imports * fix: preserve sdk tool and notice contracts * fix: preserve shipped compat config boundaries * fix: align codex oauth callback host * fix: terminate agent-core loop streams on failure * fix: keep codex oauth callback alive during fallback * ci: include session tools in critical codeql scans * fix: keep Cloudflare Anthropic provider auth header * docs: redirect legacy pi runtime pages * fix: honor bundled web provider compat discovery * fix: protect session output spill files * fix: keep legacy agent dir env blocked * fix: contain auto-discovered skill symlinks * fix: harden agent core sdk proxy surfaces * fix: restore approval reaction sdk compat * fix: keep live docker runs bounded * fix: keep codex oauth redirect host aligned * fix: resolve post-rebase agent runtime drift * fix: redact anthropic oauth parse failures * fix: preserve responses strict tool shaping * fix: repair agent runtime rebase cleanup * docs: redirect retired parity pages * fix: bound auto-discovered resources to roots * fix: repair post-rebase agent test drift * fix: preserve bundled provider allowlist migration * fix: preserve manifest-owned provider aliases * fix: declare photon image dependency * fix: keep provider headers out of proxy body * fix: preserve shipped env aliases * fix: refresh control ui i18n generated state * fix: quote read fallback paths * fix: preview edits through configured backend * test: satisfy core test typecheck * fix: preserve ZAI usage auth fallback * test: repair codex diagnostic test * fix: repair agent runtime rebase drift * test: finish embedded runner import rename * fix: repair agent runtime rebase integrations * test: align compaction oauth fallback expectations * fix: allow sdk-auth session models * fix: update doctor tool schema import * fix: preserve bedrock plugin region * fix: stream harmony-like prose immediately * ci: include session runtime in codeql shards * fix: repair latest rebase integrations * fix: honor explicit codex websocket transport * fix: keep openai-compatible credentials provider-scoped * fix: refresh sdk api baseline after rebase * fix: route cli runtime aliases through openclaw harness * test: rename stale harness mock expectation * test: rename embedded agent overflow calls * test: clean embedded auth test wording * test: use openclaw stream types in deepinfra cache test * fix: refresh sdk api baseline on latest main * fix: honor bundled discovery compat allowlists * fix: refresh sdk api baseline after latest rebase * fix: remove stale rebase imports * test: rename stale model catalog mock * test: mock renamed doctor runtime modules * fix: map canonical kimi env auth * fix: use internal model registry in bench script * fix: migrate deepinfra provider catalog entry * fix: enforce builtin tool suppression * fix: route compaction auth and proxy payloads safely * refactor: prune unused llm registry leftovers * test: update codex hooks session import * test: fix model picker ci coverage * test: align model picker auth mock types
11 KiB
summary, read_when, title
| summary | read_when | title | |||
|---|---|---|---|---|---|
| Setting up ACP agents: acpx harness config, plugin setup, permissions |
|
ACP agents — setup |
For the overview, operator runbook, and concepts, see ACP agents.
The sections below cover acpx harness config, plugin setup for the MCP bridges, and permission configuration.
Use this page only when you are setting up the ACP/acpx route. For native Codex app-server runtime config, use Codex harness. For OpenAI API keys or Codex OAuth model-provider config, use OpenAI.
Codex has two OpenClaw routes:
| Route | Config/command | Setup page |
|---|---|---|
| Native Codex app-server | /codex ..., openai/gpt-* agent refs |
Codex harness |
| Explicit Codex ACP adapter | /acp spawn codex, runtime: "acp", agentId: "codex" |
This page |
Prefer the native route unless you explicitly need ACP/acpx behavior.
acpx harness support (current)
Current acpx built-in harness aliases:
claudecodexcopilotcursor(Cursor CLI:cursor-agent acp)droidgeminiiflowkilocodekimikiroopenclawopencodeqwen
When OpenClaw uses the acpx backend, prefer these values for agentId unless your acpx config defines custom agent aliases.
If your local Cursor install still exposes ACP as agent acp, override the cursor agent command in your acpx config instead of changing the built-in default.
Direct acpx CLI usage can also target arbitrary adapters via --agent <command>, but that raw escape hatch is an acpx CLI feature (not the normal OpenClaw agentId path).
Model control is adapter-capability dependent. Codex ACP model refs are
normalized by OpenClaw before startup. Other harnesses need ACP models plus
session/set_model support; if a harness exposes neither that ACP capability
nor its own startup model flag, OpenClaw/acpx cannot force a model selection.
Required config
Core ACP baseline:
{
acp: {
enabled: true,
// Optional. Default is true; set false to pause ACP dispatch while keeping /acp controls.
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "codex",
allowedAgents: [
"claude",
"codex",
"copilot",
"cursor",
"droid",
"gemini",
"iflow",
"kilocode",
"kimi",
"kiro",
"openclaw",
"opencode",
"openclaw",
"qwen",
],
maxConcurrentSessions: 8,
stream: {
coalesceIdleMs: 300,
maxChunkChars: 1200,
},
runtime: {
ttlMinutes: 120,
},
},
}
Thread binding config is channel-adapter specific. Example for Discord:
{
session: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
spawnSessions: true,
},
},
},
}
If thread-bound ACP spawn does not work, verify the adapter feature flag first:
- Discord:
channels.discord.threadBindings.spawnSessions=true
Current-conversation binds do not require child-thread creation. They require an active conversation context and a channel adapter that exposes ACP conversation bindings.
Plugin setup for acpx backend
Packaged installs use the official @openclaw/acpx runtime plugin for ACP.
Install and enable it before using ACP harness sessions:
openclaw plugins install @openclaw/acpx
openclaw config set plugins.entries.acpx.enabled true
Source checkouts can also use the local workspace plugin after pnpm install.
Start with:
/acp doctor
If you disabled acpx, denied it via plugins.allow / plugins.deny, or want
to switch back to the packaged plugin, use the explicit package path:
openclaw plugins install @openclaw/acpx
openclaw config set plugins.entries.acpx.enabled true
Local workspace install during development:
openclaw plugins install ./path/to/local/acpx-plugin
Then verify backend health:
/acp doctor
acpx command and version configuration
By default, the acpx plugin registers the embedded ACP backend during Gateway
startup and waits for the embedded runtime startup probe before the gateway
ready signal. Set OPENCLAW_ACPX_RUNTIME_STARTUP_PROBE=0 or
OPENCLAW_SKIP_ACPX_RUNTIME_PROBE=1 only for scripts or environments that
intentionally keep the startup probe disabled. Run /acp doctor for an explicit
on-demand probe.
Override the command or version in plugin config:
{
"plugins": {
"entries": {
"acpx": {
"enabled": true,
"config": {
"command": "../acpx/dist/cli.js",
"expectedVersion": "any"
}
}
}
}
}
commandaccepts an absolute path, relative path (resolved from the OpenClaw workspace), or command name.expectedVersion: "any"disables strict version matching.- Custom
commandpaths disable plugin-local auto-install.
Override an individual ACP agent command with structured arguments when a path or flag value should remain one argv token:
{
"plugins": {
"entries": {
"acpx": {
"enabled": true,
"config": {
"agents": {
"claude": {
"command": "node",
"args": ["/path/to/custom adapter.mjs", "--verbose"]
}
}
}
}
}
}
}
agents.<id>.commandis the executable or existing command string for that ACP agent.agents.<id>.argsis optional. Each array item is shell-quoted before OpenClaw passes it through the current acpx command-string registry.
See Plugins.
Automatic dependency install
When you install OpenClaw globally with npm install -g openclaw, the acpx
runtime dependencies (platform-specific binaries) are installed automatically
via a postinstall hook. If the automatic install fails, the gateway still starts
normally and reports the missing dependency through openclaw acp doctor.
Plugin tools MCP bridge
By default, ACPX sessions do not expose OpenClaw plugin-registered tools to the ACP harness.
If you want ACP agents such as Codex or Claude Code to call installed OpenClaw plugin tools such as memory recall/store, enable the dedicated bridge:
openclaw config set plugins.entries.acpx.config.pluginToolsMcpBridge true
What this does:
- Injects a built-in MCP server named
openclaw-plugin-toolsinto ACPX session bootstrap. - Exposes plugin tools already registered by installed and enabled OpenClaw plugins.
- Keeps the feature explicit and default-off.
Security and trust notes:
- This expands the ACP harness tool surface.
- ACP agents get access only to plugin tools already active in the gateway.
- Treat this as the same trust boundary as letting those plugins execute in OpenClaw itself.
- Review installed plugins before enabling it.
Custom mcpServers still work as before. The built-in plugin-tools bridge is an
additional opt-in convenience, not a replacement for generic MCP server config.
OpenClaw tools MCP bridge
By default, ACPX sessions also do not expose built-in OpenClaw tools through
MCP. Enable the separate core-tools bridge when an ACP agent needs selected
built-in tools such as cron:
openclaw config set plugins.entries.acpx.config.openClawToolsMcpBridge true
What this does:
- Injects a built-in MCP server named
openclaw-toolsinto ACPX session bootstrap. - Exposes selected built-in OpenClaw tools. The initial server exposes
cron. - Keeps core-tool exposure explicit and default-off.
Runtime operation timeout configuration
The acpx plugin gives embedded runtime startup and control operations 120
seconds by default. This gives slower harnesses such as Gemini CLI enough time
to complete ACP startup and initialization. Override it if your host needs a
different operation limit:
openclaw config set plugins.entries.acpx.config.timeoutSeconds 180
Runtime turns use OpenClaw agent/run timeouts, including /acp timeout and
sessions_spawn.timeoutSeconds. Restart the gateway after changing this value.
Health probe agent configuration
When /acp doctor or the startup probe checks the backend, the bundled acpx
plugin probes one harness agent. If acp.allowedAgents is set, it defaults to
the first allowed agent; otherwise it defaults to codex. If your deployment
needs a different ACP agent for health checks, set the probe agent explicitly:
openclaw config set plugins.entries.acpx.config.probeAgent claude
Restart the gateway after changing this value.
Permission configuration
ACP sessions run non-interactively — there is no TTY to approve or deny file-write and shell-exec permission prompts. The acpx plugin provides two config keys that control how permissions are handled:
These ACPX harness permissions are separate from OpenClaw exec approvals and separate from CLI-backend vendor bypass flags such as Claude CLI --permission-mode bypassPermissions. ACPX approve-all is the harness-level break-glass switch for ACP sessions.
permissionMode
Controls which operations the harness agent can perform without prompting.
| Value | Behavior |
|---|---|
approve-all |
Auto-approve all file writes and shell commands. |
approve-reads |
Auto-approve reads only; writes and exec require prompts. |
deny-all |
Deny all permission prompts. |
nonInteractivePermissions
Controls what happens when a permission prompt would be shown but no interactive TTY is available (which is always the case for ACP sessions).
| Value | Behavior |
|---|---|
fail |
Abort the session with AcpRuntimeError. (default) |
deny |
Silently deny the permission and continue (graceful degradation). |
Configuration
Set via plugin config:
openclaw config set plugins.entries.acpx.config.permissionMode approve-all
openclaw config set plugins.entries.acpx.config.nonInteractivePermissions fail
Restart the gateway after changing these values.
OpenClaw defaults to `permissionMode=approve-reads` and `nonInteractivePermissions=fail`. In non-interactive ACP sessions, any write or exec that triggers a permission prompt can fail with `AcpRuntimeError: Permission prompt unavailable in non-interactive mode`.If you need to restrict permissions, set nonInteractivePermissions to deny so sessions degrade gracefully instead of crashing.
Related
- ACP agents — overview, operator runbook, concepts
- Sub-agents
- Multi-agent routing