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

推荐订阅源

博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
腾讯CDC
J
Java Code Geeks
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
云风的 BLOG
云风的 BLOG
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
雷峰网
雷峰网
B
Blog RSS Feed
博客园_首页
量子位
F
Fortinet All Blogs
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog

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
ci: retry cross-os agent runtime deps staging · openclaw/...
steipete · 2026-04-28 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -4,6 +4,7 @@

44
55

import { spawn } from "node:child_process";

66

import {

7+

appendFileSync,

78

chmodSync,

89

createWriteStream,

910

existsSync,

@@ -2552,27 +2553,51 @@ async function runModelsSet(params) {

25522553

}

25532554
25542555

async function runAgentTurn(params) {

2555-

const sessionId = `cross-os-release-check-${params.label}-${Date.now()}`;

2556-

const result = await runOpenClaw({

2557-

lane: params.lane,

2558-

env: params.env,

2559-

args: [

2560-

"agent",

2561-

"--agent",

2562-

"main",

2563-

"--session-id",

2564-

sessionId,

2565-

"--message",

2566-

"Reply with exact ASCII text OK only.",

2567-

"--json",

2568-

],

2569-

logPath: params.logPath,

2570-

timeoutMs: 10 * 60 * 1000,

2571-

});

2572-

if (!agentOutputHasExpectedOkMarker(result.stdout, { logPath: params.logPath })) {

2573-

throw new Error("Agent output did not contain the expected OK marker.");

2556+

let lastError;

2557+

for (let attempt = 1; attempt <= 2; attempt += 1) {

2558+

const sessionId = `cross-os-release-check-${params.label}-${Date.now()}-${attempt}`;

2559+

try {

2560+

const result = await runOpenClaw({

2561+

lane: params.lane,

2562+

env: params.env,

2563+

args: [

2564+

"agent",

2565+

"--agent",

2566+

"main",

2567+

"--session-id",

2568+

sessionId,

2569+

"--message",

2570+

"Reply with exact ASCII text OK only.",

2571+

"--json",

2572+

],

2573+

logPath: params.logPath,

2574+

timeoutMs: 10 * 60 * 1000,

2575+

});

2576+

if (!agentOutputHasExpectedOkMarker(result.stdout, { logPath: params.logPath })) {

2577+

throw new Error("Agent output did not contain the expected OK marker.");

2578+

}

2579+

return result;

2580+

} catch (error) {

2581+

lastError = error;

2582+

if (attempt >= 2 || !shouldRetryCrossOsAgentTurnError(error)) {

2583+

throw error;

2584+

}

2585+

appendFileSync(

2586+

params.logPath,

2587+

`\n[release-checks] retrying agent turn after bundled runtime deps staging failure: ${

2588+

error instanceof Error ? error.message : String(error)

2589+

}\n`,

2590+

);

2591+

}

25742592

}

2575-

return result;

2593+

throw lastError;

2594+

}

2595+
2596+

export function shouldRetryCrossOsAgentTurnError(error) {

2597+

const message = error instanceof Error ? error.message : String(error);

2598+

return /failed to (?:install|stage) bundled runtime deps|failed to stage bundled runtime deps after/u.test(

2599+

message,

2600+

);

25762601

}

25772602
25782603

export function agentOutputHasExpectedOkMarker(stdout, options = {}) {

Original file line numberDiff line numberDiff line change

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

4141

shouldSkipInstallerDaemonHealthCheck,

4242

shouldStopManagedGatewayBeforeManualFallback,

4343

shouldRunMainChannelDevUpdate,

44+

shouldRetryCrossOsAgentTurnError,

4445

shouldUseManagedGatewayForInstallerRuntime,

4546

shouldUseManagedGatewayService,

4647

verifyDevUpdateStatus,

@@ -83,6 +84,22 @@ describe("scripts/openclaw-cross-os-release-checks", () => {

8384

}

8485

});

8586
87+

it("retries transient bundled runtime deps staging failures during agent turns", () => {

88+

expect(

89+

shouldRetryCrossOsAgentTurnError(

90+

new Error("document-extract: failed to install bundled runtime deps: npm install failed"),

91+

),

92+

).toBe(true);

93+

expect(

94+

shouldRetryCrossOsAgentTurnError(

95+

new Error("document-extract failed to stage bundled runtime deps after 463ms"),

96+

),

97+

).toBe(true);

98+

expect(shouldRetryCrossOsAgentTurnError(new Error("Agent output did not contain OK."))).toBe(

99+

false,

100+

);

101+

});

102+
86103

it("treats explicit empty-string args as values instead of boolean flags", () => {

87104

expect(parseArgs(["--ubuntu-runner", "", "--mode", "both"])).toEqual({

88105

"ubuntu-runner": "",