From e92079be6b7a9efcfbfcfe56036c8c3e7d7f0801 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 22 Apr 2026 03:05:40 +0100 Subject: [PATCH] fix: finish browser click timeout recovery (#63524) --- CHANGELOG.md | 1 + .../browser/src/browser/pw-tools-core.interactions.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42f1d72156e..401ac9f76c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Docs: https://docs.openclaw.ai ### Fixes - Browser/Chrome MCP: reset cached existing-session control sessions when a `navigate_page` call times out, so one stuck navigation no longer poisons the browser profile until a gateway restart. (#69733) Thanks @ayeshakhalid192007-dev. +- Browser/Chrome MCP: propagate click timeouts and abort signals to existing-session actions so a stuck click fails fast and reconnects instead of poisoning the browser tool until gateway restart. (#63524) Thanks @dongseok0. - OpenCode Go: canonicalize stale bundled `opencode-go` base URLs from `/go` or `/go/v1` to `/zen/go` or `/zen/go/v1`, so older generated model metadata stops hitting the 404 HTML endpoint. (#69898) - Channels/preview streaming: centralize draft-preview finalization so Slack, Discord, Mattermost, and Matrix no longer flush temporary preview messages for media/error finals, and preserve first-reply threading for normal fallback delivery. - Discord: keep slash command follow-up chunks ephemeral when the command is configured for ephemeral replies, so long `/status` output no longer leaks fallback model or runtime details into the public channel. (#69869) thanks @gumadeiras. diff --git a/extensions/browser/src/browser/pw-tools-core.interactions.ts b/extensions/browser/src/browser/pw-tools-core.interactions.ts index f0862700734..0dc295a5ea6 100644 --- a/extensions/browser/src/browser/pw-tools-core.interactions.ts +++ b/extensions/browser/src/browser/pw-tools-core.interactions.ts @@ -554,11 +554,11 @@ export async function clickViaPlaywright(opts: { ACT_MAX_CLICK_DELAY_MS, ); if (delayMs > 0) { - await awaitEvalWithAbort(locator.hover({ timeout }), abortPromise); + await awaitActionWithAbort(locator.hover({ timeout }), abortPromise); await new Promise((resolve) => setTimeout(resolve, delayMs)); } if (opts.doubleClick) { - await awaitEvalWithAbort( + await awaitActionWithAbort( locator.dblclick({ timeout, button: opts.button, @@ -568,7 +568,7 @@ export async function clickViaPlaywright(opts: { ); return; } - await awaitEvalWithAbort( + await awaitActionWithAbort( locator.click({ timeout, button: opts.button,