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

推荐订阅源

P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
B
Blog
月光博客
月光博客
博客园 - 【当耐特】
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Jina AI
Jina AI
博客园 - Franky
MyScale Blog
MyScale Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Last Week in AI
Last Week in AI
B
Blog RSS Feed
H
Help Net Security

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
perf(plugins): reuse installed manifest realpaths (#96710...
vincentkoc · 2026-06-25 · via Recent Commits to openclaw:main

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

66

readPersistedInstalledPluginIndex,

77

writePersistedInstalledPluginIndex,

88

} from "./installed-plugin-index-store.js";

9-

import type { InstalledPluginIndex } from "./installed-plugin-index.js";

9+

import type { InstalledPluginIndex, InstalledPluginIndexRecord } from "./installed-plugin-index.js";

1010

import {

1111

loadPluginManifestRegistryForInstalledIndex,

1212

resolveInstalledManifestRegistryIndexFingerprint,

@@ -151,6 +151,24 @@ function createIndexWithPackageJson(rootDir: string): InstalledPluginIndex {

151151

};

152152

}

153153154+

function createIndexWithUnhashedPackageJson(rootDir: string): InstalledPluginIndex {

155+

const index = createIndexWithFileSignatures(rootDir);

156+

const packageJsonPath = writePackageManifest(rootDir, "Installed");

157+

const record = index.plugins[0];

158+

if (!record) {

159+

throw new Error("expected index record");

160+

}

161+

record.packageJson = {

162+

path: "package.json",

163+

hash: "",

164+

fileSignature: fileSignature(packageJsonPath),

165+

};

166+

return {

167+

...index,

168+

plugins: [record],

169+

};

170+

}

171+154172

describe("loadPluginManifestRegistryForInstalledIndex", () => {

155173

it("reuses frozen installed-index fingerprints when file signatures are persisted", () => {

156174

const rootDir = makeTempDir();

@@ -180,6 +198,97 @@ describe("loadPluginManifestRegistryForInstalledIndex", () => {

180198

expect(second).not.toBe(first);

181199

});

182200201+

it("reuses package realpaths across mutable installed-index fingerprint builds", () => {

202+

const rootDir = makeTempDir();

203+

writePlugin(rootDir, "installed", "installed-");

204+

const index = createIndexWithUnhashedPackageJson(rootDir);

205+

const packageJsonPath = path.join(fs.realpathSync(rootDir), "package.json");

206+

const realpathSpy = vi.spyOn(fs, "realpathSync");

207+

let rootPathCalls: unknown[][];

208+

let packageJsonPathCalls: unknown[][];

209+

try {

210+

resolveInstalledManifestRegistryIndexFingerprint(index);

211+

resolveInstalledManifestRegistryIndexFingerprint(index);

212+

rootPathCalls = realpathSpy.mock.calls.filter(([filePath]) => filePath === rootDir);

213+

packageJsonPathCalls = realpathSpy.mock.calls.filter(

214+

([filePath]) => filePath === packageJsonPath,

215+

);

216+

} finally {

217+

realpathSpy.mockRestore();

218+

}

219+220+

expect(rootPathCalls).toHaveLength(1);

221+

expect(packageJsonPathCalls).toHaveLength(1);

222+

});

223+224+

it("clears package realpath memoization with plugin metadata lifecycle caches", () => {

225+

const rootDir = makeTempDir();

226+

writePlugin(rootDir, "installed", "installed-");

227+

const index = createIndexWithUnhashedPackageJson(rootDir);

228+

const packageJsonPath = path.join(fs.realpathSync(rootDir), "package.json");

229+

const realpathSpy = vi.spyOn(fs, "realpathSync");

230+

let rootPathCalls: unknown[][];

231+

let packageJsonPathCalls: unknown[][];

232+

try {

233+

resolveInstalledManifestRegistryIndexFingerprint(index);

234+

clearPluginMetadataLifecycleCaches();

235+

resolveInstalledManifestRegistryIndexFingerprint(index);

236+

rootPathCalls = realpathSpy.mock.calls.filter(([filePath]) => filePath === rootDir);

237+

packageJsonPathCalls = realpathSpy.mock.calls.filter(

238+

([filePath]) => filePath === packageJsonPath,

239+

);

240+

} finally {

241+

realpathSpy.mockRestore();

242+

}

243+244+

expect(rootPathCalls).toHaveLength(2);

245+

expect(packageJsonPathCalls).toHaveLength(2);

246+

});

247+248+

it("bounds package realpath memoization across many fingerprint roots", () => {

249+

const firstRootDir = makeTempDir();

250+

writePlugin(firstRootDir, "installed", "installed-");

251+

const firstIndex = createIndexWithUnhashedPackageJson(firstRootDir);

252+

resolveInstalledManifestRegistryIndexFingerprint(firstIndex);

253+254+

const records: InstalledPluginIndexRecord[] = [];

255+

for (let index = 0; index < 300; index += 1) {

256+

const rootDir = makeTempDir();

257+

const pluginId = `installed-${index}`;

258+

writePlugin(rootDir, pluginId, `${pluginId}-`);

259+

const record = createIndexWithUnhashedPackageJson(rootDir).plugins[0];

260+

if (!record) {

261+

throw new Error("expected index record");

262+

}

263+

records.push({

264+

...record,

265+

pluginId,

266+

manifestHash: `manifest-hash-${index}`,

267+

});

268+

}

269+

resolveInstalledManifestRegistryIndexFingerprint({

270+

...firstIndex,

271+

plugins: records,

272+

});

273+274+

const packageJsonPath = path.join(fs.realpathSync(firstRootDir), "package.json");

275+

const realpathSpy = vi.spyOn(fs, "realpathSync");

276+

let rootPathCalls: unknown[][];

277+

let packageJsonPathCalls: unknown[][];

278+

try {

279+

resolveInstalledManifestRegistryIndexFingerprint(firstIndex);

280+

rootPathCalls = realpathSpy.mock.calls.filter(([filePath]) => filePath === firstRootDir);

281+

packageJsonPathCalls = realpathSpy.mock.calls.filter(

282+

([filePath]) => filePath === packageJsonPath,

283+

);

284+

} finally {

285+

realpathSpy.mockRestore();

286+

}

287+288+

expect(rootPathCalls).toHaveLength(1);

289+

expect(packageJsonPathCalls).toHaveLength(1);

290+

});

291+183292

it("does not cache shallow-frozen installed-index fingerprints with mutable nested records", () => {

184293

const rootDir = makeTempDir();

185294

writePlugin(rootDir, "installed", "installed-");