From 6991f9ae1cc5d9c2558b6ec85a3fd3720f729a2a Mon Sep 17 00:00:00 2001 From: viettranx Date: Thu, 5 Mar 2026 10:12:59 +0700 Subject: [PATCH] fix(browser): clear refs on reconnect, add reconnect to ListTabs - Reset RefStore when connection drops to avoid stale DOM node refs - Add auto-reconnect logic to ListTabs for consistency with getPage - Remove console from auto-start list (no browser needed for empty msgs) Co-Authored-By: Claude Opus 4.6 --- pkg/browser/browser.go | 15 ++++++++++++++- pkg/browser/tool.go | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pkg/browser/browser.go b/pkg/browser/browser.go index 2ccf9074..703b0b99 100644 --- a/pkg/browser/browser.go +++ b/pkg/browser/browser.go @@ -77,6 +77,7 @@ func (m *Manager) Start(ctx context.Context) error { m.browser = nil m.pages = make(map[string]*rod.Page) m.console = make(map[string][]ConsoleMessage) + m.refs = NewRefStore() } var controlURL string @@ -169,7 +170,18 @@ func (m *Manager) ListTabs(ctx context.Context) ([]TabInfo, error) { pages, err := m.browser.Pages() if err != nil { - return nil, fmt.Errorf("list pages: %w", err) + if m.remoteURL != "" { + if reconnErr := m.reconnectLocked(); reconnErr != nil { + return nil, fmt.Errorf("list pages: %w (reconnect also failed: %v)", err, reconnErr) + } + m.logger.Info("auto-reconnected to remote Chrome") + pages, err = m.browser.Pages() + if err != nil { + return nil, fmt.Errorf("list pages after reconnect: %w", err) + } + } else { + return nil, fmt.Errorf("list pages: %w", err) + } } tabs := make([]TabInfo, 0, len(pages)) @@ -349,6 +361,7 @@ func (m *Manager) reconnectLocked() error { m.browser = nil m.pages = make(map[string]*rod.Page) m.console = make(map[string][]ConsoleMessage) + m.refs = NewRefStore() controlURL, err := resolveRemoteCDP(m.remoteURL) if err != nil { diff --git a/pkg/browser/tool.go b/pkg/browser/tool.go index 63e151a0..6a52a31c 100644 --- a/pkg/browser/tool.go +++ b/pkg/browser/tool.go @@ -139,7 +139,7 @@ func (t *BrowserTool) Execute(ctx context.Context, args map[string]interface{}) // Auto-start browser for actions that need it switch action { - case "open", "snapshot", "screenshot", "navigate", "act", "tabs", "console": + case "open", "snapshot", "screenshot", "navigate", "act", "tabs": if err := t.manager.Start(ctx); err != nil { return tools.ErrorResult(fmt.Sprintf("failed to start browser: %v", err)) }