@openclaw/acpx 2026.9.2 → 2026.9.4

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.
@@ -1,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { n as createLazyAcpRuntimeProxy } from "./register.runtime-Ba7FPMGu.js";
2
+ import { n as createLazyAcpRuntimeProxy } from "./register.runtime-CksaMeEx.js";
3
3
  import "./config-schema-DN_uAi4R.js";
4
- import { _ as quoteCommandPart, a as createAcpxProcessLeaseStore, f as ACPX_GATEWAY_INSTANCE_KEY, g as normalizeAcpxGatewayInstanceRecord, l as openAcpxProcessLeaseStateStore, n as OPENCLAW_ACPX_LEASE_ID_ARG, p as ACPX_GATEWAY_INSTANCE_NAMESPACE, r as OPENCLAW_GATEWAY_INSTANCE_ID_ARG, u as readAcpxProcessLeaseIdentity, v as splitCommandParts } from "./process-lease-Cwvj7WGe.js";
5
- import { n as resolveAcpxPluginRoot, r as toAcpMcpServers, t as resolveAcpxPluginConfig } from "./config-v8M2tNu6.js";
4
+ import { _ as splitCommandParts, c as openAcpxProcessLeaseStateStore, d as ACPX_GATEWAY_INSTANCE_KEY, f as ACPX_GATEWAY_INSTANCE_NAMESPACE, h as normalizeAcpxGatewayInstanceRecord, i as createAcpxProcessLeaseStore, l as readAcpxProcessLeaseIdentity, n as OPENCLAW_ACPX_LEASE_ID_ARG, r as OPENCLAW_GATEWAY_INSTANCE_ID_ARG } from "./process-lease-B83BGiLj.js";
5
+ import { i as toAcpMcpServers, n as resolveAcpxPluginRoot, r as resolveOpenClawRoot, t as resolveAcpxPluginConfig } from "./config-D2FTk0K7.js";
6
6
  import { createRequire } from "node:module";
7
7
  import { finiteSecondsToTimerSafeMilliseconds } from "openclaw/plugin-sdk/number-runtime";
8
8
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
@@ -12,8 +12,9 @@ import os from "node:os";
12
12
  import path from "node:path";
13
13
  import fs$1 from "node:fs/promises";
14
14
  import { randomUUID } from "node:crypto";
15
- import { isPidAlive, runExec } from "openclaw/plugin-sdk/process-runtime";
15
+ import { escapeRegExp } from "openclaw/plugin-sdk/text-utility-runtime";
16
16
  import { inspect } from "node:util";
17
+ import { isPidAlive, runExec } from "openclaw/plugin-sdk/process-runtime";
17
18
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
18
19
  import { readJsonFileWithFallback } from "openclaw/plugin-sdk/json-store";
19
20
  import { parse, stringify } from "smol-toml";
@@ -68,16 +69,9 @@ function resolvePackageRoot(packageName) {
68
69
  return;
69
70
  }
70
71
  }
71
- function resolveOpenClawInstallRoot(pluginRoot) {
72
- if (path.basename(pluginRoot) === "acpx" && path.basename(path.dirname(pluginRoot)) === "extensions") {
73
- const parent = path.dirname(path.dirname(pluginRoot));
74
- return path.basename(parent) === "dist" ? path.dirname(parent) : parent;
75
- }
76
- return path.resolve(pluginRoot, "..");
77
- }
78
72
  function resolveOwnedAcpPackageRootCandidates(packageName) {
79
73
  const pluginRoot = resolveAcpxPluginRoot(import.meta.url);
80
- const openClawRoot = resolveOpenClawInstallRoot(pluginRoot);
74
+ const openClawRoot = resolveOpenClawRoot(pluginRoot);
81
75
  return [
82
76
  resolvePackageRoot(packageName),
83
77
  path.join(pluginRoot, "node_modules", packageName),
@@ -91,15 +85,9 @@ function commandBelongsToResolvedAcpPackage(command) {
91
85
  function commandMentionsGeneratedWrapper(command) {
92
86
  return Array.from(GENERATED_WRAPPER_BASENAMES).some((basename) => command.includes(basename));
93
87
  }
94
- function commandWrapperBelongsToRoot(command, wrapperRoot) {
95
- if (!wrapperRoot) return true;
96
- const normalizedCommand = normalizePathLike(command);
97
- const normalizedRoot = normalizePathLike(wrapperRoot).replace(/\/+$/, "");
98
- return Array.from(GENERATED_WRAPPER_BASENAMES).some((basename) => normalizedCommand.includes(`${normalizedRoot}/${basename}`));
99
- }
100
88
  function commandContainsExactWrapperPath(command, wrapperPath) {
101
89
  const expectedPath = normalizePathLike(wrapperPath);
102
- return splitCommandParts(command).some((part) => normalizePathLike(part) === expectedPath);
90
+ return new RegExp(`(?:^|[\\s"'])${escapeRegExp(expectedPath)}(?=$|[\\s"'])`).test(normalizePathLike(command));
103
91
  }
104
92
  function wrapperPathBelongsToRoot(wrapperPath, wrapperRoot) {
105
93
  const normalizedPath = normalizePathLike(wrapperPath);
@@ -108,24 +96,18 @@ function wrapperPathBelongsToRoot(wrapperPath, wrapperRoot) {
108
96
  }
109
97
  /** Check whether a command references an OpenClaw-generated ACPX wrapper path. */
110
98
  function isOpenClawLeaseAwareAcpxProcessCommand(params) {
111
- const command = params.command?.trim();
112
- if (!command) return false;
113
- const normalized = normalizePathLike(command);
114
- return commandMentionsGeneratedWrapper(normalized) && commandWrapperBelongsToRoot(normalized, params.wrapperRoot);
99
+ const command = normalizePathLike(Array.isArray(params.command) ? params.command.join(" ") : params.command ?? "");
100
+ const root = params.wrapperRoot ? `${normalizePathLike(params.wrapperRoot).replace(/\/+$/, "")}/` : "";
101
+ return Array.from(GENERATED_WRAPPER_BASENAMES).some((basename) => command.includes(`${root}${basename}`));
115
102
  }
116
103
  function commandsReferToSameRootCommand(liveCommand, storedCommand) {
117
104
  if (!storedCommand?.trim()) return true;
118
105
  return normalizePathLike(liveCommand).trim() === normalizePathLike(storedCommand).trim();
119
106
  }
120
- function commandOptionEquals(parts, option, expected) {
121
- if (!expected) return true;
122
- const index = parts.indexOf(option);
123
- return index >= 0 && parts[index + 1] === expected;
124
- }
125
107
  function liveCommandMatchesLeaseIdentity(params) {
126
108
  if (!params.expectedLeaseId && !params.expectedGatewayInstanceId) return true;
127
- const parts = splitCommandParts(params.command ?? "");
128
- return commandOptionEquals(parts, "--openclaw-acpx-lease-id", params.expectedLeaseId) && commandOptionEquals(parts, "--openclaw-gateway-instance-id", params.expectedGatewayInstanceId);
109
+ const identity = readAcpxProcessLeaseIdentity(params.command);
110
+ return (!params.expectedLeaseId || identity?.leaseId === params.expectedLeaseId) && (!params.expectedGatewayInstanceId || identity?.gatewayInstanceId === params.expectedGatewayInstanceId);
129
111
  }
130
112
  /** Check whether a command is owned by OpenClaw ACPX runtime packages or wrappers. */
131
113
  function isOpenClawOwnedAcpxProcessCommand(params) {
@@ -237,25 +219,10 @@ async function cleanupOpenClawOwnedAcpxProcessTree(params) {
237
219
  const rootCommand = listedTree[0]?.command ?? params.rootCommand;
238
220
  const liveCommandWasGeneratedWrapper = commandMentionsGeneratedWrapper(normalizePathLike(rootCommand ?? ""));
239
221
  const storedCommandWasGeneratedWrapper = commandMentionsGeneratedWrapper(normalizePathLike(params.rootCommand ?? ""));
240
- if (!liveCommandWasGeneratedWrapper && storedCommandWasGeneratedWrapper) return {
241
- inspectedPids: listedTree.map((processInfo) => processInfo.pid),
242
- terminatedPids: [],
243
- skippedReason: "not-openclaw-owned"
244
- };
245
- if (!liveCommandWasGeneratedWrapper && !commandsReferToSameRootCommand(rootCommand ?? "", params.rootCommand)) return {
246
- inspectedPids: listedTree.map((processInfo) => processInfo.pid),
247
- terminatedPids: [],
248
- skippedReason: "not-openclaw-owned"
249
- };
250
- if (!isOpenClawOwnedAcpxProcessCommand({
222
+ if (!liveCommandWasGeneratedWrapper && (storedCommandWasGeneratedWrapper || !commandsReferToSameRootCommand(rootCommand ?? "", params.rootCommand)) || !isOpenClawOwnedAcpxProcessCommand({
251
223
  command: rootCommand,
252
224
  wrapperRoot: params.wrapperRoot
253
- })) return {
254
- inspectedPids: listedTree.map((processInfo) => processInfo.pid),
255
- terminatedPids: [],
256
- skippedReason: "not-openclaw-owned"
257
- };
258
- if (!liveCommandMatchesLeaseIdentity({
225
+ }) || !liveCommandMatchesLeaseIdentity({
259
226
  command: rootCommand,
260
227
  expectedLeaseId: params.expectedLeaseId,
261
228
  expectedGatewayInstanceId: params.expectedGatewayInstanceId
@@ -701,9 +668,6 @@ const DIAGNOSTIC_REDACTION_RULES = [
701
668
  replacement: "[REDACTED_TELEGRAM_TOKEN]"
702
669
  }
703
670
  ];
704
- function renderDiagnosticRedactionRuleSpecs() {
705
- return JSON.stringify(DIAGNOSTIC_REDACTION_RULES);
706
- }
707
671
  function buildAdapterWrapperScript(params) {
708
672
  return `#!/usr/bin/env node
709
673
  import { appendFileSync, existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
@@ -717,9 +681,9 @@ const stderrLogFileNamePrefix = ${params.stderrLogFileNamePrefix ? JSON.stringif
717
681
  const stderrLogMaxChars = 256 * 1024;
718
682
 
719
683
  const openClawWrapperArgs = new Set([
720
- ${quoteCommandPart(OPENCLAW_ACPX_LEASE_ID_ARG)},
721
- ${quoteCommandPart(OPENCLAW_GATEWAY_INSTANCE_ID_ARG)},
722
- ${(params.openClawWrapperArgs ?? []).map(quoteCommandPart).join(",\n ")}
684
+ ${JSON.stringify(OPENCLAW_ACPX_LEASE_ID_ARG)},
685
+ ${JSON.stringify(OPENCLAW_GATEWAY_INSTANCE_ID_ARG)},
686
+ ${(params.openClawWrapperArgs ?? []).map((arg) => JSON.stringify(arg)).join(",\n ")}
723
687
  ]);
724
688
 
725
689
  function readOpenClawWrapperArg(args, name) {
@@ -756,13 +720,13 @@ function resolveStderrLogPath(args) {
756
720
  return undefined;
757
721
  }
758
722
  const leaseId =
759
- readOpenClawWrapperArg(args, ${quoteCommandPart(OPENCLAW_ACPX_LEASE_ID_ARG)}) ||
723
+ readOpenClawWrapperArg(args, ${JSON.stringify(OPENCLAW_ACPX_LEASE_ID_ARG)}) ||
760
724
  "pid-" + process.pid;
761
725
  const fileName = stderrLogFileNamePrefix + "." + safeDiagnosticFilePart(leaseId) + ".log";
762
726
  return fileURLToPath(new URL("./" + fileName, import.meta.url));
763
727
  }
764
728
 
765
- const diagnosticRedactionRules = ${renderDiagnosticRedactionRuleSpecs()}.map((rule) => [
729
+ const diagnosticRedactionRules = ${JSON.stringify(DIAGNOSTIC_REDACTION_RULES)}.map((rule) => [
766
730
  new RegExp(rule.source, rule.flags),
767
731
  rule.replacement,
768
732
  ]);
@@ -915,7 +879,7 @@ function resolveNpmCliPath() {
915
879
  }
916
880
 
917
881
  const npmCliPath = resolveNpmCliPath();
918
- const installedBinPath = ${params.installedBinPath ? quoteCommandPart(params.installedBinPath) : "undefined"};
882
+ const installedBinPath = ${params.installedBinPath ? JSON.stringify(params.installedBinPath) : "undefined"};
919
883
  let defaultCommand;
920
884
  let defaultArgs;
921
885
  if (installedBinPath) {
@@ -1098,7 +1062,7 @@ function mergeCodexConfig(base, override) {
1098
1062
 
1099
1063
  const openClawCodexConfigs = readOpenClawWrapperArgs(
1100
1064
  rawConfiguredArgs,
1101
- ${quoteCommandPart(OPENCLAW_CODEX_CONFIG_ARG)},
1065
+ ${JSON.stringify(OPENCLAW_CODEX_CONFIG_ARG)},
1102
1066
  );
1103
1067
  if (openClawCodexConfigs.length > 0) {
1104
1068
  let existingCodexConfig = {};
@@ -1164,23 +1128,13 @@ async function prepareIsolatedCodexHome(params) {
1164
1128
  }), "utf8");
1165
1129
  return codexHome;
1166
1130
  }
1167
- async function makeGeneratedWrapperExecutableIfPossible(wrapperPath) {
1131
+ async function writeAdapterWrapper(baseDir, fileName, script) {
1132
+ await fs$1.mkdir(baseDir, { recursive: true });
1133
+ const wrapperPath = path.join(baseDir, fileName);
1134
+ await fs$1.writeFile(wrapperPath, script, { encoding: "utf8" });
1168
1135
  try {
1169
1136
  await fs$1.chmod(wrapperPath, 493);
1170
1137
  } catch {}
1171
- }
1172
- async function writeCodexAcpWrapper(baseDir, installedBinPath) {
1173
- await fs$1.mkdir(baseDir, { recursive: true });
1174
- const wrapperPath = path.join(baseDir, "codex-acp-wrapper.mjs");
1175
- await fs$1.writeFile(wrapperPath, buildCodexAcpWrapperScript(installedBinPath), { encoding: "utf8" });
1176
- await makeGeneratedWrapperExecutableIfPossible(wrapperPath);
1177
- return wrapperPath;
1178
- }
1179
- async function writeClaudeAcpWrapper(baseDir, installedBinPath) {
1180
- await fs$1.mkdir(baseDir, { recursive: true });
1181
- const wrapperPath = path.join(baseDir, "claude-agent-acp-wrapper.mjs");
1182
- await fs$1.writeFile(wrapperPath, buildClaudeAcpWrapperScript(installedBinPath), { encoding: "utf8" });
1183
- await makeGeneratedWrapperExecutableIfPossible(wrapperPath);
1184
1138
  return wrapperPath;
1185
1139
  }
1186
1140
  function buildWrapperCommand(wrapperPath, args = []) {
@@ -1188,7 +1142,7 @@ function buildWrapperCommand(wrapperPath, args = []) {
1188
1142
  process.execPath,
1189
1143
  wrapperPath,
1190
1144
  ...args
1191
- ].map(quoteCommandPart).join(" ");
1145
+ ];
1192
1146
  }
1193
1147
  function isAcpPackageSpec(value, packageName) {
1194
1148
  const escapedPackageName = packageName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -1203,9 +1157,7 @@ function isPackageRunnerCommand(value) {
1203
1157
  return /^(?:npx|npm|pnpm|bunx)(?:\.cmd|\.exe)?$/i.test(basename(value));
1204
1158
  }
1205
1159
  function extractConfiguredAdapterArgs(params) {
1206
- const trimmedConfiguredCommand = params.configuredCommand?.trim();
1207
- if (!trimmedConfiguredCommand) return [];
1208
- const parts = splitCommandParts(trimmedConfiguredCommand);
1160
+ const parts = splitCommandParts(params.configuredCommand ?? []);
1209
1161
  if (!parts.length) return [];
1210
1162
  const packageIndex = parts.findIndex((part) => isAcpPackageSpec(part, params.packageName));
1211
1163
  if (packageIndex >= 0) {
@@ -1291,11 +1243,6 @@ function resolveCodexAdapterLaunch(configuredCommand) {
1291
1243
  if (!maintainedAdapterArgs) return;
1292
1244
  return { args: maintainedAdapterArgs };
1293
1245
  }
1294
- function buildCodexAcpWrapperCommand(wrapperPath, configuredCommand) {
1295
- const launch = resolveCodexAdapterLaunch(configuredCommand);
1296
- if (launch) return buildWrapperCommand(wrapperPath, launch.args);
1297
- return buildWrapperCommand(wrapperPath, [RUN_CONFIGURED_COMMAND_SENTINEL, ...splitCommandParts(configuredCommand?.trim() ?? "")]);
1298
- }
1299
1246
  async function persistMigratedCodexMcpConfig(params) {
1300
1247
  const mcpServers = params.migratedConfig?.mcp_servers;
1301
1248
  if (!isRecord(mcpServers)) return;
@@ -1310,7 +1257,7 @@ function buildClaudeAcpWrapperCommand(wrapperPath, configuredCommand) {
1310
1257
  binName: CLAUDE_ACP_BIN
1311
1258
  });
1312
1259
  if (configuredAdapterArgs) return buildWrapperCommand(wrapperPath, configuredAdapterArgs);
1313
- return configuredCommand?.trim() || buildWrapperCommand(wrapperPath);
1260
+ return configuredCommand ?? buildWrapperCommand(wrapperPath);
1314
1261
  }
1315
1262
  /** Prepare ACPX agent commands and isolated auth homes for Codex/Claude adapters. */
1316
1263
  async function prepareAcpxCodexAuthConfig(params) {
@@ -1328,13 +1275,13 @@ async function prepareAcpxCodexAuthConfig(params) {
1328
1275
  });
1329
1276
  const installedCodexBinPath = await (params.resolveInstalledCodexAcpBinPath ?? resolveInstalledCodexAcpBinPath)();
1330
1277
  const installedClaudeBinPath = await (params.resolveInstalledClaudeAcpBinPath ?? resolveInstalledClaudeAcpBinPath)();
1331
- const wrapperPath = await writeCodexAcpWrapper(codexBaseDir, installedCodexBinPath);
1332
- const claudeWrapperPath = await writeClaudeAcpWrapper(codexBaseDir, installedClaudeBinPath);
1278
+ const wrapperPath = await writeAdapterWrapper(codexBaseDir, "codex-acp-wrapper.mjs", buildCodexAcpWrapperScript(installedCodexBinPath));
1279
+ const claudeWrapperPath = await writeAdapterWrapper(codexBaseDir, "claude-agent-acp-wrapper.mjs", buildClaudeAcpWrapperScript(installedClaudeBinPath));
1333
1280
  return {
1334
1281
  ...params.pluginConfig,
1335
1282
  agents: {
1336
1283
  ...params.pluginConfig.agents,
1337
- codex: buildCodexAcpWrapperCommand(wrapperPath, configuredCodexCommand),
1284
+ codex: buildWrapperCommand(wrapperPath, codexLaunch?.args ?? [RUN_CONFIGURED_COMMAND_SENTINEL, ...splitCommandParts(configuredCodexCommand ?? [])]),
1338
1285
  claude: buildClaudeAcpWrapperCommand(claudeWrapperPath, configuredClaudeCommand)
1339
1286
  }
1340
1287
  };
@@ -1351,7 +1298,7 @@ var service_exports = /* @__PURE__ */ __exportAll({
1351
1298
  });
1352
1299
  const ENABLE_STARTUP_PROBE_ENV = "OPENCLAW_ACPX_RUNTIME_STARTUP_PROBE";
1353
1300
  const SKIP_RUNTIME_PROBE_ENV = "OPENCLAW_SKIP_ACPX_RUNTIME_PROBE";
1354
- const loadRuntimeModule = createLazyRuntimeModule(() => import("./runtime-memQfUBo.js"));
1301
+ const loadRuntimeModule = createLazyRuntimeModule(() => import("./runtime-CSNBTQIs.js"));
1355
1302
  /** Convert ACPX timeout seconds into timer-safe milliseconds. */
1356
1303
  function resolveAcpxTimerTimeoutMs(timeoutSeconds) {
1357
1304
  if (timeoutSeconds === void 0) return;
@@ -1396,9 +1343,6 @@ function createLazyDefaultRuntime(params) {
1396
1343
  }
1397
1344
  return {
1398
1345
  ...createLazyAcpRuntimeProxy(resolveRuntime),
1399
- async probeAvailability() {
1400
- await (await resolveRuntime()).probeAvailability();
1401
- },
1402
1346
  isHealthy() {
1403
1347
  return runtime?.isHealthy() ?? false;
1404
1348
  }
@@ -1592,20 +1536,18 @@ function createAcpxRuntimeService(params) {
1592
1536
  lifecycleRevision += 1;
1593
1537
  const currentRevision = lifecycleRevision;
1594
1538
  try {
1595
- await measureAcpxStartup(ctx, "probe.availability", () => withStartupProbeTimeout({
1596
- promise: startedRuntime.probeAvailability(),
1539
+ const doctorReport = await measureAcpxStartup(ctx, "probe.availability", () => withStartupProbeTimeout({
1540
+ promise: startedRuntime.doctor(),
1597
1541
  timeoutSeconds: pluginConfig.timeoutSeconds ?? 120
1598
1542
  }));
1599
1543
  if (currentRevision !== lifecycleRevision) return;
1600
- if (startedRuntime.isHealthy()) {
1544
+ if (doctorReport.ok) {
1601
1545
  detailAcpxStartup(ctx, "probe.result", [["healthyCount", 1]]);
1602
1546
  ctx.logger.info("embedded acpx runtime backend ready");
1603
1547
  return;
1604
1548
  }
1605
- const doctorReport = await measureAcpxStartup(ctx, "probe.doctor", () => startedRuntime.doctor());
1606
- if (currentRevision !== lifecycleRevision) return;
1607
1549
  detailAcpxStartup(ctx, "probe.result", [["healthyCount", 0]]);
1608
- ctx.logger.warn(`embedded acpx runtime backend probe failed: ${doctorReport ? formatDoctorFailureMessage(doctorReport) : "backend remained unhealthy after probe"}`);
1550
+ ctx.logger.warn(`embedded acpx runtime backend probe failed: ${formatDoctorFailureMessage(doctorReport)}`);
1609
1551
  } catch (err) {
1610
1552
  if (currentRevision !== lifecycleRevision) return;
1611
1553
  detailAcpxStartup(ctx, "probe.result", [["healthyCount", 0]]);
@@ -1,5 +1,5 @@
1
- import { l as openAcpxProcessLeaseStateStore, o as hashAcpxProcessCommand, s as normalizeAcpxProcessLease, u as readAcpxProcessLeaseIdentity } from "./process-lease-Cwvj7WGe.js";
2
- import { t as resolveAcpxPluginConfig } from "./config-v8M2tNu6.js";
1
+ import { a as hashAcpxProcessCommand, c as openAcpxProcessLeaseStateStore, l as readAcpxProcessLeaseIdentity, o as normalizeAcpxProcessLease } from "./process-lease-B83BGiLj.js";
2
+ import { t as resolveAcpxPluginConfig } from "./config-D2FTk0K7.js";
3
3
  import path from "node:path";
4
4
  import fs from "node:fs/promises";
5
5
  import { archiveLegacyStateSource, asObjectRecord } from "openclaw/plugin-sdk/runtime-doctor-migrations";
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "id": "acpx",
3
+ "categories": ["runtime", "tools"],
3
4
  "backupResources": [
4
5
  {
5
6
  "disposition": "regenerable",
@@ -14,7 +15,14 @@
14
15
  ],
15
16
  "doctorContract": {
16
17
  "configRepair": true,
17
- "stateMigrations": true
18
+ "stateMigrations": [
19
+ { "id": "acpx-runtime-state-to-plugin-state" },
20
+ {
21
+ "id": "acpx-session-owner-resources",
22
+ "doctorOnly": true,
23
+ "phase": "after-session-repair"
24
+ }
25
+ ]
18
26
  },
19
27
  "activation": {
20
28
  "onStartup": true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/acpx",
3
- "version": "2026.9.2",
3
+ "version": "2026.9.4",
4
4
  "description": "OpenClaw ACP runtime backend with plugin-owned session and transport management.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,7 +10,7 @@
10
10
  "dependencies": {
11
11
  "@agentclientprotocol/claude-agent-acp": "0.70.0",
12
12
  "@agentclientprotocol/codex-acp": "1.6.2",
13
- "acpx": "0.13.1",
13
+ "acpx": "0.13.2",
14
14
  "smol-toml": "1.8.0",
15
15
  "zod": "4.4.3"
16
16
  },
@@ -22,6 +22,7 @@
22
22
  "./index.ts"
23
23
  ],
24
24
  "install": {
25
+ "clawhubSpec": "clawhub:@openclaw/acpx",
25
26
  "npmSpec": "@openclaw/acpx",
26
27
  "defaultChoice": "npm",
27
28
  "minHostVersion": ">=2026.4.25",
@@ -43,10 +44,10 @@
43
44
  ]
44
45
  },
45
46
  "compat": {
46
- "pluginApi": ">=2026.9.2"
47
+ "pluginApi": ">=2026.9.4"
47
48
  },
48
49
  "build": {
49
- "openclawVersion": "2026.9.2",
50
+ "openclawVersion": "2026.9.4",
50
51
  "staticAssets": [
51
52
  {
52
53
  "source": "./src/runtime-internals/mcp-proxy.mjs",
@@ -74,7 +75,7 @@
74
75
  "skills/**"
75
76
  ],
76
77
  "peerDependencies": {
77
- "openclaw": ">=2026.9.2"
78
+ "openclaw": ">=2026.9.4"
78
79
  },
79
80
  "peerDependenciesMeta": {
80
81
  "openclaw": {