From a54b11f4c389354f91d984fff18c74dfcff2da96 Mon Sep 17 00:00:00 2001 From: robomp-bot Date: Wed, 29 Jul 2026 17:33:52 +0900 Subject: [PATCH] fix(collab-web): surface terminal auto_retry_end failures (cherry picked from commit 6a6c4014158d9636ed0e030837633ad313c1aa5a) --- packages/collab-web/CHANGELOG.md | 4 ++++ packages/collab-web/src/lib/client.ts | 3 +++ packages/collab-web/test/client.test.ts | 11 +++++++++++ 3 files changed, 18 insertions(+) diff --git a/packages/collab-web/CHANGELOG.md b/packages/collab-web/CHANGELOG.md index cf07b4023..ff8daa692 100644 --- a/packages/collab-web/CHANGELOG.md +++ b/packages/collab-web/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed the agent appearing to stop silently with no message: terminal `auto_retry_end` failures now surface as an error notice instead of being discarded. + ## [17.1.0] - 2026-07-24 ### Fixed diff --git a/packages/collab-web/src/lib/client.ts b/packages/collab-web/src/lib/client.ts index 6de49294c..0c6fe414b 100644 --- a/packages/collab-web/src/lib/client.ts +++ b/packages/collab-web/src/lib/client.ts @@ -454,6 +454,9 @@ export class GuestClient { case "auto_retry_start": this.#pushNotice("info", `retry ${event.attempt}/${event.maxAttempts}: ${event.errorMessage}`); break; + case "auto_retry_end": + if (!event.success) this.#pushNotice("error", event.finalError ?? "retry failed"); + break; case "auto_compaction_start": this.#pushNotice("info", `compacting context (${event.reason})`); break; diff --git a/packages/collab-web/test/client.test.ts b/packages/collab-web/test/client.test.ts index 11f8ada91..d979910a4 100644 --- a/packages/collab-web/test/client.test.ts +++ b/packages/collab-web/test/client.test.ts @@ -234,6 +234,17 @@ describe("GuestClient frame apply", () => { expect(notices[0]).toMatchObject({ level: "error", message: "boom" }); }); + it("auto_retry_end failure surfaces an error notice", () => { + const client = liveClient(); + client.applyFrameForTest({ + t: "event", + event: { type: "auto_retry_end", success: false, attempt: 3, finalError: "x" }, + }); + const notices = client.getSnapshot().notices; + expect(notices).toHaveLength(1); + expect(notices[0]).toMatchObject({ level: "error", message: "x" }); + }); + it("a pre-welcome error (hello rejection, e.g. protocol mismatch) ends the session with the host's reason", () => { const client = new GuestClient(LINK, "tester"); client.applyFrameForTest({