





















@@ -3,6 +3,7 @@ import { createRequire } from "node:module";
33import path from "node:path";
44import { promisify } from "node:util";
55import { splitCommandParts } from "./command-line.js";
6+import { resolveAcpxPluginRoot } from "./config.js";
67import { OPENCLAW_ACPX_LEASE_ID_ARG, OPENCLAW_GATEWAY_INSTANCE_ID_ARG } from "./process-lease.js";
7889const execFileAsync = promisify(execFile);
@@ -24,8 +25,7 @@ const OWNED_ACP_PACKAGE_NAMES = [
2425"acpx",
2526];
2627const ACP_PACKAGE_MARKERS = [
27-"/@zed-industries/codex-acp/",
28-"/@agentclientprotocol/claude-agent-acp/",
28+ ...OWNED_ACP_PACKAGE_NAMES.map((packageName) => `/node_modules/${packageName}/`),
2929"/acpx/dist/",
3030];
3131@@ -65,8 +65,29 @@ function resolvePackageRoot(packageName: string): string | undefined {
6565}
6666}
676768-const OWNED_ACP_PACKAGE_ROOTS = OWNED_ACP_PACKAGE_NAMES.map(resolvePackageRoot).filter(
69-(root): root is string => Boolean(root),
68+function resolveOpenClawInstallRoot(pluginRoot: string): string {
69+if (
70+path.basename(pluginRoot) === "acpx" &&
71+path.basename(path.dirname(pluginRoot)) === "extensions"
72+) {
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+79+function resolveOwnedAcpPackageRootCandidates(packageName: string): string[] {
80+const pluginRoot = resolveAcpxPluginRoot(import.meta.url);
81+const openClawRoot = resolveOpenClawInstallRoot(pluginRoot);
82+return [
83+resolvePackageRoot(packageName),
84+path.join(pluginRoot, "node_modules", packageName),
85+path.join(openClawRoot, "node_modules", packageName),
86+].flatMap((root) => (root ? [normalizePathLike(root)] : []));
87+}
88+89+const OWNED_ACP_PACKAGE_ROOTS = Array.from(
90+new Set(OWNED_ACP_PACKAGE_NAMES.flatMap(resolveOwnedAcpPackageRootCandidates)),
7091);
71927293function commandBelongsToResolvedAcpPackage(command: string): boolean {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。