{"record":{"id":"dca164fcf61ad6b0","repo":"musistudio/claude-code-router","slug":"deep-link-claude-browser-plugin-status-was-not-r","errorCode":null,"errorMessage":"[deep-link] Claude browser plugin status was not reachable on the running gateway; restarting gateway once. ${formatError(error)}","messagePattern":"\\[deep-link\\] Claude browser plugin status was not reachable on the running gateway; restarting gateway once\\. (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/electron/src/main/deep-link.ts","lineNumber":218,"sourceCode":"  const restartedStatus = await gatewayService.start(config);\n  if (restartedStatus.state !== \"running\") {\n    throw new Error(restartedStatus.lastError || \"CCR gateway did not restart.\");\n  }\n  await waitForPluginAppUrl(appUrl, pluginAppStartupProbeTimeoutMs);\n}\n\nasync function ensureClaudeDesignWindowCdpOptions(\n  config: AppConfig,\n  pluginId: string,\n  startedGateway: boolean\n): ReturnType<typeof loadClaudeDesignWindowCdpOptions> {\n  try {\n    return await loadClaudeDesignWindowCdpOptions(config, pluginId);\n  } catch (error) {\n    if (startedGateway) {\n      throw error;\n    }\n    console.warn(`[deep-link] Claude browser plugin status was not reachable on the running gateway; restarting gateway once. ${formatError(error)}`);\n  }\n\n  const restartedStatus = await gatewayService.start(config);\n  if (restartedStatus.state !== \"running\") {\n    throw new Error(restartedStatus.lastError || \"CCR gateway did not restart.\");\n  }\n  return await loadClaudeDesignWindowCdpOptions(config, pluginId);\n}\n\nfunction isClaudeBrowserPlugin(pluginId: string): boolean {\n  return pluginId === CLAUDE_DESIGN_PLUGIN_ID || pluginId === CLAUDE_SHIP_PLUGIN_ID;\n}\n\nasync function waitForPluginAppUrl(appUrl: string, timeoutMs: number): Promise<void> {\n  const deadline = Date.now() + timeoutMs;\n  let lastProbe = \"timeout\";\n\n  while (Date.now() <= deadline) {","sourceCodeStart":200,"sourceCodeEnd":236,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/electron/src/main/deep-link.ts#L200-L236","documentation":"Fetching the Claude browser plugin status from the running gateway failed inside ensureClaudeDesignWindowCdpOptions; the code logs and restarts the gateway once before retrying.","triggerScenarios":"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.","commonSituations":"Claude browser plugin not installed/enabled, gateway running an older version without the status endpoint, or gateway restarting concurrently.","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"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"const status = await gatewayService.pluginStatus(pluginId); if (!status?.running) await gatewayService.start(config);","typeGuard":null,"tryCatchPattern":"catch (error) { warn; const s = await gatewayService.start(config); if (s.state !== 'running') throw new Error(s.lastError); }","preventionTips":["Ensure claude browser plugin installed before using design deep links","Keep gateway and plugin versions aligned"],"tags":["gateway","claude","plugin","cdp"],"backgroundTag":"plugin-status-unavailable","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}