mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-02 18:17:14 +00:00
ACP: force sessions_spawn as the only harness thread creation path (#30957)
* ACP: enforce sessions_spawn-only thread creation for harness spawns * skills(acpx): require acp-router preflight for ACP thread spawns * fix: enforce ACP thread spawn via sessions_spawn only (#30957) (thanks @dutifulbob) --------- Co-authored-by: Onur <2453968+osolmaz@users.noreply.github.com>
This commit is contained in:
@@ -87,6 +87,7 @@ Docs: https://docs.openclaw.ai
|
|||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
|
- ACP/Harness thread spawn routing: force ACP harness thread creation through `sessions_spawn` (`runtime: "acp"`, `thread: true`) and explicitly forbid `message action=thread-create` for ACP harness requests, avoiding misrouted `Unknown channel` errors. (#30957) Thanks @dutifulbob.
|
||||||
- CLI/Startup (Raspberry Pi + small hosts): speed up startup by avoiding unnecessary plugin preload on fast routes, adding root `--version` fast-path bootstrap bypass, parallelizing status JSON/non-JSON scans where safe, and enabling Node compile cache at startup with env override compatibility (`NODE_COMPILE_CACHE`, `NODE_DISABLE_COMPILE_CACHE`). (#5871) Thanks @BookCatKid and @vincentkoc for raising startup reports, and @lupuletic for related startup work in #27973.
|
- CLI/Startup (Raspberry Pi + small hosts): speed up startup by avoiding unnecessary plugin preload on fast routes, adding root `--version` fast-path bootstrap bypass, parallelizing status JSON/non-JSON scans where safe, and enabling Node compile cache at startup with env override compatibility (`NODE_COMPILE_CACHE`, `NODE_DISABLE_COMPILE_CACHE`). (#5871) Thanks @BookCatKid and @vincentkoc for raising startup reports, and @lupuletic for related startup work in #27973.
|
||||||
- Telegram/Outbound API proxy env: keep the Node 22 `autoSelectFamily` global-dispatcher workaround while restoring env-proxy support by using `EnvHttpProxyAgent` so `HTTP_PROXY`/`HTTPS_PROXY` continue to apply to outbound requests. (#26207) Thanks @qsysbio-cjw for reporting and @rylena and @vincentkoc for work.
|
- Telegram/Outbound API proxy env: keep the Node 22 `autoSelectFamily` global-dispatcher workaround while restoring env-proxy support by using `EnvHttpProxyAgent` so `HTTP_PROXY`/`HTTPS_PROXY` continue to apply to outbound requests. (#26207) Thanks @qsysbio-cjw for reporting and @rylena and @vincentkoc for work.
|
||||||
- Browser/Security: fail closed on browser-control auth bootstrap errors; if auto-auth setup fails and no explicit token/password exists, browser control server startup now aborts instead of starting unauthenticated. This ships in the next npm release. Thanks @ijxpwastaken.
|
- Browser/Security: fail closed on browser-control auth bootstrap errors; if auto-auth setup fails and no explicit token/password exists, browser control server startup now aborts instead of starting unauthenticated. This ships in the next npm release. Thanks @ijxpwastaken.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: acp-router
|
name: acp-router
|
||||||
description: Route plain-language requests for Pi, Claude Code, Codex, OpenCode, Gemini CLI, or ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow).
|
description: Route plain-language requests for Pi, Claude Code, Codex, OpenCode, Gemini CLI, or ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation.
|
||||||
user-invocable: false
|
user-invocable: false
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -17,6 +17,11 @@ Trigger this skill when the user asks OpenClaw to:
|
|||||||
- relay instructions to an external coding harness
|
- relay instructions to an external coding harness
|
||||||
- keep an external harness conversation in a thread-like conversation
|
- keep an external harness conversation in a thread-like conversation
|
||||||
|
|
||||||
|
Mandatory preflight for coding-agent thread requests:
|
||||||
|
|
||||||
|
- Before creating any thread for Pi/Claude/Codex/OpenCode/Gemini work, read this skill first in the same turn.
|
||||||
|
- After reading, follow `OpenClaw ACP runtime path` below; do not use `message(action="thread-create")` for ACP harness thread spawn.
|
||||||
|
|
||||||
## Mode selection
|
## Mode selection
|
||||||
|
|
||||||
Choose one of these paths:
|
Choose one of these paths:
|
||||||
@@ -54,13 +59,15 @@ If policy rejects the chosen id, report the policy error clearly and ask for the
|
|||||||
|
|
||||||
Required behavior:
|
Required behavior:
|
||||||
|
|
||||||
1. Use `sessions_spawn` with:
|
1. For ACP harness thread spawn requests, read this skill first in the same turn before calling tools.
|
||||||
|
2. Use `sessions_spawn` with:
|
||||||
- `runtime: "acp"`
|
- `runtime: "acp"`
|
||||||
- `thread: true`
|
- `thread: true`
|
||||||
- `mode: "session"` (unless user explicitly wants one-shot)
|
- `mode: "session"` (unless user explicitly wants one-shot)
|
||||||
2. Put requested work in `task` so the ACP session gets it immediately.
|
3. For ACP harness thread creation, do not use `message` with `action=thread-create`; `sessions_spawn` is the only thread-create path.
|
||||||
3. Set `agentId` explicitly unless ACP default agent is known.
|
4. Put requested work in `task` so the ACP session gets it immediately.
|
||||||
4. Do not ask user to run slash commands or CLI when this path works directly.
|
5. Set `agentId` explicitly unless ACP default agent is known.
|
||||||
|
6. Do not ask user to run slash commands or CLI when this path works directly.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
|||||||
@@ -266,6 +266,9 @@ describe("buildAgentSystemPrompt", () => {
|
|||||||
expect(prompt).toContain(
|
expect(prompt).toContain(
|
||||||
"do not route ACP harness requests through `subagents`/`agents_list` or local PTY exec flows",
|
"do not route ACP harness requests through `subagents`/`agents_list` or local PTY exec flows",
|
||||||
);
|
);
|
||||||
|
expect(prompt).toContain(
|
||||||
|
'do not call `message` with `action=thread-create`; use `sessions_spawn` (`runtime: "acp"`, `thread: true`) as the single thread creation path',
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("omits ACP harness guidance when ACP is disabled", () => {
|
it("omits ACP harness guidance when ACP is disabled", () => {
|
||||||
|
|||||||
@@ -449,6 +449,7 @@ export function buildAgentSystemPrompt(params: {
|
|||||||
'For requests like "do this in codex/claude code/gemini", treat it as ACP harness intent and call `sessions_spawn` with `runtime: "acp"`.',
|
'For requests like "do this in codex/claude code/gemini", treat it as ACP harness intent and call `sessions_spawn` with `runtime: "acp"`.',
|
||||||
'On Discord, default ACP harness requests to thread-bound persistent sessions (`thread: true`, `mode: "session"`) unless the user asks otherwise.',
|
'On Discord, default ACP harness requests to thread-bound persistent sessions (`thread: true`, `mode: "session"`) unless the user asks otherwise.',
|
||||||
"Set `agentId` explicitly unless `acp.defaultAgent` is configured, and do not route ACP harness requests through `subagents`/`agents_list` or local PTY exec flows.",
|
"Set `agentId` explicitly unless `acp.defaultAgent` is configured, and do not route ACP harness requests through `subagents`/`agents_list` or local PTY exec flows.",
|
||||||
|
'For ACP harness thread spawns, do not call `message` with `action=thread-create`; use `sessions_spawn` (`runtime: "acp"`, `thread: true`) as the single thread creation path.',
|
||||||
]
|
]
|
||||||
: []),
|
: []),
|
||||||
"Do not poll `subagents list` / `sessions_list` in a loop; only check status on-demand (for intervention, debugging, or when explicitly asked).",
|
"Do not poll `subagents list` / `sessions_list` in a loop; only check status on-demand (for intervention, debugging, or when explicitly asked).",
|
||||||
|
|||||||
Reference in New Issue
Block a user