@computesdk/browserbase 0.3.7 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -61,8 +61,8 @@ function mapSessionOptions(config, options) {
|
|
|
61
61
|
if (options.timeout !== void 0) params.timeout = options.timeout;
|
|
62
62
|
if (options.extensionIds?.[0]) params.extensionId = options.extensionIds[0];
|
|
63
63
|
if (options.userMetadata) params.userMetadata = options.userMetadata;
|
|
64
|
-
if (options.proxies ===
|
|
65
|
-
params.proxies =
|
|
64
|
+
if (typeof options.proxies === "boolean") {
|
|
65
|
+
params.proxies = options.proxies;
|
|
66
66
|
} else if (Array.isArray(options.proxies)) {
|
|
67
67
|
params.proxies = options.proxies.map((p) => {
|
|
68
68
|
if (p.type === "custom" && p.server) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Browserbase Browser Provider - Factory-based Implementation\n *\n * Cloud browser sessions with stealth mode, proxies, session replay,\n * and persistent contexts via the Browserbase platform.\n */\n\nimport Browserbase from '@browserbasehq/sdk';\nimport { defineBrowserProvider } from '@computesdk/provider';\n\nimport type {\n CreateBrowserSessionOptions,\n BrowserProfile,\n BrowserExtension,\n BrowserLog,\n BrowserRecording,\n} from '@computesdk/provider';\n\n/**\n * Browserbase-specific configuration options\n */\nexport interface BrowserbaseConfig {\n /** Browserbase API key — falls back to BROWSERBASE_API_KEY env var */\n apiKey?: string;\n /** Browserbase project ID — falls back to BROWSERBASE_PROJECT_ID env var */\n projectId?: string;\n}\n\n/**\n * The native Browserbase session object returned by their SDK\n */\ntype BrowserbaseSession = Awaited<ReturnType<InstanceType<typeof Browserbase>['sessions']['create']>>;\n\n/**\n * Resolve config values from explicit config or environment variables\n */\nfunction resolveConfig(config: BrowserbaseConfig) {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.BROWSERBASE_API_KEY) || '';\n const projectId = config.projectId || (typeof process !== 'undefined' && process.env?.BROWSERBASE_PROJECT_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n `Missing Browserbase API key. Provide 'apiKey' in config or set BROWSERBASE_API_KEY environment variable. ` +\n `Get your API key from https://www.browserbase.com/settings`\n );\n }\n\n return { apiKey, projectId };\n}\n\n/**\n * Create a Browserbase SDK client from config\n */\nfunction createClient(config: BrowserbaseConfig): Browserbase {\n const { apiKey } = resolveConfig(config);\n return new Browserbase({ apiKey });\n}\n\n/**\n * Map ComputeSDK session options to Browserbase create session params\n */\nfunction mapSessionOptions(config: BrowserbaseConfig, options?: CreateBrowserSessionOptions) {\n const { projectId } = resolveConfig(config);\n\n if (!options) {\n return projectId ? { projectId } : {};\n }\n\n const params: Record<string, any> = {};\n if (projectId) params.projectId = projectId;\n if (options.region) params.region = options.region;\n if (options.keepAlive !== undefined) params.keepAlive = options.keepAlive;\n if (options.timeout !== undefined) params.timeout = options.timeout;\n // Browserbase accepts a single extensionId per session\n if (options.extensionIds?.[0]) params.extensionId = options.extensionIds[0];\n if (options.userMetadata) params.userMetadata = options.userMetadata;\n\n // Proxy configuration\n if (options.proxies === true) {\n params.proxies = true;\n } else if (Array.isArray(options.proxies)) {\n params.proxies = options.proxies.map((p: any) => {\n if (p.type === 'custom' && p.server) {\n return {\n type: 'external' as const,\n server: p.server,\n username: p.username,\n password: p.password,\n domainPattern: p.domainPattern,\n };\n }\n return {\n type: 'browserbase' as const,\n geolocation: p.geolocation,\n domainPattern: p.domainPattern,\n };\n });\n }\n\n // Browser settings\n const browserSettings: Record<string, any> = {};\n if (options.viewport) browserSettings.viewport = options.viewport;\n if (options.stealth !== undefined) browserSettings.advancedStealth = options.stealth;\n if (options.recording !== undefined) browserSettings.recordSession = options.recording;\n if (options.logging !== undefined) browserSettings.logSession = options.logging;\n if (options.profileId) {\n browserSettings.context = { id: options.profileId, persist: true };\n }\n\n if (Object.keys(browserSettings).length > 0) {\n params.browserSettings = browserSettings;\n }\n\n return params;\n}\n\n/**\n * Normalize a Browserbase session into our standard shape\n */\nfunction normalizeSession(session: BrowserbaseSession) {\n return {\n session,\n sessionId: session.id,\n connectUrl: session.connectUrl,\n status: mapStatus(session.status),\n };\n}\n\nfunction mapStatus(status: string): 'created' | 'running' | 'completed' | 'failed' | 'timed_out' {\n switch (status) {\n case 'RUNNING': return 'running';\n case 'COMPLETED': return 'completed';\n case 'FAILED':\n case 'ERROR': return 'failed';\n case 'TIMED_OUT': return 'timed_out';\n default: return 'created';\n }\n}\n\n/**\n * Create a Browserbase browser provider instance\n *\n * @example\n * ```ts\n * import { browserbase } from '@computesdk/browserbase';\n *\n * const bb = browserbase({ apiKey: 'bb_live_...' });\n *\n * // Create a stealth browser session\n * const session = await bb.session.create({ stealth: true, proxies: true });\n * console.log(session.connectUrl);\n *\n * // Connect with Playwright\n * const browser = await chromium.connectOverCDP(session.connectUrl);\n * const page = browser.contexts()[0].pages()[0];\n * await page.goto('https://example.com');\n *\n * // Get session recording after\n * const recording = await session.getRecording();\n * ```\n */\nexport const browserbase = defineBrowserProvider<BrowserbaseSession, BrowserbaseConfig>({\n name: 'browserbase',\n methods: {\n // ─── Session Lifecycle ─────────────────────────────────────────────\n session: {\n create: async (config, options) => {\n const client = createClient(config);\n const params = mapSessionOptions(config, options);\n const session = await client.sessions.create(params);\n return normalizeSession(session);\n },\n\n getById: async (config, sessionId) => {\n const client = createClient(config);\n try {\n const session = await client.sessions.retrieve(sessionId);\n return normalizeSession(session as BrowserbaseSession);\n } catch {\n return null;\n }\n },\n\n list: async (config) => {\n const client = createClient(config);\n const response = await client.sessions.list();\n return (response as BrowserbaseSession[]).map(normalizeSession);\n },\n\n destroy: async (config, sessionId) => {\n const client = createClient(config);\n await client.sessions.update(sessionId, { status: 'REQUEST_RELEASE' });\n },\n\n getConnectUrl: async (config, sessionId) => {\n const client = createClient(config);\n const session = await client.sessions.retrieve(sessionId);\n return (session as BrowserbaseSession).connectUrl;\n },\n },\n\n // ─── Profiles (Browserbase Contexts) ───────────────────────────────\n profile: {\n create: async (config, options) => {\n const client = createClient(config);\n const { projectId } = resolveConfig(config);\n const result = await client.contexts.create(projectId ? { projectId } : {});\n return {\n profileId: result.id,\n name: options?.name,\n metadata: options?.metadata as Record<string, unknown> | undefined,\n } satisfies BrowserProfile;\n },\n\n get: async (config, profileId) => {\n const client = createClient(config);\n try {\n const result = await client.contexts.retrieve(profileId);\n return { profileId: result.id } satisfies BrowserProfile;\n } catch {\n return null;\n }\n },\n\n list: async (_config) => {\n // Browserbase API doesn't expose a list contexts endpoint\n // Return empty — users track their own context IDs\n return [];\n },\n\n delete: async (config, profileId) => {\n const client = createClient(config);\n await client.contexts.delete(profileId);\n },\n },\n\n // ─── Extensions ────────────────────────────────────────────────────\n extension: {\n create: async (config, options) => {\n const client = createClient(config);\n const blob = typeof options.file === 'string'\n ? new Blob([options.file])\n : new Blob([new Uint8Array(options.file).buffer as ArrayBuffer]);\n const file = new File([blob], options.name ?? 'extension.zip');\n const result = await client.extensions.create({ file });\n return {\n extensionId: result.id,\n name: options.name,\n } satisfies BrowserExtension;\n },\n\n get: async (config, extensionId) => {\n const client = createClient(config);\n try {\n const result = await client.extensions.retrieve(extensionId);\n return { extensionId: result.id } satisfies BrowserExtension;\n } catch {\n return null;\n }\n },\n\n delete: async (config, extensionId) => {\n const client = createClient(config);\n await client.extensions.delete(extensionId);\n },\n },\n\n // ─── Logs ──────────────────────────────────────────────────────────\n logs: {\n list: async (config, sessionId) => {\n const client = createClient(config);\n const response = await client.sessions.logs.list(sessionId);\n return (response as any[]).map(log => ({\n timestamp: new Date(log.timestamp),\n level: (log.level ?? 'info') as BrowserLog['level'],\n message: log.message ?? '',\n data: log.params,\n }));\n },\n },\n\n // ─── Recordings ────────────────────────────────────────────────────\n recording: {\n get: async (config, sessionId) => {\n const client = createClient(config);\n try {\n const data = await client.sessions.recording.retrieve(sessionId);\n return {\n recordingId: sessionId,\n sessionId,\n format: 'rrweb',\n data,\n } satisfies BrowserRecording;\n } catch {\n return null;\n }\n },\n },\n },\n});\n"],"mappings":"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","names":["Browserbase"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Browserbase Browser Provider - Factory-based Implementation\n *\n * Cloud browser sessions with stealth mode, proxies, session replay,\n * and persistent contexts via the Browserbase platform.\n */\n\nimport Browserbase from '@browserbasehq/sdk';\nimport { defineBrowserProvider } from '@computesdk/provider';\n\nimport type {\n CreateBrowserSessionOptions,\n BrowserProfile,\n BrowserExtension,\n BrowserLog,\n BrowserRecording,\n} from '@computesdk/provider';\n\n/**\n * Browserbase-specific configuration options\n */\nexport interface BrowserbaseConfig {\n /** Browserbase API key — falls back to BROWSERBASE_API_KEY env var */\n apiKey?: string;\n /** Browserbase project ID — falls back to BROWSERBASE_PROJECT_ID env var */\n projectId?: string;\n}\n\n/**\n * The native Browserbase session object returned by their SDK\n */\ntype BrowserbaseSession = Awaited<ReturnType<InstanceType<typeof Browserbase>['sessions']['create']>>;\n\n/**\n * Resolve config values from explicit config or environment variables\n */\nfunction resolveConfig(config: BrowserbaseConfig) {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.BROWSERBASE_API_KEY) || '';\n const projectId = config.projectId || (typeof process !== 'undefined' && process.env?.BROWSERBASE_PROJECT_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n `Missing Browserbase API key. Provide 'apiKey' in config or set BROWSERBASE_API_KEY environment variable. ` +\n `Get your API key from https://www.browserbase.com/settings`\n );\n }\n\n return { apiKey, projectId };\n}\n\n/**\n * Create a Browserbase SDK client from config\n */\nfunction createClient(config: BrowserbaseConfig): Browserbase {\n const { apiKey } = resolveConfig(config);\n return new Browserbase({ apiKey });\n}\n\n/**\n * Map ComputeSDK session options to Browserbase create session params\n */\nfunction mapSessionOptions(config: BrowserbaseConfig, options?: CreateBrowserSessionOptions) {\n const { projectId } = resolveConfig(config);\n\n if (!options) {\n return projectId ? { projectId } : {};\n }\n\n const params: Record<string, any> = {};\n if (projectId) params.projectId = projectId;\n if (options.region) params.region = options.region;\n if (options.keepAlive !== undefined) params.keepAlive = options.keepAlive;\n if (options.timeout !== undefined) params.timeout = options.timeout;\n // Browserbase accepts a single extensionId per session\n if (options.extensionIds?.[0]) params.extensionId = options.extensionIds[0];\n if (options.userMetadata) params.userMetadata = options.userMetadata;\n\n // Proxy configuration\n if (typeof options.proxies === 'boolean') {\n params.proxies = options.proxies;\n } else if (Array.isArray(options.proxies)) {\n params.proxies = options.proxies.map((p: any) => {\n if (p.type === 'custom' && p.server) {\n return {\n type: 'external' as const,\n server: p.server,\n username: p.username,\n password: p.password,\n domainPattern: p.domainPattern,\n };\n }\n return {\n type: 'browserbase' as const,\n geolocation: p.geolocation,\n domainPattern: p.domainPattern,\n };\n });\n }\n\n // Browser settings\n const browserSettings: Record<string, any> = {};\n if (options.viewport) browserSettings.viewport = options.viewport;\n if (options.stealth !== undefined) browserSettings.advancedStealth = options.stealth;\n if (options.recording !== undefined) browserSettings.recordSession = options.recording;\n if (options.logging !== undefined) browserSettings.logSession = options.logging;\n if (options.profileId) {\n browserSettings.context = { id: options.profileId, persist: true };\n }\n\n if (Object.keys(browserSettings).length > 0) {\n params.browserSettings = browserSettings;\n }\n\n return params;\n}\n\n/**\n * Normalize a Browserbase session into our standard shape\n */\nfunction normalizeSession(session: BrowserbaseSession) {\n return {\n session,\n sessionId: session.id,\n connectUrl: session.connectUrl,\n status: mapStatus(session.status),\n };\n}\n\nfunction mapStatus(status: string): 'created' | 'running' | 'completed' | 'failed' | 'timed_out' {\n switch (status) {\n case 'RUNNING': return 'running';\n case 'COMPLETED': return 'completed';\n case 'FAILED':\n case 'ERROR': return 'failed';\n case 'TIMED_OUT': return 'timed_out';\n default: return 'created';\n }\n}\n\n/**\n * Create a Browserbase browser provider instance\n *\n * @example\n * ```ts\n * import { browserbase } from '@computesdk/browserbase';\n *\n * const bb = browserbase({ apiKey: 'bb_live_...' });\n *\n * // Create a stealth browser session\n * const session = await bb.session.create({ stealth: true, proxies: true });\n * console.log(session.connectUrl);\n *\n * // Connect with Playwright\n * const browser = await chromium.connectOverCDP(session.connectUrl);\n * const page = browser.contexts()[0].pages()[0];\n * await page.goto('https://example.com');\n *\n * // Get session recording after\n * const recording = await session.getRecording();\n * ```\n */\nexport const browserbase = defineBrowserProvider<BrowserbaseSession, BrowserbaseConfig>({\n name: 'browserbase',\n methods: {\n // ─── Session Lifecycle ─────────────────────────────────────────────\n session: {\n create: async (config, options) => {\n const client = createClient(config);\n const params = mapSessionOptions(config, options);\n const session = await client.sessions.create(params);\n return normalizeSession(session);\n },\n\n getById: async (config, sessionId) => {\n const client = createClient(config);\n try {\n const session = await client.sessions.retrieve(sessionId);\n return normalizeSession(session as BrowserbaseSession);\n } catch {\n return null;\n }\n },\n\n list: async (config) => {\n const client = createClient(config);\n const response = await client.sessions.list();\n return (response as BrowserbaseSession[]).map(normalizeSession);\n },\n\n destroy: async (config, sessionId) => {\n const client = createClient(config);\n await client.sessions.update(sessionId, { status: 'REQUEST_RELEASE' });\n },\n\n getConnectUrl: async (config, sessionId) => {\n const client = createClient(config);\n const session = await client.sessions.retrieve(sessionId);\n return (session as BrowserbaseSession).connectUrl;\n },\n },\n\n // ─── Profiles (Browserbase Contexts) ───────────────────────────────\n profile: {\n create: async (config, options) => {\n const client = createClient(config);\n const { projectId } = resolveConfig(config);\n const result = await client.contexts.create(projectId ? { projectId } : {});\n return {\n profileId: result.id,\n name: options?.name,\n metadata: options?.metadata as Record<string, unknown> | undefined,\n } satisfies BrowserProfile;\n },\n\n get: async (config, profileId) => {\n const client = createClient(config);\n try {\n const result = await client.contexts.retrieve(profileId);\n return { profileId: result.id } satisfies BrowserProfile;\n } catch {\n return null;\n }\n },\n\n list: async (_config) => {\n // Browserbase API doesn't expose a list contexts endpoint\n // Return empty — users track their own context IDs\n return [];\n },\n\n delete: async (config, profileId) => {\n const client = createClient(config);\n await client.contexts.delete(profileId);\n },\n },\n\n // ─── Extensions ────────────────────────────────────────────────────\n extension: {\n create: async (config, options) => {\n const client = createClient(config);\n const blob = typeof options.file === 'string'\n ? new Blob([options.file])\n : new Blob([new Uint8Array(options.file).buffer as ArrayBuffer]);\n const file = new File([blob], options.name ?? 'extension.zip');\n const result = await client.extensions.create({ file });\n return {\n extensionId: result.id,\n name: options.name,\n } satisfies BrowserExtension;\n },\n\n get: async (config, extensionId) => {\n const client = createClient(config);\n try {\n const result = await client.extensions.retrieve(extensionId);\n return { extensionId: result.id } satisfies BrowserExtension;\n } catch {\n return null;\n }\n },\n\n delete: async (config, extensionId) => {\n const client = createClient(config);\n await client.extensions.delete(extensionId);\n },\n },\n\n // ─── Logs ──────────────────────────────────────────────────────────\n logs: {\n list: async (config, sessionId) => {\n const client = createClient(config);\n const response = await client.sessions.logs.list(sessionId);\n return (response as any[]).map(log => ({\n timestamp: new Date(log.timestamp),\n level: (log.level ?? 'info') as BrowserLog['level'],\n message: log.message ?? '',\n data: log.params,\n }));\n },\n },\n\n // ─── Recordings ────────────────────────────────────────────────────\n recording: {\n get: async (config, sessionId) => {\n const client = createClient(config);\n try {\n const data = await client.sessions.recording.retrieve(sessionId);\n return {\n recordingId: sessionId,\n sessionId,\n format: 'rrweb',\n data,\n } satisfies BrowserRecording;\n } catch {\n return null;\n }\n },\n },\n },\n});\n"],"mappings":"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","names":["Browserbase"]}
|
package/dist/index.js
CHANGED
|
@@ -27,8 +27,8 @@ function mapSessionOptions(config, options) {
|
|
|
27
27
|
if (options.timeout !== void 0) params.timeout = options.timeout;
|
|
28
28
|
if (options.extensionIds?.[0]) params.extensionId = options.extensionIds[0];
|
|
29
29
|
if (options.userMetadata) params.userMetadata = options.userMetadata;
|
|
30
|
-
if (options.proxies ===
|
|
31
|
-
params.proxies =
|
|
30
|
+
if (typeof options.proxies === "boolean") {
|
|
31
|
+
params.proxies = options.proxies;
|
|
32
32
|
} else if (Array.isArray(options.proxies)) {
|
|
33
33
|
params.proxies = options.proxies.map((p) => {
|
|
34
34
|
if (p.type === "custom" && p.server) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Browserbase Browser Provider - Factory-based Implementation\n *\n * Cloud browser sessions with stealth mode, proxies, session replay,\n * and persistent contexts via the Browserbase platform.\n */\n\nimport Browserbase from '@browserbasehq/sdk';\nimport { defineBrowserProvider } from '@computesdk/provider';\n\nimport type {\n CreateBrowserSessionOptions,\n BrowserProfile,\n BrowserExtension,\n BrowserLog,\n BrowserRecording,\n} from '@computesdk/provider';\n\n/**\n * Browserbase-specific configuration options\n */\nexport interface BrowserbaseConfig {\n /** Browserbase API key — falls back to BROWSERBASE_API_KEY env var */\n apiKey?: string;\n /** Browserbase project ID — falls back to BROWSERBASE_PROJECT_ID env var */\n projectId?: string;\n}\n\n/**\n * The native Browserbase session object returned by their SDK\n */\ntype BrowserbaseSession = Awaited<ReturnType<InstanceType<typeof Browserbase>['sessions']['create']>>;\n\n/**\n * Resolve config values from explicit config or environment variables\n */\nfunction resolveConfig(config: BrowserbaseConfig) {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.BROWSERBASE_API_KEY) || '';\n const projectId = config.projectId || (typeof process !== 'undefined' && process.env?.BROWSERBASE_PROJECT_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n `Missing Browserbase API key. Provide 'apiKey' in config or set BROWSERBASE_API_KEY environment variable. ` +\n `Get your API key from https://www.browserbase.com/settings`\n );\n }\n\n return { apiKey, projectId };\n}\n\n/**\n * Create a Browserbase SDK client from config\n */\nfunction createClient(config: BrowserbaseConfig): Browserbase {\n const { apiKey } = resolveConfig(config);\n return new Browserbase({ apiKey });\n}\n\n/**\n * Map ComputeSDK session options to Browserbase create session params\n */\nfunction mapSessionOptions(config: BrowserbaseConfig, options?: CreateBrowserSessionOptions) {\n const { projectId } = resolveConfig(config);\n\n if (!options) {\n return projectId ? { projectId } : {};\n }\n\n const params: Record<string, any> = {};\n if (projectId) params.projectId = projectId;\n if (options.region) params.region = options.region;\n if (options.keepAlive !== undefined) params.keepAlive = options.keepAlive;\n if (options.timeout !== undefined) params.timeout = options.timeout;\n // Browserbase accepts a single extensionId per session\n if (options.extensionIds?.[0]) params.extensionId = options.extensionIds[0];\n if (options.userMetadata) params.userMetadata = options.userMetadata;\n\n // Proxy configuration\n if (options.proxies === true) {\n params.proxies = true;\n } else if (Array.isArray(options.proxies)) {\n params.proxies = options.proxies.map((p: any) => {\n if (p.type === 'custom' && p.server) {\n return {\n type: 'external' as const,\n server: p.server,\n username: p.username,\n password: p.password,\n domainPattern: p.domainPattern,\n };\n }\n return {\n type: 'browserbase' as const,\n geolocation: p.geolocation,\n domainPattern: p.domainPattern,\n };\n });\n }\n\n // Browser settings\n const browserSettings: Record<string, any> = {};\n if (options.viewport) browserSettings.viewport = options.viewport;\n if (options.stealth !== undefined) browserSettings.advancedStealth = options.stealth;\n if (options.recording !== undefined) browserSettings.recordSession = options.recording;\n if (options.logging !== undefined) browserSettings.logSession = options.logging;\n if (options.profileId) {\n browserSettings.context = { id: options.profileId, persist: true };\n }\n\n if (Object.keys(browserSettings).length > 0) {\n params.browserSettings = browserSettings;\n }\n\n return params;\n}\n\n/**\n * Normalize a Browserbase session into our standard shape\n */\nfunction normalizeSession(session: BrowserbaseSession) {\n return {\n session,\n sessionId: session.id,\n connectUrl: session.connectUrl,\n status: mapStatus(session.status),\n };\n}\n\nfunction mapStatus(status: string): 'created' | 'running' | 'completed' | 'failed' | 'timed_out' {\n switch (status) {\n case 'RUNNING': return 'running';\n case 'COMPLETED': return 'completed';\n case 'FAILED':\n case 'ERROR': return 'failed';\n case 'TIMED_OUT': return 'timed_out';\n default: return 'created';\n }\n}\n\n/**\n * Create a Browserbase browser provider instance\n *\n * @example\n * ```ts\n * import { browserbase } from '@computesdk/browserbase';\n *\n * const bb = browserbase({ apiKey: 'bb_live_...' });\n *\n * // Create a stealth browser session\n * const session = await bb.session.create({ stealth: true, proxies: true });\n * console.log(session.connectUrl);\n *\n * // Connect with Playwright\n * const browser = await chromium.connectOverCDP(session.connectUrl);\n * const page = browser.contexts()[0].pages()[0];\n * await page.goto('https://example.com');\n *\n * // Get session recording after\n * const recording = await session.getRecording();\n * ```\n */\nexport const browserbase = defineBrowserProvider<BrowserbaseSession, BrowserbaseConfig>({\n name: 'browserbase',\n methods: {\n // ─── Session Lifecycle ─────────────────────────────────────────────\n session: {\n create: async (config, options) => {\n const client = createClient(config);\n const params = mapSessionOptions(config, options);\n const session = await client.sessions.create(params);\n return normalizeSession(session);\n },\n\n getById: async (config, sessionId) => {\n const client = createClient(config);\n try {\n const session = await client.sessions.retrieve(sessionId);\n return normalizeSession(session as BrowserbaseSession);\n } catch {\n return null;\n }\n },\n\n list: async (config) => {\n const client = createClient(config);\n const response = await client.sessions.list();\n return (response as BrowserbaseSession[]).map(normalizeSession);\n },\n\n destroy: async (config, sessionId) => {\n const client = createClient(config);\n await client.sessions.update(sessionId, { status: 'REQUEST_RELEASE' });\n },\n\n getConnectUrl: async (config, sessionId) => {\n const client = createClient(config);\n const session = await client.sessions.retrieve(sessionId);\n return (session as BrowserbaseSession).connectUrl;\n },\n },\n\n // ─── Profiles (Browserbase Contexts) ───────────────────────────────\n profile: {\n create: async (config, options) => {\n const client = createClient(config);\n const { projectId } = resolveConfig(config);\n const result = await client.contexts.create(projectId ? { projectId } : {});\n return {\n profileId: result.id,\n name: options?.name,\n metadata: options?.metadata as Record<string, unknown> | undefined,\n } satisfies BrowserProfile;\n },\n\n get: async (config, profileId) => {\n const client = createClient(config);\n try {\n const result = await client.contexts.retrieve(profileId);\n return { profileId: result.id } satisfies BrowserProfile;\n } catch {\n return null;\n }\n },\n\n list: async (_config) => {\n // Browserbase API doesn't expose a list contexts endpoint\n // Return empty — users track their own context IDs\n return [];\n },\n\n delete: async (config, profileId) => {\n const client = createClient(config);\n await client.contexts.delete(profileId);\n },\n },\n\n // ─── Extensions ────────────────────────────────────────────────────\n extension: {\n create: async (config, options) => {\n const client = createClient(config);\n const blob = typeof options.file === 'string'\n ? new Blob([options.file])\n : new Blob([new Uint8Array(options.file).buffer as ArrayBuffer]);\n const file = new File([blob], options.name ?? 'extension.zip');\n const result = await client.extensions.create({ file });\n return {\n extensionId: result.id,\n name: options.name,\n } satisfies BrowserExtension;\n },\n\n get: async (config, extensionId) => {\n const client = createClient(config);\n try {\n const result = await client.extensions.retrieve(extensionId);\n return { extensionId: result.id } satisfies BrowserExtension;\n } catch {\n return null;\n }\n },\n\n delete: async (config, extensionId) => {\n const client = createClient(config);\n await client.extensions.delete(extensionId);\n },\n },\n\n // ─── Logs ──────────────────────────────────────────────────────────\n logs: {\n list: async (config, sessionId) => {\n const client = createClient(config);\n const response = await client.sessions.logs.list(sessionId);\n return (response as any[]).map(log => ({\n timestamp: new Date(log.timestamp),\n level: (log.level ?? 'info') as BrowserLog['level'],\n message: log.message ?? '',\n data: log.params,\n }));\n },\n },\n\n // ─── Recordings ────────────────────────────────────────────────────\n recording: {\n get: async (config, sessionId) => {\n const client = createClient(config);\n try {\n const data = await client.sessions.recording.retrieve(sessionId);\n return {\n recordingId: sessionId,\n sessionId,\n format: 'rrweb',\n data,\n } satisfies BrowserRecording;\n } catch {\n return null;\n }\n },\n },\n },\n});\n"],"mappings":";AAOA,OAAO,iBAAiB;AACxB,SAAS,6BAA6B;AA4BtC,SAAS,cAAc,QAA2B;AAChD,QAAM,SAAS,OAAO,UAAW,OAAO,YAAY,eAAe,QAAQ,KAAK,uBAAwB;AACxG,QAAM,YAAY,OAAO,aAAc,OAAO,YAAY,eAAe,QAAQ,KAAK,0BAA2B;AAEjH,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,UAAU;AAC7B;AAKA,SAAS,aAAa,QAAwC;AAC5D,QAAM,EAAE,OAAO,IAAI,cAAc,MAAM;AACvC,SAAO,IAAI,YAAY,EAAE,OAAO,CAAC;AACnC;AAKA,SAAS,kBAAkB,QAA2B,SAAuC;AAC3F,QAAM,EAAE,UAAU,IAAI,cAAc,MAAM;AAE1C,MAAI,CAAC,SAAS;AACZ,WAAO,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,EACtC;AAEA,QAAM,SAA8B,CAAC;AACrC,MAAI,UAAW,QAAO,YAAY;AAClC,MAAI,QAAQ,OAAQ,QAAO,SAAS,QAAQ;AAC5C,MAAI,QAAQ,cAAc,OAAW,QAAO,YAAY,QAAQ;AAChE,MAAI,QAAQ,YAAY,OAAW,QAAO,UAAU,QAAQ;AAE5D,MAAI,QAAQ,eAAe,CAAC,EAAG,QAAO,cAAc,QAAQ,aAAa,CAAC;AAC1E,MAAI,QAAQ,aAAc,QAAO,eAAe,QAAQ;AAGxD,MAAI,QAAQ,YAAY,MAAM;AAC5B,WAAO,UAAU;AAAA,EACnB,WAAW,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACzC,WAAO,UAAU,QAAQ,QAAQ,IAAI,CAAC,MAAW;AAC/C,UAAI,EAAE,SAAS,YAAY,EAAE,QAAQ;AACnC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,EAAE;AAAA,UACV,UAAU,EAAE;AAAA,UACZ,UAAU,EAAE;AAAA,UACZ,eAAe,EAAE;AAAA,QACnB;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa,EAAE;AAAA,QACf,eAAe,EAAE;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,kBAAuC,CAAC;AAC9C,MAAI,QAAQ,SAAU,iBAAgB,WAAW,QAAQ;AACzD,MAAI,QAAQ,YAAY,OAAW,iBAAgB,kBAAkB,QAAQ;AAC7E,MAAI,QAAQ,cAAc,OAAW,iBAAgB,gBAAgB,QAAQ;AAC7E,MAAI,QAAQ,YAAY,OAAW,iBAAgB,aAAa,QAAQ;AACxE,MAAI,QAAQ,WAAW;AACrB,oBAAgB,UAAU,EAAE,IAAI,QAAQ,WAAW,SAAS,KAAK;AAAA,EACnE;AAEA,MAAI,OAAO,KAAK,eAAe,EAAE,SAAS,GAAG;AAC3C,WAAO,kBAAkB;AAAA,EAC3B;AAEA,SAAO;AACT;AAKA,SAAS,iBAAiB,SAA6B;AACrD,SAAO;AAAA,IACL;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,QAAQ,UAAU,QAAQ,MAAM;AAAA,EAClC;AACF;AAEA,SAAS,UAAU,QAA8E;AAC/F,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAa,aAAO;AAAA,IACzB,KAAK;AAAA,IACL,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAa,aAAO;AAAA,IACzB;AAAS,aAAO;AAAA,EAClB;AACF;AAwBO,IAAM,cAAc,sBAA6D;AAAA,EACtF,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,IAEP,SAAS;AAAA,MACP,QAAQ,OAAO,QAAQ,YAAY;AACjC,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,SAAS,kBAAkB,QAAQ,OAAO;AAChD,cAAM,UAAU,MAAM,OAAO,SAAS,OAAO,MAAM;AACnD,eAAO,iBAAiB,OAAO;AAAA,MACjC;AAAA,MAEA,SAAS,OAAO,QAAQ,cAAc;AACpC,cAAM,SAAS,aAAa,MAAM;AAClC,YAAI;AACF,gBAAM,UAAU,MAAM,OAAO,SAAS,SAAS,SAAS;AACxD,iBAAO,iBAAiB,OAA6B;AAAA,QACvD,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,WAAW;AACtB,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,WAAW,MAAM,OAAO,SAAS,KAAK;AAC5C,eAAQ,SAAkC,IAAI,gBAAgB;AAAA,MAChE;AAAA,MAEA,SAAS,OAAO,QAAQ,cAAc;AACpC,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,OAAO,SAAS,OAAO,WAAW,EAAE,QAAQ,kBAAkB,CAAC;AAAA,MACvE;AAAA,MAEA,eAAe,OAAO,QAAQ,cAAc;AAC1C,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,UAAU,MAAM,OAAO,SAAS,SAAS,SAAS;AACxD,eAAQ,QAA+B;AAAA,MACzC;AAAA,IACF;AAAA;AAAA,IAGA,SAAS;AAAA,MACP,QAAQ,OAAO,QAAQ,YAAY;AACjC,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,EAAE,UAAU,IAAI,cAAc,MAAM;AAC1C,cAAM,SAAS,MAAM,OAAO,SAAS,OAAO,YAAY,EAAE,UAAU,IAAI,CAAC,CAAC;AAC1E,eAAO;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,MAAM,SAAS;AAAA,UACf,UAAU,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,KAAK,OAAO,QAAQ,cAAc;AAChC,cAAM,SAAS,aAAa,MAAM;AAClC,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO,SAAS,SAAS,SAAS;AACvD,iBAAO,EAAE,WAAW,OAAO,GAAG;AAAA,QAChC,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,YAAY;AAGvB,eAAO,CAAC;AAAA,MACV;AAAA,MAEA,QAAQ,OAAO,QAAQ,cAAc;AACnC,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,OAAO,SAAS,OAAO,SAAS;AAAA,MACxC;AAAA,IACF;AAAA;AAAA,IAGA,WAAW;AAAA,MACT,QAAQ,OAAO,QAAQ,YAAY;AACjC,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,OAAO,OAAO,QAAQ,SAAS,WACjC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IACvB,IAAI,KAAK,CAAC,IAAI,WAAW,QAAQ,IAAI,EAAE,MAAqB,CAAC;AACjE,cAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,QAAQ,QAAQ,eAAe;AAC7D,cAAM,SAAS,MAAM,OAAO,WAAW,OAAO,EAAE,KAAK,CAAC;AACtD,eAAO;AAAA,UACL,aAAa,OAAO;AAAA,UACpB,MAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAAA,MAEA,KAAK,OAAO,QAAQ,gBAAgB;AAClC,cAAM,SAAS,aAAa,MAAM;AAClC,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO,WAAW,SAAS,WAAW;AAC3D,iBAAO,EAAE,aAAa,OAAO,GAAG;AAAA,QAClC,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,QAAQ,OAAO,QAAQ,gBAAgB;AACrC,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,OAAO,WAAW,OAAO,WAAW;AAAA,MAC5C;AAAA,IACF;AAAA;AAAA,IAGA,MAAM;AAAA,MACJ,MAAM,OAAO,QAAQ,cAAc;AACjC,cAAM,SAAS,aAAa,MAAM;AAClC,cAAM,WAAW,MAAM,OAAO,SAAS,KAAK,KAAK,SAAS;AAC1D,eAAQ,SAAmB,IAAI,UAAQ;AAAA,UACrC,WAAW,IAAI,KAAK,IAAI,SAAS;AAAA,UACjC,OAAQ,IAAI,SAAS;AAAA,UACrB,SAAS,IAAI,WAAW;AAAA,UACxB,MAAM,IAAI;AAAA,QACZ,EAAE;AAAA,MACJ;AAAA,IACF;AAAA;AAAA,IAGA,WAAW;AAAA,MACT,KAAK,OAAO,QAAQ,cAAc;AAChC,cAAM,SAAS,aAAa,MAAM;AAClC,YAAI;AACF,gBAAM,OAAO,MAAM,OAAO,SAAS,UAAU,SAAS,SAAS;AAC/D,iBAAO;AAAA,YACL,aAAa;AAAA,YACb;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Browserbase Browser Provider - Factory-based Implementation\n *\n * Cloud browser sessions with stealth mode, proxies, session replay,\n * and persistent contexts via the Browserbase platform.\n */\n\nimport Browserbase from '@browserbasehq/sdk';\nimport { defineBrowserProvider } from '@computesdk/provider';\n\nimport type {\n CreateBrowserSessionOptions,\n BrowserProfile,\n BrowserExtension,\n BrowserLog,\n BrowserRecording,\n} from '@computesdk/provider';\n\n/**\n * Browserbase-specific configuration options\n */\nexport interface BrowserbaseConfig {\n /** Browserbase API key — falls back to BROWSERBASE_API_KEY env var */\n apiKey?: string;\n /** Browserbase project ID — falls back to BROWSERBASE_PROJECT_ID env var */\n projectId?: string;\n}\n\n/**\n * The native Browserbase session object returned by their SDK\n */\ntype BrowserbaseSession = Awaited<ReturnType<InstanceType<typeof Browserbase>['sessions']['create']>>;\n\n/**\n * Resolve config values from explicit config or environment variables\n */\nfunction resolveConfig(config: BrowserbaseConfig) {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.BROWSERBASE_API_KEY) || '';\n const projectId = config.projectId || (typeof process !== 'undefined' && process.env?.BROWSERBASE_PROJECT_ID) || '';\n\n if (!apiKey) {\n throw new Error(\n `Missing Browserbase API key. Provide 'apiKey' in config or set BROWSERBASE_API_KEY environment variable. ` +\n `Get your API key from https://www.browserbase.com/settings`\n );\n }\n\n return { apiKey, projectId };\n}\n\n/**\n * Create a Browserbase SDK client from config\n */\nfunction createClient(config: BrowserbaseConfig): Browserbase {\n const { apiKey } = resolveConfig(config);\n return new Browserbase({ apiKey });\n}\n\n/**\n * Map ComputeSDK session options to Browserbase create session params\n */\nfunction mapSessionOptions(config: BrowserbaseConfig, options?: CreateBrowserSessionOptions) {\n const { projectId } = resolveConfig(config);\n\n if (!options) {\n return projectId ? { projectId } : {};\n }\n\n const params: Record<string, any> = {};\n if (projectId) params.projectId = projectId;\n if (options.region) params.region = options.region;\n if (options.keepAlive !== undefined) params.keepAlive = options.keepAlive;\n if (options.timeout !== undefined) params.timeout = options.timeout;\n // Browserbase accepts a single extensionId per session\n if (options.extensionIds?.[0]) params.extensionId = options.extensionIds[0];\n if (options.userMetadata) params.userMetadata = options.userMetadata;\n\n // Proxy configuration\n if (typeof options.proxies === 'boolean') {\n params.proxies = options.proxies;\n } else if (Array.isArray(options.proxies)) {\n params.proxies = options.proxies.map((p: any) => {\n if (p.type === 'custom' && p.server) {\n return {\n type: 'external' as const,\n server: p.server,\n username: p.username,\n password: p.password,\n domainPattern: p.domainPattern,\n };\n }\n return {\n type: 'browserbase' as const,\n geolocation: p.geolocation,\n domainPattern: p.domainPattern,\n };\n });\n }\n\n // Browser settings\n const browserSettings: Record<string, any> = {};\n if (options.viewport) browserSettings.viewport = options.viewport;\n if (options.stealth !== undefined) browserSettings.advancedStealth = options.stealth;\n if (options.recording !== undefined) browserSettings.recordSession = options.recording;\n if (options.logging !== undefined) browserSettings.logSession = options.logging;\n if (options.profileId) {\n browserSettings.context = { id: options.profileId, persist: true };\n }\n\n if (Object.keys(browserSettings).length > 0) {\n params.browserSettings = browserSettings;\n }\n\n return params;\n}\n\n/**\n * Normalize a Browserbase session into our standard shape\n */\nfunction normalizeSession(session: BrowserbaseSession) {\n return {\n session,\n sessionId: session.id,\n connectUrl: session.connectUrl,\n status: mapStatus(session.status),\n };\n}\n\nfunction mapStatus(status: string): 'created' | 'running' | 'completed' | 'failed' | 'timed_out' {\n switch (status) {\n case 'RUNNING': return 'running';\n case 'COMPLETED': return 'completed';\n case 'FAILED':\n case 'ERROR': return 'failed';\n case 'TIMED_OUT': return 'timed_out';\n default: return 'created';\n }\n}\n\n/**\n * Create a Browserbase browser provider instance\n *\n * @example\n * ```ts\n * import { browserbase } from '@computesdk/browserbase';\n *\n * const bb = browserbase({ apiKey: 'bb_live_...' });\n *\n * // Create a stealth browser session\n * const session = await bb.session.create({ stealth: true, proxies: true });\n * console.log(session.connectUrl);\n *\n * // Connect with Playwright\n * const browser = await chromium.connectOverCDP(session.connectUrl);\n * const page = browser.contexts()[0].pages()[0];\n * await page.goto('https://example.com');\n *\n * // Get session recording after\n * const recording = await session.getRecording();\n * ```\n */\nexport const browserbase = defineBrowserProvider<BrowserbaseSession, BrowserbaseConfig>({\n name: 'browserbase',\n methods: {\n // ─── Session Lifecycle ─────────────────────────────────────────────\n session: {\n create: async (config, options) => {\n const client = createClient(config);\n const params = mapSessionOptions(config, options);\n const session = await client.sessions.create(params);\n return normalizeSession(session);\n },\n\n getById: async (config, sessionId) => {\n const client = createClient(config);\n try {\n const session = await client.sessions.retrieve(sessionId);\n return normalizeSession(session as BrowserbaseSession);\n } catch {\n return null;\n }\n },\n\n list: async (config) => {\n const client = createClient(config);\n const response = await client.sessions.list();\n return (response as BrowserbaseSession[]).map(normalizeSession);\n },\n\n destroy: async (config, sessionId) => {\n const client = createClient(config);\n await client.sessions.update(sessionId, { status: 'REQUEST_RELEASE' });\n },\n\n getConnectUrl: async (config, sessionId) => {\n const client = createClient(config);\n const session = await client.sessions.retrieve(sessionId);\n return (session as BrowserbaseSession).connectUrl;\n },\n },\n\n // ─── Profiles (Browserbase Contexts) ───────────────────────────────\n profile: {\n create: async (config, options) => {\n const client = createClient(config);\n const { projectId } = resolveConfig(config);\n const result = await client.contexts.create(projectId ? { projectId } : {});\n return {\n profileId: result.id,\n name: options?.name,\n metadata: options?.metadata as Record<string, unknown> | undefined,\n } satisfies BrowserProfile;\n },\n\n get: async (config, profileId) => {\n const client = createClient(config);\n try {\n const result = await client.contexts.retrieve(profileId);\n return { profileId: result.id } satisfies BrowserProfile;\n } catch {\n return null;\n }\n },\n\n list: async (_config) => {\n // Browserbase API doesn't expose a list contexts endpoint\n // Return empty — users track their own context IDs\n return [];\n },\n\n delete: async (config, profileId) => {\n const client = createClient(config);\n await client.contexts.delete(profileId);\n },\n },\n\n // ─── Extensions ────────────────────────────────────────────────────\n extension: {\n create: async (config, options) => {\n const client = createClient(config);\n const blob = typeof options.file === 'string'\n ? new Blob([options.file])\n : new Blob([new Uint8Array(options.file).buffer as ArrayBuffer]);\n const file = new File([blob], options.name ?? 'extension.zip');\n const result = await client.extensions.create({ file });\n return {\n extensionId: result.id,\n name: options.name,\n } satisfies BrowserExtension;\n },\n\n get: async (config, extensionId) => {\n const client = createClient(config);\n try {\n const result = await client.extensions.retrieve(extensionId);\n return { extensionId: result.id } satisfies BrowserExtension;\n } catch {\n return null;\n }\n },\n\n delete: async (config, extensionId) => {\n const client = createClient(config);\n await client.extensions.delete(extensionId);\n },\n },\n\n // ─── Logs ──────────────────────────────────────────────────────────\n logs: {\n list: async (config, sessionId) => {\n const client = createClient(config);\n const response = await client.sessions.logs.list(sessionId);\n return (response as any[]).map(log => ({\n timestamp: new Date(log.timestamp),\n level: (log.level ?? 'info') as BrowserLog['level'],\n message: log.message ?? '',\n data: log.params,\n }));\n },\n },\n\n // ─── Recordings ────────────────────────────────────────────────────\n recording: {\n get: async (config, sessionId) => {\n const client = createClient(config);\n try {\n const data = await client.sessions.recording.retrieve(sessionId);\n return {\n recordingId: sessionId,\n sessionId,\n format: 'rrweb',\n data,\n } satisfies BrowserRecording;\n } catch {\n return null;\n }\n },\n },\n },\n});\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@computesdk/browserbase",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.9",
|
|
4
4
|
"description": "Browserbase browser provider for ComputeSDK - cloud browser sessions with stealth mode, proxies, and session replay",
|
|
5
5
|
"author": "Garrison",
|
|
6
6
|
"license": "MIT",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"@browserbasehq/sdk": "^2.0.0",
|
|
23
23
|
"dotenv": "^16.0.0",
|
|
24
24
|
"playwright-core": "^1.40.0",
|
|
25
|
-
"@computesdk/provider": "2.1.
|
|
26
|
-
"computesdk": "4.1.
|
|
25
|
+
"@computesdk/provider": "2.1.3",
|
|
26
|
+
"computesdk": "4.1.3"
|
|
27
27
|
},
|
|
28
28
|
"keywords": [
|
|
29
29
|
"computesdk",
|