@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.
@@ -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 canonical owner claim is required");
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("canonical claim and backend record mode disagree");
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("canonical metadata verification failed; source retained for rerun");
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("canonical ownership evidence became incomplete");
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-DECUY80a.mjs")).acpxSessionOwnerMigration.collectBackupResources(input);
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-DECUY80a.mjs")).acpxSessionOwnerMigration.detectLegacyState(input);
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-DECUY80a.mjs")).acpxSessionOwnerMigration.migrateLegacyState(input);
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-DfAHoa8o.mjs";
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-CRe4WIFt.mjs");
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-7jc50ZJ4.mjs"));
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.openKeyedStore(options)
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;
@@ -1,2 +1 @@
1
- import { t as createAcpxRuntimeService } from "./.setup/register.runtime-DfAHoa8o.mjs";
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.5-beta.4",
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.85.1",
11
+ "@agentclientprotocol/claude-agent-acp": "0.86.0",
12
12
  "@agentclientprotocol/codex-acp": "2.1.1",
13
- "@openclaw/fs-safe": "0.25.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.5-beta.4"
48
+ "pluginApi": ">=2026.10.10-beta.1"
49
49
  },
50
50
  "build": {
51
- "openclawVersion": "2026.10.5-beta.4"
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.5-beta.4"
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
- - ensure plugin-local pinned acpx is installed in the ACPX plugin package
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 deterministic name, for example:
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`