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

推荐订阅源

C
Cyber Attacks, Cyber Crime and Cyber Security
D
DataBreaches.Net
月光博客
月光博客
B
Blog
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
F
Fox-IT International blog
G
GRAHAM CLULEY
U
Unit 42
Cisco Talos Blog
Cisco Talos Blog
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
Google Developers Blog
I
InfoQ
A
Arctic Wolf
I
Intezer
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy & Cybersecurity Law Blog
Recent Announcements
Recent Announcements
T
Tenable Blog
P
Palo Alto Networks Blog
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
T
ThreatConnect
The Hacker News
The Hacker News
C
Cisco Blogs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Martin Fowler
Martin Fowler
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
The Register - Security
The Register - Security
E
Exploit-DB.com RSS Feed
小众软件
小众软件
N
News and Events Feed by Topic
Last Week in AI
Last Week in AI
H
Hacker News: Front Page
Microsoft Azure Blog
Microsoft Azure Blog
M
MIT News - Artificial intelligence
博客园 - 叶小钗
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cybersecurity and Infrastructure Security Agency CISA
云风的 BLOG
云风的 BLOG
PCI Perspectives
PCI Perspectives
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
AWS News Blog
AWS News Blog
博客园 - Franky
H
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

Recent Commits to openclaw:main

fix(plugins): harden Windows npm package staging · openclaw/openclaw@abdd8a4 test(codex): complete sandbox turn inline · openclaw/openclaw@c14a0c6 fix(release): harden Windows npm shim verification test(release): type metadata snapshot mock params test(release): finish plugin metadata prerelease sync Fix iMessage slash command acknowledgements (#82642) test(release): align prerelease contracts test(release): align plugin prerelease checks fix(docker): copy prepare hook before install · openclaw/openclaw@0ba6b23 fix: share signed thinking replay policy fix(memory): strip invalid thinking signatures for signed-thinking pr… · openclaw/openclaw@41329c0 fix: preserve signed thinking tool ids · openclaw/openclaw@906476a fix(scripts): harden Windows install checks · openclaw/openclaw@d21abb8 fix(release): keep private QA markers out of bundled alias code · openclaw/openclaw@b972ac1 fix(discord): harden realtime voice wake joins · openclaw/openclaw@fdfcb07 test(parallels): harden release VM smoke isolation · openclaw/openclaw@3839b48 fix: keep blank agent allowlists fail closed (#85849) · openclaw/openclaw@0f83c93 fix: harden session allowlist glob matching (#85849) (thanks @SebTardif) · openclaw/openclaw@88aa713 fix(security): replace regex wildcard matching with linear-time glob … fix(telegram): normalize legacy action targets · openclaw/openclaw@32631eb fix: notify chat when main session recovery fails · openclaw/openclaw@cf61b87 docs(changelog): note restart recovery notice · openclaw/openclaw@ae9308b fix(minimax): normalize OAuth token expiry to absolute millisecond ti… fix(memory-wiki): show vault totals in palace summary (#85824) Isolate boot-md startup sessions (#85919) · openclaw/openclaw@8deb1ef Guard OpenAI image compression for PNG outputs (#85776) · openclaw/openclaw@d075111 fix(agents): clamp proxy completions caps after payload shaping (#85889) · openclaw/openclaw@1d1a7c2 fix: gate discord realtime voice by wake name (#85915) · openclaw/openclaw@17dcdea fix(update): ignore inherited launchd xpc for respawn (#85789) · openclaw/openclaw@c074d09 fix: allow symlinked workspace write parents (#85818) · openclaw/openclaw@6b337ff fix(agents): preserve latest thinking replay signatures (#85579) · openclaw/openclaw@af76510 fix(plugins): return plugin gateway method results (#85785) · openclaw/openclaw@e6d5b7d fix(gateway): hide duplicate ACP chat replies (#85775) · openclaw/openclaw@068b9ac fix(update): ignore restart script spawn failures (#85761) · openclaw/openclaw@566d8cd fix(telegram): honor explicit default account warning (#85752) · openclaw/openclaw@6173352 fix: honor OPENCLAW_HOME defaults (#85802) fix(browser): avoid cold mac chrome version timeouts (#85460) · openclaw/openclaw@2e8dee7 fix(doctor): prune stale bundled plugin paths (#85038) fix: label meeting note transcript speakers · openclaw/openclaw@c38a9a8 fix(release): speed plugin bundled dependency installs · openclaw/openclaw@bae0e3f fix(release): keep memory plugin npm package small · openclaw/openclaw@8f783cd test(matrix): stabilize thread binding sweep persistence · openclaw/openclaw@7a85f1e fix(release): keep plugin bundled install lock-compatible fix(gateway): honor restart drain budget for embedded runs · openclaw/openclaw@6008375 fix: preserve provider defaults during config saves (#85903) · openclaw/openclaw@6e994ad fix(release): accept sha-verified publish evidence · openclaw/openclaw@7439d78 fix(ui): handle empty strings with minLength constraint in config sav… · openclaw/openclaw@3b3b2cc fix(agents): treat aborted subagent runs as terminal · openclaw/openclaw@4d502b3 fix: treat aborted subagent lifecycle events as killed fix: prefer aborted stop reason over blocked lifecycle · openclaw/openclaw@fc4bd44 docs: add changelog for aborted subagent fix · openclaw/openclaw@cbdc248 Fix foreground reply fence visibility · openclaw/openclaw@bd91107 docs: update changelog for whatsapp reply fence · openclaw/openclaw@ba94ca5 fix(cli): preserve command option state · openclaw/openclaw@15ff89b fix(cli): preserve explicit command intent · openclaw/openclaw@9410eb3 fix(cli): keep plugin command metadata intact · openclaw/openclaw@9ab0af2 fix(twitch): wait through auth retry disconnects · openclaw/openclaw@9177860 fix(cli): keep secrets configure JSON singular · openclaw/openclaw@97c63e6 fix(twitch): cancel pending clients during shutdown · openclaw/openclaw@e9bf111 fix(plugins): avoid Signal and Twitch setup regressions · openclaw/openclaw@5b2703e fix(plugins): fail stalled runtime operations · openclaw/openclaw@eeb5f12 fix: address PR review comments · openclaw/openclaw@08159d8 fix(tools): tolerate out-of-scope autoreview findings · openclaw/openclaw@8cc9329 fix(twitch): cancel auth retry disconnects · openclaw/openclaw@841cb12 fix(ci): address review sweep regressions fix(plugins): stabilize Twitch and Signal setup docs(changelog): note CLI and plugin bug fixes · openclaw/openclaw@181d55e fix(browser): validate inputs and redact remote URLs · openclaw/openclaw@bee15d4 fix(acp): require allow option for auto approvals · openclaw/openclaw@25ccadd fix(node): avoid stale TLS pins when retargeting · openclaw/openclaw@679b677 fix(cli): bound node media file writes · openclaw/openclaw@a4e95cf fix(gateway): scope imported history identity · openclaw/openclaw@6d6b247 fix(cli): keep completion and Twitch races bounded · openclaw/openclaw@6ce9e0d fix: avoid duplicate media source reply transcripts · openclaw/openclaw@a10e152 test: cover source reply media transcript backing · openclaw/openclaw@321d98b fix: broadcast source reply finals for chat runs · openclaw/openclaw@84ac31b fix: ignore replayed empty TUI finals · openclaw/openclaw@17fc1d1 fix: bound Codex post-reasoning source reply waits · openclaw/openclaw@f5b415f fix: preserve source reply metadata through TTS test: narrow transcript rewrite message content access · openclaw/openclaw@81dee15 fix: preserve reply metadata through media normalization · openclaw/openclaw@a238f03 fix: preserve reply payload metadata · openclaw/openclaw@bfcd801 test: cover control ui source reply final retention · openclaw/openclaw@5534cad fix: keep source reply finals live in control ui · openclaw/openclaw@5e28574 fix: guard transcript source reply rewrites · openclaw/openclaw@b074dc5 fix: keep TUI watchdog runs active · openclaw/openclaw@84d278a fix: render late source reply finals in TUI · openclaw/openclaw@59b8aea docs: add TUI source reply changelog · openclaw/openclaw@589fd92 fix: keep long Codex source replies alive · openclaw/openclaw@c93dda9 fix: avoid double terminal chat events for source replies · openclaw/openclaw@6a0e030 fix: back source reply media in transcripts · openclaw/openclaw@39226ea fix: gracefully escalate process supervisor cancellations (#85865) · openclaw/openclaw@b13166b fix: preserve internal handoff status attribution [AI-assisted] (#85726) · openclaw/openclaw@f55e986 fix(browser): thread snapshot timeoutMs through agent tool and helper… · openclaw/openclaw@069c7b8 Disable Chrome MCP telemetry watchdog by default (#85886) · openclaw/openclaw@d581415 perf: cache stable gateway metadata · openclaw/openclaw@12f8227 chore(release): update appcast for 2026.5.22 · openclaw/openclaw@fc3c979 fix(codex): ensure codex subagent bootstrap parity with pi subagents … · openclaw/openclaw@7b3be04 fix(update): escape systemd update handoffs (#85414) · openclaw/openclaw@1f28c3e fix(media-understanding): restore image description token default · openclaw/openclaw@5dcbd38
fix(update): avoid broad tag fetches for dev updates (#84737) · openclaw/openclaw@501f2cb
rubencu · 2026-05-24 · via Recent Commits to openclaw:main

@@ -386,7 +386,7 @@ describe("runGatewayUpdate", () => {

386386

{ name: "target ref", options: { devTargetRef: "main" } },

387387

] as const)("stops dev update when fetch fails before resolving $name", async ({ options }) => {

388388

await setupGitCheckout();

389-

const fetchCommand = `git -C ${tempDir} fetch --all --prune --tags`;

389+

const fetchCommand = `git -C ${tempDir} fetch --all --prune --no-tags`;

390390

const { runner, calls } = createRunner({

391391

...buildGitWorktreeProbeResponses(),

392392

[fetchCommand]: {

@@ -403,6 +403,102 @@ describe("runGatewayUpdate", () => {

403403

expect(calls.slice(calls.indexOf(fetchCommand) + 1)).toStrictEqual([]);

404404

});

405405406+

it("does not fetch tags for dev updates", async () => {

407+

await setupGitPackageManagerFixture();

408+

const upstreamSha = "upstream123";

409+

const doctorNodePath = await resolveStableNodePath(process.execPath);

410+

const doctorCommand = `${doctorNodePath} ${path.join(tempDir, "openclaw.mjs")} doctor --non-interactive --fix`;

411+

const { runner, calls } = createRunner({

412+

...buildGitWorktreeProbeResponses(),

413+

[`git -C ${tempDir} fetch --all --prune --no-tags`]: { stdout: "" },

414+

[`git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`]: {

415+

stdout: "origin/main",

416+

},

417+

[`git -C ${tempDir} rev-parse @{upstream}`]: { stdout: upstreamSha },

418+

[`git -C ${tempDir} rev-list --max-count=10 ${upstreamSha}`]: {

419+

stdout: `${upstreamSha}\n`,

420+

},

421+

[`git -C ${tempDir} rebase ${upstreamSha}`]: { stdout: "" },

422+

"pnpm --version": { stdout: "10.0.0" },

423+

"pnpm install": { stdout: "" },

424+

"pnpm build": { stdout: "" },

425+

"pnpm ui:build": { stdout: "" },

426+

[doctorCommand]: { stdout: "" },

427+

});

428+429+

const result = await runWithRunner(runner, { channel: "dev" });

430+431+

expect(result.status).toBe("ok");

432+

expect(calls).toContain(`git -C ${tempDir} fetch --all --prune --no-tags`);

433+

expect(calls).not.toContain(`git -C ${tempDir} fetch --all --prune --tags`);

434+

});

435+436+

it("fetches only the requested tag for explicit dev tag target refs", async () => {

437+

await setupGitPackageManagerFixture();

438+

const targetSha = "2222222222222222222222222222222222222222";

439+

const doctorNodePath = await resolveStableNodePath(process.execPath);

440+

const doctorCommand = `${doctorNodePath} ${path.join(tempDir, "openclaw.mjs")} doctor --non-interactive --fix`;

441+

const { runner, calls } = createRunner({

442+

...buildGitWorktreeProbeResponses(),

443+

[`git -C ${tempDir} fetch --all --prune --no-tags`]: { stdout: "" },

444+

[`git -C ${tempDir} remote`]: { stdout: "origin\n" },

445+

[`git -C ${tempDir} fetch origin +refs/tags/v2026.5.19-beta.2:refs/tags/v2026.5.19-beta.2`]: {

446+

stdout: "",

447+

},

448+

[`git -C ${tempDir} rev-parse refs/tags/v2026.5.19-beta.2^{}`]: {

449+

stdout: `${targetSha}\n`,

450+

},

451+

[`git -C ${tempDir} rev-list --max-count=10 ${targetSha}`]: {

452+

stdout: `${targetSha}\n`,

453+

},

454+

[`git -C ${tempDir} checkout --detach ${targetSha}`]: { stdout: "" },

455+

"pnpm --version": { stdout: "10.0.0" },

456+

"pnpm install": { stdout: "" },

457+

"pnpm build": { stdout: "" },

458+

"pnpm ui:build": { stdout: "" },

459+

[doctorCommand]: { stdout: "" },

460+

});

461+462+

const result = await runWithRunner(runner, {

463+

channel: "dev",

464+

devTargetRef: "refs/tags/v2026.5.19-beta.2",

465+

});

466+467+

expect(result.status).toBe("ok");

468+

expect(calls).toContain(`git -C ${tempDir} fetch --all --prune --no-tags`);

469+

expect(calls).not.toContain(`git -C ${tempDir} fetch --all --prune --tags`);

470+

expect(calls).toContain(

471+

`git -C ${tempDir} fetch origin +refs/tags/v2026.5.19-beta.2:refs/tags/v2026.5.19-beta.2`,

472+

);

473+

expect(calls).toContain(`git -C ${tempDir} rev-parse refs/tags/v2026.5.19-beta.2^{}`);

474+

});

475+476+

it("does not resolve stale local dev tag target refs after targeted tag fetch failure", async () => {

477+

await setupGitCheckout();

478+

const { runner, calls } = createRunner({

479+

...buildGitWorktreeProbeResponses(),

480+

[`git -C ${tempDir} fetch --all --prune --no-tags`]: { stdout: "" },

481+

[`git -C ${tempDir} remote`]: { stdout: "origin\n" },

482+

[`git -C ${tempDir} fetch origin +refs/tags/v2026.5.19-beta.2:refs/tags/v2026.5.19-beta.2`]: {

483+

code: 1,

484+

stderr: "would clobber existing tag",

485+

},

486+

});

487+488+

const result = await runWithRunner(runner, {

489+

channel: "dev",

490+

devTargetRef: "refs/tags/v2026.5.19-beta.2",

491+

});

492+493+

expect(result.status).toBe("error");

494+

expect(result.reason).toBe("no-target-sha");

495+

expect(calls).toContain(

496+

`git -C ${tempDir} fetch origin +refs/tags/v2026.5.19-beta.2:refs/tags/v2026.5.19-beta.2`,

497+

);

498+

expect(calls).not.toContain(`git -C ${tempDir} rev-parse refs/tags/v2026.5.19-beta.2^{}`);

499+

expect(calls).not.toContain(`git -C ${tempDir} rev-parse refs/tags/v2026.5.19-beta.2`);

500+

});

501+406502

it("aborts rebase on failure", async () => {

407503

await setupGitCheckout();

408504

const { runner, calls } = createRunner({

@@ -537,7 +633,7 @@ describe("runGatewayUpdate", () => {

537633

if (key === `git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`) {

538634

return { stdout: "origin/main", stderr: "", code: 0 };

539635

}

540-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

636+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

541637

return { stdout: "", stderr: "", code: 0 };

542638

}

543639

if (key === `git -C ${tempDir} rev-parse @{upstream}`) {

@@ -758,7 +854,7 @@ describe("runGatewayUpdate", () => {

758854

if (key === `git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`) {

759855

return { stdout: "origin/main", stderr: "", code: 0 };

760856

}

761-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

857+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

762858

return { stdout: "", stderr: "", code: 0 };

763859

}

764860

if (key === `git -C ${tempDir} rev-parse @{upstream}`) {

@@ -873,7 +969,7 @@ describe("runGatewayUpdate", () => {

873969

if (key === `git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`) {

874970

return { stdout: "origin/main", stderr: "", code: 0 };

875971

}

876-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

972+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

877973

return { stdout: "", stderr: "", code: 0 };

878974

}

879975

if (key === `git -C ${tempDir} rev-parse @{upstream}`) {

@@ -970,7 +1066,7 @@ describe("runGatewayUpdate", () => {

9701066

if (key === `git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`) {

9711067

return { stdout: "origin/main", stderr: "", code: 0 };

9721068

}

973-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

1069+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

9741070

return { stdout: "", stderr: "", code: 0 };

9751071

}

9761072

if (key === `git -C ${tempDir} rev-parse @{upstream}`) {

@@ -1084,7 +1180,7 @@ describe("runGatewayUpdate", () => {

10841180

if (key === `git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`) {

10851181

return { stdout: "origin/main", stderr: "", code: 0 };

10861182

}

1087-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

1183+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

10881184

return { stdout: "", stderr: "", code: 0 };

10891185

}

10901186

if (key === `git -C ${tempDir} rev-parse @{upstream}`) {

@@ -1182,7 +1278,7 @@ describe("runGatewayUpdate", () => {

11821278

if (key === `git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`) {

11831279

return { stdout: "origin/main", stderr: "", code: 0 };

11841280

}

1185-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

1281+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

11861282

return { stdout: "", stderr: "", code: 0 };

11871283

}

11881284

if (key === `git -C ${tempDir} rev-parse @{upstream}`) {

@@ -1275,7 +1371,7 @@ describe("runGatewayUpdate", () => {

12751371

if (key === `git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`) {

12761372

return { stdout: "origin/main", stderr: "", code: 0 };

12771373

}

1278-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

1374+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

12791375

return { stdout: "", stderr: "", code: 0 };

12801376

}

12811377

if (key === `git -C ${tempDir} rev-parse @{upstream}`) {

@@ -1367,7 +1463,7 @@ describe("runGatewayUpdate", () => {

13671463

if (key === `git -C ${tempDir} status --porcelain -- :!dist/control-ui/`) {

13681464

return { stdout: "", stderr: "", code: 0 };

13691465

}

1370-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

1466+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

13711467

return { stdout: "", stderr: "", code: 0 };

13721468

}

13731469

if (key === `git -C ${tempDir} rev-parse ${targetSha}`) {

@@ -1447,7 +1543,7 @@ describe("runGatewayUpdate", () => {

14471543

if (key === `git -C ${tempDir} status --porcelain -- :!dist/control-ui/`) {

14481544

return { stdout: "", stderr: "", code: 0 };

14491545

}

1450-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

1546+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

14511547

return { stdout: "", stderr: "", code: 0 };

14521548

}

14531549

if (key === `git -C ${tempDir} rev-parse refs/remotes/origin/main`) {

@@ -1530,7 +1626,7 @@ describe("runGatewayUpdate", () => {

15301626

if (key === `git -C ${gitRoot} status --porcelain -- :!dist/control-ui/`) {

15311627

return { stdout: "", stderr: "", code: 0 };

15321628

}

1533-

if (key === `git -C ${gitRoot} fetch --all --prune --tags`) {

1629+

if (key === `git -C ${gitRoot} fetch --all --prune --no-tags`) {

15341630

return { stdout: "", stderr: "", code: 0 };

15351631

}

15361632

if (key === `git -C ${gitRoot} rev-parse refs/remotes/origin/main`) {

@@ -1606,7 +1702,7 @@ describe("runGatewayUpdate", () => {

16061702

if (key === `git -C ${tempDir} rev-parse --abbrev-ref --symbolic-full-name @{upstream}`) {

16071703

return { stdout: "origin/main", stderr: "", code: 0 };

16081704

}

1609-

if (key === `git -C ${tempDir} fetch --all --prune --tags`) {

1705+

if (key === `git -C ${tempDir} fetch --all --prune --no-tags`) {

16101706

return { stdout: "", stderr: "", code: 0 };

16111707

}

16121708

if (key === `git -C ${tempDir} rev-parse @{upstream}`) {