Skip to content

Commit 0f8df48

Browse files
committed
fix(release): forward-port 2026.6.9 closeout fixes
1 parent 7b28b73 commit 0f8df48

4 files changed

Lines changed: 177 additions & 20 deletions

File tree

.agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { execFileSync } from "node:child_process";
44
import { readFileSync, writeFileSync } from "node:fs";
55

66
const repo = "openclaw/openclaw";
7+
const commitAssociationQueryBatchSize = 20;
78
const excludedHandles = new Set(["openclaw", "clawsweeper", "claude", "codex", "steipete"]);
89
const nonEditorialTypes = new Set([
910
"build",
@@ -618,13 +619,25 @@ function graphql(query) {
618619
let lastError;
619620
for (let attempt = 0; attempt < 5; attempt += 1) {
620621
try {
621-
return githubApi(["graphql", "-f", `query=${query}`]).data;
622+
const response = githubApi(["graphql", "-f", `query=${query}`]);
623+
if (response?.data && typeof response.data === "object") {
624+
return response.data;
625+
}
626+
const errors = Array.isArray(response?.errors)
627+
? response.errors.map((error) => error?.message).filter(Boolean)
628+
: [];
629+
const detail = [...errors, response?.message].filter(Boolean).join("\n");
630+
throw new Error(
631+
detail
632+
? `GitHub GraphQL response did not include data:\n${detail}`
633+
: "GitHub GraphQL response did not include data.",
634+
);
622635
} catch (error) {
623636
lastError = error;
624637
const message = [error?.message, error?.stdout, error?.stderr].filter(Boolean).join("\n");
625638
// Historical ranges batch hundreds of objects; only retry transient transport failures.
626639
if (
627-
!/(?:operation timed out|ECONNRESET|ETIMEDOUT|EAI_AGAIN|TLS handshake timeout|stream error: .*CANCEL|unexpected end of JSON input|upstream connect error|connection termination|error connecting to api\.github\.com|Unexpected token '<')/i.test(
640+
!/(?:operation timed out|ECONNRESET|ETIMEDOUT|EAI_AGAIN|TLS handshake timeout|stream error: .*CANCEL|unexpected end of JSON input|upstream connect error|connection termination|connection reset by peer|error connecting to api\.github\.com|Unexpected token '<'|something went wrong|temporarily unavailable|internal server error|rate limit)/i.test(
628641
message,
629642
)
630643
) {
@@ -657,8 +670,8 @@ function resolveAssociatedPullRequests(commitHashes, targetTimestamp) {
657670
pending.push({ commitHash, cursor: connection.pageInfo.endCursor });
658671
}
659672
}
660-
for (let index = 0; index < commitHashes.length; index += 40) {
661-
const chunk = commitHashes.slice(index, index + 40);
673+
for (let index = 0; index < commitHashes.length; index += commitAssociationQueryBatchSize) {
674+
const chunk = commitHashes.slice(index, index + commitAssociationQueryBatchSize);
662675
const fields = chunk
663676
.map(
664677
(hash, offset) =>

CHANGELOG.md

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Docs: https://docs.openclaw.ai
66

77
### Highlights
88

9-
- **Richer Telegram delivery:** Telegram now sends rich HTML, preserves rich markdown and sticker paths, renders progress drafts and command output more faithfully, and keeps mentions and spooled handlers on the right delivery path. (#93286, #93164, #93124, #93364, #93130, #93088, #93281) Thanks @obviyus, @vincentkoc, @goutamadwant, @kesslerio, @NianJiuZst, @SweetSophia, @Marvinthebored, and @aaajiao.
9+
- **Richer Telegram delivery:** Telegram now sends rich HTML, preserves rich markdown and sticker paths, renders progress drafts and command output more faithfully, normalizes HTML tables safely, and keeps mentions and spooled handlers on the right delivery path. (#93286, #93164, #93124, #93364, #93130, #93088, #93281, #94891, #94856) Thanks @obviyus, @vincentkoc, @goutamadwant, @kesslerio, @NianJiuZst, @SweetSophia, @Marvinthebored, @aaajiao, @zhangqueping, and @jairrab.
1010
- **More dependable agent recovery:** retries, terminal outcomes, usage after compaction, session history repair, and reply reconciliation now keep more interrupted or partial turns moving toward a visible final result. (#92191, #93073, #93228, #93084, #93469, #93291, #90943) Thanks @ai-hpc, @lml2468, @fuller-stack-dev, @Hollychou924, @leno23, @de1tydev, @425072024, @wuwahe3, @drvoss, @yetval, @sandieman2, and @vincentkoc.
1111
- **A stronger Codex integration:** Codex gains automatic plugin approvals, GPT-5.3 Spark OAuth routing, remote-node `exec` as a dynamic tool, and more reliable app-server teardown and terminal outcomes. (#92625, #89133, #93654, #91767, #93287) Thanks @kevinslin, @VACInc, @vincentkoc, @JPKay-AI, and @aliahnaf2013-max.
1212
- **Standalone official provider plugins:** external provider packages are now first-class npm releases, externally installed channel plugins load at Gateway startup, and StepFun is available from npm and ClawHub. (#93470) Thanks @sunlit-deng, @cxdnicole, and @vincentkoc.
@@ -18,22 +18,22 @@ Docs: https://docs.openclaw.ai
1818
- Providers and auth: add Codex Hosted Search, improve Gemini CLI OAuth behind proxies, and keep external provider onboarding on current choices and package metadata. (#93446, #92815) Thanks @fuller-stack-dev, @yetval, @EvetteYoung, and @vincentkoc.
1919
- Plugins and installs: externalized official providers publish as independent npm packages, Gateway discovers installed channel plugins at startup, and StepFun installs from npm or ClawHub. (#93470) Thanks @sunlit-deng, @cxdnicole, and @vincentkoc.
2020
- Dashboard and mobile: add a session workspace rail, plugin health in status, compact cron lists, and iOS Watch controls. (#92856, #91952, #93395, #93387) Thanks @Solvely-Colin, @jalehman, @yu-xin-c, @centralpc, @joshavant, and @vincentkoc.
21-
- Codex and skills: add automatic plugin approvals, preserve ClawHub skill provenance, and expose remote-node execution to Codex when a node is connected. (#92625, #93283, #93654) Thanks @kevinslin, @momothemage, @nmccready-tars, @vincentkoc, and @JPKay-AI.
22-
- QA and release engineering: QA scenarios now use YAML, with broader profile evidence and release coverage for the plugin and channel matrix.
21+
- Codex, observability, and skills: add automatic plugin approvals and SecretRefs, preserve ClawHub skill provenance, add OpenTelemetry log export, and expose remote-node execution to Codex when a node is connected. (#92625, #94324, #93283, #94561, #93654) Thanks @kevinslin, @kevinlin-openai, @momothemage, @nmccready-tars, @jesse-merhi, @vincentkoc, and @JPKay-AI.
22+
- QA and release engineering: QA scenarios now use YAML, with broader profile evidence and release coverage for the plugin and channel matrix. Thanks @vincentkoc.
2323

2424
### Fixes
2525

2626
- Security and privacy: redact secrets from debug/config output, block internal HTTP session overrides, audit open-DM tool exposure, and retain plugin write ownership checks. (#93333, #88496, #93443, #92883, #93353) Thanks @Alix-007, @jason-allen-oneal, @coygeek, @RichardCao, @yu-xin-c, @cjg20ss, @eleqtrizit, and @vincentkoc.
27-
- Agent and session runtime: retry thinking-only and empty post-tool turns, prevent duplicate hook execution, preserve fresh usage through compaction, and repair partial JSON/history artifacts. (#92191, #93073, #93009, #93084, #93469) Thanks @ai-hpc, @lml2468, @fuller-stack-dev, @zenglingbiao, @dertbv, @Hollychou924, @leno23, @de1tydev, @425072024, @wuwahe3, @drvoss, and @vincentkoc.
28-
- Channels and replies: fix Telegram rich delivery and ingress recovery, preserve WhatsApp auth and media error reporting, keep Mattermost thread replies intact, and harden Discord action handling. (#93286, #93364, #93281, #93076, #93334, #93424, #93488) Thanks @obviyus, @NianJiuZst, @mcaxtr, @rushindrasinha, @amknight, @lzyyzznl, @darealgege, and @vincentkoc.
27+
- Agent and session runtime: retry thinking-only and empty post-tool turns, prevent duplicate hook execution, preserve pending subagent delivery, preserve fresh usage through compaction, and repair partial JSON/history artifacts. (#92191, #93073, #93009, #93084, #93469, #94349, #92383, #94257) Thanks @ai-hpc, @lml2468, @fuller-stack-dev, @zenglingbiao, @dertbv, @Hollychou924, @leno23, @de1tydev, @425072024, @wuwahe3, @drvoss, @vincentkoc, @sallyom, @oiGaDio, @Hidetsugu55, and @Nas01010101.
28+
- Channels and replies: fix Telegram rich delivery, table rendering, action-error handling, and ingress recovery; preserve command progress detail across channel adapters; retain WhatsApp opening text after a media failure; keep Mattermost thread replies intact; and harden Discord action handling. (#93286, #93364, #93281, #93076, #93334, #93424, #93488, #94868, #94891, #94856, #94810, #93823) Thanks @obviyus, @NianJiuZst, @mcaxtr, @rushindrasinha, @amknight, @lzyyzznl, @darealgege, @vincentkoc, @zhangqueping, @jairrab, @ZOOWH, @parveshsaini, and @yetval.
2929
- Storage and migrations: avoid SQLite WAL on network filesystems, clean reindex artifacts, keep setup state out of workspace dot-directories, and import default-agent auth profiles into SQLite. (#93454, #92891, #93182, #93295, #93520, #93156) Thanks @vincentkoc, @ZengWen-DT, @Zeng-wen, @potterdigital, @Alix-007, @Pick-cat, @sallyom, @1qh, and @Tazio7.
3030
- Provider and model behavior: fix Gemini CLI proxy OAuth, restore Codex Spark OAuth routing, correct Bedrock embedding model IDs, and preserve configured defaults in embedded runs. (#92815, #89133, #93452, #93428) Thanks @yetval, @EvetteYoung, @VACInc, @LiuwqGit, @aleck31, @zenglingbiao, @danielgerlag, and @vincentkoc.
3131
- CLI, TUI, and apps: accept global flags after subcommands, keep terminal output and activity indicators visible, preserve CJK IME composition, and refresh stale UI state. (#93455, #93460, #93006, #93427, #93498, #93606) Thanks @ooiuuii, @Alix-007, @ZengWen-DT, @Zeng-wen, @AlethiaQuizForge, @Zhaoqj2016, @liuhao1024, @BrianClaw1955, @vincentkoc, and @NicoBoom13.
32-
- Operations and updates: harden official plugin recovery, restart managed Gateways after failed update handoff, avoid Node-specific npm prefixes, and keep package validation paths reliable. (#93325, #92111, #93650) Thanks @vincentkoc, @yetval, @ofan, and @yaanfpv.
32+
- Operations and updates: harden official plugin recovery, restart managed Gateways after failed update handoff, keep safe cron delivery defaults, avoid Node-specific npm prefixes, and keep package validation paths reliable. (#93325, #92111, #93650, #94453, #91685) Thanks @vincentkoc, @yetval, @ofan, @yaanfpv, @jincheng-xydt, @sallyom, @davectr, and @nxmxbbd.
3333

3434
### Complete contribution record
3535

36-
This audited record covers the complete v2026.6.8..HEAD~1 history: 375 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact.
36+
This audited record covers the complete v2026.6.8..HEAD history: 422 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact.
3737

3838
#### Pull requests
3939

@@ -175,7 +175,7 @@ This audited record covers the complete v2026.6.8..HEAD~1 history: 375 merged PR
175175
- **PR #90003** feat(policy): cover exec approvals artifact. Thanks @giodl73-repo.
176176
- **PR #93448** fix(guards): allow auth profile sqlite reader. Thanks @amknight.
177177
- **PR #93424** fix(mattermost): keep message tool replies in threads. Thanks @amknight and @vincentkoc.
178-
- **PR #93418** fix(telegram): forward Bot API 10.1 rich_message content to agent. Related #93410. Thanks @xzh-xydt and @vincentkoc and @0pen7ech.
178+
- **PR #93418** fix(telegram): forward Bot API 10.1 rich_message content to agent. Related #93410. Thanks @xzh-icenter and @vincentkoc and @0pen7ech.
179179
- **PR #93175** test(qa): taxonomy profiles: includeAllCategories for release profile, update some coverage. Thanks @RomneyDa.
180180
- **PR #93456** fix(agents): handle string assistant message content. Thanks @vincentkoc.
181181
- **PR #93441** fix(outbound): ignore schema-padded poll metadata on send. Related #43015. Thanks @weichengdeng and @charzhou.
@@ -412,6 +412,53 @@ This audited record covers the complete v2026.6.8..HEAD~1 history: 375 merged PR
412412
- **PR #94658** test(sqlite): use shared temp directory helper. Thanks @vincentkoc.
413413
- **PR #92135** fix(openai-embedding): preserve openai/ prefix for non-native base URLs. Related #92124. Thanks @xialonglee and @Kambrian.
414414
- **PR #93737** refactor: add session maintenance transaction seam. Thanks @jalehman.
415+
- **PR #93685** refactor(auto-reply): add lifecycle storage seams. Thanks @jalehman.
416+
- **PR #94349** fix(agents): preserve pending subagent completion announces. Related #93323. Thanks @sallyom and @oiGaDio.
417+
- **PR #93174** test: fold channel message flows into qa e2e. Thanks @RomneyDa.
418+
- **PR #94093** Prevent Codex thread rotation from losing next-step context. Thanks @VACInc.
419+
- **PR #53920** fix(scripts): avoid mutating tracked auth-monitor template during setup. Thanks @JackWuGlobal.
420+
- **PR #94702** Standardize QA coverage IDs on dotted names. Thanks @RomneyDa.
421+
- **PR #81825** fix(skills/1password): stop forcing tmux for desktop app auth (#52540). Thanks @koshaji and @tylerbittner.
422+
- **PR #94725** fix(doctor): warn on volatile SQLite state. Thanks @vincentkoc.
423+
- **PR #88551** fix(agents): skip auth gate for CLI-owned transport. Thanks @yu-xin-c.
424+
- **PR #88581** feat(commands): add /name to rename the current session from chat. Thanks @BSG2000.
425+
- **PR #94324** feat(codex): support app-server SecretRefs. Thanks @kevinlin-openai and @kevinslin.
426+
- **PR #90882** fix: add self-knowledge docs rule to system prompt. Related #90713. Thanks @SutraHsing.
427+
- **PR #94684** fix: #80507 show dry-run output for message send/poll. Thanks @lzyyzznl and @YB0y.
428+
- **PR #93823** fix(whatsapp): keep opening text chunk when first media fails on multi-chunk reply. Thanks @yetval.
429+
- **PR #89203** refactor: route SDK session compatibility through seam. Thanks @jalehman.
430+
- **PR #94453** fix: default cron runMode to "due" instead of "force" (#94270). Thanks @jincheng-xydt and @sallyom and @davectr.
431+
- **PR #94746** fix(note): prevent clack from re-breaking copy-sensitive tokens. Related #94730. Thanks @xzh-icenter and @berkgungor.
432+
- **PR #89904** refactor: route sdk session compatibility through accessor. Thanks @jalehman.
433+
- **PR #86719** fix(skills): retarget stale plugin skill symlinks. Related #85925. Thanks @stevenepalmer and @shakkernerd.
434+
- **PR #94337** fix(tui): show 0 not ? for fresh-session context tokens in footer. Thanks @mushuiyu886.
435+
- **PR #94539** fix(android): group settings by intent. Thanks @Tosko4.
436+
- **PR #92383** fix(gateway): never return an empty chat.history transcript. Thanks @Hidetsugu55.
437+
- **PR #92574** test(browser): cover action-input CLI request bodies. Related #83877. Thanks @yu-xin-c and @davinci282828.
438+
- **PR #92873** test(diffs): add viewerState, toolbar toggle, shadow root, and hydrateProps tests (fixes #83915). Thanks @liuhao1024 and @davinci282828.
439+
- **PR #94257** fix(sessions): preserve Media\* index alignment when reading user-turn fields. Thanks @Nas01010101.
440+
- **PR #94756** fix(codex): bound turn/start text when context budget is non-positive. Related #94748. Thanks @Nas01010101.
441+
- **PR #94729** fix(skills/trello): add curl to requires.bins to match body examples (fixes #94727). Thanks @liuhao1024 and @berkgungor.
442+
- **PR #94790** feat(slack): log INFO receipt for inbound app_mention events. Related #94691. Thanks @ZengWen-DT and @BryceMurray.
443+
- **PR #81696** fix: guard tool event callbacks (AI-assisted). Thanks @enjoylife1243.
444+
- **PR #94809** chore: forward-port alpha release fixes.
445+
- **PR #94612** fix(macos): open NSOpenPanel for embedded Control UI file inputs (#94468). Thanks @bbblending and @DINGDANGMAOUP.
446+
- **PR #89806** fix(feishu): avoid axios interceptor internals. Related #83913. Thanks @sweetcornna and @davinci282828.
447+
- **PR #91923** fix(ios): clean up notification settings state. Thanks @zats.
448+
- **PR #91345** fix: suggest close CLI commands. Related #83999. Thanks @glenn-agent and @HannesOberreiter.
449+
- **PR #94561** Add stdout diagnostics OTEL log exporter. Thanks @jesse-merhi.
450+
- **PR #91013** fix(gateway): ignore stale abort markers for fresh chat events. Related #91012. Thanks @nxmxbbd.
451+
- **PR #89279** fix(tasks): deliver ACP completions to bound Discord threads. Related #84022. Thanks @anyech and @h-mascot.
452+
- **PR #91656** test(cron): expand parseAbsoluteTimeMs test coverage to 39 cases. Related #91654. Thanks @SpecialLeon.
453+
- **PR #94810** fix(telegram): classify sendChatAction 401 by structured error_code, not bare substring match. Related #94787. Thanks @ZOOWH and @parveshsaini.
454+
- **PR #94737** fix(reply): clarify provider internal error copy. Thanks @snowzlmbot.
455+
- **PR #94868** fix(channels): preserve command progress detail. Thanks @vincentkoc.
456+
- **PR #94891** fix(telegram): send progress previews as html text. Thanks @obviyus.
457+
- **PR #94683** fix(outbound): keep direct-only targets out of group sessions. Related #92384. Thanks @scotthuang and @haiwei01.
458+
- **PR #92477** fix: migrate watch app to single-target app (Xcode 27+ compat). Thanks @zats and @joshavant.
459+
- **PR #94812** test(perf): compare saved CLI startup benchmarks. Thanks @FelixIsaac.
460+
- **PR #94856** fix(telegram): normalize all HTML tables before entity-escaping in rich messages. Related #94317. Thanks @zhangqueping and @jairrab.
461+
- **PR #91685** fix(cron): refuse keyless implicit isolated cron delivery inherited from shared agent-main bucket. Thanks @nxmxbbd.
415462

416463
## 2026.6.8
417464

scripts/docker/install-sh-e2e/run.sh

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -309,15 +309,63 @@ function extractTrailingJsonObject(input) {
309309
try {
310310
return JSON.parse(trimmed);
311311
} catch {
312-
// Some local runs emit stderr diagnostics before the final JSON payload.
313-
// Walk backward and keep the last parseable top-level object.
314-
for (let index = trimmed.lastIndexOf("{"); index >= 0; index = trimmed.lastIndexOf("{", index - 1)) {
315-
const candidate = trimmed.slice(index);
312+
// Agent lifecycle diagnostics can surround --json output. Prefer an agent
313+
// result envelope so a structured post-result diagnostic cannot replace it.
314+
let lastParsed;
315+
let lastAgentResult;
316+
for (let index = 0; index < trimmed.length; index += 1) {
317+
if (trimmed[index] !== "{") {
318+
continue;
319+
}
320+
let depth = 0;
321+
let inString = false;
322+
let escaping = false;
323+
let end = -1;
324+
for (let cursor = index; cursor < trimmed.length; cursor += 1) {
325+
const char = trimmed[cursor];
326+
if (inString) {
327+
if (escaping) {
328+
escaping = false;
329+
} else if (char === "\\") {
330+
escaping = true;
331+
} else if (char === '"') {
332+
inString = false;
333+
}
334+
continue;
335+
}
336+
if (char === '"') {
337+
inString = true;
338+
} else if (char === "{") {
339+
depth += 1;
340+
} else if (char === "}") {
341+
depth -= 1;
342+
if (depth === 0) {
343+
end = cursor;
344+
break;
345+
}
346+
}
347+
}
348+
if (end < 0) {
349+
continue;
350+
}
316351
try {
317-
return JSON.parse(candidate);
352+
lastParsed = JSON.parse(trimmed.slice(index, end + 1));
353+
if (
354+
Array.isArray(lastParsed?.result?.payloads) ||
355+
Array.isArray(lastParsed?.payloads)
356+
) {
357+
lastAgentResult = lastParsed;
358+
}
318359
} catch {
319360
// keep scanning
320361
}
362+
index = end;
363+
}
364+
if (lastAgentResult !== undefined) {
365+
return lastAgentResult;
366+
}
367+
if (lastParsed !== undefined) {
368+
return lastParsed;
321369
}
322370
throw new Error(`could not extract JSON payload from agent output:\n${trimmed}`);
323371
}

0 commit comments

Comments
 (0)