{"record":{"id":"2400488a3c76117f","repo":"mastra-ai/mastra","slug":"no-browser-context-available-for-screencast","errorCode":null,"errorMessage":"No browser context available for screencast","messagePattern":"No browser context available for screencast","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"browser/browser-viewer/src/browser-viewer.ts","lineNumber":270,"sourceCode":"      activeTabIndex: activeIndex,\n    };\n  }\n\n  // ---------------------------------------------------------------------------\n  // Screencast Support\n  // ---------------------------------------------------------------------------\n\n  override async startScreencast(options?: ScreencastOptions): Promise<ScreencastStream> {\n    const threadId = options?.threadId ?? this.getCurrentThread();\n\n    // Create CDP session provider that creates FRESH sessions on each call\n    // This is critical for tab switching - when reconnecting, we need a CDP session\n    // attached to the CURRENT page, not the original page from launch\n    const provider: CdpSessionProvider = {\n      getCdpSession: async () => {\n        const cdpSession = await this.threadManager.createFreshCdpSession(threadId);\n        if (!cdpSession) {\n          throw new Error('No browser context available for screencast');\n        }\n\n        // Return wrapper that implements CdpSessionLike\n        return {\n          send: async (method: string, params?: Record<string, unknown>) => {\n            return cdpSession.send(method as any, params);\n          },\n          on: (event: string, handler: (params: unknown) => void) => {\n            cdpSession.on(event as any, handler);\n          },\n          off: (event: string, handler: (params: unknown) => void) => {\n            cdpSession.off(event as any, handler);\n          },\n        };\n      },\n      isBrowserRunning: () => this.isBrowserRunning(threadId),\n    };\n","sourceCodeStart":252,"sourceCodeEnd":288,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/browser/browser-viewer/src/browser-viewer.ts#L252-L288","documentation":"startScreencast needs a live CDP session attached to the currently active page so frames can be captured across tab switches. It asks the thread manager for a fresh CDP session; if no browser context exists for that thread, createFreshCdpSession returns null and this error is thrown instead of failing silently.","triggerScenarios":"Calling startScreencast for a threadId whose browser session was never launched, was already closed (e.g. via browser_close), or whose browser/page was disposed before the screencast started.","commonSituations":"Viewer frontend reconnecting after the agent closed its session; screencast started against a stale/expired thread; race where the browser tears down while the viewer boots.","solutions":["Ensure the thread's browser session exists (launch/reconnect) before starting the screencast.","Verify the threadId passed matches a live session; fall back to the viewer's current thread.","Reconnect the thread and retry the screencast after catching this error.","Check no concurrent browser_close is racing the viewer."],"exampleFix":"// before\nviewer.startScreencast('stale-thread'); // throws\n// after\nawait viewer.reconnectThread(threadId); // relaunch if missing\nawait viewer.startScreencast(threadId);","handlingStrategy":"retry","validationCode":"const session = await viewer.threadManager.createFreshCdpSession(threadId);\nif (!session) {\n  await viewer.reconnectThread(threadId); // relaunch before screencast\n}\nawait viewer.startScreencast(threadId);","typeGuard":"function hasCdpSession<T>(s: T | null | undefined): s is T {\n  return s !== null && s !== undefined;\n}","tryCatchPattern":"try {\n  await viewer.startScreencast(threadId);\n} catch (err) {\n  if (err instanceof Error && err.message === 'No browser context available for screencast') {\n    await viewer.reconnectThread(threadId);\n    await viewer.startScreencast(threadId); // one retry after relaunch\n    return;\n  }\n  throw err;\n}","preventionTips":["Verify the thread's browser session is live before opening the viewer.","Reconnect stale threads on viewer mount/reconnect instead of assuming liveness.","Avoid browser_close while a screencast is attached.","Refresh sessions proactively before TTL expiry."],"tags":["browser","cdp","screencast","missing-session"],"backgroundTag":"cdp-session-unavailable","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}