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

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Register - Security
The Register - Security
The Hacker News
The Hacker News
F
Full Disclosure
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
Spread Privacy
Spread Privacy
K
Kaspersky official blog
P
Privacy & Cybersecurity Law Blog
F
Fox-IT International blog
博客园_首页
D
DataBreaches.Net
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
G
Google Developers Blog
N
Netflix TechBlog - Medium
博客园 - 叶小钗
Recorded Future
Recorded Future
Malwarebytes
Malwarebytes
T
Threatpost
F
Future of Privacy Forum
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
The GitHub Blog
The GitHub Blog
P
Palo Alto Networks Blog
IT之家
IT之家
博客园 - 司徒正美
G
GRAHAM CLULEY
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Securelist
云风的 BLOG
云风的 BLOG
M
Microsoft Research Blog - Microsoft Research
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
T
Tenable Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
美团技术团队
Last Week in AI
Last Week in AI
AWS News Blog
AWS News Blog
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
Latest news
Latest news
人人都是产品经理
人人都是产品经理
Project Zero
Project Zero
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
月光博客
月光博客
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint

Recent Commits to openclaw:main

fix(daemon): preserve explicit systemd unit during refresh fix(gateway): preserve traced child sessions · openclaw/openclaw@3f3ed5e feat(ios): refresh pro UI and gateway flows (#87367) fix(auto-reply): bound scp staging stderr · openclaw/openclaw@b474130 fix(voice-call): ignore tailscale helper stderr · openclaw/openclaw@76f447b fix(voice-call): ignore ngrok probe output · openclaw/openclaw@bc6ecc8 fix(voice-call): drain tailscale tunnel output fix(scripts): bound boundary check output fix(voice-call): bound tailscale status output docs: point release process at public evidence repo · openclaw/openclaw@910354b fix(telegram): retain streamed long final prefixes · openclaw/openclaw@27d57af test(telegram): cover long streamed final replay fix(release): bound command output capture · openclaw/openclaw@b667bdd fix(docker): alias main images to latest release · openclaw/openclaw@3cb7ae5 perf: reduce agent turn CPU overhead · openclaw/openclaw@b58786c fix(matrix): bound bootstrap output capture fix(agents): bound search tool stderr · openclaw/openclaw@f2f18f5 fix(process): bound command output capture fix(ci): run CodeQL on main pushes · openclaw/openclaw@44451ea fix(backup): cap verify manifest extraction fix(agents): normalize session tool limits · openclaw/openclaw@38f3040 test(telegram): cover draft preview overflow · openclaw/openclaw@a048cbc fix(telegram): preserve final overflow state · openclaw/openclaw@bda924b fix(telegram): skip stopped draft finalization · openclaw/openclaw@8677310 fix(telegram): clamp partial draft overflow · openclaw/openclaw@e856932 fix(crestodian): bound local command probes · openclaw/openclaw@8e3be0a fix(agents): detect signaled local service exits · openclaw/openclaw@76ebc14 fix(release): port 2026.5.27 fixes fix(msteams): bound service error bodies fix(test): keep btw fs promises mock partial · openclaw/openclaw@56302f7 ci(docker): publish browser release images · openclaw/openclaw@dc31f73 fix(test): detect signaled memory fd gateway exits · openclaw/openclaw@5809bdf fix(test): detect signaled kitchen sink gateway exits · openclaw/openclaw@97ed582 docs: add release verification skill · openclaw/openclaw@6eedc83 fix(test): detect signaled test gateway exits test: stabilize code mode wait timeout · openclaw/openclaw@d7e62a8 fix(test): detect signaled cross-os gateway exits · openclaw/openclaw@f48a89c fix(test): detect signaled bundled smoke exits fix(test): hard kill boundary prep timeouts · openclaw/openclaw@a854331 fix(test): hard kill boundary step timeouts · openclaw/openclaw@3fb6746 docs: tune clawdtributor refresh summaries · openclaw/openclaw@51e57d4 fix(test): handle extension memory spawn errors · openclaw/openclaw@e5a687f chore(release): update appcast for 2026.5.27 · openclaw/openclaw@17c1b06 fix(test): bound startup build helpers · openclaw/openclaw@bda3531 test: speed up slow test suite (#87611) · openclaw/openclaw@aab5410 fix(release): bound npm release checks · openclaw/openclaw@e0635eb fix: reduce gateway warning noise · openclaw/openclaw@4252f07 fix(test): rebuild startup memory artifacts · openclaw/openclaw@4ce3c3e fix(release): bound prepack subprocesses · openclaw/openclaw@653e8d1 fix(release): bound release check commands · openclaw/openclaw@98d6331 fix(release): bound npm verifier commands · openclaw/openclaw@2b0e399 fix(e2e): bound bundled plugin selection · openclaw/openclaw@b234aa0 fix(docker): bound package capture output · openclaw/openclaw@cee364e fix(agent-sessions): fail oversized exec output · openclaw/openclaw@da55146 fix(supervisor): bound captured process output · openclaw/openclaw@2252cf6 fix(file-transfer): bound dir fetch tar listings · openclaw/openclaw@9a7f808 fix(brave): bound search error bodies · openclaw/openclaw@eb273a8 fix(test): bound package candidate command output · openclaw/openclaw@259796d fix(test): bound extension memory profiler output · openclaw/openclaw@d64b394 fix(test): wait for credential timeout cleanup · openclaw/openclaw@88c395c fix(qa-lab): bound plugin tools stderr tail · openclaw/openclaw@9085d17 fix(qa-lab): bound child process output · openclaw/openclaw@4a2b02e fix(test): escalate e2e watchdog termination · openclaw/openclaw@beb25d6 fix(security): avoid fetching untrusted proof refs · openclaw/openclaw@4bd711e fix(security): avoid CodeQL legacy auth patterns · openclaw/openclaw@3844e03 fix(test): keep upgrade survivor runtime state local · openclaw/openclaw@9fef53c Tighten phone-control mutation authorization [AI] (#87150) · openclaw/openclaw@91a4635 fix(voice-call): bound ngrok diagnostics · openclaw/openclaw@629fc2f fix(qa): expose credential fingerprints in admin list · openclaw/openclaw@1bc32e5 fix(memory): bound remote error bodies · openclaw/openclaw@93577ad Clarify directive persistence authorization policy [AI] (#86369) · openclaw/openclaw@bb418a8 fix(install): harden Windows git installs · openclaw/openclaw@dc5671e fix(qa): stabilize live transport lanes · openclaw/openclaw@f9aec04 fix(security): address OpenClaw CodeQL alerts · openclaw/openclaw@b008989 fix(parallels): guard release target harness mismatch · openclaw/openclaw@7275304 docs(skills): add OpenClaw release announcement guide · openclaw/openclaw@9805202 docs(skills): refine beta release announcement guidance · openclaw/openclaw@9ebf51e fix(release): bound cross-os fetch bodies · openclaw/openclaw@13dcded Fix Claude live tool progress for watchdog recovery (#87546) · openclaw/openclaw@4c3a029 test: avoid platform-specific transcript stat assertion · openclaw/openclaw@bd02977 fix(scripts): bound audit advisory error bodies · openclaw/openclaw@9f70064 fix: ignore leading transcript bytes in tail scan · openclaw/openclaw@b005f01 fix: avoid direct transcript stat fallback · openclaw/openclaw@e397636 fix(scripts): bound docker preflight capture fix(scripts): bound gh read error bodies · openclaw/openclaw@744da7e perf: avoid runtime catalog load for reasoning defaults fix(release): pin ClawHub publish workdir · openclaw/openclaw@a0cf185 perf: reuse preflight transcript scan size · openclaw/openclaw@8d5f6c8 fix(scripts): bound labeler error bodies perf: skip recent transcript read after final usage · openclaw/openclaw@39bc43c fix(scripts): bound memory fd ready output perf: reuse transcript scan size · openclaw/openclaw@bd6a404 fix(scripts): bound gateway watch log capture fix(agents): cancel failed skill download bodies · openclaw/openclaw@00fb152 fix(agents): suppress abandoned requester completion handoff (#87541) fix(qa): keep live transport artifacts local fix(release): speed windows upgrade fallback · openclaw/openclaw@1342727 fix(release): close cross-os artifact sockets · openclaw/openclaw@9771727 test(release): satisfy cross-os socket lint chore(ui): refresh nl control ui locale · openclaw/openclaw@43deaf4
fix(imessage): bound cli output capture · openclaw/openclaw@65d47dc
vincentkoc · 2026-05-28 · via Recent Commits to openclaw:main

@@ -3,6 +3,7 @@ import { mkdtemp, rm, writeFile } from "node:fs/promises";

33

import { extname, join } from "node:path";

44

import { normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";

55

import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path";

6+

import { appendIMessageCliStderrTail, appendIMessageCliStdout } from "./cli-output.js";

67

import { createIMessageRpcClient } from "./client.js";

78

import { extractMarkdownFormatRuns } from "./markdown-format.js";

89

import { resolveIMessageMessageId as resolveIMessageMessageIdImpl } from "./monitor-reply-cache.js";

@@ -182,6 +183,31 @@ async function runIMessageCliJson(

182183

let stdout = "";

183184

let stderr = "";

184185

let killEscalation: ReturnType<typeof setTimeout> | null = null;

186+

let settled = false;

187+

const clearTimers = (options: { keepKillEscalation?: boolean } = {}): void => {

188+

if (timer) {

189+

clearTimeout(timer);

190+

}

191+

if (killEscalation && !options.keepKillEscalation) {

192+

clearTimeout(killEscalation);

193+

}

194+

};

195+

const fail = (error: Error, options: { keepKillEscalation?: boolean } = {}): void => {

196+

if (settled) {

197+

return;

198+

}

199+

settled = true;

200+

clearTimers(options);

201+

reject(error);

202+

};

203+

const succeed = (value: Record<string, unknown>): void => {

204+

if (settled) {

205+

return;

206+

}

207+

settled = true;

208+

clearTimers();

209+

resolve(value);

210+

};

185211

const timer =

186212

options.timeoutMs && options.timeoutMs > 0

187213

? setTimeout(() => {

@@ -196,32 +222,43 @@ async function runIMessageCliJson(

196222

// best-effort

197223

}

198224

}, 2000);

199-

reject(new Error(`iMessage action timed out after ${options.timeoutMs}ms`));

225+

fail(new Error(`iMessage action timed out after ${options.timeoutMs}ms`), {

226+

keepKillEscalation: true,

227+

});

200228

}, options.timeoutMs)

201229

: null;

202230

child.stdout.setEncoding("utf8");

203231

child.stderr.setEncoding("utf8");

204232

child.stdout.on("data", (chunk) => {

205-

stdout += chunk;

233+

if (settled) {

234+

return;

235+

}

236+

const appended = appendIMessageCliStdout(stdout, chunk);

237+

if (!appended.ok) {

238+

try {

239+

child.kill("SIGKILL");

240+

} catch {

241+

// best-effort

242+

}

243+

fail(new Error(appended.message));

244+

return;

245+

}

246+

stdout = appended.value;

206247

});

207248

child.stderr.on("data", (chunk) => {

208-

stderr += chunk;

249+

stderr = appendIMessageCliStderrTail(stderr, chunk);

209250

});

210251

child.on("error", (error) => {

211-

if (timer) {

212-

clearTimeout(timer);

213-

}

214-

if (killEscalation) {

215-

clearTimeout(killEscalation);

252+

if (settled) {

253+

clearTimers();

254+

return;

216255

}

217-

reject(error);

256+

fail(error);

218257

});

219258

child.on("close", (code) => {

220-

if (timer) {

221-

clearTimeout(timer);

222-

}

223-

if (killEscalation) {

224-

clearTimeout(killEscalation);

259+

if (settled) {

260+

clearTimers();

261+

return;

225262

}

226263

const lines = normalizeStringEntries(stdout.split(/\r?\n/));

227264

const last = lines.at(-1);

@@ -242,22 +279,22 @@ async function runIMessageCliJson(

242279

stderr.trim() ||

243280

stdout.trim() ||

244281

`imsg exited with code ${code}`;

245-

reject(new Error(detail));

282+

fail(new Error(detail));

246283

return;

247284

}

248285

if (!parsed) {

249-

reject(new Error(`imsg returned non-JSON output: ${stdout.trim() || stderr.trim()}`));

286+

fail(new Error(`imsg returned non-JSON output: ${stdout.trim() || stderr.trim()}`));

250287

return;

251288

}

252289

if (parsed.success === false) {

253290

const error =

254291

typeof parsed.error === "string" && parsed.error.trim()

255292

? parsed.error.trim()

256293

: "iMessage action failed";

257-

reject(new Error(error));

294+

fail(new Error(error));

258295

return;

259296

}

260-

resolve(parsed);

297+

succeed(parsed);

261298

});

262299

});

263300

}