@openclaw/acpx 2026.10.5-beta.4 → 2026.10.10-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/.setup/{harness-attempt-CRe4WIFt.mjs → harness-attempt-lu4_bMfd.mjs} +2 -2
- package/dist/.setup/{pi-session-catalog-runtime-7jc50ZJ4.mjs → pi-session-catalog-runtime-BAM1pEMw.mjs} +43 -170
- package/dist/.setup/{register.runtime-DfAHoa8o.mjs → register.runtime-CdG6bROH.mjs} +1 -1
- package/dist/.setup/{service-De_oVTL3.mjs → service-5eVJSjDE.mjs} +326 -313
- package/dist/.setup/{session-owner-migration-DECUY80a.mjs → session-owner-migration-duvwZfxk.mjs} +4 -4
- package/dist/doctor-contract-api.js +3 -3
- package/dist/index.js +6 -8
- package/dist/register.runtime.js +1 -2
- package/package.json +6 -6
- package/skills/acp-router/SKILL.md +12 -5
package/dist/.setup/{session-owner-migration-DECUY80a.mjs → session-owner-migration-duvwZfxk.mjs}
RENAMED
|
@@ -276,11 +276,11 @@ async function migrateRecord(input, directory, oldId, claims, changes, warnings)
|
|
|
276
276
|
const { resolveAcpxSessionResource } = await import("./session-resource-DKJsUJPu.mjs").then((n) => n.n);
|
|
277
277
|
const { createFileSessionStore, decodeAcpxRuntimeHandleState, encodeAcpxRuntimeHandleState } = await import("acpx/runtime");
|
|
278
278
|
const candidates = claims.filter((claim) => matchesClaimRecord(claim, raw, oldId, resolveAcpxSessionResource(claim), decodeAcpxRuntimeHandleState));
|
|
279
|
-
if (candidates.length !== 1) throw new Error("exactly one current
|
|
279
|
+
if (candidates.length !== 1) throw new Error("exactly one current owner claim is required");
|
|
280
280
|
const claim = candidates[0];
|
|
281
281
|
const resource = resolveAcpxSessionResource(claim);
|
|
282
282
|
const oneshot = claim.meta.mode === "oneshot";
|
|
283
|
-
if (oneshot !== (raw.name !== oldId)) throw new Error("
|
|
283
|
+
if (oneshot !== (raw.name !== oldId)) throw new Error("current claim and backend record mode disagree");
|
|
284
284
|
if (!oneshot && oldId === resource) return;
|
|
285
285
|
const recordId = oneshot ? oldId : resource;
|
|
286
286
|
const leaseStore = openAcpxProcessLeaseStateStore(input.context.openPluginStateKeyedStore);
|
|
@@ -357,7 +357,7 @@ async function migrateRecord(input, directory, oldId, claims, changes, warnings)
|
|
|
357
357
|
acpxRecordId: recordId
|
|
358
358
|
});
|
|
359
359
|
const verified = await input.context.inspectAcpSessionClaims();
|
|
360
|
-
if (verified.incomplete.length || !verified.claims.some((item) => item.agentId === claim.agentId && item.sessionKey === claim.sessionKey && item.meta.identity?.acpxRecordId === recordId && isDeepStrictEqual(item.binding, claim.binding))) throw new Error("
|
|
360
|
+
if (verified.incomplete.length || !verified.claims.some((item) => item.agentId === claim.agentId && item.sessionKey === claim.sessionKey && item.meta.identity?.acpxRecordId === recordId && isDeepStrictEqual(item.binding, claim.binding))) throw new Error("stored metadata verification failed; source retained for rerun");
|
|
361
361
|
changes.push(`Migrated ACP backend history for ${claim.agentId}/${claim.sessionKey} to its owner-qualified resource.`);
|
|
362
362
|
if (!oneshot) await (0, runtime_doctor_migrations_exports.archiveLegacyStateSource)({
|
|
363
363
|
filePath: sourcePath,
|
|
@@ -416,7 +416,7 @@ const acpxSessionOwnerMigration = {
|
|
|
416
416
|
};
|
|
417
417
|
for (const oldId of ids) try {
|
|
418
418
|
const current = await input.context.inspectAcpSessionClaims();
|
|
419
|
-
if (current.incomplete.length) throw new Error("
|
|
419
|
+
if (current.incomplete.length) throw new Error("current ownership evidence became incomplete");
|
|
420
420
|
await migrateRecord(input, directory, oldId, current.claims, changes, warnings);
|
|
421
421
|
} catch (error) {
|
|
422
422
|
warnings.push(`ACP record ${oldId} retained: ${String(error)}`);
|
|
@@ -40,13 +40,13 @@ const stateMigrations = [{
|
|
|
40
40
|
doctorOnly: true,
|
|
41
41
|
phase: "after-session-repair",
|
|
42
42
|
async collectBackupResources(input) {
|
|
43
|
-
return (await import("./.setup/session-owner-migration-
|
|
43
|
+
return (await import("./.setup/session-owner-migration-duvwZfxk.mjs")).acpxSessionOwnerMigration.collectBackupResources(input);
|
|
44
44
|
},
|
|
45
45
|
async detectLegacyState(input) {
|
|
46
|
-
return (await import("./.setup/session-owner-migration-
|
|
46
|
+
return (await import("./.setup/session-owner-migration-duvwZfxk.mjs")).acpxSessionOwnerMigration.detectLegacyState(input);
|
|
47
47
|
},
|
|
48
48
|
async migrateLegacyState(input) {
|
|
49
|
-
return (await import("./.setup/session-owner-migration-
|
|
49
|
+
return (await import("./.setup/session-owner-migration-duvwZfxk.mjs")).acpxSessionOwnerMigration.migrateLegacyState(input);
|
|
50
50
|
}
|
|
51
51
|
}];
|
|
52
52
|
//#endregion
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { t as createAcpxRuntimeService } from "./.setup/register.runtime-
|
|
1
|
+
import { t as createAcpxRuntimeService } from "./.setup/register.runtime-CdG6bROH.mjs";
|
|
2
2
|
import { g as AcpxNativeAgentsSchema, h as ACPX_NATIVE_AGENT_IDS, t as resolveAcpxPluginConfig } from "./.setup/config-D0ATuiVJ.mjs";
|
|
3
3
|
import { a as PI_SESSIONS_CAPABILITY, c as PI_SESSION_READ_COMMAND, l as PI_TERMINAL_RESUME_COMMAND, o as PI_SESSIONS_LIST_COMMAND, r as piSessionStoreAvailable, s as PI_SESSION_ID_PATTERN } from "./.setup/pi-session-paths-CIvyk6KB.mjs";
|
|
4
4
|
import { createAgentRegistry } from "acpx/agent-registry";
|
|
5
5
|
import { tryDispatchAcpReplyHook } from "openclaw/plugin-sdk/acp-runtime-backend";
|
|
6
6
|
import { createLazyRuntimeModule, createLazyRuntimeSurface } from "openclaw/plugin-sdk/lazy-runtime";
|
|
7
|
-
import { inspectAgentModels } from "acpx/runtime";
|
|
8
|
-
import { createNativeSessionCommitFinalizer } from "openclaw/plugin-sdk/agent-harness-session-runtime";
|
|
9
7
|
import { finiteSecondsToTimerSafeMilliseconds } from "openclaw/plugin-sdk/number-runtime";
|
|
10
8
|
import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
11
9
|
import { resolveNodeHostExecutable } from "openclaw/plugin-sdk/node-host";
|
|
@@ -166,6 +164,7 @@ function createAcpAgentHarness(params) {
|
|
|
166
164
|
workspaceDir: input.workspaceDir
|
|
167
165
|
});
|
|
168
166
|
try {
|
|
167
|
+
const { inspectAgentModels } = await import("acpx/runtime");
|
|
169
168
|
const models = await inspectAgentModels({
|
|
170
169
|
agentCommand: inspection.launch.argv,
|
|
171
170
|
cwd: input.workspaceDir ?? config.cwd,
|
|
@@ -173,7 +172,6 @@ function createAcpAgentHarness(params) {
|
|
|
173
172
|
timeoutMs: config.timeoutSeconds === void 0 ? void 0 : finiteSecondsToTimerSafeMilliseconds(config.timeoutSeconds) ?? 1
|
|
174
173
|
});
|
|
175
174
|
generation.signal.throwIfAborted();
|
|
176
|
-
if (!params.isEnabled()) return { entries: [] };
|
|
177
175
|
return {
|
|
178
176
|
entries: (models?.availableModels ?? []).map((model) => ({
|
|
179
177
|
provider: id,
|
|
@@ -188,7 +186,6 @@ function createAcpAgentHarness(params) {
|
|
|
188
186
|
};
|
|
189
187
|
} catch (error) {
|
|
190
188
|
generation.signal.throwIfAborted();
|
|
191
|
-
if (!params.isEnabled()) return { entries: [] };
|
|
192
189
|
const authRequired = error instanceof Error && error.name === "RequestError" && "code" in error && error.code === -32e3 && (error.message === "Authentication required" || error.message.startsWith("Authentication required: "));
|
|
193
190
|
return {
|
|
194
191
|
entries: [],
|
|
@@ -207,7 +204,7 @@ function createAcpAgentHarness(params) {
|
|
|
207
204
|
if (inspection?.launch.kind !== "installed") throw new Error(`${params.label} is not installed; refresh the model catalog`);
|
|
208
205
|
const runtime = await runtimeFor(input.workspaceDir);
|
|
209
206
|
generation.signal.throwIfAborted();
|
|
210
|
-
const { runAcpHarnessAttempt } = await import("./.setup/harness-attempt-
|
|
207
|
+
const { runAcpHarnessAttempt } = await import("./.setup/harness-attempt-lu4_bMfd.mjs");
|
|
211
208
|
return await runAcpHarnessAttempt({
|
|
212
209
|
input,
|
|
213
210
|
runtime,
|
|
@@ -226,6 +223,7 @@ function createAcpAgentHarness(params) {
|
|
|
226
223
|
}, () => generation.signal.throwIfAborted());
|
|
227
224
|
},
|
|
228
225
|
async withSessionDeletion(input, run) {
|
|
226
|
+
const { createNativeSessionCommitFinalizer } = await import("openclaw/plugin-sdk/agent-harness-session-runtime");
|
|
229
227
|
let committed = false;
|
|
230
228
|
try {
|
|
231
229
|
return await run(createNativeSessionCommitFinalizer({
|
|
@@ -248,7 +246,7 @@ function createAcpAgentHarness(params) {
|
|
|
248
246
|
}
|
|
249
247
|
//#endregion
|
|
250
248
|
//#region extensions/acpx/src/pi-session-catalog-plugin.ts
|
|
251
|
-
const loadPiSessionCatalogModule = createLazyRuntimeModule(() => import("./.setup/pi-session-catalog-runtime-
|
|
249
|
+
const loadPiSessionCatalogModule = createLazyRuntimeModule(() => import("./.setup/pi-session-catalog-runtime-BAM1pEMw.mjs"));
|
|
252
250
|
function fullConfigCatalogEnabled(config) {
|
|
253
251
|
if (!isRecord(config) || !isRecord(config.plugins) || !isRecord(config.plugins.entries)) return true;
|
|
254
252
|
const entry = config.plugins.entries.acpx;
|
|
@@ -325,7 +323,7 @@ const plugin = {
|
|
|
325
323
|
const service = createAcpxRuntimeService({
|
|
326
324
|
pluginConfig: api.pluginConfig,
|
|
327
325
|
getAllowedAgents: () => api.runtime.config.current().acp?.allowedAgents,
|
|
328
|
-
openKeyedStore: (options) => api.runtime.state.
|
|
326
|
+
openKeyedStore: (options) => api.runtime.state.openKeyedStoreV2(options)
|
|
329
327
|
});
|
|
330
328
|
api.registerService(service);
|
|
331
329
|
const currentConfig = () => api.runtime.config.current().plugins?.entries?.acpx?.config;
|
package/dist/register.runtime.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { createAcpxRuntimeService };
|
|
1
|
+
export { t as createAcpxRuntimeService } from "./.setup/register.runtime-CdG6bROH.mjs";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/acpx",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.10-beta.1",
|
|
4
4
|
"description": "OpenClaw ACP runtime backend with plugin-owned session and transport management.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
},
|
|
9
9
|
"type": "module",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@agentclientprotocol/claude-agent-acp": "0.
|
|
11
|
+
"@agentclientprotocol/claude-agent-acp": "0.86.0",
|
|
12
12
|
"@agentclientprotocol/codex-acp": "2.1.1",
|
|
13
|
-
"@openclaw/fs-safe": "0.
|
|
13
|
+
"@openclaw/fs-safe": "0.26.5",
|
|
14
14
|
"acpx": "0.19.4",
|
|
15
15
|
"smol-toml": "1.9.0",
|
|
16
16
|
"zod": "4.6.5"
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
]
|
|
46
46
|
},
|
|
47
47
|
"compat": {
|
|
48
|
-
"pluginApi": ">=2026.10.
|
|
48
|
+
"pluginApi": ">=2026.10.10-beta.1"
|
|
49
49
|
},
|
|
50
50
|
"build": {
|
|
51
|
-
"openclawVersion": "2026.10.
|
|
51
|
+
"openclawVersion": "2026.10.10-beta.1"
|
|
52
52
|
},
|
|
53
53
|
"release": {
|
|
54
54
|
"publishToClawHub": true,
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"skills/**"
|
|
69
69
|
],
|
|
70
70
|
"peerDependencies": {
|
|
71
|
-
"openclaw": ">=2026.10.
|
|
71
|
+
"openclaw": ">=2026.10.10-beta.1"
|
|
72
72
|
},
|
|
73
73
|
"peerDependenciesMeta": {
|
|
74
74
|
"openclaw": {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: acp-router
|
|
3
|
-
description: Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit 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. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.
|
|
3
|
+
description: Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Grok Build, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit 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. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.
|
|
4
4
|
user-invocable: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# ACP Harness Router
|
|
8
8
|
|
|
9
|
-
When user intent is "run this in Claude Code/Cursor/Copilot/OpenClaw/OpenCode/Gemini/Qwen/Kiro/Kimi/iFlow/Droid/Kilocode (ACP harness)", do not use subagent runtime or PTY scraping. Route through ACP-aware flows.
|
|
9
|
+
When user intent is "run this in Claude Code/Cursor/Copilot/OpenClaw/OpenCode/Gemini/Grok Build/Qwen/Kiro/Kimi/iFlow/Droid/Kilocode (ACP harness)", do not use subagent runtime or PTY scraping. Route through ACP-aware flows.
|
|
10
10
|
|
|
11
11
|
Codex is special: plain chat/conversation binding and control should use the native Codex app-server plugin (`/codex bind`, `/codex threads`, `/codex resume`) instead of the default ACP path. Use ACP for Codex only when the user explicitly names ACP/`/acp`/acpx, or when spawning background child sessions through `sessions_spawn` where a native Codex runtime spawn is not available yet.
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ Codex is special: plain chat/conversation binding and control should use the nat
|
|
|
14
14
|
|
|
15
15
|
Trigger this skill when the user asks OpenClaw to:
|
|
16
16
|
|
|
17
|
-
- run something in Claude Code / Cursor / Copilot / OpenClaw / OpenCode / Gemini / Qwen / Kiro / Kimi / iFlow / Droid / Kilocode
|
|
17
|
+
- run something in Claude Code / Cursor / Copilot / OpenClaw / OpenCode / Gemini / Grok Build / Qwen / Kiro / Kimi / iFlow / Droid / Kilocode
|
|
18
18
|
- run Codex explicitly through ACP, `/acp`, or acpx
|
|
19
19
|
- continue existing harness work
|
|
20
20
|
- relay instructions to an external coding harness
|
|
@@ -56,6 +56,7 @@ Use these defaults when user names a harness directly:
|
|
|
56
56
|
- "droid" or "factory droid" -> `agentId: "droid"`
|
|
57
57
|
- "opencode" -> `agentId: "opencode"`
|
|
58
58
|
- "gemini" or "gemini cli" -> `agentId: "gemini"`
|
|
59
|
+
- "grok build" or "grok-build" -> `agentId: "grok-build"`
|
|
59
60
|
- "iflow" -> `agentId: "iflow"`
|
|
60
61
|
- "kilocode" -> `agentId: "kilocode"`
|
|
61
62
|
- "kimi" or "kimi cli" -> `agentId: "kimi"`
|
|
@@ -64,6 +65,10 @@ Use these defaults when user names a harness directly:
|
|
|
64
65
|
|
|
65
66
|
These defaults match current acpx built-in aliases.
|
|
66
67
|
|
|
68
|
+
`grok-build` is an ACPX agent target, not the xAI model id
|
|
69
|
+
`xai/grok-build-0.1`. Route `grok-build` through `agentId`; use the fully
|
|
70
|
+
qualified xAI ref only in an OpenClaw `model` field.
|
|
71
|
+
|
|
67
72
|
If policy rejects the chosen id, report the policy error clearly and ask for the allowed ACP agent id.
|
|
68
73
|
|
|
69
74
|
## OpenClaw ACP runtime path
|
|
@@ -104,7 +109,7 @@ Required behavior when ACP backend is unavailable:
|
|
|
104
109
|
|
|
105
110
|
1. Do not immediately ask the user to pick an alternate path.
|
|
106
111
|
2. First attempt automatic local repair:
|
|
107
|
-
-
|
|
112
|
+
- check that plugin-local pinned acpx is installed in the ACPX plugin package
|
|
108
113
|
- verify `${ACPX_CMD} --version`
|
|
109
114
|
3. After reinstall/repair, restart the gateway and explicitly offer to run that restart for the user.
|
|
110
115
|
4. Retry ACP thread spawn once after repair.
|
|
@@ -153,7 +158,7 @@ Use this path to drive harness sessions without `/acp` or subagent runtime.
|
|
|
153
158
|
|
|
154
159
|
### Session naming
|
|
155
160
|
|
|
156
|
-
Use a
|
|
161
|
+
Use a stable name, for example:
|
|
157
162
|
|
|
158
163
|
- `oc-<harness>-<conversationId>`
|
|
159
164
|
|
|
@@ -196,6 +201,7 @@ ${ACPX_CMD} codex sessions close oc-codex-<conversationId>
|
|
|
196
201
|
- `cursor`
|
|
197
202
|
- `droid`
|
|
198
203
|
- `gemini`
|
|
204
|
+
- `grok-build`
|
|
199
205
|
- `iflow`
|
|
200
206
|
- `kilocode`
|
|
201
207
|
- `kimi`
|
|
@@ -215,6 +221,7 @@ Defaults are:
|
|
|
215
221
|
- `cursor -> cursor-agent acp`
|
|
216
222
|
- `droid -> droid exec --output-format acp`
|
|
217
223
|
- `gemini -> gemini --acp`
|
|
224
|
+
- `grok-build -> grok agent stdio`
|
|
218
225
|
- `iflow -> iflow --experimental-acp`
|
|
219
226
|
- `kilocode -> npx -y @kilocode/cli acp`
|
|
220
227
|
- `kimi -> kimi acp`
|