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

推荐订阅源

Y
Y Combinator Blog
IT之家
IT之家
博客园_首页
人人都是产品经理
人人都是产品经理
博客园 - Franky
I
InfoQ
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
MongoDB | Blog
MongoDB | Blog
雷峰网
雷峰网
博客园 - 聂微东
N
Netflix TechBlog - Medium
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
D
Docker

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: drop stale managed plugin install records · openclaw...
steipete · 2026-05-10 · via Recent Commits to openclaw:main

@@ -27,6 +27,17 @@ function makeTempDir() {

2727

return makeTrackedTempDir("openclaw-doctor-plugin-registry", tempDirs);

2828

}

292930+

async function readRequiredPersistedInstalledPluginIndex(

31+

stateDir: string,

32+

): Promise<InstalledPluginIndex> {

33+

const persisted = await readPersistedInstalledPluginIndex({ stateDir });

34+

expect(persisted).not.toBeNull();

35+

if (!persisted) {

36+

throw new Error("Expected persisted installed plugin index");

37+

}

38+

return persisted;

39+

}

40+3041

function hermeticEnv(overrides: NodeJS.ProcessEnv = {}): NodeJS.ProcessEnv {

3142

return {

3243

OPENCLAW_BUNDLED_PLUGINS_DIR: undefined,

@@ -226,14 +237,10 @@ describe("maybeRepairPluginRegistryState", () => {

226237

});

227238228239

expect(nextConfig).toStrictEqual({});

229-

await expect(readPersistedInstalledPluginIndex({ stateDir })).resolves.toMatchObject({

230-

refreshReason: "migration",

231-

plugins: [

232-

expect.objectContaining({

233-

pluginId: "demo",

234-

}),

235-

],

236-

});

240+

const persisted = await readRequiredPersistedInstalledPluginIndex(stateDir);

241+

expect(persisted.refreshReason).toBe("migration");

242+

expect(persisted.plugins).toHaveLength(1);

243+

expect(persisted.plugins[0]?.pluginId).toBe("demo");

237244

});

238245239246

it("does not repair when registry migration is disabled", async () => {

@@ -341,16 +348,12 @@ describe("maybeRepairPluginRegistryState", () => {

341348

expect(

342349

JSON.parse(fs.readFileSync(path.join(stateDir, "npm", "package.json"), "utf8")),

343350

).not.toHaveProperty("dependencies");

344-

await expect(readPersistedInstalledPluginIndex({ stateDir })).resolves.toMatchObject({

345-

refreshReason: "migration",

346-

plugins: [

347-

expect.objectContaining({

348-

pluginId: "google-meet",

349-

origin: "bundled",

350-

rootDir: bundledDir,

351-

}),

352-

],

353-

});

351+

const persisted = await readRequiredPersistedInstalledPluginIndex(stateDir);

352+

expect(persisted.refreshReason).toBe("migration");

353+

expect(persisted.plugins).toHaveLength(1);

354+

expect(persisted.plugins[0]?.pluginId).toBe("google-meet");

355+

expect(persisted.plugins[0]?.origin).toBe("bundled");

356+

expect(persisted.plugins[0]?.rootDir).toBe(bundledDir);

354357

expect(vi.mocked(note).mock.calls.join("\n")).toContain(

355358

"Removed stale managed npm plugin package",

356359

);

@@ -402,17 +405,13 @@ describe("maybeRepairPluginRegistryState", () => {

402405

});

403406404407

expect(fs.existsSync(managed.packageDir)).toBe(false);

405-

await expect(readPersistedInstalledPluginIndex({ stateDir })).resolves.toMatchObject({

406-

installRecords: {},

407-

refreshReason: "migration",

408-

plugins: [

409-

expect.objectContaining({

410-

pluginId: "google-meet",

411-

origin: "bundled",

412-

rootDir: bundledDir,

413-

}),

414-

],

415-

});

408+

const persisted = await readRequiredPersistedInstalledPluginIndex(stateDir);

409+

expect(persisted.installRecords).toStrictEqual({});

410+

expect(persisted.refreshReason).toBe("migration");

411+

expect(persisted.plugins).toHaveLength(1);

412+

expect(persisted.plugins[0]?.pluginId).toBe("google-meet");

413+

expect(persisted.plugins[0]?.origin).toBe("bundled");

414+

expect(persisted.plugins[0]?.rootDir).toBe(bundledDir);

416415

});

417416418417

it("removes stale managed npm packages from the package lock during repair", async () => {