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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
量子位
M
Microsoft Research Blog - Microsoft Research
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
罗磊的独立博客
V
Visual Studio Blog
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
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

Recent Commits to openclaw:main

fix(image): hint safe provider timeout (#85812) · openclaw/openclaw@8ede81a docs(skills): require autoreview before bug sweep URLs fix(control-ui): restore light select arrows fix(web-ui): improve light theme visibility for select arrows and bub… test: align full release dispatch assertion fix(scripts): route check stages through managed runner · openclaw/openclaw@353d132 test: clean up Codex app-server run failures · openclaw/openclaw@9cef99f ci: retry release child workflow dispatch · openclaw/openclaw@ee61f79 test: isolate Codex report snapshot tests perf(gateway): reduce startup filesystem probes · openclaw/openclaw@edbd833 ci: retry GHCR docker login · openclaw/openclaw@fcb9c46 ci: harden manual checkout auth · openclaw/openclaw@d42bc0b fix(scripts): avoid Windows shell argv warnings · openclaw/openclaw@208a067 ci: fix release reachability auth · openclaw/openclaw@02b1c8c docs: note docs publishing routing · openclaw/openclaw@388b24a ci: harden release package validation · openclaw/openclaw@41f4605 ci(testbox): expose stable pnpm through corepack · openclaw/openclaw@3e14f54 ci(testbox): avoid ready raw runners after hydration failure perf(gateway): defer startup-idle runtime work · openclaw/openclaw@f1226ae ci: harden beta release validation flakes · openclaw/openclaw@391f29b test: type codex thread request mocks · openclaw/openclaw@86a0502 test: avoid codex heartbeat lifecycle timeout · openclaw/openclaw@85664f8 fix(scripts): run Windows check commands through shims · openclaw/openclaw@8a94e82 fix: aggressively prune retired model catalogs fix: harden package URL downloads (#85578) ci: retry npm Telegram release dispatch test: isolate Telegram spooled timeout from stall watchdog · openclaw/openclaw@a04566d fix(exec-approvals): add .catch() to expiry delivery fire-and-forget … fix(memory-core): avoid double bulleting promoted snippets (#85724) · openclaw/openclaw@983a3b9 fix(doctor): skip empty entries and memoize routes in plugin session … ci: avoid duplicate release-check auth headers · openclaw/openclaw@6191750 fix: prune retired model catalog entries ci: authenticate release-check reachability fetches · openclaw/openclaw@0c192e2 docs(changelog): note Telegram attachment action fix · openclaw/openclaw@c5f1344 fix(telegram): send attachment paths as media · openclaw/openclaw@fdf01db refactor(telegram): simplify action media sends · openclaw/openclaw@0540025 fix(doctor): canonicalize git checkout detection (#85735) test(ci): update plugin prerelease checkout expectation ci: persist checkout credentials for release validation test(codex): avoid searchable-tool registration flake · openclaw/openclaw@5e8c71b refactor: simplify doctor repair checks (#83753) docs(changelog): credit landed bug sweep PRs · openclaw/openclaw@24de304 perf(utils): preserve message identity in stripInlineDirectiveTagsFro… · openclaw/openclaw@bf84b30 fix(agents): add openai-responses family to non-visible turn retry gu… · openclaw/openclaw@49e9c3e fix(status): show configured cost for aws-sdk models (#85619) · openclaw/openclaw@6e289b4 fix(microsoft-foundry): DeepSeek V4 models incorrectly use openai-com… · openclaw/openclaw@ec43acb fix(skills): show empty state notice in config wizard (#85032) · openclaw/openclaw@74e65f4 test(codex): avoid forced-tool allowlist flake · openclaw/openclaw@ef7e652 fix: avoid gateway startup event-loop stalls test(codex): type forced-tool request mock · openclaw/openclaw@f6ab188 test(codex): avoid forced-tool turn flake · openclaw/openclaw@8d1ab83 test(codex): avoid startup cleanup socket flake fix(gateway): pin relative state dir at startup · openclaw/openclaw@2e5be0c fix(whatsapp): persist inbound delivery in plugin state (#85506) · openclaw/openclaw@b47bace test(codex): make sandbox cleanup proof deterministic fix(cron): route topic targets through channel plugins · openclaw/openclaw@9175491 fix(agents): simplify subagent completion handoff ci(release): isolate npm publish concurrency · openclaw/openclaw@9c26b87 ci(release): allow beta publish after npm preflight · openclaw/openclaw@0e37263 fix(release): allow large beta smoke run lists ci(release): retry child workflow polling · openclaw/openclaw@c689f71 ci(release): poll child workflows through actions api · openclaw/openclaw@e5dab55 fix(bootstrap): guard bootstrap name checks against undefined names (… · openclaw/openclaw@25fa46b fix(cli): waitForever must keep the event loop alive (#85694) · openclaw/openclaw@eca9645 fix(cli-output): ignore cumulative usage from result events in stream… · openclaw/openclaw@84229d9 fix(secrets): show irreversible warning after interactive apply confi… · openclaw/openclaw@bb52b54 fix(agents/harness): pass CLI runtime aliases through to PI in select… · openclaw/openclaw@2c3b7ea docs: add bug-sweep changelog entries fix(release): run npm shims on Windows · openclaw/openclaw@1f32a48 fix(ci): repair crabbox hydrate replay (#85706) · openclaw/openclaw@0d7d99b feat(auth): support named model login profiles fix(gateway): restore WebChat image understanding routing · openclaw/openclaw@55a0c9b fix(anthropic): migrate 1M context to GA handling fix(scripts): resolve Crabbox shims on Windows · openclaw/openclaw@5c535df test(ci): harden installer smoke coverage · openclaw/openclaw@68bcd4e fix(status): bound deep docker audit probes (#85476) · openclaw/openclaw@f7c05dc docs: expand meeting notes docs · openclaw/openclaw@a7e0fa0 fix(cli): validate tasks audit limit (#84901) · openclaw/openclaw@44d470f fix(twitch): preserve newer message handler during cleanup (#85425) · openclaw/openclaw@71ddc01 fix(ci): require live docker credentials by resource · openclaw/openclaw@1e21121 fix(diagnostics): drop snake case otel ids (#72645) · openclaw/openclaw@e0bafc5 fix(ci): clear signal and docs guard blockers (#85693) · openclaw/openclaw@3a1d4dd fix(ci): require factory auth for droid live docker · openclaw/openclaw@cc6c372 fix: honor disabled synthetic auth lookup · openclaw/openclaw@a4a1abb fix(scripts): repair live docker auth shellcheck · openclaw/openclaw@4e34ac4 fix(docker): avoid printing gateway token · openclaw/openclaw@5db773f fix(cli): keep logs follow on live gateway state · openclaw/openclaw@6e3b318 fix(e2e): prefer x64 MinGit on Windows · openclaw/openclaw@15d9134 feat: add meeting notes plugin docs: update changelog for memory artifacts (#85060) (thanks @brokema… · openclaw/openclaw@9e55383 fix(memory-lancedb): expose public memory artifacts · openclaw/openclaw@aac1abe fix(memory): preserve sidecar capability hooks · openclaw/openclaw@e6288ca fix(e2e): scrub Windows update config on PowerShell 5.1 · openclaw/openclaw@6657b49 docs: absorb documentation PR sweep · openclaw/openclaw@2c536a8 fix(agents): stabilize Linux fallback tests · openclaw/openclaw@6b04170 fix(codex): preserve native web search action metadata (#85378) · openclaw/openclaw@bcf756c test: refresh Codex prompt snapshots · openclaw/openclaw@492d656 docs: absorb hook and subagent guidance PRs fix(agents): audit tool policy blocks (#85673) · openclaw/openclaw@09dd051 ci: fix plugin npm bundled dependency install · openclaw/openclaw@d485464
test: bound Codex app-server cleanup waits · openclaw/openclaw@6fc9d7b
steipete · 2026-05-24 · via Recent Commits to openclaw:main

@@ -299,6 +299,41 @@ function mockCall(mock: unknown, label: string, index = 0): unknown[] {

299299

return call;

300300

}

301301302+

async function waitForPromiseForTest<T>(

303+

promise: Promise<T>,

304+

timeoutMs: number,

305+

label: string,

306+

): Promise<T> {

307+

let timer: ReturnType<typeof setTimeout> | undefined;

308+

try {

309+

return await Promise.race([

310+

promise,

311+

new Promise<never>((_resolve, reject) => {

312+

timer = setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs);

313+

}),

314+

]);

315+

} finally {

316+

if (timer) {

317+

clearTimeout(timer);

318+

}

319+

}

320+

}

321+322+

async function drainPromiseForTest(

323+

promise: Promise<unknown>,

324+

timeoutMs: number,

325+

label: string,

326+

): Promise<void> {

327+

await waitForPromiseForTest(

328+

promise.then(

329+

() => undefined,

330+

() => undefined,

331+

),

332+

timeoutMs,

333+

label,

334+

);

335+

}

336+302337

function openSocket(url: string): Promise<WebSocket> {

303338

return new Promise((resolve, reject) => {

304339

const socket = new WebSocket(url);

@@ -3153,7 +3188,8 @@ describe("runCodexAppServerAttempt", () => {

31533188

params.runtimePlan = createCodexRuntimePlanFixture();

3154318931553190

const run = runCodexAppServerAttempt(params);

3156-

let completed = false;

3191+

void run.catch(() => undefined);

3192+

let runSettled = false;

31573193

let diagnosticsSubscribed = true;

31583194

try {

31593195

await harness.waitForMethod("thread/start", 10_000);

@@ -3213,37 +3249,20 @@ describe("runCodexAppServerAttempt", () => {

32133249

).toHaveLength(1);

32143250

expect(activeDiagnosticToolKeys(diagnosticEvents)).toEqual(new Set());

321532513216-

await harness.notify({

3217-

method: "item/completed",

3218-

params: {

3219-

threadId: "thread-1",

3220-

turnId: "turn-1",

3221-

completedAtMs: Date.now(),

3222-

item: {

3223-

type: "dynamicToolCall",

3224-

id: "call-echo-1",

3225-

namespace: null,

3226-

tool: "echo",

3227-

arguments: {},

3228-

status: "completed",

3229-

contentItems: [{ type: "inputText", text: "echo done" }],

3230-

success: true,

3231-

durationMs: 1,

3232-

},

3233-

},

3234-

});

3235-3236-

await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });

3237-

completed = true;

3238-

await run;

3252+

harness.close();

3253+

abortController.abort(new Error("test complete"));

3254+

await drainPromiseForTest(run, 10_000, "Codex diagnostic test run cleanup");

3255+

runSettled = true;

32393256

} finally {

32403257

if (diagnosticsSubscribed) {

32413258

unsubscribeDiagnostics();

32423259

}

3243-

if (!completed) {

3260+

if (!runSettled) {

32443261

harness.close();

32453262

abortController.abort(new Error("test cleanup"));

3246-

await run.catch(() => {});

3263+

await drainPromiseForTest(run, 1_000, "Codex diagnostic test failure cleanup").catch(

3264+

() => undefined,

3265+

);

32473266

}

32483267

}

32493268

});

@@ -3299,7 +3318,7 @@ describe("runCodexAppServerAttempt", () => {

32993318

contentItems: [{ type: "inputText", text: "Background task started." }],

33003319

});

33013320

expect(harness.requests.some((request) => request.method === "turn/interrupt")).toBe(false);

3302-

const result = await run;

3321+

const result = await waitForPromiseForTest(run, 20_000, "Codex terminal dynamic tool run");

33033322

completed = true;

3304332333053324

expect(result.timedOut).toBe(false);

@@ -3321,7 +3340,9 @@ describe("runCodexAppServerAttempt", () => {

33213340

if (!completed) {

33223341

harness.close();

33233342

abortController.abort(new Error("test cleanup"));

3324-

await run.catch(() => {});

3343+

await drainPromiseForTest(run, 1_000, "Codex terminal dynamic tool cleanup").catch(

3344+

() => undefined,

3345+

);

33253346

}

33263347

}

33273348

});