{"record":{"id":"3514e6755046c978","repo":"mastra-ai/mastra","slug":"this-provider-does-not-support-connecting-to-ex","errorCode":null,"errorMessage":"${this.provider} does not support connecting to external CDP","messagePattern":"(.+?) does not support connecting to external CDP","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/browser/browser.ts","lineNumber":824,"sourceCode":"\n    return this._closePromise;\n  }\n\n  /**\n   * Connect to an external browser via CDP URL for screencast.\n   *\n   * Use this when an agent is using their own external CDP (e.g., browser-use cloud).\n   * Connects Playwright to the external browser to enable screencast without launching\n   * our own browser.\n   *\n   * Override this in subclasses that support external CDP connections.\n   * The base implementation throws an error.\n   *\n   * @param cdpUrl - The external CDP WebSocket URL (wss://... or ws://...)\n   * @param threadId - Thread ID to associate the session with\n   */\n  async connectToExternalCdp(_cdpUrl: string, _threadId?: string): Promise<void> {\n    throw new Error(`${this.provider} does not support connecting to external CDP`);\n  }\n\n  /**\n   * Ensure the browser is ready, launching if needed.\n   * If browser was previously closed, it will be re-launched.\n   */\n  async ensureReady(): Promise<void> {\n    if (this.status === 'ready') {\n      // Check if browser is still alive (handles external closure)\n      // checkBrowserAlive() should save lastBrowserState internally if it detects closure\n      const stillAlive = await this.checkBrowserAlive();\n      if (stillAlive) {\n        return;\n      }\n      // Browser was externally closed, mark as closed for re-launch\n      this.status = 'closed';\n    }\n    if (this.status === 'pending' || this.status === 'error' || this.status === 'closed') {","sourceCodeStart":806,"sourceCodeEnd":842,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/browser/browser.ts#L806-L842","documentation":"connectToExternalCdp is a base-class stub on MastraBrowser. Only providers that implement external CDP support override it; the default implementation always throws, stating which provider lacks support. Attaching to an externally running Chrome instance is opt-in per provider.","triggerScenarios":"Calling browser.connectToExternalCdp(cdpUrl, threadId?) on a provider subclass that has not overridden the method (e.g. a Playwright/agent-browser provider without CDP attach support).","commonSituations":"Assuming all providers can attach to an existing Chrome DevTools endpoint; migrating code from a CDP-capable provider to one that launches its own browser; passing a browserops endpoint string expecting it to be honored.","solutions":["Use a provider that implements connectToExternalCdp for external CDP attach.","Check the provider's API surface/docs for CDP support before calling.","Launch a managed browser instead of attaching externally.","Implement the override on a custom provider subclass."],"exampleFix":"// before\nawait unsupportedBrowser.connectToExternalCdp('ws://localhost:9222/...');\n// after\nconst browser = new CdpCapableBrowser({ provider: 'agent-browser' });\nawait browser.connectToExternalCdp('ws://localhost:9222/devtools/browser/...');","handlingStrategy":"validation","validationCode":"// capability check before attach\nif (browser.connectToExternalCdp === MastraBrowser.prototype.connectToExternalCdp) {\n  throw new Error(`Provider ${browser.provider} cannot attach to external CDP`);\n}\nawait browser.connectToExternalCdp(cdpUrl, threadId);","typeGuard":"interface CdpCapable { connectToExternalCdp(url: string, threadId?: string): Promise<void>; }\nfunction isCdpCapable(b: object): b is object & CdpCapable {\n  return b.connectToExternalCdp !== MastraBrowser.prototype.connectToExternalCdp;\n}","tryCatchPattern":"try {\n  await browser.connectToExternalCdp(url);\n} catch (err) {\n  if (err instanceof Error && err.message.endsWith('does not support connecting to external CDP')) {\n    // fall back to managed launch\n    await browser.launch();\n  } else throw err;\n}","preventionTips":["Check provider docs for CDP attach support before designing around it.","Feature-detect via prototype comparison rather than calling and catching.","Keep a capability matrix of providers your app relies on.","Pin the provider type in config so unsupported code paths are unreachable."],"tags":["cdp","unsupported-operation","provider-capability"],"backgroundTag":"unsupported-provider-operation","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T08:17:16.595Z"}