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
- Navigate the tab back to an http(s) URL before running commands
- Re-run 'opencli browser bind' on a debuggable http(s) tab
- Prevent manual navigation of the automation tab, or run automation in a dedicated window
- 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
- Keep the automation tab on http(s) URLs
- Block manual navigation to chrome:// pages in the automation tab
- Rebind after intentional navigation to non-debuggable pages
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
- Bound tab for session "${session.session}" is not debuggable
- bound_tab_not_debuggable
- Cannot debug tab ${tabId}: URL is ${tab.url ?? 'unknown'}
- [opencli] Tab ${tabId} drifted to window ${tab.windowId}, mo
- [opencli] Failed to move tab back: ${moveErr}
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/1ee378c0799fc866.
Report an issue: GitHub.