diff --git a/CHANGELOG.md b/CHANGELOG.md index 60f64bf2e3d..487f691fe22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,6 +106,7 @@ Docs: https://docs.openclaw.ai - Mattermost/threading: honor `replyToMode: "off"` for already-threaded inbound posts so threaded follow-ups can fall back to top-level replies when configured. (#52543) Thanks @RichardCao. - Telegram/replies: set `allow_sending_without_reply` on reply-targeted sends and media-error notices so deleted parent messages no longer drop otherwise valid replies. (#52524) Thanks @moltbot886. - Gateway/status: resolve env-backed `gateway.auth.*` SecretRefs before read-only probe auth checks so status no longer reports false probe failures when auth is configured through SecretRef. (#52513) Thanks @CodeForgeNet. +- Agents/exec: return plain-text failed tool output for timeouts and other non-success exec outcomes so models no longer parrot raw JSON error payloads back to users. (#52508) Thanks @martingarramon. - CLI/startup: lazy-load channel add and root help startup paths to trim avoidable RSS and help latency on constrained hosts. (#46784) Thanks @vincentkoc. - CLI/onboarding: import static provider definitions directly for onboarding model/config helpers so those paths no longer pull provider discovery just for built-in defaults. (#47467) Thanks @vincentkoc. - CLI/configure: clarify fresh-setup memory-search warnings so they say semantic recall needs at least one embedding provider, and scope the initial model allowlist picker to the provider selected in configure. Thanks @vincentkoc. diff --git a/src/agents/bash-tools.test.ts b/src/agents/bash-tools.test.ts index a56da935f86..44c5a369ba7 100644 --- a/src/agents/bash-tools.test.ts +++ b/src/agents/bash-tools.test.ts @@ -462,11 +462,21 @@ describe("exec tool backgrounding", () => { allowBackground: false, }); const result = await executeExecCommand(customBash, longDelayCmd); - const text = (result as { content: { text: string }[] }).content[0].text; + const text = readTextContent(result.content); expect(text).toMatch(/timed out/i); expect(text).toMatch(/re-run with a higher timeout/i); - const details = (result as { details: { status: string } }).details; - expect(details.status).toBe("failed"); + const details = result.details as { + status?: string; + exitCode?: number | null; + durationMs?: number; + aggregated?: string; + }; + expect(details).toMatchObject({ + status: "failed", + exitCode: null, + aggregated: "", + }); + expect(details.durationMs).toEqual(expect.any(Number)); }); it.each(DISALLOWED_ELEVATION_CASES)(