





















@@ -1,6 +1,7 @@
11import fs from "node:fs";
22import path from "node:path";
3-import { resolveBundledPluginsDir } from "./bundled-dir.js";
3+import { resolveUserPath } from "../utils.js";
4+import { areBundledPluginsDisabled, resolveBundledPluginsDir } from "./bundled-dir.js";
4556export const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [
67".ts",
@@ -101,37 +102,105 @@ function resolvePackageFallbackForBundledDir(params: {
101102});
102103}
103104105+function sameExistingPath(left: string, right: string): boolean {
106+try {
107+return fs.realpathSync.native(left) === fs.realpathSync.native(right);
108+} catch {
109+return false;
110+}
111+}
112+113+function resolveExplicitEnvBundledPluginsDir(env: NodeJS.ProcessEnv): string | undefined {
114+const envOverride = env.OPENCLAW_BUNDLED_PLUGINS_DIR?.trim();
115+if (!envOverride) {
116+return undefined;
117+}
118+const bundledPluginsDir = resolveBundledPluginsDir(env);
119+if (!bundledPluginsDir) {
120+return undefined;
121+}
122+const requestedDir = resolveUserPath(envOverride, env);
123+return sameExistingPath(requestedDir, bundledPluginsDir) ? bundledPluginsDir : undefined;
124+}
125+126+function resolvePublicSurfaceFromBundledDir(params: {
127+rootDir: string;
128+bundledPluginsDir: string;
129+dirName: string;
130+artifactBasename: string;
131+}): string | null {
132+const pluginDir = path.resolve(params.bundledPluginsDir, params.dirName);
133+const builtCandidate = path.join(pluginDir, params.artifactBasename);
134+if (fs.existsSync(builtCandidate)) {
135+return builtCandidate;
136+}
137+return (
138+resolveBundledPluginSourcePublicSurfacePath({
139+sourceRoot: params.bundledPluginsDir,
140+dirName: params.dirName,
141+artifactBasename: params.artifactBasename,
142+}) ??
143+resolvePackageFallbackForBundledDir({
144+rootDir: params.rootDir,
145+bundledPluginsDir: params.bundledPluginsDir,
146+dirName: params.dirName,
147+artifactBasename: params.artifactBasename,
148+})
149+);
150+}
151+104152export function resolveBundledPluginPublicSurfacePath(params: {
105153rootDir: string;
106154dirName: string;
107155artifactBasename: string;
108156env?: NodeJS.ProcessEnv;
109157bundledPluginsDir?: string;
158+bundledPluginsDirMode?: "explicit" | "auto";
110159}): string | null {
111160const artifactBasename = normalizeBundledPluginArtifactSubpath(params.artifactBasename);
112161const dirName = normalizeBundledPluginDirName(params.dirName);
162+const env = params.env ?? process.env;
113163114164const explicitBundledPluginsDir =
115-params.bundledPluginsDir ?? resolveBundledPluginsDir(params.env ?? process.env);
165+params.bundledPluginsDirMode === "auto"
166+ ? resolveExplicitEnvBundledPluginsDir(env)
167+ : (params.bundledPluginsDir ?? resolveExplicitEnvBundledPluginsDir(env));
116168if (explicitBundledPluginsDir) {
117-const explicitPluginDir = path.resolve(explicitBundledPluginsDir, dirName);
118-const explicitBuiltCandidate = path.join(explicitPluginDir, artifactBasename);
119-if (fs.existsSync(explicitBuiltCandidate)) {
120-return explicitBuiltCandidate;
169+return resolvePublicSurfaceFromBundledDir({
170+rootDir: params.rootDir,
171+bundledPluginsDir: explicitBundledPluginsDir,
172+ dirName,
173+ artifactBasename,
174+});
175+}
176+177+if (areBundledPluginsDisabled(env)) {
178+return null;
179+}
180+181+const sourceCandidate = resolveBundledPluginSourcePublicSurfacePath({
182+sourceRoot: path.resolve(params.rootDir, "extensions"),
183+ dirName,
184+ artifactBasename,
185+});
186+if (sourceCandidate) {
187+return sourceCandidate;
188+}
189+190+const bundledPluginsDir =
191+params.bundledPluginsDirMode === "auto"
192+ ? params.bundledPluginsDir
193+ : resolveBundledPluginsDir(env);
194+if (bundledPluginsDir) {
195+const bundledCandidate = resolvePublicSurfaceFromBundledDir({
196+rootDir: params.rootDir,
197+ bundledPluginsDir,
198+ dirName,
199+ artifactBasename,
200+});
201+if (bundledCandidate) {
202+return bundledCandidate;
121203}
122-return (
123-resolveBundledPluginSourcePublicSurfacePath({
124-sourceRoot: explicitBundledPluginsDir,
125- dirName,
126- artifactBasename,
127-}) ??
128-resolvePackageFallbackForBundledDir({
129-rootDir: params.rootDir,
130-bundledPluginsDir: explicitBundledPluginsDir,
131- dirName,
132- artifactBasename,
133-})
134-);
135204}
136205137206for (const candidate of [
@@ -142,10 +211,5 @@ export function resolveBundledPluginPublicSurfacePath(params: {
142211return candidate;
143212}
144213}
145-146-return resolveBundledPluginSourcePublicSurfacePath({
147-sourceRoot: path.resolve(params.rootDir, "extensions"),
148- dirName,
149- artifactBasename,
150-});
214+return null;
151215}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。