musistudio/claude-code-router · warning
[deep-link] Claude browser plugin status was not reachable o
Error message
[deep-link] Claude browser plugin status was not reachable on the running gateway; restarting gateway once. ${formatError(error)} What it means
Fetching the Claude browser plugin status from the running gateway failed inside ensureClaudeDesignWindowCdpOptions; the code logs and restarts the gateway once before retrying.
Source
Thrown at packages/electron/src/main/deep-link.ts:218
const restartedStatus = await gatewayService.start(config);
if (restartedStatus.state !== "running") {
throw new Error(restartedStatus.lastError || "CCR gateway did not restart.");
}
await waitForPluginAppUrl(appUrl, pluginAppStartupProbeTimeoutMs);
}
async function ensureClaudeDesignWindowCdpOptions(
config: AppConfig,
pluginId: string,
startedGateway: boolean
): ReturnType<typeof loadClaudeDesignWindowCdpOptions> {
try {
return await loadClaudeDesignWindowCdpOptions(config, pluginId);
} catch (error) {
if (startedGateway) {
throw error;
}
console.warn(`[deep-link] Claude browser plugin status was not reachable on the running gateway; restarting gateway once. ${formatError(error)}`);
}
const restartedStatus = await gatewayService.start(config);
if (restartedStatus.state !== "running") {
throw new Error(restartedStatus.lastError || "CCR gateway did not restart.");
}
return await loadClaudeDesignWindowCdpOptions(config, pluginId);
}
function isClaudeBrowserPlugin(pluginId: string): boolean {
return pluginId === CLAUDE_DESIGN_PLUGIN_ID || pluginId === CLAUDE_SHIP_PLUGIN_ID;
}
async function waitForPluginAppUrl(appUrl: string, timeoutMs: number): Promise<void> {
const deadline = Date.now() + timeoutMs;
let lastProbe = "timeout";
while (Date.now() <= deadline) {View on GitHub (pinned to 99f24806c6)
Solutions
- Confirm the Claude browser plugin is installed and enabled in gateway config
- Restart the gateway manually and retry the design link
- Upgrade gateway and plugin to matching versions
- Inspect gateway logs for the plugin's startup error
Defensive patterns
Strategy: retry
Validate before calling
const status = await gatewayService.pluginStatus(pluginId); if (!status?.running) await gatewayService.start(config);
Try / catch
catch (error) { warn; const s = await gatewayService.start(config); if (s.state !== 'running') throw new Error(s.lastError); } Prevention
- Ensure claude browser plugin installed before using design deep links
- Keep gateway and plugin versions aligned
When it happens
Trigger: claudeDesignCdp deep-link path: loadClaudeDesignWindowCdpOptions throws because the gateway responded non-200, the plugin status endpoint is missing, or the plugin failed to start — and the gateway wasn't started by this call.
Common situations: Claude browser plugin not installed/enabled, gateway running an older version without the status endpoint, or gateway restarting concurrently.
Related errors
- [deep-link] Plugin app URL was not reachable on the running
- Codex App DevTools port was not available${lastError ? `: ${
- Codex App CDP page target was not available${lastError ? `:
- Artifact origin is not the configured CCR gateway.
- Artifact URL does not use the CCR media artifact path.
AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27).
Data as JSON: /api/errors/dca164fcf61ad6b0.
Report an issue: GitHub.