jackwener/OpenCLI · warning

[opencli] Tab ${tabId} URL is not debuggable (${tab.url}), r

Error message

[opencli] Tab ${tabId} URL is not debuggable (${tab.url}), re-resolving

What it means

A console warning logged during tab re-resolution when the bound tab still exists but its current URL is not debuggable (not http/https devtools-eligible), so the extension re-resolves to a different tab. It indicates the bound tab navigated somewhere automation cannot attach to.

Source

Thrown at extension/src/background.ts:1514

            : `Target tab is not the tab bound to session "${session.session}".`,
          'Run "opencli browser bind" again on a debuggable http(s) tab.',
        );
      }
      if (session && !matchesSession && session.preferredTabId === null && isDebuggableUrl(tab.url)) {
        // Tab drifted to another window but content is still valid.
        // Try to move it back instead of abandoning it.
        console.warn(`[opencli] Tab ${tabId} drifted to window ${tab.windowId}, moving back to ${session.windowId}`);
        try {
          await chrome.tabs.move(tabId, { windowId: session.windowId, index: -1 });
          const moved = await chrome.tabs.get(tabId);
          if (moved.windowId === session.windowId && isDebuggableUrl(moved.url)) {
            return { tabId, tab: moved };
          }
        } catch (moveErr) {
          console.warn(`[opencli] Failed to move tab back: ${moveErr}`);
        }
      } else if (!isDebuggableUrl(tab.url)) {
        console.warn(`[opencli] Tab ${tabId} URL is not debuggable (${tab.url}), re-resolving`);
      }
    } catch (err) {
      if (err instanceof CommandFailure) throw err;
      if (existingSession && !existingSession.owned) {
        automationSessions.delete(leaseKey);
        throw new CommandFailure(
          'bound_tab_gone',
          `Bound tab for session "${existingSession.session}" no longer exists.`,
          'Run "opencli browser bind" again, then retry the command.',
        );
      }
      console.warn(`[opencli] Tab ${tabId} no longer exists, re-resolving`);
    }
  }

  const existingPreferredTabId = existingSession?.preferredTabId ?? null;
  if (existingSession && existingPreferredTabId !== null) {
    const session = existingSession;

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Navigate the tab back to an http(s) URL before running commands
  2. Re-run 'opencli browser bind' on a debuggable http(s) tab
  3. Prevent manual navigation of the automation tab, or run automation in a dedicated window
  4. If a redirect causes it, intercept or whitelist the target URL in the automation flow
Defensive patterns

Strategy: validation

Validate before calling

const tab = await chrome.tabs.get(tabId);
if (!/^https?:/.test(tab.url ?? '')) await rebindToDebuggableTab();

Type guard

const isDebuggable = (url) => typeof url === 'string' && /^https?:\/\//.test(url);

Prevention

When it happens

Trigger: The bound tab navigated to chrome://, chrome-extension://, file://, about:blank-adjacent, or web store pages, then an automation command re-resolves the session's tab.

Common situations: User types a chrome:// URL in the automation tab; a redirect lands on a non-debuggable page; navigation to an internal page during a run.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/1ee378c0799fc866. Report an issue: GitHub.