From e303b356ba23a99a0c057306bdc992e784bc50fb Mon Sep 17 00:00:00 2001 From: pandego <7780875+pandego@users.noreply.github.com> Date: Sun, 1 Mar 2026 14:52:55 +0100 Subject: [PATCH] fix(browser): detach tab-cap listing from openTab return path --- src/browser/server-context.remote-tab-ops.test.ts | 10 ++++++---- src/browser/server-context.ts | 14 ++++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/browser/server-context.remote-tab-ops.test.ts b/src/browser/server-context.remote-tab-ops.test.ts index 509c3e7a3c2..8d310f8bda9 100644 --- a/src/browser/server-context.remote-tab-ops.test.ts +++ b/src/browser/server-context.remote-tab-ops.test.ts @@ -486,10 +486,12 @@ describe("browser server-context tab selection state", () => { const opened = await openclaw.openTab("http://127.0.0.1:3009"); expect(opened.targetId).toBe("NEW"); - expect(fetchMock).toHaveBeenCalledWith( - expect.stringContaining("/json/close/OLD1"), - expect.any(Object), - ); + await vi.waitFor(() => { + expect(fetchMock).toHaveBeenCalledWith( + expect.stringContaining("/json/close/OLD1"), + expect.any(Object), + ); + }); }); it("does not fail tab open when managed-tab cleanup list fails", async () => { diff --git a/src/browser/server-context.ts b/src/browser/server-context.ts index 0da19af4f28..4cffd0be444 100644 --- a/src/browser/server-context.ts +++ b/src/browser/server-context.ts @@ -165,6 +165,12 @@ function createProfileContext( } }; + const triggerManagedTabLimit = (keepTargetId: string): void => { + void enforceManagedTabLimit(keepTargetId).catch(() => { + // best-effort cleanup only + }); + }; + const openTab = async (url: string): Promise => { const ssrfPolicyOpts = withBrowserNavigationPolicy(state().resolved.ssrfPolicy); @@ -181,7 +187,7 @@ function createProfileContext( }); const profileState = getProfileState(); profileState.lastTargetId = page.targetId; - await enforceManagedTabLimit(page.targetId); + triggerManagedTabLimit(page.targetId); return { targetId: page.targetId, title: page.title, @@ -208,12 +214,12 @@ function createProfileContext( const found = tabs.find((t) => t.targetId === createdViaCdp); if (found) { await assertBrowserNavigationResultAllowed({ url: found.url, ...ssrfPolicyOpts }); - await enforceManagedTabLimit(found.targetId); + triggerManagedTabLimit(found.targetId); return found; } await new Promise((r) => setTimeout(r, 100)); } - await enforceManagedTabLimit(createdViaCdp); + triggerManagedTabLimit(createdViaCdp); return { targetId: createdViaCdp, title: "", url, type: "page" }; } @@ -250,7 +256,7 @@ function createProfileContext( profileState.lastTargetId = created.id; const resolvedUrl = created.url ?? url; await assertBrowserNavigationResultAllowed({ url: resolvedUrl, ...ssrfPolicyOpts }); - await enforceManagedTabLimit(created.id); + triggerManagedTabLimit(created.id); return { targetId: created.id, title: created.title ?? "",