feat(acp): enable dispatch by default

This commit is contained in:
Peter Steinberger
2026-03-03 00:47:25 +00:00
parent 6649c22471
commit 36dfd462a8
5 changed files with 9 additions and 6 deletions

View File

@@ -28,6 +28,7 @@ Docs: https://docs.openclaw.ai
- **BREAKING:** Plugin SDK removed `api.registerHttpHandler(...)`. Plugins must register explicit HTTP routes via `api.registerHttpRoute({ path, auth, match, handler })`, and dynamic webhook lifecycles should use `registerPluginHttpRoute(...)`.
- **BREAKING:** Zalo Personal plugin (`@openclaw/zalouser`) no longer depends on external `zca`-compatible CLI binaries (`openzca`, `zca-cli`) for runtime send/listen/login; operators should use `openclaw channels login --channel zalouser` after upgrade to refresh sessions in the new JS-native path.
- **BREAKING:** Onboarding now defaults `tools.profile` to `messaging` for new local installs (interactive + non-interactive). New setups no longer start with broad coding/system tools unless explicitly configured.
- **BREAKING:** ACP dispatch now defaults to enabled unless explicitly disabled (`acp.dispatch.enabled=false`). If you need to pause ACP turn routing while keeping `/acp` controls, set `acp.dispatch.enabled=false`. Docs: https://docs.openclaw.ai/tools/acp-agents
### Fixes

View File

@@ -75,7 +75,7 @@ Thread binding support is adapter-specific. If the active channel adapter does n
Required feature flags for thread-bound ACP:
- `acp.enabled=true`
- `acp.dispatch.enabled=true`
- `acp.dispatch.enabled` is on by default (set `false` to pause ACP dispatch)
- Channel-adapter ACP thread-spawn flag enabled (adapter-specific)
- Discord: `channels.discord.threadBindings.spawnAcpSessions=true`
@@ -249,6 +249,7 @@ 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",

View File

@@ -11,11 +11,11 @@ import {
} from "./policy.js";
describe("acp policy", () => {
it("treats ACP as enabled by default", () => {
it("treats ACP + ACP dispatch as enabled by default", () => {
const cfg = {} satisfies OpenClawConfig;
expect(isAcpEnabledByPolicy(cfg)).toBe(true);
expect(isAcpDispatchEnabledByPolicy(cfg)).toBe(false);
expect(resolveAcpDispatchPolicyState(cfg)).toBe("dispatch_disabled");
expect(isAcpDispatchEnabledByPolicy(cfg)).toBe(true);
expect(resolveAcpDispatchPolicyState(cfg)).toBe("enabled");
});
it("reports ACP disabled state when acp.enabled is false", () => {

View File

@@ -16,7 +16,8 @@ export function resolveAcpDispatchPolicyState(cfg: OpenClawConfig): AcpDispatchP
if (!isAcpEnabledByPolicy(cfg)) {
return "acp_disabled";
}
if (cfg.acp?.dispatch?.enabled !== true) {
// ACP dispatch is enabled unless explicitly disabled.
if (cfg.acp?.dispatch?.enabled === false) {
return "dispatch_disabled";
}
return "enabled";

View File

@@ -163,7 +163,7 @@ export const FIELD_HELP: Record<string, string> = {
"acp.enabled":
"Global ACP feature gate. Keep disabled unless ACP runtime + policy are configured.",
"acp.dispatch.enabled":
"Independent dispatch gate for ACP session turns. Disable to keep ACP commands available while blocking ACP turn execution.",
"Independent dispatch gate for ACP session turns (default: true). Set false to keep ACP commands available while blocking ACP turn execution.",
"acp.backend":
"Default ACP runtime backend id (for example: acpx). Must match a registered ACP runtime plugin backend.",
"acp.defaultAgent":