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

推荐订阅源

N
Netflix TechBlog - Medium
IT之家
IT之家
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
罗磊的独立博客
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理

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): load packaged runtime mirrors from canonica...
steipete · 2026-04-25 · via Recent Commits to openclaw:main

@@ -5,6 +5,7 @@ import {

55

existsSync,

66

mkdtempSync,

77

mkdirSync,

8+

realpathSync,

89

readdirSync,

910

readFileSync,

1011

rmSync,

@@ -17,6 +18,10 @@ import {

1718

PACKAGE_DIST_INVENTORY_RELATIVE_PATH,

1819

writePackageDistInventory,

1920

} from "../src/infra/package-dist-inventory.ts";

21+

import {

22+

resolveBundledRuntimeDependencyInstallRoot,

23+

resolveBundledRuntimeDependencyPackageInstallRoot,

24+

} from "../src/plugins/bundled-runtime-deps.ts";

2025

import {

2126

collectBundledExtensionManifestErrors,

2227

type BundledExtension,

@@ -317,28 +322,48 @@ function bundledRuntimeDependencySentinelPath(

317322

);

318323

}

319324320-

function bundledRuntimeDependencySentinelCandidates(

325+

export function bundledRuntimeDependencySentinelCandidates(

321326

packageRoot: string,

322327

pluginId: string,

323328

dependencyName: string,

329+

env: NodeJS.ProcessEnv = process.env,

324330

): string[] {

325331

const dependencyParts = dependencyName.split("/");

332+

const packageRoots = [

333+

packageRoot,

334+

(() => {

335+

try {

336+

return realpathSync(packageRoot);

337+

} catch {

338+

return packageRoot;

339+

}

340+

})(),

341+

];

342+

const runtimeRoots = packageRoots.flatMap((root) => [

343+

resolveBundledRuntimeDependencyPackageInstallRoot(root, { env }),

344+

resolveBundledRuntimeDependencyInstallRoot(join(root, "dist", "extensions", pluginId), {

345+

env,

346+

}),

347+

]);

326348

return [

327349

bundledRuntimeDependencySentinelPath(packageRoot, pluginId, dependencyName),

328350

join(packageRoot, "dist", "extensions", "node_modules", ...dependencyParts, "package.json"),

329351

join(packageRoot, "node_modules", ...dependencyParts, "package.json"),

330-

];

352+

...runtimeRoots.map((root) => join(root, "node_modules", ...dependencyParts, "package.json")),

353+

].filter((candidate, index, candidates) => candidates.indexOf(candidate) === index);

331354

}

332355333356

function assertBundledRuntimeDependencyAbsent(params: {

334357

packageRoot: string;

335358

pluginId: string;

336359

dependencyName: string;

360+

env?: NodeJS.ProcessEnv;

337361

}): void {

338362

const sentinelPath = bundledRuntimeDependencySentinelCandidates(

339363

params.packageRoot,

340364

params.pluginId,

341365

params.dependencyName,

366+

params.env,

342367

).find((candidate) => existsSync(candidate));

343368

if (sentinelPath) {

344369

throw new Error(

@@ -351,11 +376,13 @@ function assertBundledRuntimeDependencyPresent(params: {

351376

packageRoot: string;

352377

pluginId: string;

353378

dependencyName: string;

379+

env?: NodeJS.ProcessEnv;

354380

}): void {

355381

const sentinelPath = bundledRuntimeDependencySentinelCandidates(

356382

params.packageRoot,

357383

params.pluginId,

358384

params.dependencyName,

385+

params.env,

359386

).find((candidate) => existsSync(candidate));

360387

if (sentinelPath) {

361388

return;

@@ -413,24 +440,25 @@ function runPackedBundledPluginActivationSmoke(packageRoot: string, tmpRoot: str

413440

{ pluginId: "feishu", dependencyName: "@larksuiteoapi/node-sdk" },

414441

] as const;

415442443+

const homeDir = join(tmpRoot, "activation-home");

444+

mkdirSync(homeDir, { recursive: true });

445+

const env = createPackedCliSmokeEnv(process.env, {

446+

HOME: homeDir,

447+

OPENAI_API_KEY: "sk-openclaw-release-check",

448+

});

416449

for (const dep of lazyDeps) {

417-

assertBundledRuntimeDependencyAbsent({ packageRoot, ...dep });

450+

assertBundledRuntimeDependencyAbsent({ packageRoot, env, ...dep });

418451

}

419452420-

const homeDir = join(tmpRoot, "activation-home");

421-

mkdirSync(homeDir, { recursive: true });

422453

writePackedBundledPluginActivationConfig(homeDir);

423454

execFileSync(process.execPath, [join(packageRoot, "openclaw.mjs"), "plugins", "doctor"], {

424455

cwd: packageRoot,

425456

stdio: "inherit",

426-

env: createPackedCliSmokeEnv(process.env, {

427-

HOME: homeDir,

428-

OPENAI_API_KEY: "sk-openclaw-release-check",

429-

}),

457+

env,

430458

});

431459432460

for (const dep of lazyDeps) {

433-

assertBundledRuntimeDependencyPresent({ packageRoot, ...dep });

461+

assertBundledRuntimeDependencyPresent({ packageRoot, env, ...dep });

434462

}

435463

}

436464