惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
IT之家
IT之家
C
Check Point Blog
T
The Blog of Author Tim Ferriss
S
SegmentFault 最新的问题
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
M
MIT News - Artificial intelligence
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
F
Fortinet All Blogs
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
fix(plugins): allow prerelease-only official packages · o...
vincentkoc · 2026-05-04 · via Recent Commits to openclaw:main

@@ -170,12 +170,16 @@ function compareStableSemver(a: string, b: string): number {

170170

return 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: {

174178

spec: ParsedRegistryNpmSpec;

175179

resolvedPrereleaseVersion: string;

176180

timeoutMs: number;

177181

logger: PluginInstallLogger;

178-

}): Promise<NpmSpecResolution | null> {

182+

}): Promise<TrustedOfficialPrereleaseResolution | null> {

179183

if (!params.spec.name.startsWith("@openclaw/")) {

180184

return null;

181185

}

@@ -199,12 +203,20 @@ async function resolveTrustedOfficialStableNpmResolution(params: {

199203

} catch {

200204

return 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);

207213

if (!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+

}

208220

return null;

209221

}

210222

@@ -219,7 +231,7 @@ async function resolveTrustedOfficialStableNpmResolution(params: {

219231

params.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

}

224236225237

function buildFileInstallResult(pluginId: string, targetFile: string): InstallPluginResult {

@@ -1245,18 +1257,20 @@ export async function installPluginFromNpmSpec(

12451257

resolvedVersion: npmResolution.version,

12461258

})

12471259

) {

1248-

const stableResolution = params.trustedSourceLinkedOfficialInstall

1249-

? await resolveTrustedOfficialStableNpmResolution({

1260+

const trustedResolution = params.trustedSourceLinkedOfficialInstall

1261+

? await resolveTrustedOfficialPrereleaseResolution({

12501262

spec: parsedSpec,

12511263

resolvedPrereleaseVersion: 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, {

12581270

resolvedAt: 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 {

12611275

return {

12621276

ok: false,