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

  1. Confirm the Claude browser plugin is installed and enabled in gateway config
  2. Restart the gateway manually and retry the design link
  3. Upgrade gateway and plugin to matching versions
  4. 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

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


AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27). Data as JSON: /api/errors/dca164fcf61ad6b0. Report an issue: GitHub.