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

推荐订阅源

T
True Tiger Recordings
Cyberwarzone
Cyberwarzone
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
T
Tenable Blog
Latest news
Latest news
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
Securelist
F
Future of Privacy Forum
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
aimingoo的专栏
aimingoo的专栏
量子位
小众软件
小众软件
罗磊的独立博客
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX - 技术
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
P
Palo Alto Networks Blog
C
CERT Recently Published Vulnerability Notes
博客园 - Franky
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threatpost
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
P
Privacy International News Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 聂微东
H
Help Net Security
A
Arctic Wolf
L
LINUX DO - 热门话题
D
DataBreaches.Net
K
Kaspersky official blog
N
News | PayPal Newsroom
C
Check Point Blog
Project Zero
Project Zero
D
Darknet – Hacking Tools, Hacker News & Cyber Security
SecWiki News
SecWiki News
Jina AI
Jina AI
L
LINUX DO - 最新话题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
美团技术团队
F
Full Disclosure
Schneier on Security
Schneier on Security

Recent Commits to openclaw:main

fix(update): roll back failed git updates · openclaw/openclaw@769fd0b test(docker): expect prod store seed command fix(agents): bound embedded compaction write locks · openclaw/openclaw@46de078 fix(update): repair managed npm plugin peers (#83794) (thanks @fuller… · openclaw/openclaw@de8a82a fix(telegram): honor table mode in outbound chunks (#85455) · openclaw/openclaw@7fc691a fix(docker): precreate owned named volume targets (#85454) fix(ui): strip ANSI from displayed gateway logs (#85453) fix(skills): accept macos os requirement on darwin (#85451) fix(gateway): preserve message-tool replies in chat history test: track Docker prod store seed command · openclaw/openclaw@9a816f4 fix: satisfy prod store package list lint · openclaw/openclaw@d5247d0 test(plugins): clear lookup metadata memo fix(docker): seed prod store before offline prune · openclaw/openclaw@6788aa1 fix(memory): expand home paths in extra memory paths (#85449) · openclaw/openclaw@48bf037 docs: add security FAQ guidance chore(deps): refresh npm shrinkwraps docs: clarify OpenAI HTTP client guidance docs: remove stale showcase intro videos · openclaw/openclaw@00d3dca fix(gateway): point model override error to config docs docs: document secrets provider plan fields docs: clarify media directive formatting · openclaw/openclaw@c876fec docs: align memory search cache default refactor(ios): centralize setup auth parsing test(release): wait for config reload log proof refactor(ios): consolidate manual auth override inputs · openclaw/openclaw@d93c597 fix(ui): hide thinking options for non-reasoning models (#85406) · openclaw/openclaw@bb4d88e fix(ui): attach pasted data image text (#85392) · openclaw/openclaw@a03a8d9 fix(gateway): preserve OpenAI usage aliases in chat history (#85383) · openclaw/openclaw@d9c6c5f feat(ios): add realtime talk relay mode · openclaw/openclaw@e730e9b fix(browser): hint WSL portproxy CDP empty replies (#85379) · openclaw/openclaw@933f01c fix(installer): persist portable Git on Windows · openclaw/openclaw@5b90a48 fix(opencode-go): strip Kimi reasoning replay fields (#85377) · openclaw/openclaw@d22bcfc fix(build): normalize cache paths on Windows (#85437) · openclaw/openclaw@81d22c8 fix(update): detect nested macOS gateway ancestry (#85391) · openclaw/openclaw@adc6adc fix(docker): seed offline prune store in runtime stage · openclaw/openclaw@faf2a6c fix(ci): stabilize npm shrinkwrap metadata · openclaw/openclaw@21bedd3 fix(codex): route node exec through OpenClaw tools · openclaw/openclaw@5cc0dbc test(installer): track portable node root helper · openclaw/openclaw@9364b21 fix(ui): sync talk transcript translations fix(ui): localize talk transcript labels · openclaw/openclaw@8fc48af fix(release): stabilize config restart QA · openclaw/openclaw@cc91ff0 fix(installer): extract portable Node directly test(qa-lab): report scenario pack coverage · openclaw/openclaw@dcd98bf fix(plugins): drop stale tlon tool contract · openclaw/openclaw@d70dc4b fix(installer): prefer tar for portable Node extraction · openclaw/openclaw@a54a881 fix(codex): deliver native subagent completions feat: add context-engine host capability requirements (#84994) · openclaw/openclaw@cff5244 fix(release): keep shrinkwrap pinned to pnpm lock · openclaw/openclaw@9d24fde fix: surface plan updates as status notices · openclaw/openclaw@dc04503 test(google): narrow web search fake timers · openclaw/openclaw@fe7d13c fix(installer): extract portable Node with ZipFile · openclaw/openclaw@ffa6cd8 fix(gateway): defer provider auth prewarm after startup (#85369) · openclaw/openclaw@69255f8 fix(talk): stabilize realtime voice consults · openclaw/openclaw@683ad75 test(qa): tolerate slow gateway rpc startup · openclaw/openclaw@29118a0 chore(diagnostics): refresh plugin sdk baseline · openclaw/openclaw@ab684f5 fix(diagnostics): surface async queue drops fix(diagnostics): bound diagnostic buffers · openclaw/openclaw@bdcaac0 fix(installer): copy portable Node into place · openclaw/openclaw@c21ca88 fix(cli): recover replaced device approvals (#85342) · openclaw/openclaw@6ea907c test(release): align prerelease validation · openclaw/openclaw@0def3e2 fix(installer): install portable Node directory atomically · openclaw/openclaw@2890b1a fix(runtime-llm): avoid duplicate provider prefix in allowlist diagno… · openclaw/openclaw@937a756 fix(gateway): include openclaw bin in service PATH (#84475) · openclaw/openclaw@66d1d13 fix(gateway): handle concurrent launchd bootstrap restart race (#84722) · openclaw/openclaw@ba86716 feat: support pi and opencode autoreview engines · openclaw/openclaw@31a189d ci(package): gate acceptance on package integrity · openclaw/openclaw@5275929 ci(release): bypass pnpm for tsdown package build · openclaw/openclaw@fea89cd test(release): align prerelease validation baselines · openclaw/openclaw@04ebdc6 ci(release): harden docker package build · openclaw/openclaw@7b1fbe1 fix(codex): skip native web search transcript mirroring (#85346) · openclaw/openclaw@c3531fc fix(gateway): harden launchd reload handoff race recovery (#84641) · openclaw/openclaw@fc7a531 fix: honor per-model provider transport overrides (#80488) fix(skills): type watcher mock calls in dedupe regression tests · openclaw/openclaw@bb73f0a fix(skills): dedupe shared-directory watchers across agent workspaces… · openclaw/openclaw@3e94290 fix(skills): document watcher edge cases, add teardown/rebuild tests,… · openclaw/openclaw@19ff77e fix(infra): allow macos browser open over ssh env (#85340) · openclaw/openclaw@47d66fe fix(update): preserve package service state during cutover (#83026) · openclaw/openclaw@a15797a fix(gateway): broadcast agent-run error payloads (#85355) · openclaw/openclaw@07e61fc test(e2e): avoid synthetic channel config in plugin smoke fix(cli): suppress systemd hints for live gateway (#85336) · openclaw/openclaw@a00c583 fix(cli): honor agent for model auth logout (#85326) · openclaw/openclaw@fc47c1f fix(gateway): eager-load lifecycle runtime to survive in-place upgrad… · openclaw/openclaw@4a91385 fix(doctor): point codex asset warning at migrate plan (#85324) fix(update): harden managed handoff cwd (#83875) · openclaw/openclaw@1bafc23 docs(release): prepare 2026.5.21 notes ci(crabbox): harden docker hydration refactor(crabbox): parse provider list from binary help instead of ha… test(plugins): keep rpc source walk on source call gateway test(plugins): add kitchen sink rpc docker lane · openclaw/openclaw@6f6da5f test(plugins): run kitchen sink rpc lane without tsx test(qa-lab): add bus tool trace scenario · openclaw/openclaw@2b39613 fix(cron): classify network retry errors (#85344) fix(installer): bootstrap portable Windows Node · openclaw/openclaw@3551e98 fix(ui): move chat session search into picker (#85303) · openclaw/openclaw@1fdc73a fix: opt codex out of bundled runtime deps · openclaw/openclaw@fcecbd8 test: update shrinkwrap packaging expectations · openclaw/openclaw@a1b05aa fix: publish explicit plugin bundled dependencies · openclaw/openclaw@976da39 chore: refresh shrinkwrap metadata chore: harden npm shrinkwrap release path fix: keep bundled plugin peers nested · openclaw/openclaw@86faf65
fix(update): repair managed npm plugin peers · openclaw/openclaw@571f364
fuller-stack · 2026-05-23 · via Recent Commits to openclaw:main

@@ -2,6 +2,7 @@ import fs from "node:fs/promises";

22

import os from "node:os";

33

import path from "node:path";

44

import { afterEach, beforeEach, describe, expect, it } from "vitest";

5+

import { resolveOpenClawPackageRootSync } from "../../infra/openclaw-root.js";

56

import { runPluginPayloadSmokeCheck } from "./plugin-payload-validation.js";

6778

describe("runPluginPayloadSmokeCheck", () => {

@@ -28,6 +29,25 @@ describe("runPluginPayloadSmokeCheck", () => {

2829

}

2930

}

303132+

function resolveTestHostRoot(): string {

33+

const hostRoot = resolveOpenClawPackageRootSync({

34+

argv1: process.argv[1],

35+

moduleUrl: import.meta.url,

36+

cwd: process.cwd(),

37+

});

38+

expect(hostRoot).toBeTruthy();

39+

return hostRoot!;

40+

}

41+42+

async function linkOpenClawPeerToHost(dir: string): Promise<void> {

43+

await fs.mkdir(path.join(dir, "node_modules"), { recursive: true });

44+

await fs.symlink(resolveTestHostRoot(), path.join(dir, "node_modules", "openclaw"), "junction");

45+

}

46+47+

async function resolveRealPath(target: string): Promise<string> {

48+

return await fs.realpath(target).catch(() => target);

49+

}

50+3151

it("reports ok for a record whose package.json + main file exist", async () => {

3252

const dir = path.join(tmpRoot, "discord");

3353

await writePackage(

@@ -167,6 +187,127 @@ describe("runPluginPayloadSmokeCheck", () => {

167187

expect(result.failures).toEqual([]);

168188

});

169189190+

it("reports a failure when an openclaw peer link is missing", async () => {

191+

const dir = path.join(tmpRoot, "codex");

192+

await writePackage(

193+

dir,

194+

{

195+

name: "@openclaw/codex",

196+

main: "dist/index.js",

197+

peerDependencies: { openclaw: ">=2026.5.18-beta.1" },

198+

},

199+

"export default {};\n",

200+

);

201+202+

const result = await runPluginPayloadSmokeCheck({

203+

records: { codex: { source: "npm", installPath: dir } },

204+

env: {},

205+

});

206+207+

expect(result.failures).toStrictEqual([

208+

{

209+

pluginId: "codex",

210+

installPath: dir,

211+

reason: "missing-openclaw-peer-link",

212+

detail: `Plugin declares peerDependency "openclaw" but peer link audit failed: missing ${path.join(

213+

dir,

214+

"node_modules",

215+

"openclaw",

216+

)}.`,

217+

},

218+

]);

219+

});

220+221+

it("reports a failure when an openclaw peer link is a stale real directory", async () => {

222+

const dir = path.join(tmpRoot, "codex");

223+

await writePackage(

224+

dir,

225+

{

226+

name: "@openclaw/codex",

227+

main: "dist/index.js",

228+

peerDependencies: { openclaw: ">=2026.5.18-beta.1" },

229+

},

230+

"export default {};\n",

231+

);

232+

const stalePeerDir = path.join(dir, "node_modules", "openclaw");

233+

await fs.mkdir(stalePeerDir, { recursive: true });

234+235+

const result = await runPluginPayloadSmokeCheck({

236+

records: { codex: { source: "npm", installPath: dir } },

237+

env: {},

238+

});

239+240+

expect(result.failures).toHaveLength(1);

241+

expect(result.failures[0]).toMatchObject({

242+

pluginId: "codex",

243+

installPath: dir,

244+

reason: "missing-openclaw-peer-link",

245+

});

246+

expect(result.failures[0]?.detail).toContain(`${stalePeerDir} points to`);

247+

expect(result.failures[0]?.detail).toContain(

248+

`instead of ${await resolveRealPath(resolveTestHostRoot())}`,

249+

);

250+

});

251+252+

it("reports a failure when an openclaw peer link points at the wrong package root", async () => {

253+

const dir = path.join(tmpRoot, "codex");

254+

await writePackage(

255+

dir,

256+

{

257+

name: "@openclaw/codex",

258+

main: "dist/index.js",

259+

peerDependencies: { openclaw: ">=2026.5.18-beta.1" },

260+

},

261+

"export default {};\n",

262+

);

263+

const wrongHostRoot = path.join(tmpRoot, "old-openclaw");

264+

await fs.mkdir(wrongHostRoot, { recursive: true });

265+

await fs.mkdir(path.join(dir, "node_modules"), { recursive: true });

266+

await fs.symlink(wrongHostRoot, path.join(dir, "node_modules", "openclaw"), "junction");

267+268+

const result = await runPluginPayloadSmokeCheck({

269+

records: { codex: { source: "npm", installPath: dir } },

270+

env: {},

271+

});

272+273+

expect(result.failures).toHaveLength(1);

274+

expect(result.failures[0]).toMatchObject({

275+

pluginId: "codex",

276+

installPath: dir,

277+

reason: "missing-openclaw-peer-link",

278+

});

279+

expect(result.failures[0]?.detail).toContain(

280+

`${path.join(

281+

dir,

282+

"node_modules",

283+

"openclaw",

284+

)} points to ${await resolveRealPath(wrongHostRoot)} instead of ${await resolveRealPath(

285+

resolveTestHostRoot(),

286+

)}`,

287+

);

288+

});

289+290+

it("accepts an openclaw peer link when it resolves to the host package root", async () => {

291+

const dir = path.join(tmpRoot, "codex");

292+

await writePackage(

293+

dir,

294+

{

295+

name: "@openclaw/codex",

296+

main: "dist/index.js",

297+

peerDependencies: { openclaw: ">=2026.5.18-beta.1" },

298+

},

299+

"export default {};\n",

300+

);

301+

await linkOpenClawPeerToHost(dir);

302+303+

const result = await runPluginPayloadSmokeCheck({

304+

records: { codex: { source: "npm", installPath: dir } },

305+

env: {},

306+

});

307+308+

expect(result.failures).toEqual([]);

309+

});

310+170311

it("reports a failure when an `openclaw.extensions` entry file is missing", async () => {

171312

const dir = path.join(tmpRoot, "brave");

172313

await writePackage(dir, {