

























@@ -170,12 +170,16 @@ function compareStableSemver(a: string, b: string): number {
170170return left[0] - right[0] || left[1] - right[1] || left[2] - right[2];
171171}
172172173-async function resolveTrustedOfficialStableNpmResolution(params: {
173+type TrustedOfficialPrereleaseResolution =
174+| { kind: "stable"; resolution: NpmSpecResolution }
175+| { kind: "allow-prerelease-only" };
176+177+async function resolveTrustedOfficialPrereleaseResolution(params: {
174178spec: ParsedRegistryNpmSpec;
175179resolvedPrereleaseVersion: string;
176180timeoutMs: number;
177181logger: PluginInstallLogger;
178-}): Promise<NpmSpecResolution | null> {
182+}): Promise<TrustedOfficialPrereleaseResolution | null> {
179183if (!params.spec.name.startsWith("@openclaw/")) {
180184return null;
181185}
@@ -199,12 +203,20 @@ async function resolveTrustedOfficialStableNpmResolution(params: {
199203} catch {
200204return null;
201205}
202-const stableVersion = (Array.isArray(parsed) ? parsed : [parsed])
203-.filter((value): value is string => typeof value === "string")
204-.filter((value) => isExactSemverVersion(value) && !isPrereleaseSemverVersion(value))
206+const semverVersions = (Array.isArray(parsed) ? parsed : [parsed]).filter(
207+(value): value is string => typeof value === "string" && isExactSemverVersion(value),
208+);
209+const stableVersion = semverVersions
210+.filter((value) => !isPrereleaseSemverVersion(value))
205211.sort(compareStableSemver)
206212.at(-1);
207213if (!stableVersion) {
214+if (semverVersions.length > 0 && semverVersions.every(isPrereleaseSemverVersion)) {
215+params.logger.warn?.(
216+`Resolved ${params.spec.raw} to prerelease version ${params.resolvedPrereleaseVersion}; allowing it because this trusted official OpenClaw package has no stable npm versions yet.`,
217+);
218+return { kind: "allow-prerelease-only" };
219+}
208220return null;
209221}
210222@@ -219,7 +231,7 @@ async function resolveTrustedOfficialStableNpmResolution(params: {
219231params.logger.warn?.(
220232`Resolved ${params.spec.raw} to prerelease version ${params.resolvedPrereleaseVersion}; falling back to stable ${stableSpec} for this trusted official OpenClaw install.`,
221233);
222-return metadataResult.metadata;
234+return { kind: "stable", resolution: metadataResult.metadata };
223235}
224236225237function buildFileInstallResult(pluginId: string, targetFile: string): InstallPluginResult {
@@ -1245,18 +1257,20 @@ export async function installPluginFromNpmSpec(
12451257resolvedVersion: npmResolution.version,
12461258})
12471259) {
1248-const stableResolution = params.trustedSourceLinkedOfficialInstall
1249- ? await resolveTrustedOfficialStableNpmResolution({
1260+const trustedResolution = params.trustedSourceLinkedOfficialInstall
1261+ ? await resolveTrustedOfficialPrereleaseResolution({
12501262spec: parsedSpec,
12511263resolvedPrereleaseVersion: npmResolution.version,
12521264 timeoutMs,
12531265 logger,
12541266})
12551267 : null;
1256-if (stableResolution) {
1257-Object.assign(npmResolution, stableResolution, {
1268+if (trustedResolution?.kind === "stable") {
1269+Object.assign(npmResolution, trustedResolution.resolution, {
12581270resolvedAt: npmResolution.resolvedAt,
12591271});
1272+} else if (trustedResolution?.kind === "allow-prerelease-only") {
1273+// Keep the original prerelease resolution. The package has no stable line yet.
12601274} else {
12611275return {
12621276ok: false,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。