lexmount 0.5.6 → 0.5.7
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.d.mts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -161,6 +161,10 @@ interface SessionCreateOptions {
|
|
|
161
161
|
* Browser mode to start.
|
|
162
162
|
*/
|
|
163
163
|
browserMode?: BrowserMode;
|
|
164
|
+
/**
|
|
165
|
+
* Optional custom browser image identifier to use for this session.
|
|
166
|
+
*/
|
|
167
|
+
customImageId?: string;
|
|
164
168
|
/**
|
|
165
169
|
* Optional persistent context configuration.
|
|
166
170
|
*/
|
|
@@ -838,6 +842,6 @@ declare class TimeoutError extends LexmountError {
|
|
|
838
842
|
/**
|
|
839
843
|
* Lexmount Node.js SDK.
|
|
840
844
|
*/
|
|
841
|
-
declare const VERSION = "0.5.
|
|
845
|
+
declare const VERSION = "0.5.7";
|
|
842
846
|
|
|
843
847
|
export { APIError, AuthenticationError, type BrowserMode, CDPClient, type CDPEventMessage, type CatalogInfo, type ContextAccessMode, type ContextCreateOptions, ContextInfo, type ContextListOptions, ContextListResponse, ContextLockedError, type ContextMetadata, ContextNotFoundError, type ContextStatus, ContextsResource, ExtensionInfo, type ExtensionInfoShape, type ExtensionListOptions, type ExtensionUploadOptions, ExtensionsResource, type ForceReleaseResponse, type IntegratedAuthCallback, type IntegratedAuthCallbackResult, Lexmount, type LexmountConfig, LexmountError, LexmountLogger, type LogLevel, NetworkError, PaginationInfo, type PaginationInfoShape, type RegionCatalogEntry, type RegionInfo, type SessionContext, type SessionCreateOptions, type SessionCreateResponse, type SessionDeleteOptions, SessionDownloadInfo, type SessionDownloadInfoShape, SessionDownloadsDeleteResponse, type SessionDownloadsDeleteResponseShape, SessionDownloadsListResponse, type SessionDownloadsListResponseShape, SessionDownloadsResource, SessionInfo, type SessionListOptions, SessionListResponse, SessionNotFoundError, type SessionProxyConfig, type SessionStatus, SessionTargetInfo, type SessionTargetInfoShape, SessionsResource, TimeoutError, VERSION, ValidationError, connectOverCDP, Lexmount as default, deregisterIntegratedAuthCallback, disableLogging, enableLogging, getLogger, registerIntegratedAuthCallback, setLogLevel };
|
package/dist/index.d.ts
CHANGED
|
@@ -161,6 +161,10 @@ interface SessionCreateOptions {
|
|
|
161
161
|
* Browser mode to start.
|
|
162
162
|
*/
|
|
163
163
|
browserMode?: BrowserMode;
|
|
164
|
+
/**
|
|
165
|
+
* Optional custom browser image identifier to use for this session.
|
|
166
|
+
*/
|
|
167
|
+
customImageId?: string;
|
|
164
168
|
/**
|
|
165
169
|
* Optional persistent context configuration.
|
|
166
170
|
*/
|
|
@@ -838,6 +842,6 @@ declare class TimeoutError extends LexmountError {
|
|
|
838
842
|
/**
|
|
839
843
|
* Lexmount Node.js SDK.
|
|
840
844
|
*/
|
|
841
|
-
declare const VERSION = "0.5.
|
|
845
|
+
declare const VERSION = "0.5.7";
|
|
842
846
|
|
|
843
847
|
export { APIError, AuthenticationError, type BrowserMode, CDPClient, type CDPEventMessage, type CatalogInfo, type ContextAccessMode, type ContextCreateOptions, ContextInfo, type ContextListOptions, ContextListResponse, ContextLockedError, type ContextMetadata, ContextNotFoundError, type ContextStatus, ContextsResource, ExtensionInfo, type ExtensionInfoShape, type ExtensionListOptions, type ExtensionUploadOptions, ExtensionsResource, type ForceReleaseResponse, type IntegratedAuthCallback, type IntegratedAuthCallbackResult, Lexmount, type LexmountConfig, LexmountError, LexmountLogger, type LogLevel, NetworkError, PaginationInfo, type PaginationInfoShape, type RegionCatalogEntry, type RegionInfo, type SessionContext, type SessionCreateOptions, type SessionCreateResponse, type SessionDeleteOptions, SessionDownloadInfo, type SessionDownloadInfoShape, SessionDownloadsDeleteResponse, type SessionDownloadsDeleteResponseShape, SessionDownloadsListResponse, type SessionDownloadsListResponseShape, SessionDownloadsResource, SessionInfo, type SessionListOptions, SessionListResponse, SessionNotFoundError, type SessionProxyConfig, type SessionStatus, SessionTargetInfo, type SessionTargetInfoShape, SessionsResource, TimeoutError, VERSION, ValidationError, connectOverCDP, Lexmount as default, deregisterIntegratedAuthCallback, disableLogging, enableLogging, getLogger, registerIntegratedAuthCallback, setLogLevel };
|
package/dist/index.js
CHANGED
|
@@ -570,6 +570,9 @@ var SessionsResource = class {
|
|
|
570
570
|
project_id: options.projectId ?? this.client.projectId,
|
|
571
571
|
browser_mode: options.browserMode ?? "normal"
|
|
572
572
|
};
|
|
573
|
+
if (options.customImageId) {
|
|
574
|
+
payload.custom_image_id = options.customImageId;
|
|
575
|
+
}
|
|
573
576
|
if (options.context) {
|
|
574
577
|
const contextPayload = {
|
|
575
578
|
id: options.context.id,
|
|
@@ -1735,7 +1738,7 @@ var Lexmount = class {
|
|
|
1735
1738
|
};
|
|
1736
1739
|
|
|
1737
1740
|
// src/index.ts
|
|
1738
|
-
var VERSION = "0.5.
|
|
1741
|
+
var VERSION = "0.5.7";
|
|
1739
1742
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1740
1743
|
0 && (module.exports = {
|
|
1741
1744
|
APIError,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/cdp.ts","../src/errors.ts","../src/logging.ts","../src/sessions.ts","../src/auth.ts","../src/client.ts","../src/contexts.ts","../src/extensions.ts"],"sourcesContent":["/**\n * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.5.6';\n\nexport {\n deregisterIntegratedAuthCallback,\n registerIntegratedAuthCallback,\n type IntegratedAuthCallback,\n type IntegratedAuthCallbackResult,\n} from './auth';\nexport { CDPClient, connectOverCDP, type CDPEventMessage } from './cdp';\nexport { Lexmount } from './client';\nexport { ContextInfo, ContextListResponse, ContextsResource } from './contexts';\nexport { ExtensionInfo, ExtensionsResource } from './extensions';\nexport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n LexmountError,\n NetworkError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nexport {\n LexmountLogger,\n disableLogging,\n enableLogging,\n getLogger,\n setLogLevel,\n type LogLevel,\n} from './logging';\nexport {\n PaginationInfo,\n SessionDownloadInfo,\n SessionDownloadsDeleteResponse,\n SessionDownloadsListResponse,\n SessionDownloadsResource,\n SessionInfo,\n SessionListResponse,\n SessionTargetInfo,\n SessionsResource,\n type SessionCreateResponse,\n} from './sessions';\nexport type {\n BrowserMode,\n ContextAccessMode,\n ContextCreateOptions,\n ContextListOptions,\n ContextMetadata,\n ContextStatus,\n ExtensionInfoShape,\n ExtensionListOptions,\n ExtensionUploadOptions,\n ForceReleaseResponse,\n CatalogInfo,\n LexmountConfig,\n PaginationInfoShape,\n RegionCatalogEntry,\n RegionInfo,\n SessionContext,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n SessionTargetInfoShape,\n} from './types';\n\nexport { Lexmount as default } from './client';\n","/**\n * Chrome DevTools Protocol connection helpers.\n */\n\nimport { EventEmitter } from 'events';\nimport CDP from 'chrome-remote-interface';\nimport { ValidationError } from './errors';\nimport { getLogger } from './logging';\nimport { SessionInfo } from './sessions';\n\nexport interface CDPEventMessage {\n method: string;\n params?: Record<string, unknown>;\n sessionId?: string;\n}\n\nfunction hasExplicitPort(url: string): boolean {\n const authority = url.match(/^[a-z][a-z\\d+\\-.]*:\\/\\/([^/?#]+)/i)?.[1] ?? '';\n const host = authority.includes('@')\n ? authority.slice(authority.lastIndexOf('@') + 1)\n : authority;\n\n if (host.startsWith('[')) {\n return /\\]:\\d+$/.test(host);\n }\n\n return /:\\d+$/.test(host);\n}\n\nfunction getDefaultPort(url: string): number | undefined {\n const protocol = getProtocol(url);\n if (protocol === 'ws') {\n return 80;\n }\n if (protocol === 'wss') {\n return 443;\n }\n return undefined;\n}\n\nfunction getProtocol(url: string): string | undefined {\n return url.match(/^([a-z][a-z\\d+\\-.]*):\\/\\//i)?.[1]?.toLowerCase();\n}\n\n/**\n * Lexmount CDP client.\n *\n * It forwards Chrome DevTools Protocol notifications through EventEmitter and\n * exposes `send()` for raw CDP commands.\n */\nexport class CDPClient extends EventEmitter {\n readonly session: SessionInfo;\n private closed = false;\n private rawClient?: CDP.Client;\n\n constructor(session: SessionInfo) {\n super();\n\n const connectUrl = session.connectUrl;\n if (!connectUrl) {\n throw new ValidationError(`Session ${session.sessionId} does not include a CDP connect URL`);\n }\n\n this.session = session;\n }\n\n /**\n * Connect the CDP client to the session.\n */\n async connect(): Promise<this> {\n if (this.rawClient && !this.closed) {\n return this;\n }\n\n this.closed = false;\n getLogger().debug(`Connecting to session ${this.session.sessionId} over CDP`);\n const options: CDP.Options = {\n target: this.session.connectUrl,\n local: true,\n };\n const defaultPort = getDefaultPort(this.session.connectUrl);\n if (!hasExplicitPort(this.session.connectUrl) && defaultPort) {\n options.port = defaultPort;\n }\n if (getProtocol(this.session.connectUrl) === 'wss') {\n options.secure = true;\n }\n\n this.rawClient = await CDP(options);\n\n this.rawClient.on('event', (message: CDPEventMessage) => {\n this.emit(message.method, message.params, message.sessionId);\n });\n this.rawClient.on('error', (err) => {\n this.emit('error', err);\n });\n this.rawClient.on('disconnect', () => {\n void this.close().catch((err) => {\n getLogger().error(`Failed to close CDP client for session ${this.session.sessionId} after disconnect`, err);\n });\n this.emit('disconnect');\n });\n\n return this;\n }\n\n /**\n * Send a raw Chrome DevTools Protocol command.\n *\n * Returns `undefined` if called before the client has connected.\n */\n async send(method: string, params?: any, sessionId?: string): Promise<any | undefined> {\n if (this.closed) {\n throw new ValidationError('Cannot send CDP command after client is closed');\n }\n\n const rawClient = this.rawClient;\n if (!rawClient) {\n return undefined;\n }\n\n return rawClient.send(method, params, sessionId);\n }\n\n /**\n * Close the CDP connection and release internal listeners.\n */\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n if (this.rawClient) {\n this.rawClient.removeAllListeners('event');\n this.rawClient.removeAllListeners('disconnect');\n this.rawClient.removeAllListeners('error');\n await this.rawClient.close();\n }\n }\n}\n\n/**\n * Connect to a Lexmount browser session over Chrome DevTools Protocol.\n */\nexport async function connectOverCDP(session: SessionInfo): Promise<CDPClient> {\n const client = new CDPClient(session);\n await client.connect();\n return client;\n}\n","/**\n * Lexmount SDK error hierarchy.\n */\n\n/**\n * Base error for all Lexmount SDK failures.\n */\nexport class LexmountError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\n/**\n * Raised when API authentication fails.\n */\nexport class AuthenticationError extends LexmountError {}\n\n/**\n * Raised when a session cannot be found.\n */\nexport class SessionNotFoundError extends LexmountError {}\n\n/**\n * Raised when a context cannot be found.\n */\nexport class ContextNotFoundError extends LexmountError {}\n\n/**\n * Raised when a context is locked by another active session.\n */\nexport class ContextLockedError extends LexmountError {\n readonly activeSessionId?: string;\n readonly retryAfter?: number;\n\n constructor(\n message: string,\n options: { activeSessionId?: string; retryAfter?: number } = {}\n ) {\n const details: string[] = [];\n\n if (options.activeSessionId) {\n details.push(`locked by session: ${options.activeSessionId}`);\n }\n\n if (typeof options.retryAfter === 'number') {\n details.push(`retry after ${options.retryAfter}s`);\n }\n\n super(details.length > 0 ? `${message} (${details.join(', ')})` : message);\n this.activeSessionId = options.activeSessionId;\n this.retryAfter = options.retryAfter;\n }\n}\n\n/**\n * Raised when the Lexmount API returns a non-success response.\n */\nexport class APIError extends LexmountError {\n readonly statusCode?: number;\n readonly response?: unknown;\n\n constructor(message: string, options: { statusCode?: number; response?: unknown } = {}) {\n super(\n typeof options.statusCode === 'number'\n ? `${message} (HTTP ${options.statusCode})`\n : message\n );\n this.statusCode = options.statusCode;\n this.response = options.response;\n }\n}\n\n/**\n * Raised when a network error prevents the request from reaching the API.\n */\nexport class NetworkError extends LexmountError {}\n\n/**\n * Raised when input validation fails.\n */\nexport class ValidationError extends LexmountError {}\n\n/**\n * Raised when a request exceeds the configured timeout.\n */\nexport class TimeoutError extends LexmountError {}\n","import { ValidationError } from './errors';\n\n/**\n * Supported SDK log levels.\n */\nexport type LogLevel =\n | 'DEBUG'\n | 'INFO'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'SILENT';\n\nconst LOGGER_NAME = 'lexmount';\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n DEBUG: 10,\n INFO: 20,\n WARNING: 30,\n ERROR: 40,\n CRITICAL: 50,\n SILENT: 60,\n};\n\nlet currentLevel: LogLevel = 'WARNING';\n\nfunction isLogLevel(value: string): value is LogLevel {\n return value in LOG_LEVEL_PRIORITY;\n}\n\nfunction formatTimestamp(date: Date): string {\n return date.toISOString().replace('T', ' ').replace('Z', '');\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[currentLevel];\n}\n\nfunction emit(level: Exclude<LogLevel, 'SILENT'>, args: unknown[]): void {\n if (!shouldLog(level)) {\n return;\n }\n\n const prefix = `${formatTimestamp(new Date())} - ${LOGGER_NAME} - ${level} -`;\n\n if (level === 'ERROR' || level === 'CRITICAL') {\n console.error(prefix, ...args);\n return;\n }\n\n if (level === 'WARNING') {\n console.warn(prefix, ...args);\n return;\n }\n\n if (level === 'INFO') {\n console.info(prefix, ...args);\n return;\n }\n\n console.debug(prefix, ...args);\n}\n\n/**\n * Shared SDK logger.\n */\nexport class LexmountLogger {\n /**\n * Current SDK log level.\n */\n get level(): LogLevel {\n return currentLevel;\n }\n\n debug(...args: unknown[]): void {\n emit('DEBUG', args);\n }\n\n info(...args: unknown[]): void {\n emit('INFO', args);\n }\n\n warn(...args: unknown[]): void {\n emit('WARNING', args);\n }\n\n error(...args: unknown[]): void {\n emit('ERROR', args);\n }\n\n critical(...args: unknown[]): void {\n emit('CRITICAL', args);\n }\n}\n\nconst logger = new LexmountLogger();\n\n/**\n * Return the shared SDK logger instance.\n */\nexport function getLogger(): LexmountLogger {\n return logger;\n}\n\n/**\n * Set the SDK log level.\n */\nexport function setLogLevel(level: LogLevel | string): void {\n if (typeof level !== 'string' || level.trim() === '') {\n throw new ValidationError(\n 'Invalid log level. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL, SILENT'\n );\n }\n\n const normalizedLevel = level.toUpperCase();\n if (!isLogLevel(normalizedLevel)) {\n throw new ValidationError(\n `Invalid log level: ${level}. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL, SILENT`\n );\n }\n\n currentLevel = normalizedLevel;\n logger.debug(`Log level set to ${normalizedLevel}`);\n}\n\n/**\n * Disable all SDK logging.\n */\nexport function disableLogging(): void {\n currentLevel = 'SILENT';\n}\n\n/**\n * Re-enable SDK logging.\n */\nexport function enableLogging(level: LogLevel | string = 'INFO'): void {\n setLogLevel(level);\n}\n","/**\n * Session resource implementation.\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nimport { getLogger } from './logging';\nimport type {\n BrowserMode,\n PaginationInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n SessionTargetInfoShape,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction withRequestedRegion(client: Lexmount, payload: JsonRecord): JsonRecord {\n const regionId = client.selectedRegion ?? client.region;\n return regionId ? { ...payload, region_id: regionId } : payload;\n}\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizeContextMode(mode: string): 'read_write' | 'read_only' {\n if (mode === 'readWrite' || mode === 'read_write') {\n return 'read_write';\n }\n\n return 'read_only';\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Session pagination information.\n */\nexport class PaginationInfo implements PaginationInfoShape {\n readonly currentPage: number;\n readonly pageSize: number;\n readonly totalCount: number;\n readonly totalPages: number;\n readonly activeCount: number;\n readonly closedCount: number;\n\n constructor(shape: PaginationInfoShape) {\n this.currentPage = shape.currentPage;\n this.pageSize = shape.pageSize;\n this.totalCount = shape.totalCount;\n this.totalPages = shape.totalPages;\n this.activeCount = shape.activeCount;\n this.closedCount = shape.closedCount;\n }\n}\n\ninterface SessionInfoOptions {\n id: string;\n status: SessionStatus;\n apiKey: string;\n projectId: string;\n regionId?: string | null;\n browserType: BrowserMode | string;\n createdAt: string;\n inspectUrl: string;\n containerId: string | null;\n ws?: string | null;\n client?: Lexmount;\n}\n\n/**\n * Session information returned by the API.\n */\nexport class SessionInfo {\n readonly id: string;\n readonly sessionId: string;\n readonly status: SessionStatus;\n readonly apiKey: string;\n readonly projectId: string;\n readonly regionId: string | null;\n readonly region_id: string | null;\n readonly browserType: BrowserMode | string;\n readonly createdAt: string;\n readonly inspectUrl: string;\n readonly containerId: string | null;\n readonly ws: string | null;\n\n private readonly client?: Lexmount;\n private closed = false;\n\n /** @internal */\n constructor(options: SessionInfoOptions) {\n this.id = options.id;\n this.sessionId = options.id;\n this.status = options.status;\n this.apiKey = options.apiKey;\n this.projectId = options.projectId;\n this.regionId = options.regionId ?? null;\n this.region_id = this.regionId;\n this.browserType = options.browserType;\n this.createdAt = options.createdAt;\n this.inspectUrl = options.inspectUrl;\n this.containerId = options.containerId;\n this.ws = options.ws ?? null;\n this.client = options.client;\n }\n\n /**\n * Playwright/CDP connection URL.\n */\n get connectUrl(): string {\n return this.ws ?? '';\n }\n\n /**\n * Parsed session creation time.\n */\n get createdAtDate(): Date | null {\n const date = new Date(this.createdAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n /**\n * Close the current session.\n *\n * This method is idempotent. Errors are logged and swallowed to keep cleanup safe.\n */\n async close(): Promise<void> {\n if (this.closed) {\n getLogger().debug(`Session ${this.sessionId} is already closed.`);\n return;\n }\n\n if (!this.client) {\n getLogger().warn(\n `Cannot close session ${this.sessionId}: client was not provided during session creation.`\n );\n return;\n }\n\n try {\n getLogger().debug(`Closing session ${this.sessionId}`);\n await this.client.sessions.delete({\n sessionId: this.sessionId,\n projectId: this.projectId,\n });\n this.closed = true;\n getLogger().info(`Session closed: ${this.sessionId}`);\n } catch (error) {\n getLogger().warn(`Failed to close session ${this.sessionId}:`, error);\n }\n }\n}\n\n/**\n * Response object from `sessions.list()`.\n */\nexport class SessionListResponse implements Iterable<SessionInfo> {\n readonly sessions: SessionInfo[];\n readonly pagination: PaginationInfo;\n\n constructor(sessions: SessionInfo[], pagination: PaginationInfo) {\n this.sessions = sessions;\n this.pagination = pagination;\n }\n\n /**\n * Number of sessions in the current page.\n */\n get length(): number {\n return this.sessions.length;\n }\n\n [Symbol.iterator](): Iterator<SessionInfo> {\n return this.sessions[Symbol.iterator]();\n }\n\n at(index: number): SessionInfo | undefined {\n return this.sessions[index];\n }\n}\n\n/**\n * Session download metadata returned by the API.\n */\nexport class SessionDownloadInfo implements SessionDownloadInfoShape {\n readonly id: string;\n readonly filename: string;\n readonly contentType: string | null;\n readonly size: number;\n readonly sha256: string | null;\n readonly status: string;\n readonly createdAt: string;\n\n constructor(shape: SessionDownloadInfoShape) {\n this.id = shape.id;\n this.filename = shape.filename;\n this.contentType = shape.contentType;\n this.size = shape.size;\n this.sha256 = shape.sha256;\n this.status = shape.status;\n this.createdAt = shape.createdAt;\n }\n}\n\n/**\n * Structured response from `sessions.downloads.list()`.\n */\nexport class SessionDownloadsListResponse {\n readonly downloads: SessionDownloadInfo[];\n readonly summary: SessionDownloadsListResponseShape;\n\n constructor(downloads: SessionDownloadInfo[], summary: SessionDownloadsListResponseShape) {\n this.downloads = downloads;\n this.summary = summary;\n }\n}\n\n/**\n * Structured response from `sessions.downloads.delete()`.\n */\nexport class SessionDownloadsDeleteResponse implements SessionDownloadsDeleteResponseShape {\n readonly status: string;\n readonly deletedCount: number;\n\n constructor(shape: SessionDownloadsDeleteResponseShape) {\n this.status = shape.status;\n this.deletedCount = shape.deletedCount;\n }\n}\n\n/**\n * Session target metadata returned by `/json`.\n */\nexport class SessionTargetInfo implements SessionTargetInfoShape {\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly description: string;\n readonly inspectUrl: string | null;\n readonly webSocketDebuggerUrl: string | null;\n readonly webSocketDebuggerUrlTransformed: string | null;\n\n constructor(shape: SessionTargetInfoShape) {\n this.id = shape.id;\n this.title = shape.title;\n this.type = shape.type;\n this.url = shape.url;\n this.description = shape.description;\n this.inspectUrl = shape.inspectUrl;\n this.webSocketDebuggerUrl = shape.webSocketDebuggerUrl;\n this.webSocketDebuggerUrlTransformed = shape.webSocketDebuggerUrlTransformed;\n }\n}\n\n/**\n * Session download operations.\n */\nexport class SessionDownloadsResource {\n constructor(private readonly client: Lexmount) {}\n\n async list(sessionId: string, projectId?: string): Promise<SessionDownloadsListResponse> {\n const response = await this.client._post(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/list`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n }\n );\n if (response.status >= 400) {\n this.handleError('list session downloads', response, sessionId);\n }\n\n const result = asRecord(response.data);\n const items = Array.isArray(result.downloads) ? result.downloads : [];\n const downloads = items.map((item) => {\n const download = asRecord(item);\n return new SessionDownloadInfo({\n id: getString(download.id) ?? '',\n filename: getString(download.filename) ?? '',\n contentType: getString(download.content_type) ?? null,\n size: getNumber(download.size) ?? 0,\n sha256: getString(download.sha256) ?? null,\n status: getString(download.status) ?? 'available',\n createdAt: getString(download.created_at) ?? '',\n });\n });\n const summary = asRecord(result.summary);\n\n return new SessionDownloadsListResponse(downloads, {\n count: getNumber(summary.count) ?? downloads.length,\n totalSize: getNumber(summary.total_size) ?? 0,\n });\n }\n\n async get(sessionId: string, downloadId: string, projectId?: string): Promise<Buffer> {\n const response = await this.client._get(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/${downloadId}`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n },\n {\n responseType: 'arraybuffer',\n }\n );\n if (response.status >= 400) {\n this.handleError('fetch session download', response, sessionId);\n }\n\n return Buffer.from(response.data as ArrayBuffer);\n }\n\n async archive(sessionId: string, projectId?: string): Promise<Buffer> {\n const response = await this.client._get(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/archive`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n },\n {\n responseType: 'arraybuffer',\n }\n );\n if (response.status >= 400) {\n this.handleError('archive session downloads', response, sessionId);\n }\n\n return Buffer.from(response.data as ArrayBuffer);\n }\n\n async delete(sessionId: string, projectId?: string): Promise<SessionDownloadsDeleteResponse> {\n const response = await this.client._delete(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n }\n );\n if (response.status >= 400) {\n this.handleError('delete session downloads', response, sessionId);\n }\n\n const result = asRecord(response.data);\n return new SessionDownloadsDeleteResponse({\n status: getString(result.status) ?? '',\n deletedCount: getNumber(result.deleted_count) ?? 0,\n });\n }\n\n private handleError(action: string, response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(`Session downloads not found for ${sessionId}: ${errorMessage}`);\n }\n\n throw new APIError(`Failed to ${action}: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n\n/**\n * Alias kept for parity with the Python SDK.\n */\nexport type SessionCreateResponse = SessionInfo;\n\n/**\n * Session resource operations.\n */\nexport class SessionsResource {\n readonly downloads: SessionDownloadsResource;\n\n constructor(private readonly client: Lexmount) {\n this.downloads = new SessionDownloadsResource(client);\n }\n\n /**\n * Create a new browser session.\n */\n async create(options: SessionCreateOptions = {}): Promise<SessionCreateResponse> {\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n browser_mode: options.browserMode ?? 'normal',\n };\n\n if (options.context) {\n const contextPayload = {\n id: options.context.id,\n mode: normalizeContextMode(options.context.mode),\n };\n payload.context = contextPayload;\n getLogger().debug(\n `Creating session with context (id=${options.context.id}, mode=${contextPayload.mode})`\n );\n } else {\n getLogger().debug(`Creating session with browser_mode=${payload.browser_mode as string}`);\n }\n\n if (options.extensionIds && options.extensionIds.length > 0) {\n payload.extension_ids = options.extensionIds;\n }\n\n if (options.proxy) {\n payload.proxy = this.normalizeProxy(options.proxy);\n }\n\n if (options.weakLock) {\n payload.weak_lock = true;\n }\n\n if (options.asyncCreate !== false) {\n return this.createAsync(withRequestedRegion(this.client, payload), options);\n }\n\n const url = `${this.client.baseUrl}/instance`;\n const response = await this.client._post(url, withRequestedRegion(this.client, payload));\n if (response.status >= 400) {\n this.handleCreateError(response);\n }\n\n const result = asRecord(response.data);\n const sessionId = getString(result.session_id);\n if (!sessionId) {\n throw new APIError('Failed to create session: session_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const containerId = getString(result.container_id) ?? null;\n const projectId = options.projectId ?? this.client.projectId;\n // The create endpoint does not return the canonical inspect URL. Re-fetch the created\n // session so the SDK can return the server-provided inspectUrl when available.\n const createdSession = await this._getCreatedSession(sessionId, projectId);\n const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n\n getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);\n\n return new SessionInfo({\n id: sessionId,\n status: createdSession?.status ?? 'active',\n apiKey: this.client.apiKey,\n projectId,\n regionId: createdSession?.regionId ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: createdSession?.browserType ?? ((options.browserMode ?? 'normal') as BrowserMode),\n createdAt: createdSession?.createdAt ?? new Date().toISOString(),\n inspectUrl:\n createdSession?.inspectUrl ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: createdSession?.containerId ?? containerId,\n ws: wsUrl ?? createdSession?.ws ?? null,\n client: this.client,\n });\n }\n\n private async createAsync(\n payload: JsonRecord,\n options: SessionCreateOptions\n ): Promise<SessionCreateResponse> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v2`, payload);\n if (response.status >= 400) {\n this.handleCreateError(response);\n }\n\n const result = asRecord(response.data);\n const sessionId = getString(result.session_id);\n if (!sessionId) {\n throw new APIError('Failed to create session: session_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const projectId = options.projectId ?? this.client.projectId;\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const pollTimeoutMs = options.pollTimeoutMs ?? 600_000;\n const deadline = Date.now() + pollTimeoutMs;\n\n while (Date.now() < deadline) {\n const info = await this.get(sessionId, projectId);\n if (info.status === 'active') {\n const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n getLogger().info(`Session created successfully (async): id=${sessionId}`);\n return new SessionInfo({\n id: sessionId,\n status: 'active',\n apiKey: this.client.apiKey,\n projectId,\n regionId: info.regionId ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: info.browserType || ((options.browserMode ?? 'normal') as BrowserMode),\n createdAt: info.createdAt,\n inspectUrl: info.inspectUrl,\n containerId: info.containerId,\n ws: wsUrl ?? info.ws,\n client: this.client,\n });\n }\n\n if (info.status === 'create_failed') {\n this.handleAsyncCreateFailed(payload);\n throw new APIError('Session creation failed', {\n statusCode: 500,\n response: { session_id: sessionId, status: info.status },\n });\n }\n\n if (info.status === 'closed') {\n throw new APIError('Session closed before activation', {\n statusCode: 500,\n response: { session_id: sessionId, status: info.status },\n });\n }\n\n await delay(pollIntervalMs);\n }\n\n throw new TimeoutError(\n `Timed out waiting for session ${sessionId} to become active after ${pollTimeoutMs}ms`\n );\n }\n\n /**\n * Fetch one session by id.\n *\n * The upstream API uses POST /instance/session for this lookup, so this SDK method\n * intentionally uses POST even though the operation is read-only.\n */\n async get(sessionId: string, projectId?: string): Promise<SessionInfo> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/session`, withRequestedRegion(this.client, {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n session_id: sessionId,\n }));\n\n if (response.status >= 400) {\n this.handleGetError(response, sessionId);\n }\n\n return this.mapSessionInfo(asRecord(response.data), projectId);\n }\n\n /**\n * List sessions for the current project.\n */\n async list(options: SessionListOptions = {}): Promise<SessionListResponse> {\n const url = `${this.client.baseUrl}/instance/v2/sessions`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n };\n\n if (options.status) {\n payload.status = options.status;\n }\n\n const response = await this.client._post(url, withRequestedRegion(this.client, payload));\n if (response.status >= 400) {\n this.handleListError(response);\n }\n\n const result = asRecord(response.data);\n const sessionsData = Array.isArray(result.sessions) ? result.sessions : [];\n const paginationData = asRecord(result.pagination);\n\n const sessions = sessionsData.map((item) => this.mapSessionInfo(asRecord(item), options.projectId));\n\n const pagination = new PaginationInfo({\n currentPage: getNumber(paginationData.currentPage) ?? 1,\n pageSize: getNumber(paginationData.pageSize) ?? sessions.length,\n totalCount: getNumber(paginationData.totalCount) ?? sessions.length,\n totalPages: getNumber(paginationData.totalPages) ?? 1,\n activeCount: getNumber(paginationData.activeCount) ?? 0,\n closedCount: getNumber(paginationData.closedCount) ?? 0,\n });\n\n getLogger().info(\n `Retrieved ${sessions.length} sessions (total: ${pagination.totalCount}, active: ${pagination.activeCount}, closed: ${pagination.closedCount})`\n );\n\n return new SessionListResponse(sessions, pagination);\n }\n\n /**\n * Delete a browser session.\n */\n async delete(options: SessionDeleteOptions): Promise<void> {\n const url = `${this.client.baseUrl}/instance`;\n const payload = withRequestedRegion(this.client, {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n session_id: options.sessionId,\n });\n\n const response = await this.client._delete(url, payload);\n if (response.status >= 400) {\n this.handleDeleteError(response, options.sessionId);\n }\n\n getLogger().info(`Session deleted successfully: ${options.sessionId}`);\n }\n\n /**\n * List target/page metadata for a session via `/json`.\n */\n async listTargets(sessionId: string): Promise<SessionTargetInfo[]> {\n const response = await this.client._get(`${this.client.baseUrl}/json`, {\n session_id: sessionId,\n });\n\n if (response.status >= 400) {\n this.handleListTargetsError(response, sessionId);\n }\n\n const result = Array.isArray(response.data) ? response.data : [];\n return result.map((item) => this.mapSessionTarget(asRecord(item)));\n }\n\n /**\n * Fetch the debugger WebSocket URL for a session.\n *\n * @internal\n */\n async _getWebSocketDebuggerUrl(sessionId: string): Promise<string | null> {\n try {\n const response = await this.client._get(`${this.client.baseUrl}/json/version`, {\n session_id: sessionId,\n });\n\n if (response.status >= 400) {\n getLogger().error('Error getting WebSocket debugger URL:', response.data);\n return null;\n }\n\n const result = asRecord(response.data);\n return (\n getString(result.webSocketDebuggerUrlTransformed) ??\n getString(result.webSocketDebuggerUrl) ??\n null\n );\n } catch (error) {\n getLogger().error('Error getting WebSocket debugger URL:', error);\n return null;\n }\n }\n\n private normalizeProxy(proxy: SessionProxyConfig): JsonRecord {\n if (!proxy.server) {\n throw new ValidationError('proxy.server is required when proxy is provided');\n }\n\n const normalizedProxy: JsonRecord = {\n type: proxy.type ?? 'external',\n server: proxy.server,\n };\n\n if (proxy.username) {\n normalizedProxy.username = proxy.username;\n }\n\n if (proxy.password) {\n normalizedProxy.password = proxy.password;\n }\n\n return normalizedProxy;\n }\n\n private handleAsyncCreateFailed(payload: JsonRecord): void {\n const context = asRecord(payload.context);\n const contextId = getString(context.id);\n const contextMode = getString(context.mode);\n\n // The async create endpoint can accept the request and only surface lock conflicts\n // later as create_failed while polling. Preserve the SDK's ContextLockedError contract\n // for read-write context creation so callers do not have to special-case APIError.\n if (contextId && contextMode === 'read_write' && payload.weak_lock !== true) {\n throw new ContextLockedError('Context is locked by another active session');\n }\n }\n\n private handleCreateError(response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n const errorCode = getString(errorData.code);\n const metadata = asRecord(errorData.metadata);\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404 && errorCode === 'context_not_found') {\n throw new ContextNotFoundError(`Context not found: ${errorMessage}`);\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(`Resource not found: ${errorMessage}`);\n }\n\n if (response.status === 409 && errorCode === 'context_locked') {\n throw new ContextLockedError(errorMessage, {\n activeSessionId: getString(metadata.activeSessionId),\n retryAfter: getNumber(metadata.retryAfter),\n });\n }\n\n throw new APIError(`Failed to create session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleGetError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`\n );\n }\n\n throw new APIError(`Failed to get session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleListError(response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n throw new APIError(`Failed to list sessions: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleListTargetsError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`\n );\n }\n\n throw new APIError(`Failed to list session targets: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleDeleteError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may have already been deleted or never existed.`\n );\n }\n\n throw new APIError(`Failed to delete session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private mapSessionInfo(raw: JsonRecord, projectId?: string): SessionInfo {\n const sessionId = getString(raw.session_id) ?? getString(raw.id) ?? '';\n\n return new SessionInfo({\n id: sessionId,\n status: getString(raw.status) ?? 'active',\n apiKey: getString(raw.api_key) ?? this.client.apiKey,\n projectId: getString(raw.project_id) ?? (projectId ?? this.client.projectId),\n regionId: getString(raw.region_id) ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: getString(raw.browser_type) ?? getString(raw.browser_mode) ?? 'normal',\n createdAt: getString(raw.created_at) ?? '',\n inspectUrl:\n getString(raw.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: getString(raw.container_id) ?? null,\n ws: getString(raw.ws) ?? null,\n client: this.client,\n });\n }\n\n private mapSessionTarget(raw: JsonRecord): SessionTargetInfo {\n return new SessionTargetInfo({\n id: getString(raw.id) ?? '',\n title: getString(raw.title) ?? '',\n type: getString(raw.type) ?? '',\n url: getString(raw.url) ?? '',\n description: getString(raw.description) ?? '',\n inspectUrl: getString(raw.inspectUrl) ?? getString(raw.inspect_url) ?? null,\n webSocketDebuggerUrl:\n getString(raw.webSocketDebuggerUrl) ?? getString(raw.web_socket_debugger_url) ?? null,\n webSocketDebuggerUrlTransformed:\n getString(raw.webSocketDebuggerUrlTransformed) ??\n getString(raw.web_socket_debugger_url_transformed) ??\n null,\n });\n }\n\n private async _getCreatedSession(\n sessionId: string,\n projectId: string\n ): Promise<SessionInfo | null> {\n try {\n return await this.get(sessionId, projectId);\n } catch (error) {\n getLogger().warn(\n `Failed to fetch created session ${sessionId}; falling back to locally derived session fields:`,\n error\n );\n return null;\n }\n }\n}\n","/**\n * Integrated authentication helpers.\n */\n\nimport { CDPClient, connectOverCDP } from './cdp';\nimport { ValidationError } from './errors';\nimport { getLogger } from './logging';\nimport { SessionInfo } from './sessions';\n\nexport type IntegratedAuthCallbackResult =\n | {\n cancel: true;\n }\n | {\n cancel: false;\n scheme: string;\n token: string;\n };\n\nexport type IntegratedAuthCallback = (\n params: any,\n callback: (result: IntegratedAuthCallbackResult) => Promise<void>\n) => void | Promise<void>;\n\nconst integratedAuthCallbacks = new Map<string, Set<IntegratedAuthCallback>>();\nconst cdpClients = new Map<string, CDPClient>();\n\nfunction getIntegratedAuthKey(sessionOrClient: SessionInfo | CDPClient): string {\n const session =\n sessionOrClient instanceof SessionInfo ? sessionOrClient : sessionOrClient.session;\n const connectUrl = session.connectUrl;\n\n if (!connectUrl) {\n throw new ValidationError(`Session ${session.sessionId} does not include a CDP connect URL`);\n }\n\n return connectUrl;\n}\n\n/**\n * Register an integrated auth callback for a session.\n */\nexport async function registerIntegratedAuthCallback(\n sessionOrClient: SessionInfo | CDPClient,\n callback: IntegratedAuthCallback\n): Promise<void> {\n const key = getIntegratedAuthKey(sessionOrClient);\n\n let sessionCallbacks = integratedAuthCallbacks.get(key);\n if (sessionCallbacks?.has(callback)) {\n return;\n }\n\n let client = cdpClients.get(key);\n if (!client) {\n if (sessionOrClient instanceof SessionInfo) {\n client = await connectOverCDP(sessionOrClient);\n } else {\n client = sessionOrClient;\n }\n\n await client.send('Fetch.enable', { handleAuthRequests: true });\n cdpClients.set(key, client);\n\n client.on('disconnect', () => {\n cdpClients.delete(key);\n integratedAuthCallbacks.delete(key);\n });\n\n client.on('Fetch.requestPaused', async (event: any, sessionId: string) => {\n try {\n await client!.send(\n 'Fetch.continueRequest',\n {\n requestId: event.requestId,\n },\n sessionId\n );\n } catch (error) {\n getLogger().error('Failed to continue paused fetch request', error);\n }\n });\n\n client.on('Fetch.integratedAuthRequired', async (params: any, sessionId: string) => {\n try {\n const sessionCallbacks = integratedAuthCallbacks.get(key);\n if (!sessionCallbacks) {\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'CancelAuth',\n },\n },\n sessionId\n );\n return;\n }\n\n const sender = async (result: IntegratedAuthCallbackResult) => {\n if (result.cancel) {\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'CancelAuth',\n },\n },\n sessionId\n );\n return;\n }\n\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'ProvideIntegratedCredentials',\n scheme: result.scheme,\n token: result.token,\n },\n },\n sessionId\n );\n };\n\n for (const cb of sessionCallbacks) {\n try {\n const result = cb(params, sender);\n void Promise.resolve(result).catch((error) => {\n getLogger().error('Integrated auth callback failed', error);\n });\n } catch (error) {\n getLogger().error('Integrated auth callback failed', error);\n }\n }\n } catch (error) {\n getLogger().error('Failed to handle integrated auth request', error);\n }\n });\n }\n\n if (!sessionCallbacks) {\n sessionCallbacks = new Set();\n integratedAuthCallbacks.set(key, sessionCallbacks);\n }\n\n sessionCallbacks.add(callback);\n}\n\n/**\n * Deregister a previously registered integrated auth callback.\n */\nexport function deregisterIntegratedAuthCallback(\n sessionOrClient: SessionInfo | CDPClient,\n callback: IntegratedAuthCallback\n): void {\n const key = getIntegratedAuthKey(sessionOrClient);\n\n const sessionCallbacks = integratedAuthCallbacks.get(key);\n if (!sessionCallbacks?.has(callback)) {\n return;\n }\n\n sessionCallbacks.delete(callback);\n\n if (sessionCallbacks.size === 0) {\n integratedAuthCallbacks.delete(key);\n }\n}\n","/**\n * Lexmount API client.\n */\n\nimport { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, isAxiosError } from 'axios';\nimport axios from 'axios';\nimport * as dotenv from 'dotenv';\nimport { ContextsResource } from './contexts';\nimport { ExtensionsResource } from './extensions';\nimport { APIError, NetworkError, TimeoutError, ValidationError } from './errors';\nimport { getLogger, setLogLevel } from './logging';\nimport { SessionsResource } from './sessions';\nimport type { CatalogInfo, LexmountConfig, RegionCatalogEntry, RegionInfo } from './types';\n\ndotenv.config();\n\n/**\n * Main Lexmount SDK client.\n */\nexport class Lexmount {\n /**\n * API key used for authentication.\n */\n readonly apiKey: string;\n\n /**\n * Default project identifier used by resource methods.\n */\n readonly projectId: string;\n\n /**\n * API base URL.\n */\n readonly baseUrl: string;\n\n readonly region?: string;\n\n selectedRegion?: string;\n\n private endpointBaseUrl?: string;\n\n private selectedHost?: string;\n\n private regionResolutionAttempted = false;\n\n private regionResolutionPromise?: Promise<void>;\n\n /**\n * Session operations.\n */\n readonly sessions: SessionsResource;\n\n /**\n * Persistent context operations.\n */\n readonly contexts: ContextsResource;\n\n /**\n * Browser extension operations.\n */\n readonly extensions: ExtensionsResource;\n\n private readonly httpClient: AxiosInstance;\n\n constructor(config: LexmountConfig = {}) {\n this.apiKey = config.apiKey ?? process.env.LEXMOUNT_API_KEY ?? '';\n if (!this.apiKey) {\n throw new ValidationError(\n 'apiKey must be provided or set LEXMOUNT_API_KEY environment variable'\n );\n }\n\n this.projectId = config.projectId ?? process.env.LEXMOUNT_PROJECT_ID ?? '';\n if (!this.projectId) {\n throw new ValidationError(\n 'projectId must be provided or set LEXMOUNT_PROJECT_ID environment variable'\n );\n }\n\n this.baseUrl = (\n config.baseUrl ??\n process.env.LEXMOUNT_BASE_URL ??\n 'https://api.lexmount.cn'\n ).replace(/\\/$/, '');\n this.region = config.region;\n\n if (config.logLevel) {\n setLogLevel(config.logLevel);\n }\n\n this.httpClient = axios.create({\n timeout: config.timeout ?? 60000,\n validateStatus: () => true,\n });\n\n this.sessions = new SessionsResource(this);\n this.contexts = new ContextsResource(this);\n this.extensions = new ExtensionsResource(this);\n }\n\n /**\n * Internal POST request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _post<T = unknown>(\n url: string,\n data?: unknown,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('POST', url, { ...config, data });\n }\n\n /**\n * Internal GET request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _get<T = unknown>(\n url: string,\n params?: Record<string, unknown>,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('GET', url, { ...config, params });\n }\n\n /**\n * Internal DELETE request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _delete<T = unknown>(\n url: string,\n data?: unknown,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('DELETE', url, { ...config, data });\n }\n\n async regionInfo(): Promise<RegionInfo> {\n await this.ensureRegionResolved();\n return {\n requestedRegion: this.region,\n selectedRegion: this.selectedRegion,\n baseUrl: this.baseUrl,\n endpointBaseUrl: this.endpointBaseUrl,\n host: this.selectedHost,\n resolved: this.regionResolutionAttempted,\n usingRegion: this.selectedRegion !== undefined,\n };\n }\n\n async catalogInfo(): Promise<CatalogInfo> {\n try {\n const response = await this.httpClient.get<{ regions?: unknown }>(\n `${this.baseUrl}/v1/regions/catalog`\n );\n if (response.status !== 200) {\n return {\n baseUrl: this.baseUrl,\n available: false,\n statusCode: response.status,\n regions: [],\n };\n }\n\n const regions = Array.isArray(response.data?.regions)\n ? (response.data.regions as RegionCatalogEntry[])\n : [];\n return {\n baseUrl: this.baseUrl,\n available: Array.isArray(response.data?.regions),\n statusCode: response.status,\n regions,\n error: Array.isArray(response.data?.regions) ? undefined : 'invalid catalog regions',\n };\n } catch (error) {\n return {\n baseUrl: this.baseUrl,\n available: false,\n regions: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Close the client.\n *\n * Axios does not require explicit teardown, but the method is kept for API symmetry.\n */\n close(): void {\n getLogger().debug('Closing Lexmount client');\n }\n\n /**\n * String representation of the client.\n */\n toString(): string {\n return `Lexmount(projectId='${this.projectId}', baseUrl='${this.baseUrl}')`;\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n config: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n const logger = getLogger();\n const startTime = Date.now();\n const requestUrl = this.rewriteUrl(url);\n logger.debug(`${method} request to ${requestUrl}`);\n\n try {\n const headers = {\n api_key: this.apiKey,\n project_id: this.projectId,\n ...this.getDefaultHeaders(config.data),\n ...(config.headers ?? {}),\n };\n\n const response = await this.httpClient.request<T>({\n method,\n url: requestUrl,\n ...config,\n headers,\n });\n\n const elapsed = Date.now() - startTime;\n logger.debug(\n `${method} response: status=${response.status}, duration=${elapsed.toFixed(2)}ms`\n );\n return response;\n } catch (error) {\n const elapsed = Date.now() - startTime;\n throw this.normalizeRequestError(error, elapsed);\n }\n }\n\n private normalizeRequestError(error: unknown, elapsedMs: number): Error {\n const logger = getLogger();\n\n if (!isAxiosError(error)) {\n logger.error(`Unexpected request error after ${elapsedMs.toFixed(2)}ms:`, error);\n return new APIError('Unexpected HTTP error', { response: error });\n }\n\n const axiosError = error as AxiosError<unknown>;\n\n if (axiosError.code === 'ECONNABORTED') {\n logger.error(`Request timeout after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new TimeoutError(`Request timed out: ${axiosError.message}`);\n }\n\n if (axiosError.response) {\n logger.error(`HTTP error after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new APIError(`HTTP error: ${axiosError.message}`, {\n statusCode: axiosError.response.status,\n response: axiosError.response.data,\n });\n }\n\n logger.error(`Network error after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new NetworkError(`Network error: ${axiosError.message}`);\n }\n\n private getDefaultHeaders(data: unknown): Record<string, string> {\n if (typeof data === 'undefined') {\n return {};\n }\n\n if (typeof FormData !== 'undefined' && data instanceof FormData) {\n return {};\n }\n\n return {\n 'Content-Type': 'application/json',\n };\n }\n\n private async ensureRegionResolved(): Promise<void> {\n if (this.regionResolutionAttempted) {\n return;\n }\n\n if (!this.regionResolutionPromise) {\n this.regionResolutionPromise = this.resolveRegion().finally(() => {\n this.regionResolutionAttempted = true;\n this.regionResolutionPromise = undefined;\n });\n }\n\n await this.regionResolutionPromise;\n }\n\n private async resolveRegion(): Promise<void> {\n const logger = getLogger();\n try {\n const response = await this.httpClient.get<{ regions?: unknown }>(\n `${this.baseUrl}/v1/regions/catalog`\n );\n if (response.status !== 200 || !Array.isArray(response.data?.regions)) {\n logger.debug(\n `Region catalog unavailable, falling back to baseUrl: status=${response.status}`\n );\n return;\n }\n\n const selected = this.selectCatalogRegion(response.data.regions as RegionCatalogEntry[]);\n if (!selected) {\n if (this.region) {\n logger.warn(`Requested region not found in catalog: ${this.region}`);\n } else {\n logger.debug('No default catalog region, falling back to baseUrl');\n }\n return;\n }\n\n const endpointBaseUrl = await this.probeRegionHost(selected);\n if (!endpointBaseUrl) {\n logger.debug('Region probe failed, falling back to baseUrl');\n return;\n }\n\n this.selectedRegion = selected.region_id;\n this.selectedHost = selected.host;\n this.endpointBaseUrl = endpointBaseUrl;\n } catch (error) {\n logger.debug('Region resolution failed, falling back to baseUrl:', error);\n }\n }\n\n private selectCatalogRegion(regions: RegionCatalogEntry[]): RegionCatalogEntry | undefined {\n if (this.region) {\n return regions.find((region) => region.region_id === this.region);\n }\n const defaultRegions = regions.filter((region) => region.default === true);\n return defaultRegions.length === 1 ? defaultRegions[0] : undefined;\n }\n\n private async probeRegionHost(region: RegionCatalogEntry): Promise<string | undefined> {\n const logger = getLogger();\n const host = String(region.host || '').trim();\n if (!host) {\n return undefined;\n }\n if (!this.isAllowedCatalogHost(host)) {\n logger.warn(`Ignoring invalid region catalog host: ${host}`);\n return undefined;\n }\n\n const endpointBaseUrl = `https://${host}`;\n const probePath = String(region.probe_path || '/v1/region/probe').replace(/^(?!\\/)/, '/');\n try {\n const response = await this.httpClient.get(`${endpointBaseUrl}${probePath}`);\n return response.status === 200 ? endpointBaseUrl : undefined;\n } catch {\n return undefined;\n }\n }\n\n private isAllowedCatalogHost(host: string): boolean {\n let parsed: URL;\n try {\n parsed = new URL(`https://${host}`);\n } catch {\n return false;\n }\n\n if (\n parsed.username ||\n parsed.password ||\n parsed.port ||\n parsed.pathname !== '/' ||\n parsed.search ||\n parsed.hash\n ) {\n return false;\n }\n\n const hostname = parsed.hostname.toLowerCase();\n const allowedDomains = ['lexmount.cn', 'lexmount.com', 'lexmount.net'];\n return allowedDomains.some((domain) => hostname === domain || hostname.endsWith(`.${domain}`));\n }\n\n private rewriteUrl(url: string): string {\n if (!this.endpointBaseUrl || !url.startsWith(this.baseUrl)) {\n return url;\n }\n return `${this.endpointBaseUrl}${url.slice(this.baseUrl.length)}`;\n }\n}\n\nexport default Lexmount;\n","/**\n * Context resource implementation.\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n} from './errors';\nimport { getLogger } from './logging';\nimport type {\n ContextCreateOptions,\n ContextListOptions,\n ContextMetadata,\n ContextStatus,\n ForceReleaseResponse,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction parseTimestamp(value: unknown): string | null {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return new Date(value).toISOString();\n }\n\n return null;\n}\n\nfunction normalizeContextStatus(value: unknown): ContextStatus {\n if (value === true || value === 'locked') {\n return 'locked';\n }\n\n if (value === false || value === 'available') {\n return 'available';\n }\n\n return typeof value === 'string' ? value : 'available';\n}\n\n/**\n * Context information returned by the API.\n */\nexport class ContextInfo {\n readonly id: string;\n readonly status: ContextStatus;\n readonly metadata: ContextMetadata;\n readonly createdAt: string | null;\n readonly updatedAt: string | null;\n\n constructor(options: {\n id: string;\n status: ContextStatus;\n metadata?: ContextMetadata;\n createdAt?: string | null;\n updatedAt?: string | null;\n }) {\n this.id = options.id;\n this.status = options.status;\n this.metadata = options.metadata ?? {};\n this.createdAt = options.createdAt ?? null;\n this.updatedAt = options.updatedAt ?? null;\n }\n\n get createdAtDate(): Date | null {\n if (!this.createdAt) {\n return null;\n }\n\n const date = new Date(this.createdAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n get updatedAtDate(): Date | null {\n if (!this.updatedAt) {\n return null;\n }\n\n const date = new Date(this.updatedAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n isLocked(): boolean {\n return this.status === 'locked';\n }\n\n isAvailable(): boolean {\n return this.status === 'available';\n }\n}\n\n/**\n * Response object from `contexts.list()`.\n */\nexport class ContextListResponse implements Iterable<ContextInfo> {\n readonly data: ContextInfo[];\n\n constructor(data: ContextInfo[]) {\n this.data = data;\n }\n\n get length(): number {\n return this.data.length;\n }\n\n [Symbol.iterator](): Iterator<ContextInfo> {\n return this.data[Symbol.iterator]();\n }\n\n at(index: number): ContextInfo | undefined {\n return this.data[index];\n }\n}\n\n/**\n * Context resource operations.\n */\nexport class ContextsResource {\n constructor(private readonly client: Lexmount) {}\n\n /**\n * Create a new persistent context.\n */\n async create(options: ContextCreateOptions = {}): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/create-context`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n if (options.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'create');\n }\n\n const result = asRecord(response.data);\n const contextId = getString(result.context_id);\n if (!contextId) {\n throw new APIError('Failed to create context: context_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const context = new ContextInfo({\n id: contextId,\n status: normalizeContextStatus(result.locked),\n metadata: (result.metadata as ContextMetadata | undefined) ?? options.metadata ?? {},\n createdAt: parseTimestamp(result.created_at),\n });\n\n getLogger().info(`Successfully created context '${context.id}'`);\n return context;\n }\n\n /**\n * List contexts in the current project.\n */\n async list(options: ContextListOptions = {}): Promise<ContextListResponse> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/list-contexts`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n limit: options.limit ?? 20,\n };\n\n if (options.status) {\n payload.status = options.status;\n }\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'list');\n }\n\n const result = asRecord(response.data);\n const contexts = Array.isArray(result.contexts)\n ? result.contexts.map((item) => {\n const context = asRecord(item);\n return new ContextInfo({\n id: getString(context.context_id) ?? '',\n status: normalizeContextStatus(context.locked),\n createdAt: parseTimestamp(context.created_at),\n updatedAt: parseTimestamp(context.updated_at),\n metadata: (context.metadata as ContextMetadata | undefined) ?? {},\n });\n })\n : [];\n\n getLogger().info(`Retrieved ${contexts.length} contexts`);\n return new ContextListResponse(contexts);\n }\n\n /**\n * Fetch a single context.\n */\n async get(contextId: string): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'get', contextId);\n }\n\n const result = asRecord(response.data);\n const context = asRecord(result.context);\n\n const contextInfo = new ContextInfo({\n id: getString(context.context_id) ?? contextId,\n status: normalizeContextStatus(context.locked),\n metadata: (context.metadata as ContextMetadata | undefined) ?? {},\n createdAt: parseTimestamp(context.created_at),\n updatedAt: parseTimestamp(context.updated_at),\n });\n\n getLogger().info(`Retrieved context '${contextInfo.id}' (status: ${contextInfo.status})`);\n return contextInfo;\n }\n\n /**\n * Fork an existing persistent context into a new context.\n */\n async fork(contextId: string): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/fork`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'fork', contextId);\n }\n\n const result = asRecord(response.data);\n const forkedContextId = getString(result.context_id);\n if (!forkedContextId) {\n throw new APIError('Failed to fork context: context_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const contextInfo = new ContextInfo({\n id: forkedContextId,\n status: normalizeContextStatus(result.locked),\n metadata: (result.metadata as ContextMetadata | undefined) ?? {},\n createdAt: parseTimestamp(result.created_at),\n updatedAt: parseTimestamp(result.updated_at),\n });\n\n getLogger().info(`Successfully forked context '${contextId}' -> '${contextInfo.id}'`);\n return contextInfo;\n }\n\n /**\n * Delete a persistent context.\n */\n async delete(contextId: string): Promise<void> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._delete(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'delete', contextId);\n }\n\n getLogger().info(`Successfully deleted context '${contextId}'`);\n }\n\n /**\n * Force-release a stuck lock on a context.\n */\n async forceRelease(contextId: string): Promise<ForceReleaseResponse> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/force-release`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'force_release', contextId);\n }\n\n const result = asRecord(response.data);\n return {\n status: getString(result.status) ?? 'unlocked',\n message: getString(result.message) ?? 'Lock released successfully',\n };\n }\n\n private handleError(\n response: AxiosResponse<unknown>,\n operation: string,\n contextId?: string\n ): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n const errorCode = getString(errorData.code);\n const metadata = asRecord(errorData.metadata);\n\n if (response.status === 401) {\n throw new AuthenticationError(`Authentication failed: ${errorMessage}`);\n }\n\n if (response.status === 404) {\n const suffix = contextId ? `: ${contextId}` : '';\n throw new ContextNotFoundError(`Context not found${suffix}`);\n }\n\n if (\n response.status === 409 &&\n (errorCode === 'context_locked' || errorCode === 'CONTEXT_FORK_SOURCE_LOCKED')\n ) {\n throw new ContextLockedError(errorMessage, {\n activeSessionId: getString(metadata.activeSessionId),\n retryAfter:\n typeof metadata.retryAfter === 'number' ? metadata.retryAfter : undefined,\n });\n }\n\n if (response.status === 409 && errorCode === 'session_active') {\n throw new APIError(\n `Cannot ${operation} context: ${errorMessage} (session is active)`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 500) {\n const details = getString(errorData.details);\n throw new APIError(\n `Internal server error (500) during ${operation}: ${errorMessage}${details ? `. Details: ${details}` : ''}`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 502) {\n throw new APIError(\n `Server gateway error (502) during ${operation}: The service may be temporarily unavailable. Please retry.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 503) {\n throw new APIError(\n `Service unavailable (503) during ${operation}: The service is temporarily unavailable. Please retry later.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 504) {\n throw new APIError(\n `Gateway timeout (504) during ${operation}: The request timed out. Please retry.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n throw new APIError(`Failed to ${operation} context: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n","/**\n * Extension resource implementation.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport { APIError, AuthenticationError } from './errors';\nimport { getLogger } from './logging';\nimport type {\n ExtensionInfoShape,\n ExtensionListOptions,\n ExtensionUploadOptions,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Extension metadata returned by the API.\n */\nexport class ExtensionInfo implements ExtensionInfoShape {\n readonly id: string;\n readonly name: string;\n readonly projectId: string;\n readonly createdAt?: string;\n readonly updatedAt?: string;\n\n constructor(shape: ExtensionInfoShape) {\n this.id = shape.id;\n this.name = shape.name;\n this.projectId = shape.projectId;\n this.createdAt = shape.createdAt;\n this.updatedAt = shape.updatedAt;\n }\n}\n\n/**\n * Browser extension resource operations.\n */\nexport class ExtensionsResource {\n constructor(private readonly client: Lexmount) {}\n\n async upload(filePath: string, options: ExtensionUploadOptions = {}): Promise<ExtensionInfo> {\n const fileBuffer = await readFile(filePath);\n const form = new FormData();\n const usedProjectId = options.projectId ?? this.client.projectId;\n\n form.append('project_id', usedProjectId);\n if (options.name) {\n form.append('name', options.name);\n }\n\n form.append(\n 'file',\n new Blob([fileBuffer], { type: 'application/octet-stream' }),\n path.basename(filePath)\n );\n\n const response = await this.client._post(\n `${this.client.baseUrl}/instance/v1/extension/upload`,\n form,\n {\n headers: {\n project_id: usedProjectId,\n },\n }\n );\n if (response.status >= 400) {\n this.handleError('upload extension', response);\n }\n\n getLogger().info(`Extension uploaded successfully: ${filePath}`);\n return this.parseInfo(response.data);\n }\n\n async list(options: ExtensionListOptions = {}): Promise<ExtensionInfo[]> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v1/extension/list`, {\n project_id: options.projectId ?? this.client.projectId,\n limit: options.limit ?? 20,\n offset: options.offset ?? 0,\n });\n if (response.status >= 400) {\n this.handleError('list extensions', response);\n }\n\n const result = asRecord(response.data);\n const items = Array.isArray(result.data) ? result.data : [];\n return items.map((item) => this.parseInfo(item));\n }\n\n async get(extensionId: string, projectId?: string): Promise<ExtensionInfo> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v1/extension/info`, {\n project_id: projectId ?? this.client.projectId,\n extension_id: extensionId,\n });\n if (response.status >= 400) {\n this.handleError('get extension', response);\n }\n\n return this.parseInfo(response.data);\n }\n\n async delete(extensionId: string): Promise<void> {\n const response = await this.client._delete(\n `${this.client.baseUrl}/instance/v1/extension/${extensionId}`\n );\n if (response.status >= 400) {\n this.handleError('delete extension', response);\n }\n\n getLogger().info(`Extension deleted successfully: ${extensionId}`);\n }\n\n private parseInfo(data: unknown): ExtensionInfo {\n const item = asRecord(data);\n\n return new ExtensionInfo({\n id: getString(item.id) ?? '',\n name: getString(item.name) ?? '',\n projectId: getString(item.project_id) ?? '',\n createdAt: getString(item.created_at),\n updatedAt: getString(item.updated_at),\n });\n }\n\n private handleError(action: string, response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.message) ?? getString(errorData.error) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n throw new APIError(`Failed to ${action}: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n"],"mappings":"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","names":["CDP","sessionCallbacks","import_axios","asRecord","getString","asRecord","getString","path","config","axios","logger"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/cdp.ts","../src/errors.ts","../src/logging.ts","../src/sessions.ts","../src/auth.ts","../src/client.ts","../src/contexts.ts","../src/extensions.ts"],"sourcesContent":["/**\n * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.5.7';\n\nexport {\n deregisterIntegratedAuthCallback,\n registerIntegratedAuthCallback,\n type IntegratedAuthCallback,\n type IntegratedAuthCallbackResult,\n} from './auth';\nexport { CDPClient, connectOverCDP, type CDPEventMessage } from './cdp';\nexport { Lexmount } from './client';\nexport { ContextInfo, ContextListResponse, ContextsResource } from './contexts';\nexport { ExtensionInfo, ExtensionsResource } from './extensions';\nexport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n LexmountError,\n NetworkError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nexport {\n LexmountLogger,\n disableLogging,\n enableLogging,\n getLogger,\n setLogLevel,\n type LogLevel,\n} from './logging';\nexport {\n PaginationInfo,\n SessionDownloadInfo,\n SessionDownloadsDeleteResponse,\n SessionDownloadsListResponse,\n SessionDownloadsResource,\n SessionInfo,\n SessionListResponse,\n SessionTargetInfo,\n SessionsResource,\n type SessionCreateResponse,\n} from './sessions';\nexport type {\n BrowserMode,\n ContextAccessMode,\n ContextCreateOptions,\n ContextListOptions,\n ContextMetadata,\n ContextStatus,\n ExtensionInfoShape,\n ExtensionListOptions,\n ExtensionUploadOptions,\n ForceReleaseResponse,\n CatalogInfo,\n LexmountConfig,\n PaginationInfoShape,\n RegionCatalogEntry,\n RegionInfo,\n SessionContext,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n SessionTargetInfoShape,\n} from './types';\n\nexport { Lexmount as default } from './client';\n","/**\n * Chrome DevTools Protocol connection helpers.\n */\n\nimport { EventEmitter } from 'events';\nimport CDP from 'chrome-remote-interface';\nimport { ValidationError } from './errors';\nimport { getLogger } from './logging';\nimport { SessionInfo } from './sessions';\n\nexport interface CDPEventMessage {\n method: string;\n params?: Record<string, unknown>;\n sessionId?: string;\n}\n\nfunction hasExplicitPort(url: string): boolean {\n const authority = url.match(/^[a-z][a-z\\d+\\-.]*:\\/\\/([^/?#]+)/i)?.[1] ?? '';\n const host = authority.includes('@')\n ? authority.slice(authority.lastIndexOf('@') + 1)\n : authority;\n\n if (host.startsWith('[')) {\n return /\\]:\\d+$/.test(host);\n }\n\n return /:\\d+$/.test(host);\n}\n\nfunction getDefaultPort(url: string): number | undefined {\n const protocol = getProtocol(url);\n if (protocol === 'ws') {\n return 80;\n }\n if (protocol === 'wss') {\n return 443;\n }\n return undefined;\n}\n\nfunction getProtocol(url: string): string | undefined {\n return url.match(/^([a-z][a-z\\d+\\-.]*):\\/\\//i)?.[1]?.toLowerCase();\n}\n\n/**\n * Lexmount CDP client.\n *\n * It forwards Chrome DevTools Protocol notifications through EventEmitter and\n * exposes `send()` for raw CDP commands.\n */\nexport class CDPClient extends EventEmitter {\n readonly session: SessionInfo;\n private closed = false;\n private rawClient?: CDP.Client;\n\n constructor(session: SessionInfo) {\n super();\n\n const connectUrl = session.connectUrl;\n if (!connectUrl) {\n throw new ValidationError(`Session ${session.sessionId} does not include a CDP connect URL`);\n }\n\n this.session = session;\n }\n\n /**\n * Connect the CDP client to the session.\n */\n async connect(): Promise<this> {\n if (this.rawClient && !this.closed) {\n return this;\n }\n\n this.closed = false;\n getLogger().debug(`Connecting to session ${this.session.sessionId} over CDP`);\n const options: CDP.Options = {\n target: this.session.connectUrl,\n local: true,\n };\n const defaultPort = getDefaultPort(this.session.connectUrl);\n if (!hasExplicitPort(this.session.connectUrl) && defaultPort) {\n options.port = defaultPort;\n }\n if (getProtocol(this.session.connectUrl) === 'wss') {\n options.secure = true;\n }\n\n this.rawClient = await CDP(options);\n\n this.rawClient.on('event', (message: CDPEventMessage) => {\n this.emit(message.method, message.params, message.sessionId);\n });\n this.rawClient.on('error', (err) => {\n this.emit('error', err);\n });\n this.rawClient.on('disconnect', () => {\n void this.close().catch((err) => {\n getLogger().error(`Failed to close CDP client for session ${this.session.sessionId} after disconnect`, err);\n });\n this.emit('disconnect');\n });\n\n return this;\n }\n\n /**\n * Send a raw Chrome DevTools Protocol command.\n *\n * Returns `undefined` if called before the client has connected.\n */\n async send(method: string, params?: any, sessionId?: string): Promise<any | undefined> {\n if (this.closed) {\n throw new ValidationError('Cannot send CDP command after client is closed');\n }\n\n const rawClient = this.rawClient;\n if (!rawClient) {\n return undefined;\n }\n\n return rawClient.send(method, params, sessionId);\n }\n\n /**\n * Close the CDP connection and release internal listeners.\n */\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n if (this.rawClient) {\n this.rawClient.removeAllListeners('event');\n this.rawClient.removeAllListeners('disconnect');\n this.rawClient.removeAllListeners('error');\n await this.rawClient.close();\n }\n }\n}\n\n/**\n * Connect to a Lexmount browser session over Chrome DevTools Protocol.\n */\nexport async function connectOverCDP(session: SessionInfo): Promise<CDPClient> {\n const client = new CDPClient(session);\n await client.connect();\n return client;\n}\n","/**\n * Lexmount SDK error hierarchy.\n */\n\n/**\n * Base error for all Lexmount SDK failures.\n */\nexport class LexmountError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\n/**\n * Raised when API authentication fails.\n */\nexport class AuthenticationError extends LexmountError {}\n\n/**\n * Raised when a session cannot be found.\n */\nexport class SessionNotFoundError extends LexmountError {}\n\n/**\n * Raised when a context cannot be found.\n */\nexport class ContextNotFoundError extends LexmountError {}\n\n/**\n * Raised when a context is locked by another active session.\n */\nexport class ContextLockedError extends LexmountError {\n readonly activeSessionId?: string;\n readonly retryAfter?: number;\n\n constructor(\n message: string,\n options: { activeSessionId?: string; retryAfter?: number } = {}\n ) {\n const details: string[] = [];\n\n if (options.activeSessionId) {\n details.push(`locked by session: ${options.activeSessionId}`);\n }\n\n if (typeof options.retryAfter === 'number') {\n details.push(`retry after ${options.retryAfter}s`);\n }\n\n super(details.length > 0 ? `${message} (${details.join(', ')})` : message);\n this.activeSessionId = options.activeSessionId;\n this.retryAfter = options.retryAfter;\n }\n}\n\n/**\n * Raised when the Lexmount API returns a non-success response.\n */\nexport class APIError extends LexmountError {\n readonly statusCode?: number;\n readonly response?: unknown;\n\n constructor(message: string, options: { statusCode?: number; response?: unknown } = {}) {\n super(\n typeof options.statusCode === 'number'\n ? `${message} (HTTP ${options.statusCode})`\n : message\n );\n this.statusCode = options.statusCode;\n this.response = options.response;\n }\n}\n\n/**\n * Raised when a network error prevents the request from reaching the API.\n */\nexport class NetworkError extends LexmountError {}\n\n/**\n * Raised when input validation fails.\n */\nexport class ValidationError extends LexmountError {}\n\n/**\n * Raised when a request exceeds the configured timeout.\n */\nexport class TimeoutError extends LexmountError {}\n","import { ValidationError } from './errors';\n\n/**\n * Supported SDK log levels.\n */\nexport type LogLevel =\n | 'DEBUG'\n | 'INFO'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'SILENT';\n\nconst LOGGER_NAME = 'lexmount';\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n DEBUG: 10,\n INFO: 20,\n WARNING: 30,\n ERROR: 40,\n CRITICAL: 50,\n SILENT: 60,\n};\n\nlet currentLevel: LogLevel = 'WARNING';\n\nfunction isLogLevel(value: string): value is LogLevel {\n return value in LOG_LEVEL_PRIORITY;\n}\n\nfunction formatTimestamp(date: Date): string {\n return date.toISOString().replace('T', ' ').replace('Z', '');\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[currentLevel];\n}\n\nfunction emit(level: Exclude<LogLevel, 'SILENT'>, args: unknown[]): void {\n if (!shouldLog(level)) {\n return;\n }\n\n const prefix = `${formatTimestamp(new Date())} - ${LOGGER_NAME} - ${level} -`;\n\n if (level === 'ERROR' || level === 'CRITICAL') {\n console.error(prefix, ...args);\n return;\n }\n\n if (level === 'WARNING') {\n console.warn(prefix, ...args);\n return;\n }\n\n if (level === 'INFO') {\n console.info(prefix, ...args);\n return;\n }\n\n console.debug(prefix, ...args);\n}\n\n/**\n * Shared SDK logger.\n */\nexport class LexmountLogger {\n /**\n * Current SDK log level.\n */\n get level(): LogLevel {\n return currentLevel;\n }\n\n debug(...args: unknown[]): void {\n emit('DEBUG', args);\n }\n\n info(...args: unknown[]): void {\n emit('INFO', args);\n }\n\n warn(...args: unknown[]): void {\n emit('WARNING', args);\n }\n\n error(...args: unknown[]): void {\n emit('ERROR', args);\n }\n\n critical(...args: unknown[]): void {\n emit('CRITICAL', args);\n }\n}\n\nconst logger = new LexmountLogger();\n\n/**\n * Return the shared SDK logger instance.\n */\nexport function getLogger(): LexmountLogger {\n return logger;\n}\n\n/**\n * Set the SDK log level.\n */\nexport function setLogLevel(level: LogLevel | string): void {\n if (typeof level !== 'string' || level.trim() === '') {\n throw new ValidationError(\n 'Invalid log level. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL, SILENT'\n );\n }\n\n const normalizedLevel = level.toUpperCase();\n if (!isLogLevel(normalizedLevel)) {\n throw new ValidationError(\n `Invalid log level: ${level}. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL, SILENT`\n );\n }\n\n currentLevel = normalizedLevel;\n logger.debug(`Log level set to ${normalizedLevel}`);\n}\n\n/**\n * Disable all SDK logging.\n */\nexport function disableLogging(): void {\n currentLevel = 'SILENT';\n}\n\n/**\n * Re-enable SDK logging.\n */\nexport function enableLogging(level: LogLevel | string = 'INFO'): void {\n setLogLevel(level);\n}\n","/**\n * Session resource implementation.\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nimport { getLogger } from './logging';\nimport type {\n BrowserMode,\n PaginationInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n SessionTargetInfoShape,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction withRequestedRegion(client: Lexmount, payload: JsonRecord): JsonRecord {\n const regionId = client.selectedRegion ?? client.region;\n return regionId ? { ...payload, region_id: regionId } : payload;\n}\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizeContextMode(mode: string): 'read_write' | 'read_only' {\n if (mode === 'readWrite' || mode === 'read_write') {\n return 'read_write';\n }\n\n return 'read_only';\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Session pagination information.\n */\nexport class PaginationInfo implements PaginationInfoShape {\n readonly currentPage: number;\n readonly pageSize: number;\n readonly totalCount: number;\n readonly totalPages: number;\n readonly activeCount: number;\n readonly closedCount: number;\n\n constructor(shape: PaginationInfoShape) {\n this.currentPage = shape.currentPage;\n this.pageSize = shape.pageSize;\n this.totalCount = shape.totalCount;\n this.totalPages = shape.totalPages;\n this.activeCount = shape.activeCount;\n this.closedCount = shape.closedCount;\n }\n}\n\ninterface SessionInfoOptions {\n id: string;\n status: SessionStatus;\n apiKey: string;\n projectId: string;\n regionId?: string | null;\n browserType: BrowserMode | string;\n createdAt: string;\n inspectUrl: string;\n containerId: string | null;\n ws?: string | null;\n client?: Lexmount;\n}\n\n/**\n * Session information returned by the API.\n */\nexport class SessionInfo {\n readonly id: string;\n readonly sessionId: string;\n readonly status: SessionStatus;\n readonly apiKey: string;\n readonly projectId: string;\n readonly regionId: string | null;\n readonly region_id: string | null;\n readonly browserType: BrowserMode | string;\n readonly createdAt: string;\n readonly inspectUrl: string;\n readonly containerId: string | null;\n readonly ws: string | null;\n\n private readonly client?: Lexmount;\n private closed = false;\n\n /** @internal */\n constructor(options: SessionInfoOptions) {\n this.id = options.id;\n this.sessionId = options.id;\n this.status = options.status;\n this.apiKey = options.apiKey;\n this.projectId = options.projectId;\n this.regionId = options.regionId ?? null;\n this.region_id = this.regionId;\n this.browserType = options.browserType;\n this.createdAt = options.createdAt;\n this.inspectUrl = options.inspectUrl;\n this.containerId = options.containerId;\n this.ws = options.ws ?? null;\n this.client = options.client;\n }\n\n /**\n * Playwright/CDP connection URL.\n */\n get connectUrl(): string {\n return this.ws ?? '';\n }\n\n /**\n * Parsed session creation time.\n */\n get createdAtDate(): Date | null {\n const date = new Date(this.createdAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n /**\n * Close the current session.\n *\n * This method is idempotent. Errors are logged and swallowed to keep cleanup safe.\n */\n async close(): Promise<void> {\n if (this.closed) {\n getLogger().debug(`Session ${this.sessionId} is already closed.`);\n return;\n }\n\n if (!this.client) {\n getLogger().warn(\n `Cannot close session ${this.sessionId}: client was not provided during session creation.`\n );\n return;\n }\n\n try {\n getLogger().debug(`Closing session ${this.sessionId}`);\n await this.client.sessions.delete({\n sessionId: this.sessionId,\n projectId: this.projectId,\n });\n this.closed = true;\n getLogger().info(`Session closed: ${this.sessionId}`);\n } catch (error) {\n getLogger().warn(`Failed to close session ${this.sessionId}:`, error);\n }\n }\n}\n\n/**\n * Response object from `sessions.list()`.\n */\nexport class SessionListResponse implements Iterable<SessionInfo> {\n readonly sessions: SessionInfo[];\n readonly pagination: PaginationInfo;\n\n constructor(sessions: SessionInfo[], pagination: PaginationInfo) {\n this.sessions = sessions;\n this.pagination = pagination;\n }\n\n /**\n * Number of sessions in the current page.\n */\n get length(): number {\n return this.sessions.length;\n }\n\n [Symbol.iterator](): Iterator<SessionInfo> {\n return this.sessions[Symbol.iterator]();\n }\n\n at(index: number): SessionInfo | undefined {\n return this.sessions[index];\n }\n}\n\n/**\n * Session download metadata returned by the API.\n */\nexport class SessionDownloadInfo implements SessionDownloadInfoShape {\n readonly id: string;\n readonly filename: string;\n readonly contentType: string | null;\n readonly size: number;\n readonly sha256: string | null;\n readonly status: string;\n readonly createdAt: string;\n\n constructor(shape: SessionDownloadInfoShape) {\n this.id = shape.id;\n this.filename = shape.filename;\n this.contentType = shape.contentType;\n this.size = shape.size;\n this.sha256 = shape.sha256;\n this.status = shape.status;\n this.createdAt = shape.createdAt;\n }\n}\n\n/**\n * Structured response from `sessions.downloads.list()`.\n */\nexport class SessionDownloadsListResponse {\n readonly downloads: SessionDownloadInfo[];\n readonly summary: SessionDownloadsListResponseShape;\n\n constructor(downloads: SessionDownloadInfo[], summary: SessionDownloadsListResponseShape) {\n this.downloads = downloads;\n this.summary = summary;\n }\n}\n\n/**\n * Structured response from `sessions.downloads.delete()`.\n */\nexport class SessionDownloadsDeleteResponse implements SessionDownloadsDeleteResponseShape {\n readonly status: string;\n readonly deletedCount: number;\n\n constructor(shape: SessionDownloadsDeleteResponseShape) {\n this.status = shape.status;\n this.deletedCount = shape.deletedCount;\n }\n}\n\n/**\n * Session target metadata returned by `/json`.\n */\nexport class SessionTargetInfo implements SessionTargetInfoShape {\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly description: string;\n readonly inspectUrl: string | null;\n readonly webSocketDebuggerUrl: string | null;\n readonly webSocketDebuggerUrlTransformed: string | null;\n\n constructor(shape: SessionTargetInfoShape) {\n this.id = shape.id;\n this.title = shape.title;\n this.type = shape.type;\n this.url = shape.url;\n this.description = shape.description;\n this.inspectUrl = shape.inspectUrl;\n this.webSocketDebuggerUrl = shape.webSocketDebuggerUrl;\n this.webSocketDebuggerUrlTransformed = shape.webSocketDebuggerUrlTransformed;\n }\n}\n\n/**\n * Session download operations.\n */\nexport class SessionDownloadsResource {\n constructor(private readonly client: Lexmount) {}\n\n async list(sessionId: string, projectId?: string): Promise<SessionDownloadsListResponse> {\n const response = await this.client._post(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/list`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n }\n );\n if (response.status >= 400) {\n this.handleError('list session downloads', response, sessionId);\n }\n\n const result = asRecord(response.data);\n const items = Array.isArray(result.downloads) ? result.downloads : [];\n const downloads = items.map((item) => {\n const download = asRecord(item);\n return new SessionDownloadInfo({\n id: getString(download.id) ?? '',\n filename: getString(download.filename) ?? '',\n contentType: getString(download.content_type) ?? null,\n size: getNumber(download.size) ?? 0,\n sha256: getString(download.sha256) ?? null,\n status: getString(download.status) ?? 'available',\n createdAt: getString(download.created_at) ?? '',\n });\n });\n const summary = asRecord(result.summary);\n\n return new SessionDownloadsListResponse(downloads, {\n count: getNumber(summary.count) ?? downloads.length,\n totalSize: getNumber(summary.total_size) ?? 0,\n });\n }\n\n async get(sessionId: string, downloadId: string, projectId?: string): Promise<Buffer> {\n const response = await this.client._get(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/${downloadId}`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n },\n {\n responseType: 'arraybuffer',\n }\n );\n if (response.status >= 400) {\n this.handleError('fetch session download', response, sessionId);\n }\n\n return Buffer.from(response.data as ArrayBuffer);\n }\n\n async archive(sessionId: string, projectId?: string): Promise<Buffer> {\n const response = await this.client._get(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/archive`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n },\n {\n responseType: 'arraybuffer',\n }\n );\n if (response.status >= 400) {\n this.handleError('archive session downloads', response, sessionId);\n }\n\n return Buffer.from(response.data as ArrayBuffer);\n }\n\n async delete(sessionId: string, projectId?: string): Promise<SessionDownloadsDeleteResponse> {\n const response = await this.client._delete(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n }\n );\n if (response.status >= 400) {\n this.handleError('delete session downloads', response, sessionId);\n }\n\n const result = asRecord(response.data);\n return new SessionDownloadsDeleteResponse({\n status: getString(result.status) ?? '',\n deletedCount: getNumber(result.deleted_count) ?? 0,\n });\n }\n\n private handleError(action: string, response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(`Session downloads not found for ${sessionId}: ${errorMessage}`);\n }\n\n throw new APIError(`Failed to ${action}: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n\n/**\n * Alias kept for parity with the Python SDK.\n */\nexport type SessionCreateResponse = SessionInfo;\n\n/**\n * Session resource operations.\n */\nexport class SessionsResource {\n readonly downloads: SessionDownloadsResource;\n\n constructor(private readonly client: Lexmount) {\n this.downloads = new SessionDownloadsResource(client);\n }\n\n /**\n * Create a new browser session.\n */\n async create(options: SessionCreateOptions = {}): Promise<SessionCreateResponse> {\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n browser_mode: options.browserMode ?? 'normal',\n };\n\n if (options.customImageId) {\n payload.custom_image_id = options.customImageId;\n }\n\n if (options.context) {\n const contextPayload = {\n id: options.context.id,\n mode: normalizeContextMode(options.context.mode),\n };\n payload.context = contextPayload;\n getLogger().debug(\n `Creating session with context (id=${options.context.id}, mode=${contextPayload.mode})`\n );\n } else {\n getLogger().debug(`Creating session with browser_mode=${payload.browser_mode as string}`);\n }\n\n if (options.extensionIds && options.extensionIds.length > 0) {\n payload.extension_ids = options.extensionIds;\n }\n\n if (options.proxy) {\n payload.proxy = this.normalizeProxy(options.proxy);\n }\n\n if (options.weakLock) {\n payload.weak_lock = true;\n }\n\n if (options.asyncCreate !== false) {\n return this.createAsync(withRequestedRegion(this.client, payload), options);\n }\n\n const url = `${this.client.baseUrl}/instance`;\n const response = await this.client._post(url, withRequestedRegion(this.client, payload));\n if (response.status >= 400) {\n this.handleCreateError(response);\n }\n\n const result = asRecord(response.data);\n const sessionId = getString(result.session_id);\n if (!sessionId) {\n throw new APIError('Failed to create session: session_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const containerId = getString(result.container_id) ?? null;\n const projectId = options.projectId ?? this.client.projectId;\n // The create endpoint does not return the canonical inspect URL. Re-fetch the created\n // session so the SDK can return the server-provided inspectUrl when available.\n const createdSession = await this._getCreatedSession(sessionId, projectId);\n const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n\n getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);\n\n return new SessionInfo({\n id: sessionId,\n status: createdSession?.status ?? 'active',\n apiKey: this.client.apiKey,\n projectId,\n regionId: createdSession?.regionId ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: createdSession?.browserType ?? ((options.browserMode ?? 'normal') as BrowserMode),\n createdAt: createdSession?.createdAt ?? new Date().toISOString(),\n inspectUrl:\n createdSession?.inspectUrl ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: createdSession?.containerId ?? containerId,\n ws: wsUrl ?? createdSession?.ws ?? null,\n client: this.client,\n });\n }\n\n private async createAsync(\n payload: JsonRecord,\n options: SessionCreateOptions\n ): Promise<SessionCreateResponse> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v2`, payload);\n if (response.status >= 400) {\n this.handleCreateError(response);\n }\n\n const result = asRecord(response.data);\n const sessionId = getString(result.session_id);\n if (!sessionId) {\n throw new APIError('Failed to create session: session_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const projectId = options.projectId ?? this.client.projectId;\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const pollTimeoutMs = options.pollTimeoutMs ?? 600_000;\n const deadline = Date.now() + pollTimeoutMs;\n\n while (Date.now() < deadline) {\n const info = await this.get(sessionId, projectId);\n if (info.status === 'active') {\n const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n getLogger().info(`Session created successfully (async): id=${sessionId}`);\n return new SessionInfo({\n id: sessionId,\n status: 'active',\n apiKey: this.client.apiKey,\n projectId,\n regionId: info.regionId ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: info.browserType || ((options.browserMode ?? 'normal') as BrowserMode),\n createdAt: info.createdAt,\n inspectUrl: info.inspectUrl,\n containerId: info.containerId,\n ws: wsUrl ?? info.ws,\n client: this.client,\n });\n }\n\n if (info.status === 'create_failed') {\n this.handleAsyncCreateFailed(payload);\n throw new APIError('Session creation failed', {\n statusCode: 500,\n response: { session_id: sessionId, status: info.status },\n });\n }\n\n if (info.status === 'closed') {\n throw new APIError('Session closed before activation', {\n statusCode: 500,\n response: { session_id: sessionId, status: info.status },\n });\n }\n\n await delay(pollIntervalMs);\n }\n\n throw new TimeoutError(\n `Timed out waiting for session ${sessionId} to become active after ${pollTimeoutMs}ms`\n );\n }\n\n /**\n * Fetch one session by id.\n *\n * The upstream API uses POST /instance/session for this lookup, so this SDK method\n * intentionally uses POST even though the operation is read-only.\n */\n async get(sessionId: string, projectId?: string): Promise<SessionInfo> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/session`, withRequestedRegion(this.client, {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n session_id: sessionId,\n }));\n\n if (response.status >= 400) {\n this.handleGetError(response, sessionId);\n }\n\n return this.mapSessionInfo(asRecord(response.data), projectId);\n }\n\n /**\n * List sessions for the current project.\n */\n async list(options: SessionListOptions = {}): Promise<SessionListResponse> {\n const url = `${this.client.baseUrl}/instance/v2/sessions`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n };\n\n if (options.status) {\n payload.status = options.status;\n }\n\n const response = await this.client._post(url, withRequestedRegion(this.client, payload));\n if (response.status >= 400) {\n this.handleListError(response);\n }\n\n const result = asRecord(response.data);\n const sessionsData = Array.isArray(result.sessions) ? result.sessions : [];\n const paginationData = asRecord(result.pagination);\n\n const sessions = sessionsData.map((item) => this.mapSessionInfo(asRecord(item), options.projectId));\n\n const pagination = new PaginationInfo({\n currentPage: getNumber(paginationData.currentPage) ?? 1,\n pageSize: getNumber(paginationData.pageSize) ?? sessions.length,\n totalCount: getNumber(paginationData.totalCount) ?? sessions.length,\n totalPages: getNumber(paginationData.totalPages) ?? 1,\n activeCount: getNumber(paginationData.activeCount) ?? 0,\n closedCount: getNumber(paginationData.closedCount) ?? 0,\n });\n\n getLogger().info(\n `Retrieved ${sessions.length} sessions (total: ${pagination.totalCount}, active: ${pagination.activeCount}, closed: ${pagination.closedCount})`\n );\n\n return new SessionListResponse(sessions, pagination);\n }\n\n /**\n * Delete a browser session.\n */\n async delete(options: SessionDeleteOptions): Promise<void> {\n const url = `${this.client.baseUrl}/instance`;\n const payload = withRequestedRegion(this.client, {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n session_id: options.sessionId,\n });\n\n const response = await this.client._delete(url, payload);\n if (response.status >= 400) {\n this.handleDeleteError(response, options.sessionId);\n }\n\n getLogger().info(`Session deleted successfully: ${options.sessionId}`);\n }\n\n /**\n * List target/page metadata for a session via `/json`.\n */\n async listTargets(sessionId: string): Promise<SessionTargetInfo[]> {\n const response = await this.client._get(`${this.client.baseUrl}/json`, {\n session_id: sessionId,\n });\n\n if (response.status >= 400) {\n this.handleListTargetsError(response, sessionId);\n }\n\n const result = Array.isArray(response.data) ? response.data : [];\n return result.map((item) => this.mapSessionTarget(asRecord(item)));\n }\n\n /**\n * Fetch the debugger WebSocket URL for a session.\n *\n * @internal\n */\n async _getWebSocketDebuggerUrl(sessionId: string): Promise<string | null> {\n try {\n const response = await this.client._get(`${this.client.baseUrl}/json/version`, {\n session_id: sessionId,\n });\n\n if (response.status >= 400) {\n getLogger().error('Error getting WebSocket debugger URL:', response.data);\n return null;\n }\n\n const result = asRecord(response.data);\n return (\n getString(result.webSocketDebuggerUrlTransformed) ??\n getString(result.webSocketDebuggerUrl) ??\n null\n );\n } catch (error) {\n getLogger().error('Error getting WebSocket debugger URL:', error);\n return null;\n }\n }\n\n private normalizeProxy(proxy: SessionProxyConfig): JsonRecord {\n if (!proxy.server) {\n throw new ValidationError('proxy.server is required when proxy is provided');\n }\n\n const normalizedProxy: JsonRecord = {\n type: proxy.type ?? 'external',\n server: proxy.server,\n };\n\n if (proxy.username) {\n normalizedProxy.username = proxy.username;\n }\n\n if (proxy.password) {\n normalizedProxy.password = proxy.password;\n }\n\n return normalizedProxy;\n }\n\n private handleAsyncCreateFailed(payload: JsonRecord): void {\n const context = asRecord(payload.context);\n const contextId = getString(context.id);\n const contextMode = getString(context.mode);\n\n // The async create endpoint can accept the request and only surface lock conflicts\n // later as create_failed while polling. Preserve the SDK's ContextLockedError contract\n // for read-write context creation so callers do not have to special-case APIError.\n if (contextId && contextMode === 'read_write' && payload.weak_lock !== true) {\n throw new ContextLockedError('Context is locked by another active session');\n }\n }\n\n private handleCreateError(response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n const errorCode = getString(errorData.code);\n const metadata = asRecord(errorData.metadata);\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404 && errorCode === 'context_not_found') {\n throw new ContextNotFoundError(`Context not found: ${errorMessage}`);\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(`Resource not found: ${errorMessage}`);\n }\n\n if (response.status === 409 && errorCode === 'context_locked') {\n throw new ContextLockedError(errorMessage, {\n activeSessionId: getString(metadata.activeSessionId),\n retryAfter: getNumber(metadata.retryAfter),\n });\n }\n\n throw new APIError(`Failed to create session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleGetError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`\n );\n }\n\n throw new APIError(`Failed to get session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleListError(response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n throw new APIError(`Failed to list sessions: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleListTargetsError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`\n );\n }\n\n throw new APIError(`Failed to list session targets: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleDeleteError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may have already been deleted or never existed.`\n );\n }\n\n throw new APIError(`Failed to delete session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private mapSessionInfo(raw: JsonRecord, projectId?: string): SessionInfo {\n const sessionId = getString(raw.session_id) ?? getString(raw.id) ?? '';\n\n return new SessionInfo({\n id: sessionId,\n status: getString(raw.status) ?? 'active',\n apiKey: getString(raw.api_key) ?? this.client.apiKey,\n projectId: getString(raw.project_id) ?? (projectId ?? this.client.projectId),\n regionId: getString(raw.region_id) ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: getString(raw.browser_type) ?? getString(raw.browser_mode) ?? 'normal',\n createdAt: getString(raw.created_at) ?? '',\n inspectUrl:\n getString(raw.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: getString(raw.container_id) ?? null,\n ws: getString(raw.ws) ?? null,\n client: this.client,\n });\n }\n\n private mapSessionTarget(raw: JsonRecord): SessionTargetInfo {\n return new SessionTargetInfo({\n id: getString(raw.id) ?? '',\n title: getString(raw.title) ?? '',\n type: getString(raw.type) ?? '',\n url: getString(raw.url) ?? '',\n description: getString(raw.description) ?? '',\n inspectUrl: getString(raw.inspectUrl) ?? getString(raw.inspect_url) ?? null,\n webSocketDebuggerUrl:\n getString(raw.webSocketDebuggerUrl) ?? getString(raw.web_socket_debugger_url) ?? null,\n webSocketDebuggerUrlTransformed:\n getString(raw.webSocketDebuggerUrlTransformed) ??\n getString(raw.web_socket_debugger_url_transformed) ??\n null,\n });\n }\n\n private async _getCreatedSession(\n sessionId: string,\n projectId: string\n ): Promise<SessionInfo | null> {\n try {\n return await this.get(sessionId, projectId);\n } catch (error) {\n getLogger().warn(\n `Failed to fetch created session ${sessionId}; falling back to locally derived session fields:`,\n error\n );\n return null;\n }\n }\n}\n","/**\n * Integrated authentication helpers.\n */\n\nimport { CDPClient, connectOverCDP } from './cdp';\nimport { ValidationError } from './errors';\nimport { getLogger } from './logging';\nimport { SessionInfo } from './sessions';\n\nexport type IntegratedAuthCallbackResult =\n | {\n cancel: true;\n }\n | {\n cancel: false;\n scheme: string;\n token: string;\n };\n\nexport type IntegratedAuthCallback = (\n params: any,\n callback: (result: IntegratedAuthCallbackResult) => Promise<void>\n) => void | Promise<void>;\n\nconst integratedAuthCallbacks = new Map<string, Set<IntegratedAuthCallback>>();\nconst cdpClients = new Map<string, CDPClient>();\n\nfunction getIntegratedAuthKey(sessionOrClient: SessionInfo | CDPClient): string {\n const session =\n sessionOrClient instanceof SessionInfo ? sessionOrClient : sessionOrClient.session;\n const connectUrl = session.connectUrl;\n\n if (!connectUrl) {\n throw new ValidationError(`Session ${session.sessionId} does not include a CDP connect URL`);\n }\n\n return connectUrl;\n}\n\n/**\n * Register an integrated auth callback for a session.\n */\nexport async function registerIntegratedAuthCallback(\n sessionOrClient: SessionInfo | CDPClient,\n callback: IntegratedAuthCallback\n): Promise<void> {\n const key = getIntegratedAuthKey(sessionOrClient);\n\n let sessionCallbacks = integratedAuthCallbacks.get(key);\n if (sessionCallbacks?.has(callback)) {\n return;\n }\n\n let client = cdpClients.get(key);\n if (!client) {\n if (sessionOrClient instanceof SessionInfo) {\n client = await connectOverCDP(sessionOrClient);\n } else {\n client = sessionOrClient;\n }\n\n await client.send('Fetch.enable', { handleAuthRequests: true });\n cdpClients.set(key, client);\n\n client.on('disconnect', () => {\n cdpClients.delete(key);\n integratedAuthCallbacks.delete(key);\n });\n\n client.on('Fetch.requestPaused', async (event: any, sessionId: string) => {\n try {\n await client!.send(\n 'Fetch.continueRequest',\n {\n requestId: event.requestId,\n },\n sessionId\n );\n } catch (error) {\n getLogger().error('Failed to continue paused fetch request', error);\n }\n });\n\n client.on('Fetch.integratedAuthRequired', async (params: any, sessionId: string) => {\n try {\n const sessionCallbacks = integratedAuthCallbacks.get(key);\n if (!sessionCallbacks) {\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'CancelAuth',\n },\n },\n sessionId\n );\n return;\n }\n\n const sender = async (result: IntegratedAuthCallbackResult) => {\n if (result.cancel) {\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'CancelAuth',\n },\n },\n sessionId\n );\n return;\n }\n\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'ProvideIntegratedCredentials',\n scheme: result.scheme,\n token: result.token,\n },\n },\n sessionId\n );\n };\n\n for (const cb of sessionCallbacks) {\n try {\n const result = cb(params, sender);\n void Promise.resolve(result).catch((error) => {\n getLogger().error('Integrated auth callback failed', error);\n });\n } catch (error) {\n getLogger().error('Integrated auth callback failed', error);\n }\n }\n } catch (error) {\n getLogger().error('Failed to handle integrated auth request', error);\n }\n });\n }\n\n if (!sessionCallbacks) {\n sessionCallbacks = new Set();\n integratedAuthCallbacks.set(key, sessionCallbacks);\n }\n\n sessionCallbacks.add(callback);\n}\n\n/**\n * Deregister a previously registered integrated auth callback.\n */\nexport function deregisterIntegratedAuthCallback(\n sessionOrClient: SessionInfo | CDPClient,\n callback: IntegratedAuthCallback\n): void {\n const key = getIntegratedAuthKey(sessionOrClient);\n\n const sessionCallbacks = integratedAuthCallbacks.get(key);\n if (!sessionCallbacks?.has(callback)) {\n return;\n }\n\n sessionCallbacks.delete(callback);\n\n if (sessionCallbacks.size === 0) {\n integratedAuthCallbacks.delete(key);\n }\n}\n","/**\n * Lexmount API client.\n */\n\nimport { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, isAxiosError } from 'axios';\nimport axios from 'axios';\nimport * as dotenv from 'dotenv';\nimport { ContextsResource } from './contexts';\nimport { ExtensionsResource } from './extensions';\nimport { APIError, NetworkError, TimeoutError, ValidationError } from './errors';\nimport { getLogger, setLogLevel } from './logging';\nimport { SessionsResource } from './sessions';\nimport type { CatalogInfo, LexmountConfig, RegionCatalogEntry, RegionInfo } from './types';\n\ndotenv.config();\n\n/**\n * Main Lexmount SDK client.\n */\nexport class Lexmount {\n /**\n * API key used for authentication.\n */\n readonly apiKey: string;\n\n /**\n * Default project identifier used by resource methods.\n */\n readonly projectId: string;\n\n /**\n * API base URL.\n */\n readonly baseUrl: string;\n\n readonly region?: string;\n\n selectedRegion?: string;\n\n private endpointBaseUrl?: string;\n\n private selectedHost?: string;\n\n private regionResolutionAttempted = false;\n\n private regionResolutionPromise?: Promise<void>;\n\n /**\n * Session operations.\n */\n readonly sessions: SessionsResource;\n\n /**\n * Persistent context operations.\n */\n readonly contexts: ContextsResource;\n\n /**\n * Browser extension operations.\n */\n readonly extensions: ExtensionsResource;\n\n private readonly httpClient: AxiosInstance;\n\n constructor(config: LexmountConfig = {}) {\n this.apiKey = config.apiKey ?? process.env.LEXMOUNT_API_KEY ?? '';\n if (!this.apiKey) {\n throw new ValidationError(\n 'apiKey must be provided or set LEXMOUNT_API_KEY environment variable'\n );\n }\n\n this.projectId = config.projectId ?? process.env.LEXMOUNT_PROJECT_ID ?? '';\n if (!this.projectId) {\n throw new ValidationError(\n 'projectId must be provided or set LEXMOUNT_PROJECT_ID environment variable'\n );\n }\n\n this.baseUrl = (\n config.baseUrl ??\n process.env.LEXMOUNT_BASE_URL ??\n 'https://api.lexmount.cn'\n ).replace(/\\/$/, '');\n this.region = config.region;\n\n if (config.logLevel) {\n setLogLevel(config.logLevel);\n }\n\n this.httpClient = axios.create({\n timeout: config.timeout ?? 60000,\n validateStatus: () => true,\n });\n\n this.sessions = new SessionsResource(this);\n this.contexts = new ContextsResource(this);\n this.extensions = new ExtensionsResource(this);\n }\n\n /**\n * Internal POST request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _post<T = unknown>(\n url: string,\n data?: unknown,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('POST', url, { ...config, data });\n }\n\n /**\n * Internal GET request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _get<T = unknown>(\n url: string,\n params?: Record<string, unknown>,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('GET', url, { ...config, params });\n }\n\n /**\n * Internal DELETE request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _delete<T = unknown>(\n url: string,\n data?: unknown,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('DELETE', url, { ...config, data });\n }\n\n async regionInfo(): Promise<RegionInfo> {\n await this.ensureRegionResolved();\n return {\n requestedRegion: this.region,\n selectedRegion: this.selectedRegion,\n baseUrl: this.baseUrl,\n endpointBaseUrl: this.endpointBaseUrl,\n host: this.selectedHost,\n resolved: this.regionResolutionAttempted,\n usingRegion: this.selectedRegion !== undefined,\n };\n }\n\n async catalogInfo(): Promise<CatalogInfo> {\n try {\n const response = await this.httpClient.get<{ regions?: unknown }>(\n `${this.baseUrl}/v1/regions/catalog`\n );\n if (response.status !== 200) {\n return {\n baseUrl: this.baseUrl,\n available: false,\n statusCode: response.status,\n regions: [],\n };\n }\n\n const regions = Array.isArray(response.data?.regions)\n ? (response.data.regions as RegionCatalogEntry[])\n : [];\n return {\n baseUrl: this.baseUrl,\n available: Array.isArray(response.data?.regions),\n statusCode: response.status,\n regions,\n error: Array.isArray(response.data?.regions) ? undefined : 'invalid catalog regions',\n };\n } catch (error) {\n return {\n baseUrl: this.baseUrl,\n available: false,\n regions: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Close the client.\n *\n * Axios does not require explicit teardown, but the method is kept for API symmetry.\n */\n close(): void {\n getLogger().debug('Closing Lexmount client');\n }\n\n /**\n * String representation of the client.\n */\n toString(): string {\n return `Lexmount(projectId='${this.projectId}', baseUrl='${this.baseUrl}')`;\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n config: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n const logger = getLogger();\n const startTime = Date.now();\n const requestUrl = this.rewriteUrl(url);\n logger.debug(`${method} request to ${requestUrl}`);\n\n try {\n const headers = {\n api_key: this.apiKey,\n project_id: this.projectId,\n ...this.getDefaultHeaders(config.data),\n ...(config.headers ?? {}),\n };\n\n const response = await this.httpClient.request<T>({\n method,\n url: requestUrl,\n ...config,\n headers,\n });\n\n const elapsed = Date.now() - startTime;\n logger.debug(\n `${method} response: status=${response.status}, duration=${elapsed.toFixed(2)}ms`\n );\n return response;\n } catch (error) {\n const elapsed = Date.now() - startTime;\n throw this.normalizeRequestError(error, elapsed);\n }\n }\n\n private normalizeRequestError(error: unknown, elapsedMs: number): Error {\n const logger = getLogger();\n\n if (!isAxiosError(error)) {\n logger.error(`Unexpected request error after ${elapsedMs.toFixed(2)}ms:`, error);\n return new APIError('Unexpected HTTP error', { response: error });\n }\n\n const axiosError = error as AxiosError<unknown>;\n\n if (axiosError.code === 'ECONNABORTED') {\n logger.error(`Request timeout after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new TimeoutError(`Request timed out: ${axiosError.message}`);\n }\n\n if (axiosError.response) {\n logger.error(`HTTP error after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new APIError(`HTTP error: ${axiosError.message}`, {\n statusCode: axiosError.response.status,\n response: axiosError.response.data,\n });\n }\n\n logger.error(`Network error after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new NetworkError(`Network error: ${axiosError.message}`);\n }\n\n private getDefaultHeaders(data: unknown): Record<string, string> {\n if (typeof data === 'undefined') {\n return {};\n }\n\n if (typeof FormData !== 'undefined' && data instanceof FormData) {\n return {};\n }\n\n return {\n 'Content-Type': 'application/json',\n };\n }\n\n private async ensureRegionResolved(): Promise<void> {\n if (this.regionResolutionAttempted) {\n return;\n }\n\n if (!this.regionResolutionPromise) {\n this.regionResolutionPromise = this.resolveRegion().finally(() => {\n this.regionResolutionAttempted = true;\n this.regionResolutionPromise = undefined;\n });\n }\n\n await this.regionResolutionPromise;\n }\n\n private async resolveRegion(): Promise<void> {\n const logger = getLogger();\n try {\n const response = await this.httpClient.get<{ regions?: unknown }>(\n `${this.baseUrl}/v1/regions/catalog`\n );\n if (response.status !== 200 || !Array.isArray(response.data?.regions)) {\n logger.debug(\n `Region catalog unavailable, falling back to baseUrl: status=${response.status}`\n );\n return;\n }\n\n const selected = this.selectCatalogRegion(response.data.regions as RegionCatalogEntry[]);\n if (!selected) {\n if (this.region) {\n logger.warn(`Requested region not found in catalog: ${this.region}`);\n } else {\n logger.debug('No default catalog region, falling back to baseUrl');\n }\n return;\n }\n\n const endpointBaseUrl = await this.probeRegionHost(selected);\n if (!endpointBaseUrl) {\n logger.debug('Region probe failed, falling back to baseUrl');\n return;\n }\n\n this.selectedRegion = selected.region_id;\n this.selectedHost = selected.host;\n this.endpointBaseUrl = endpointBaseUrl;\n } catch (error) {\n logger.debug('Region resolution failed, falling back to baseUrl:', error);\n }\n }\n\n private selectCatalogRegion(regions: RegionCatalogEntry[]): RegionCatalogEntry | undefined {\n if (this.region) {\n return regions.find((region) => region.region_id === this.region);\n }\n const defaultRegions = regions.filter((region) => region.default === true);\n return defaultRegions.length === 1 ? defaultRegions[0] : undefined;\n }\n\n private async probeRegionHost(region: RegionCatalogEntry): Promise<string | undefined> {\n const logger = getLogger();\n const host = String(region.host || '').trim();\n if (!host) {\n return undefined;\n }\n if (!this.isAllowedCatalogHost(host)) {\n logger.warn(`Ignoring invalid region catalog host: ${host}`);\n return undefined;\n }\n\n const endpointBaseUrl = `https://${host}`;\n const probePath = String(region.probe_path || '/v1/region/probe').replace(/^(?!\\/)/, '/');\n try {\n const response = await this.httpClient.get(`${endpointBaseUrl}${probePath}`);\n return response.status === 200 ? endpointBaseUrl : undefined;\n } catch {\n return undefined;\n }\n }\n\n private isAllowedCatalogHost(host: string): boolean {\n let parsed: URL;\n try {\n parsed = new URL(`https://${host}`);\n } catch {\n return false;\n }\n\n if (\n parsed.username ||\n parsed.password ||\n parsed.port ||\n parsed.pathname !== '/' ||\n parsed.search ||\n parsed.hash\n ) {\n return false;\n }\n\n const hostname = parsed.hostname.toLowerCase();\n const allowedDomains = ['lexmount.cn', 'lexmount.com', 'lexmount.net'];\n return allowedDomains.some((domain) => hostname === domain || hostname.endsWith(`.${domain}`));\n }\n\n private rewriteUrl(url: string): string {\n if (!this.endpointBaseUrl || !url.startsWith(this.baseUrl)) {\n return url;\n }\n return `${this.endpointBaseUrl}${url.slice(this.baseUrl.length)}`;\n }\n}\n\nexport default Lexmount;\n","/**\n * Context resource implementation.\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n} from './errors';\nimport { getLogger } from './logging';\nimport type {\n ContextCreateOptions,\n ContextListOptions,\n ContextMetadata,\n ContextStatus,\n ForceReleaseResponse,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction parseTimestamp(value: unknown): string | null {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return new Date(value).toISOString();\n }\n\n return null;\n}\n\nfunction normalizeContextStatus(value: unknown): ContextStatus {\n if (value === true || value === 'locked') {\n return 'locked';\n }\n\n if (value === false || value === 'available') {\n return 'available';\n }\n\n return typeof value === 'string' ? value : 'available';\n}\n\n/**\n * Context information returned by the API.\n */\nexport class ContextInfo {\n readonly id: string;\n readonly status: ContextStatus;\n readonly metadata: ContextMetadata;\n readonly createdAt: string | null;\n readonly updatedAt: string | null;\n\n constructor(options: {\n id: string;\n status: ContextStatus;\n metadata?: ContextMetadata;\n createdAt?: string | null;\n updatedAt?: string | null;\n }) {\n this.id = options.id;\n this.status = options.status;\n this.metadata = options.metadata ?? {};\n this.createdAt = options.createdAt ?? null;\n this.updatedAt = options.updatedAt ?? null;\n }\n\n get createdAtDate(): Date | null {\n if (!this.createdAt) {\n return null;\n }\n\n const date = new Date(this.createdAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n get updatedAtDate(): Date | null {\n if (!this.updatedAt) {\n return null;\n }\n\n const date = new Date(this.updatedAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n isLocked(): boolean {\n return this.status === 'locked';\n }\n\n isAvailable(): boolean {\n return this.status === 'available';\n }\n}\n\n/**\n * Response object from `contexts.list()`.\n */\nexport class ContextListResponse implements Iterable<ContextInfo> {\n readonly data: ContextInfo[];\n\n constructor(data: ContextInfo[]) {\n this.data = data;\n }\n\n get length(): number {\n return this.data.length;\n }\n\n [Symbol.iterator](): Iterator<ContextInfo> {\n return this.data[Symbol.iterator]();\n }\n\n at(index: number): ContextInfo | undefined {\n return this.data[index];\n }\n}\n\n/**\n * Context resource operations.\n */\nexport class ContextsResource {\n constructor(private readonly client: Lexmount) {}\n\n /**\n * Create a new persistent context.\n */\n async create(options: ContextCreateOptions = {}): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/create-context`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n if (options.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'create');\n }\n\n const result = asRecord(response.data);\n const contextId = getString(result.context_id);\n if (!contextId) {\n throw new APIError('Failed to create context: context_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const context = new ContextInfo({\n id: contextId,\n status: normalizeContextStatus(result.locked),\n metadata: (result.metadata as ContextMetadata | undefined) ?? options.metadata ?? {},\n createdAt: parseTimestamp(result.created_at),\n });\n\n getLogger().info(`Successfully created context '${context.id}'`);\n return context;\n }\n\n /**\n * List contexts in the current project.\n */\n async list(options: ContextListOptions = {}): Promise<ContextListResponse> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/list-contexts`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n limit: options.limit ?? 20,\n };\n\n if (options.status) {\n payload.status = options.status;\n }\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'list');\n }\n\n const result = asRecord(response.data);\n const contexts = Array.isArray(result.contexts)\n ? result.contexts.map((item) => {\n const context = asRecord(item);\n return new ContextInfo({\n id: getString(context.context_id) ?? '',\n status: normalizeContextStatus(context.locked),\n createdAt: parseTimestamp(context.created_at),\n updatedAt: parseTimestamp(context.updated_at),\n metadata: (context.metadata as ContextMetadata | undefined) ?? {},\n });\n })\n : [];\n\n getLogger().info(`Retrieved ${contexts.length} contexts`);\n return new ContextListResponse(contexts);\n }\n\n /**\n * Fetch a single context.\n */\n async get(contextId: string): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'get', contextId);\n }\n\n const result = asRecord(response.data);\n const context = asRecord(result.context);\n\n const contextInfo = new ContextInfo({\n id: getString(context.context_id) ?? contextId,\n status: normalizeContextStatus(context.locked),\n metadata: (context.metadata as ContextMetadata | undefined) ?? {},\n createdAt: parseTimestamp(context.created_at),\n updatedAt: parseTimestamp(context.updated_at),\n });\n\n getLogger().info(`Retrieved context '${contextInfo.id}' (status: ${contextInfo.status})`);\n return contextInfo;\n }\n\n /**\n * Fork an existing persistent context into a new context.\n */\n async fork(contextId: string): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/fork`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'fork', contextId);\n }\n\n const result = asRecord(response.data);\n const forkedContextId = getString(result.context_id);\n if (!forkedContextId) {\n throw new APIError('Failed to fork context: context_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const contextInfo = new ContextInfo({\n id: forkedContextId,\n status: normalizeContextStatus(result.locked),\n metadata: (result.metadata as ContextMetadata | undefined) ?? {},\n createdAt: parseTimestamp(result.created_at),\n updatedAt: parseTimestamp(result.updated_at),\n });\n\n getLogger().info(`Successfully forked context '${contextId}' -> '${contextInfo.id}'`);\n return contextInfo;\n }\n\n /**\n * Delete a persistent context.\n */\n async delete(contextId: string): Promise<void> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._delete(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'delete', contextId);\n }\n\n getLogger().info(`Successfully deleted context '${contextId}'`);\n }\n\n /**\n * Force-release a stuck lock on a context.\n */\n async forceRelease(contextId: string): Promise<ForceReleaseResponse> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/force-release`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'force_release', contextId);\n }\n\n const result = asRecord(response.data);\n return {\n status: getString(result.status) ?? 'unlocked',\n message: getString(result.message) ?? 'Lock released successfully',\n };\n }\n\n private handleError(\n response: AxiosResponse<unknown>,\n operation: string,\n contextId?: string\n ): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n const errorCode = getString(errorData.code);\n const metadata = asRecord(errorData.metadata);\n\n if (response.status === 401) {\n throw new AuthenticationError(`Authentication failed: ${errorMessage}`);\n }\n\n if (response.status === 404) {\n const suffix = contextId ? `: ${contextId}` : '';\n throw new ContextNotFoundError(`Context not found${suffix}`);\n }\n\n if (\n response.status === 409 &&\n (errorCode === 'context_locked' || errorCode === 'CONTEXT_FORK_SOURCE_LOCKED')\n ) {\n throw new ContextLockedError(errorMessage, {\n activeSessionId: getString(metadata.activeSessionId),\n retryAfter:\n typeof metadata.retryAfter === 'number' ? metadata.retryAfter : undefined,\n });\n }\n\n if (response.status === 409 && errorCode === 'session_active') {\n throw new APIError(\n `Cannot ${operation} context: ${errorMessage} (session is active)`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 500) {\n const details = getString(errorData.details);\n throw new APIError(\n `Internal server error (500) during ${operation}: ${errorMessage}${details ? `. Details: ${details}` : ''}`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 502) {\n throw new APIError(\n `Server gateway error (502) during ${operation}: The service may be temporarily unavailable. Please retry.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 503) {\n throw new APIError(\n `Service unavailable (503) during ${operation}: The service is temporarily unavailable. Please retry later.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 504) {\n throw new APIError(\n `Gateway timeout (504) during ${operation}: The request timed out. Please retry.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n throw new APIError(`Failed to ${operation} context: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n","/**\n * Extension resource implementation.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport { APIError, AuthenticationError } from './errors';\nimport { getLogger } from './logging';\nimport type {\n ExtensionInfoShape,\n ExtensionListOptions,\n ExtensionUploadOptions,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Extension metadata returned by the API.\n */\nexport class ExtensionInfo implements ExtensionInfoShape {\n readonly id: string;\n readonly name: string;\n readonly projectId: string;\n readonly createdAt?: string;\n readonly updatedAt?: string;\n\n constructor(shape: ExtensionInfoShape) {\n this.id = shape.id;\n this.name = shape.name;\n this.projectId = shape.projectId;\n this.createdAt = shape.createdAt;\n this.updatedAt = shape.updatedAt;\n }\n}\n\n/**\n * Browser extension resource operations.\n */\nexport class ExtensionsResource {\n constructor(private readonly client: Lexmount) {}\n\n async upload(filePath: string, options: ExtensionUploadOptions = {}): Promise<ExtensionInfo> {\n const fileBuffer = await readFile(filePath);\n const form = new FormData();\n const usedProjectId = options.projectId ?? this.client.projectId;\n\n form.append('project_id', usedProjectId);\n if (options.name) {\n form.append('name', options.name);\n }\n\n form.append(\n 'file',\n new Blob([fileBuffer], { type: 'application/octet-stream' }),\n path.basename(filePath)\n );\n\n const response = await this.client._post(\n `${this.client.baseUrl}/instance/v1/extension/upload`,\n form,\n {\n headers: {\n project_id: usedProjectId,\n },\n }\n );\n if (response.status >= 400) {\n this.handleError('upload extension', response);\n }\n\n getLogger().info(`Extension uploaded successfully: ${filePath}`);\n return this.parseInfo(response.data);\n }\n\n async list(options: ExtensionListOptions = {}): Promise<ExtensionInfo[]> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v1/extension/list`, {\n project_id: options.projectId ?? this.client.projectId,\n limit: options.limit ?? 20,\n offset: options.offset ?? 0,\n });\n if (response.status >= 400) {\n this.handleError('list extensions', response);\n }\n\n const result = asRecord(response.data);\n const items = Array.isArray(result.data) ? result.data : [];\n return items.map((item) => this.parseInfo(item));\n }\n\n async get(extensionId: string, projectId?: string): Promise<ExtensionInfo> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v1/extension/info`, {\n project_id: projectId ?? this.client.projectId,\n extension_id: extensionId,\n });\n if (response.status >= 400) {\n this.handleError('get extension', response);\n }\n\n return this.parseInfo(response.data);\n }\n\n async delete(extensionId: string): Promise<void> {\n const response = await this.client._delete(\n `${this.client.baseUrl}/instance/v1/extension/${extensionId}`\n );\n if (response.status >= 400) {\n this.handleError('delete extension', response);\n }\n\n getLogger().info(`Extension deleted successfully: ${extensionId}`);\n }\n\n private parseInfo(data: unknown): ExtensionInfo {\n const item = asRecord(data);\n\n return new ExtensionInfo({\n id: getString(item.id) ?? '',\n name: getString(item.name) ?? '',\n projectId: getString(item.project_id) ?? '',\n createdAt: getString(item.created_at),\n updatedAt: getString(item.updated_at),\n });\n }\n\n private handleError(action: string, response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.message) ?? getString(errorData.error) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n throw new APIError(`Failed to ${action}: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n"],"mappings":"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","names":["CDP","sessionCallbacks","import_axios","asRecord","getString","asRecord","getString","path","config","axios","logger"]}
|
package/dist/index.mjs
CHANGED
|
@@ -500,6 +500,9 @@ var SessionsResource = class {
|
|
|
500
500
|
project_id: options.projectId ?? this.client.projectId,
|
|
501
501
|
browser_mode: options.browserMode ?? "normal"
|
|
502
502
|
};
|
|
503
|
+
if (options.customImageId) {
|
|
504
|
+
payload.custom_image_id = options.customImageId;
|
|
505
|
+
}
|
|
503
506
|
if (options.context) {
|
|
504
507
|
const contextPayload = {
|
|
505
508
|
id: options.context.id,
|
|
@@ -1665,7 +1668,7 @@ var Lexmount = class {
|
|
|
1665
1668
|
};
|
|
1666
1669
|
|
|
1667
1670
|
// src/index.ts
|
|
1668
|
-
var VERSION = "0.5.
|
|
1671
|
+
var VERSION = "0.5.7";
|
|
1669
1672
|
export {
|
|
1670
1673
|
APIError,
|
|
1671
1674
|
AuthenticationError,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cdp.ts","../src/errors.ts","../src/logging.ts","../src/sessions.ts","../src/auth.ts","../src/client.ts","../src/contexts.ts","../src/extensions.ts","../src/index.ts"],"sourcesContent":["/**\n * Chrome DevTools Protocol connection helpers.\n */\n\nimport { EventEmitter } from 'events';\nimport CDP from 'chrome-remote-interface';\nimport { ValidationError } from './errors';\nimport { getLogger } from './logging';\nimport { SessionInfo } from './sessions';\n\nexport interface CDPEventMessage {\n method: string;\n params?: Record<string, unknown>;\n sessionId?: string;\n}\n\nfunction hasExplicitPort(url: string): boolean {\n const authority = url.match(/^[a-z][a-z\\d+\\-.]*:\\/\\/([^/?#]+)/i)?.[1] ?? '';\n const host = authority.includes('@')\n ? authority.slice(authority.lastIndexOf('@') + 1)\n : authority;\n\n if (host.startsWith('[')) {\n return /\\]:\\d+$/.test(host);\n }\n\n return /:\\d+$/.test(host);\n}\n\nfunction getDefaultPort(url: string): number | undefined {\n const protocol = getProtocol(url);\n if (protocol === 'ws') {\n return 80;\n }\n if (protocol === 'wss') {\n return 443;\n }\n return undefined;\n}\n\nfunction getProtocol(url: string): string | undefined {\n return url.match(/^([a-z][a-z\\d+\\-.]*):\\/\\//i)?.[1]?.toLowerCase();\n}\n\n/**\n * Lexmount CDP client.\n *\n * It forwards Chrome DevTools Protocol notifications through EventEmitter and\n * exposes `send()` for raw CDP commands.\n */\nexport class CDPClient extends EventEmitter {\n readonly session: SessionInfo;\n private closed = false;\n private rawClient?: CDP.Client;\n\n constructor(session: SessionInfo) {\n super();\n\n const connectUrl = session.connectUrl;\n if (!connectUrl) {\n throw new ValidationError(`Session ${session.sessionId} does not include a CDP connect URL`);\n }\n\n this.session = session;\n }\n\n /**\n * Connect the CDP client to the session.\n */\n async connect(): Promise<this> {\n if (this.rawClient && !this.closed) {\n return this;\n }\n\n this.closed = false;\n getLogger().debug(`Connecting to session ${this.session.sessionId} over CDP`);\n const options: CDP.Options = {\n target: this.session.connectUrl,\n local: true,\n };\n const defaultPort = getDefaultPort(this.session.connectUrl);\n if (!hasExplicitPort(this.session.connectUrl) && defaultPort) {\n options.port = defaultPort;\n }\n if (getProtocol(this.session.connectUrl) === 'wss') {\n options.secure = true;\n }\n\n this.rawClient = await CDP(options);\n\n this.rawClient.on('event', (message: CDPEventMessage) => {\n this.emit(message.method, message.params, message.sessionId);\n });\n this.rawClient.on('error', (err) => {\n this.emit('error', err);\n });\n this.rawClient.on('disconnect', () => {\n void this.close().catch((err) => {\n getLogger().error(`Failed to close CDP client for session ${this.session.sessionId} after disconnect`, err);\n });\n this.emit('disconnect');\n });\n\n return this;\n }\n\n /**\n * Send a raw Chrome DevTools Protocol command.\n *\n * Returns `undefined` if called before the client has connected.\n */\n async send(method: string, params?: any, sessionId?: string): Promise<any | undefined> {\n if (this.closed) {\n throw new ValidationError('Cannot send CDP command after client is closed');\n }\n\n const rawClient = this.rawClient;\n if (!rawClient) {\n return undefined;\n }\n\n return rawClient.send(method, params, sessionId);\n }\n\n /**\n * Close the CDP connection and release internal listeners.\n */\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n if (this.rawClient) {\n this.rawClient.removeAllListeners('event');\n this.rawClient.removeAllListeners('disconnect');\n this.rawClient.removeAllListeners('error');\n await this.rawClient.close();\n }\n }\n}\n\n/**\n * Connect to a Lexmount browser session over Chrome DevTools Protocol.\n */\nexport async function connectOverCDP(session: SessionInfo): Promise<CDPClient> {\n const client = new CDPClient(session);\n await client.connect();\n return client;\n}\n","/**\n * Lexmount SDK error hierarchy.\n */\n\n/**\n * Base error for all Lexmount SDK failures.\n */\nexport class LexmountError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\n/**\n * Raised when API authentication fails.\n */\nexport class AuthenticationError extends LexmountError {}\n\n/**\n * Raised when a session cannot be found.\n */\nexport class SessionNotFoundError extends LexmountError {}\n\n/**\n * Raised when a context cannot be found.\n */\nexport class ContextNotFoundError extends LexmountError {}\n\n/**\n * Raised when a context is locked by another active session.\n */\nexport class ContextLockedError extends LexmountError {\n readonly activeSessionId?: string;\n readonly retryAfter?: number;\n\n constructor(\n message: string,\n options: { activeSessionId?: string; retryAfter?: number } = {}\n ) {\n const details: string[] = [];\n\n if (options.activeSessionId) {\n details.push(`locked by session: ${options.activeSessionId}`);\n }\n\n if (typeof options.retryAfter === 'number') {\n details.push(`retry after ${options.retryAfter}s`);\n }\n\n super(details.length > 0 ? `${message} (${details.join(', ')})` : message);\n this.activeSessionId = options.activeSessionId;\n this.retryAfter = options.retryAfter;\n }\n}\n\n/**\n * Raised when the Lexmount API returns a non-success response.\n */\nexport class APIError extends LexmountError {\n readonly statusCode?: number;\n readonly response?: unknown;\n\n constructor(message: string, options: { statusCode?: number; response?: unknown } = {}) {\n super(\n typeof options.statusCode === 'number'\n ? `${message} (HTTP ${options.statusCode})`\n : message\n );\n this.statusCode = options.statusCode;\n this.response = options.response;\n }\n}\n\n/**\n * Raised when a network error prevents the request from reaching the API.\n */\nexport class NetworkError extends LexmountError {}\n\n/**\n * Raised when input validation fails.\n */\nexport class ValidationError extends LexmountError {}\n\n/**\n * Raised when a request exceeds the configured timeout.\n */\nexport class TimeoutError extends LexmountError {}\n","import { ValidationError } from './errors';\n\n/**\n * Supported SDK log levels.\n */\nexport type LogLevel =\n | 'DEBUG'\n | 'INFO'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'SILENT';\n\nconst LOGGER_NAME = 'lexmount';\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n DEBUG: 10,\n INFO: 20,\n WARNING: 30,\n ERROR: 40,\n CRITICAL: 50,\n SILENT: 60,\n};\n\nlet currentLevel: LogLevel = 'WARNING';\n\nfunction isLogLevel(value: string): value is LogLevel {\n return value in LOG_LEVEL_PRIORITY;\n}\n\nfunction formatTimestamp(date: Date): string {\n return date.toISOString().replace('T', ' ').replace('Z', '');\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[currentLevel];\n}\n\nfunction emit(level: Exclude<LogLevel, 'SILENT'>, args: unknown[]): void {\n if (!shouldLog(level)) {\n return;\n }\n\n const prefix = `${formatTimestamp(new Date())} - ${LOGGER_NAME} - ${level} -`;\n\n if (level === 'ERROR' || level === 'CRITICAL') {\n console.error(prefix, ...args);\n return;\n }\n\n if (level === 'WARNING') {\n console.warn(prefix, ...args);\n return;\n }\n\n if (level === 'INFO') {\n console.info(prefix, ...args);\n return;\n }\n\n console.debug(prefix, ...args);\n}\n\n/**\n * Shared SDK logger.\n */\nexport class LexmountLogger {\n /**\n * Current SDK log level.\n */\n get level(): LogLevel {\n return currentLevel;\n }\n\n debug(...args: unknown[]): void {\n emit('DEBUG', args);\n }\n\n info(...args: unknown[]): void {\n emit('INFO', args);\n }\n\n warn(...args: unknown[]): void {\n emit('WARNING', args);\n }\n\n error(...args: unknown[]): void {\n emit('ERROR', args);\n }\n\n critical(...args: unknown[]): void {\n emit('CRITICAL', args);\n }\n}\n\nconst logger = new LexmountLogger();\n\n/**\n * Return the shared SDK logger instance.\n */\nexport function getLogger(): LexmountLogger {\n return logger;\n}\n\n/**\n * Set the SDK log level.\n */\nexport function setLogLevel(level: LogLevel | string): void {\n if (typeof level !== 'string' || level.trim() === '') {\n throw new ValidationError(\n 'Invalid log level. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL, SILENT'\n );\n }\n\n const normalizedLevel = level.toUpperCase();\n if (!isLogLevel(normalizedLevel)) {\n throw new ValidationError(\n `Invalid log level: ${level}. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL, SILENT`\n );\n }\n\n currentLevel = normalizedLevel;\n logger.debug(`Log level set to ${normalizedLevel}`);\n}\n\n/**\n * Disable all SDK logging.\n */\nexport function disableLogging(): void {\n currentLevel = 'SILENT';\n}\n\n/**\n * Re-enable SDK logging.\n */\nexport function enableLogging(level: LogLevel | string = 'INFO'): void {\n setLogLevel(level);\n}\n","/**\n * Session resource implementation.\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nimport { getLogger } from './logging';\nimport type {\n BrowserMode,\n PaginationInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n SessionTargetInfoShape,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction withRequestedRegion(client: Lexmount, payload: JsonRecord): JsonRecord {\n const regionId = client.selectedRegion ?? client.region;\n return regionId ? { ...payload, region_id: regionId } : payload;\n}\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizeContextMode(mode: string): 'read_write' | 'read_only' {\n if (mode === 'readWrite' || mode === 'read_write') {\n return 'read_write';\n }\n\n return 'read_only';\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Session pagination information.\n */\nexport class PaginationInfo implements PaginationInfoShape {\n readonly currentPage: number;\n readonly pageSize: number;\n readonly totalCount: number;\n readonly totalPages: number;\n readonly activeCount: number;\n readonly closedCount: number;\n\n constructor(shape: PaginationInfoShape) {\n this.currentPage = shape.currentPage;\n this.pageSize = shape.pageSize;\n this.totalCount = shape.totalCount;\n this.totalPages = shape.totalPages;\n this.activeCount = shape.activeCount;\n this.closedCount = shape.closedCount;\n }\n}\n\ninterface SessionInfoOptions {\n id: string;\n status: SessionStatus;\n apiKey: string;\n projectId: string;\n regionId?: string | null;\n browserType: BrowserMode | string;\n createdAt: string;\n inspectUrl: string;\n containerId: string | null;\n ws?: string | null;\n client?: Lexmount;\n}\n\n/**\n * Session information returned by the API.\n */\nexport class SessionInfo {\n readonly id: string;\n readonly sessionId: string;\n readonly status: SessionStatus;\n readonly apiKey: string;\n readonly projectId: string;\n readonly regionId: string | null;\n readonly region_id: string | null;\n readonly browserType: BrowserMode | string;\n readonly createdAt: string;\n readonly inspectUrl: string;\n readonly containerId: string | null;\n readonly ws: string | null;\n\n private readonly client?: Lexmount;\n private closed = false;\n\n /** @internal */\n constructor(options: SessionInfoOptions) {\n this.id = options.id;\n this.sessionId = options.id;\n this.status = options.status;\n this.apiKey = options.apiKey;\n this.projectId = options.projectId;\n this.regionId = options.regionId ?? null;\n this.region_id = this.regionId;\n this.browserType = options.browserType;\n this.createdAt = options.createdAt;\n this.inspectUrl = options.inspectUrl;\n this.containerId = options.containerId;\n this.ws = options.ws ?? null;\n this.client = options.client;\n }\n\n /**\n * Playwright/CDP connection URL.\n */\n get connectUrl(): string {\n return this.ws ?? '';\n }\n\n /**\n * Parsed session creation time.\n */\n get createdAtDate(): Date | null {\n const date = new Date(this.createdAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n /**\n * Close the current session.\n *\n * This method is idempotent. Errors are logged and swallowed to keep cleanup safe.\n */\n async close(): Promise<void> {\n if (this.closed) {\n getLogger().debug(`Session ${this.sessionId} is already closed.`);\n return;\n }\n\n if (!this.client) {\n getLogger().warn(\n `Cannot close session ${this.sessionId}: client was not provided during session creation.`\n );\n return;\n }\n\n try {\n getLogger().debug(`Closing session ${this.sessionId}`);\n await this.client.sessions.delete({\n sessionId: this.sessionId,\n projectId: this.projectId,\n });\n this.closed = true;\n getLogger().info(`Session closed: ${this.sessionId}`);\n } catch (error) {\n getLogger().warn(`Failed to close session ${this.sessionId}:`, error);\n }\n }\n}\n\n/**\n * Response object from `sessions.list()`.\n */\nexport class SessionListResponse implements Iterable<SessionInfo> {\n readonly sessions: SessionInfo[];\n readonly pagination: PaginationInfo;\n\n constructor(sessions: SessionInfo[], pagination: PaginationInfo) {\n this.sessions = sessions;\n this.pagination = pagination;\n }\n\n /**\n * Number of sessions in the current page.\n */\n get length(): number {\n return this.sessions.length;\n }\n\n [Symbol.iterator](): Iterator<SessionInfo> {\n return this.sessions[Symbol.iterator]();\n }\n\n at(index: number): SessionInfo | undefined {\n return this.sessions[index];\n }\n}\n\n/**\n * Session download metadata returned by the API.\n */\nexport class SessionDownloadInfo implements SessionDownloadInfoShape {\n readonly id: string;\n readonly filename: string;\n readonly contentType: string | null;\n readonly size: number;\n readonly sha256: string | null;\n readonly status: string;\n readonly createdAt: string;\n\n constructor(shape: SessionDownloadInfoShape) {\n this.id = shape.id;\n this.filename = shape.filename;\n this.contentType = shape.contentType;\n this.size = shape.size;\n this.sha256 = shape.sha256;\n this.status = shape.status;\n this.createdAt = shape.createdAt;\n }\n}\n\n/**\n * Structured response from `sessions.downloads.list()`.\n */\nexport class SessionDownloadsListResponse {\n readonly downloads: SessionDownloadInfo[];\n readonly summary: SessionDownloadsListResponseShape;\n\n constructor(downloads: SessionDownloadInfo[], summary: SessionDownloadsListResponseShape) {\n this.downloads = downloads;\n this.summary = summary;\n }\n}\n\n/**\n * Structured response from `sessions.downloads.delete()`.\n */\nexport class SessionDownloadsDeleteResponse implements SessionDownloadsDeleteResponseShape {\n readonly status: string;\n readonly deletedCount: number;\n\n constructor(shape: SessionDownloadsDeleteResponseShape) {\n this.status = shape.status;\n this.deletedCount = shape.deletedCount;\n }\n}\n\n/**\n * Session target metadata returned by `/json`.\n */\nexport class SessionTargetInfo implements SessionTargetInfoShape {\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly description: string;\n readonly inspectUrl: string | null;\n readonly webSocketDebuggerUrl: string | null;\n readonly webSocketDebuggerUrlTransformed: string | null;\n\n constructor(shape: SessionTargetInfoShape) {\n this.id = shape.id;\n this.title = shape.title;\n this.type = shape.type;\n this.url = shape.url;\n this.description = shape.description;\n this.inspectUrl = shape.inspectUrl;\n this.webSocketDebuggerUrl = shape.webSocketDebuggerUrl;\n this.webSocketDebuggerUrlTransformed = shape.webSocketDebuggerUrlTransformed;\n }\n}\n\n/**\n * Session download operations.\n */\nexport class SessionDownloadsResource {\n constructor(private readonly client: Lexmount) {}\n\n async list(sessionId: string, projectId?: string): Promise<SessionDownloadsListResponse> {\n const response = await this.client._post(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/list`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n }\n );\n if (response.status >= 400) {\n this.handleError('list session downloads', response, sessionId);\n }\n\n const result = asRecord(response.data);\n const items = Array.isArray(result.downloads) ? result.downloads : [];\n const downloads = items.map((item) => {\n const download = asRecord(item);\n return new SessionDownloadInfo({\n id: getString(download.id) ?? '',\n filename: getString(download.filename) ?? '',\n contentType: getString(download.content_type) ?? null,\n size: getNumber(download.size) ?? 0,\n sha256: getString(download.sha256) ?? null,\n status: getString(download.status) ?? 'available',\n createdAt: getString(download.created_at) ?? '',\n });\n });\n const summary = asRecord(result.summary);\n\n return new SessionDownloadsListResponse(downloads, {\n count: getNumber(summary.count) ?? downloads.length,\n totalSize: getNumber(summary.total_size) ?? 0,\n });\n }\n\n async get(sessionId: string, downloadId: string, projectId?: string): Promise<Buffer> {\n const response = await this.client._get(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/${downloadId}`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n },\n {\n responseType: 'arraybuffer',\n }\n );\n if (response.status >= 400) {\n this.handleError('fetch session download', response, sessionId);\n }\n\n return Buffer.from(response.data as ArrayBuffer);\n }\n\n async archive(sessionId: string, projectId?: string): Promise<Buffer> {\n const response = await this.client._get(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/archive`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n },\n {\n responseType: 'arraybuffer',\n }\n );\n if (response.status >= 400) {\n this.handleError('archive session downloads', response, sessionId);\n }\n\n return Buffer.from(response.data as ArrayBuffer);\n }\n\n async delete(sessionId: string, projectId?: string): Promise<SessionDownloadsDeleteResponse> {\n const response = await this.client._delete(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n }\n );\n if (response.status >= 400) {\n this.handleError('delete session downloads', response, sessionId);\n }\n\n const result = asRecord(response.data);\n return new SessionDownloadsDeleteResponse({\n status: getString(result.status) ?? '',\n deletedCount: getNumber(result.deleted_count) ?? 0,\n });\n }\n\n private handleError(action: string, response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(`Session downloads not found for ${sessionId}: ${errorMessage}`);\n }\n\n throw new APIError(`Failed to ${action}: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n\n/**\n * Alias kept for parity with the Python SDK.\n */\nexport type SessionCreateResponse = SessionInfo;\n\n/**\n * Session resource operations.\n */\nexport class SessionsResource {\n readonly downloads: SessionDownloadsResource;\n\n constructor(private readonly client: Lexmount) {\n this.downloads = new SessionDownloadsResource(client);\n }\n\n /**\n * Create a new browser session.\n */\n async create(options: SessionCreateOptions = {}): Promise<SessionCreateResponse> {\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n browser_mode: options.browserMode ?? 'normal',\n };\n\n if (options.context) {\n const contextPayload = {\n id: options.context.id,\n mode: normalizeContextMode(options.context.mode),\n };\n payload.context = contextPayload;\n getLogger().debug(\n `Creating session with context (id=${options.context.id}, mode=${contextPayload.mode})`\n );\n } else {\n getLogger().debug(`Creating session with browser_mode=${payload.browser_mode as string}`);\n }\n\n if (options.extensionIds && options.extensionIds.length > 0) {\n payload.extension_ids = options.extensionIds;\n }\n\n if (options.proxy) {\n payload.proxy = this.normalizeProxy(options.proxy);\n }\n\n if (options.weakLock) {\n payload.weak_lock = true;\n }\n\n if (options.asyncCreate !== false) {\n return this.createAsync(withRequestedRegion(this.client, payload), options);\n }\n\n const url = `${this.client.baseUrl}/instance`;\n const response = await this.client._post(url, withRequestedRegion(this.client, payload));\n if (response.status >= 400) {\n this.handleCreateError(response);\n }\n\n const result = asRecord(response.data);\n const sessionId = getString(result.session_id);\n if (!sessionId) {\n throw new APIError('Failed to create session: session_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const containerId = getString(result.container_id) ?? null;\n const projectId = options.projectId ?? this.client.projectId;\n // The create endpoint does not return the canonical inspect URL. Re-fetch the created\n // session so the SDK can return the server-provided inspectUrl when available.\n const createdSession = await this._getCreatedSession(sessionId, projectId);\n const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n\n getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);\n\n return new SessionInfo({\n id: sessionId,\n status: createdSession?.status ?? 'active',\n apiKey: this.client.apiKey,\n projectId,\n regionId: createdSession?.regionId ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: createdSession?.browserType ?? ((options.browserMode ?? 'normal') as BrowserMode),\n createdAt: createdSession?.createdAt ?? new Date().toISOString(),\n inspectUrl:\n createdSession?.inspectUrl ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: createdSession?.containerId ?? containerId,\n ws: wsUrl ?? createdSession?.ws ?? null,\n client: this.client,\n });\n }\n\n private async createAsync(\n payload: JsonRecord,\n options: SessionCreateOptions\n ): Promise<SessionCreateResponse> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v2`, payload);\n if (response.status >= 400) {\n this.handleCreateError(response);\n }\n\n const result = asRecord(response.data);\n const sessionId = getString(result.session_id);\n if (!sessionId) {\n throw new APIError('Failed to create session: session_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const projectId = options.projectId ?? this.client.projectId;\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const pollTimeoutMs = options.pollTimeoutMs ?? 600_000;\n const deadline = Date.now() + pollTimeoutMs;\n\n while (Date.now() < deadline) {\n const info = await this.get(sessionId, projectId);\n if (info.status === 'active') {\n const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n getLogger().info(`Session created successfully (async): id=${sessionId}`);\n return new SessionInfo({\n id: sessionId,\n status: 'active',\n apiKey: this.client.apiKey,\n projectId,\n regionId: info.regionId ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: info.browserType || ((options.browserMode ?? 'normal') as BrowserMode),\n createdAt: info.createdAt,\n inspectUrl: info.inspectUrl,\n containerId: info.containerId,\n ws: wsUrl ?? info.ws,\n client: this.client,\n });\n }\n\n if (info.status === 'create_failed') {\n this.handleAsyncCreateFailed(payload);\n throw new APIError('Session creation failed', {\n statusCode: 500,\n response: { session_id: sessionId, status: info.status },\n });\n }\n\n if (info.status === 'closed') {\n throw new APIError('Session closed before activation', {\n statusCode: 500,\n response: { session_id: sessionId, status: info.status },\n });\n }\n\n await delay(pollIntervalMs);\n }\n\n throw new TimeoutError(\n `Timed out waiting for session ${sessionId} to become active after ${pollTimeoutMs}ms`\n );\n }\n\n /**\n * Fetch one session by id.\n *\n * The upstream API uses POST /instance/session for this lookup, so this SDK method\n * intentionally uses POST even though the operation is read-only.\n */\n async get(sessionId: string, projectId?: string): Promise<SessionInfo> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/session`, withRequestedRegion(this.client, {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n session_id: sessionId,\n }));\n\n if (response.status >= 400) {\n this.handleGetError(response, sessionId);\n }\n\n return this.mapSessionInfo(asRecord(response.data), projectId);\n }\n\n /**\n * List sessions for the current project.\n */\n async list(options: SessionListOptions = {}): Promise<SessionListResponse> {\n const url = `${this.client.baseUrl}/instance/v2/sessions`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n };\n\n if (options.status) {\n payload.status = options.status;\n }\n\n const response = await this.client._post(url, withRequestedRegion(this.client, payload));\n if (response.status >= 400) {\n this.handleListError(response);\n }\n\n const result = asRecord(response.data);\n const sessionsData = Array.isArray(result.sessions) ? result.sessions : [];\n const paginationData = asRecord(result.pagination);\n\n const sessions = sessionsData.map((item) => this.mapSessionInfo(asRecord(item), options.projectId));\n\n const pagination = new PaginationInfo({\n currentPage: getNumber(paginationData.currentPage) ?? 1,\n pageSize: getNumber(paginationData.pageSize) ?? sessions.length,\n totalCount: getNumber(paginationData.totalCount) ?? sessions.length,\n totalPages: getNumber(paginationData.totalPages) ?? 1,\n activeCount: getNumber(paginationData.activeCount) ?? 0,\n closedCount: getNumber(paginationData.closedCount) ?? 0,\n });\n\n getLogger().info(\n `Retrieved ${sessions.length} sessions (total: ${pagination.totalCount}, active: ${pagination.activeCount}, closed: ${pagination.closedCount})`\n );\n\n return new SessionListResponse(sessions, pagination);\n }\n\n /**\n * Delete a browser session.\n */\n async delete(options: SessionDeleteOptions): Promise<void> {\n const url = `${this.client.baseUrl}/instance`;\n const payload = withRequestedRegion(this.client, {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n session_id: options.sessionId,\n });\n\n const response = await this.client._delete(url, payload);\n if (response.status >= 400) {\n this.handleDeleteError(response, options.sessionId);\n }\n\n getLogger().info(`Session deleted successfully: ${options.sessionId}`);\n }\n\n /**\n * List target/page metadata for a session via `/json`.\n */\n async listTargets(sessionId: string): Promise<SessionTargetInfo[]> {\n const response = await this.client._get(`${this.client.baseUrl}/json`, {\n session_id: sessionId,\n });\n\n if (response.status >= 400) {\n this.handleListTargetsError(response, sessionId);\n }\n\n const result = Array.isArray(response.data) ? response.data : [];\n return result.map((item) => this.mapSessionTarget(asRecord(item)));\n }\n\n /**\n * Fetch the debugger WebSocket URL for a session.\n *\n * @internal\n */\n async _getWebSocketDebuggerUrl(sessionId: string): Promise<string | null> {\n try {\n const response = await this.client._get(`${this.client.baseUrl}/json/version`, {\n session_id: sessionId,\n });\n\n if (response.status >= 400) {\n getLogger().error('Error getting WebSocket debugger URL:', response.data);\n return null;\n }\n\n const result = asRecord(response.data);\n return (\n getString(result.webSocketDebuggerUrlTransformed) ??\n getString(result.webSocketDebuggerUrl) ??\n null\n );\n } catch (error) {\n getLogger().error('Error getting WebSocket debugger URL:', error);\n return null;\n }\n }\n\n private normalizeProxy(proxy: SessionProxyConfig): JsonRecord {\n if (!proxy.server) {\n throw new ValidationError('proxy.server is required when proxy is provided');\n }\n\n const normalizedProxy: JsonRecord = {\n type: proxy.type ?? 'external',\n server: proxy.server,\n };\n\n if (proxy.username) {\n normalizedProxy.username = proxy.username;\n }\n\n if (proxy.password) {\n normalizedProxy.password = proxy.password;\n }\n\n return normalizedProxy;\n }\n\n private handleAsyncCreateFailed(payload: JsonRecord): void {\n const context = asRecord(payload.context);\n const contextId = getString(context.id);\n const contextMode = getString(context.mode);\n\n // The async create endpoint can accept the request and only surface lock conflicts\n // later as create_failed while polling. Preserve the SDK's ContextLockedError contract\n // for read-write context creation so callers do not have to special-case APIError.\n if (contextId && contextMode === 'read_write' && payload.weak_lock !== true) {\n throw new ContextLockedError('Context is locked by another active session');\n }\n }\n\n private handleCreateError(response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n const errorCode = getString(errorData.code);\n const metadata = asRecord(errorData.metadata);\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404 && errorCode === 'context_not_found') {\n throw new ContextNotFoundError(`Context not found: ${errorMessage}`);\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(`Resource not found: ${errorMessage}`);\n }\n\n if (response.status === 409 && errorCode === 'context_locked') {\n throw new ContextLockedError(errorMessage, {\n activeSessionId: getString(metadata.activeSessionId),\n retryAfter: getNumber(metadata.retryAfter),\n });\n }\n\n throw new APIError(`Failed to create session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleGetError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`\n );\n }\n\n throw new APIError(`Failed to get session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleListError(response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n throw new APIError(`Failed to list sessions: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleListTargetsError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`\n );\n }\n\n throw new APIError(`Failed to list session targets: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleDeleteError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may have already been deleted or never existed.`\n );\n }\n\n throw new APIError(`Failed to delete session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private mapSessionInfo(raw: JsonRecord, projectId?: string): SessionInfo {\n const sessionId = getString(raw.session_id) ?? getString(raw.id) ?? '';\n\n return new SessionInfo({\n id: sessionId,\n status: getString(raw.status) ?? 'active',\n apiKey: getString(raw.api_key) ?? this.client.apiKey,\n projectId: getString(raw.project_id) ?? (projectId ?? this.client.projectId),\n regionId: getString(raw.region_id) ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: getString(raw.browser_type) ?? getString(raw.browser_mode) ?? 'normal',\n createdAt: getString(raw.created_at) ?? '',\n inspectUrl:\n getString(raw.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: getString(raw.container_id) ?? null,\n ws: getString(raw.ws) ?? null,\n client: this.client,\n });\n }\n\n private mapSessionTarget(raw: JsonRecord): SessionTargetInfo {\n return new SessionTargetInfo({\n id: getString(raw.id) ?? '',\n title: getString(raw.title) ?? '',\n type: getString(raw.type) ?? '',\n url: getString(raw.url) ?? '',\n description: getString(raw.description) ?? '',\n inspectUrl: getString(raw.inspectUrl) ?? getString(raw.inspect_url) ?? null,\n webSocketDebuggerUrl:\n getString(raw.webSocketDebuggerUrl) ?? getString(raw.web_socket_debugger_url) ?? null,\n webSocketDebuggerUrlTransformed:\n getString(raw.webSocketDebuggerUrlTransformed) ??\n getString(raw.web_socket_debugger_url_transformed) ??\n null,\n });\n }\n\n private async _getCreatedSession(\n sessionId: string,\n projectId: string\n ): Promise<SessionInfo | null> {\n try {\n return await this.get(sessionId, projectId);\n } catch (error) {\n getLogger().warn(\n `Failed to fetch created session ${sessionId}; falling back to locally derived session fields:`,\n error\n );\n return null;\n }\n }\n}\n","/**\n * Integrated authentication helpers.\n */\n\nimport { CDPClient, connectOverCDP } from './cdp';\nimport { ValidationError } from './errors';\nimport { getLogger } from './logging';\nimport { SessionInfo } from './sessions';\n\nexport type IntegratedAuthCallbackResult =\n | {\n cancel: true;\n }\n | {\n cancel: false;\n scheme: string;\n token: string;\n };\n\nexport type IntegratedAuthCallback = (\n params: any,\n callback: (result: IntegratedAuthCallbackResult) => Promise<void>\n) => void | Promise<void>;\n\nconst integratedAuthCallbacks = new Map<string, Set<IntegratedAuthCallback>>();\nconst cdpClients = new Map<string, CDPClient>();\n\nfunction getIntegratedAuthKey(sessionOrClient: SessionInfo | CDPClient): string {\n const session =\n sessionOrClient instanceof SessionInfo ? sessionOrClient : sessionOrClient.session;\n const connectUrl = session.connectUrl;\n\n if (!connectUrl) {\n throw new ValidationError(`Session ${session.sessionId} does not include a CDP connect URL`);\n }\n\n return connectUrl;\n}\n\n/**\n * Register an integrated auth callback for a session.\n */\nexport async function registerIntegratedAuthCallback(\n sessionOrClient: SessionInfo | CDPClient,\n callback: IntegratedAuthCallback\n): Promise<void> {\n const key = getIntegratedAuthKey(sessionOrClient);\n\n let sessionCallbacks = integratedAuthCallbacks.get(key);\n if (sessionCallbacks?.has(callback)) {\n return;\n }\n\n let client = cdpClients.get(key);\n if (!client) {\n if (sessionOrClient instanceof SessionInfo) {\n client = await connectOverCDP(sessionOrClient);\n } else {\n client = sessionOrClient;\n }\n\n await client.send('Fetch.enable', { handleAuthRequests: true });\n cdpClients.set(key, client);\n\n client.on('disconnect', () => {\n cdpClients.delete(key);\n integratedAuthCallbacks.delete(key);\n });\n\n client.on('Fetch.requestPaused', async (event: any, sessionId: string) => {\n try {\n await client!.send(\n 'Fetch.continueRequest',\n {\n requestId: event.requestId,\n },\n sessionId\n );\n } catch (error) {\n getLogger().error('Failed to continue paused fetch request', error);\n }\n });\n\n client.on('Fetch.integratedAuthRequired', async (params: any, sessionId: string) => {\n try {\n const sessionCallbacks = integratedAuthCallbacks.get(key);\n if (!sessionCallbacks) {\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'CancelAuth',\n },\n },\n sessionId\n );\n return;\n }\n\n const sender = async (result: IntegratedAuthCallbackResult) => {\n if (result.cancel) {\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'CancelAuth',\n },\n },\n sessionId\n );\n return;\n }\n\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'ProvideIntegratedCredentials',\n scheme: result.scheme,\n token: result.token,\n },\n },\n sessionId\n );\n };\n\n for (const cb of sessionCallbacks) {\n try {\n const result = cb(params, sender);\n void Promise.resolve(result).catch((error) => {\n getLogger().error('Integrated auth callback failed', error);\n });\n } catch (error) {\n getLogger().error('Integrated auth callback failed', error);\n }\n }\n } catch (error) {\n getLogger().error('Failed to handle integrated auth request', error);\n }\n });\n }\n\n if (!sessionCallbacks) {\n sessionCallbacks = new Set();\n integratedAuthCallbacks.set(key, sessionCallbacks);\n }\n\n sessionCallbacks.add(callback);\n}\n\n/**\n * Deregister a previously registered integrated auth callback.\n */\nexport function deregisterIntegratedAuthCallback(\n sessionOrClient: SessionInfo | CDPClient,\n callback: IntegratedAuthCallback\n): void {\n const key = getIntegratedAuthKey(sessionOrClient);\n\n const sessionCallbacks = integratedAuthCallbacks.get(key);\n if (!sessionCallbacks?.has(callback)) {\n return;\n }\n\n sessionCallbacks.delete(callback);\n\n if (sessionCallbacks.size === 0) {\n integratedAuthCallbacks.delete(key);\n }\n}\n","/**\n * Lexmount API client.\n */\n\nimport { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, isAxiosError } from 'axios';\nimport axios from 'axios';\nimport * as dotenv from 'dotenv';\nimport { ContextsResource } from './contexts';\nimport { ExtensionsResource } from './extensions';\nimport { APIError, NetworkError, TimeoutError, ValidationError } from './errors';\nimport { getLogger, setLogLevel } from './logging';\nimport { SessionsResource } from './sessions';\nimport type { CatalogInfo, LexmountConfig, RegionCatalogEntry, RegionInfo } from './types';\n\ndotenv.config();\n\n/**\n * Main Lexmount SDK client.\n */\nexport class Lexmount {\n /**\n * API key used for authentication.\n */\n readonly apiKey: string;\n\n /**\n * Default project identifier used by resource methods.\n */\n readonly projectId: string;\n\n /**\n * API base URL.\n */\n readonly baseUrl: string;\n\n readonly region?: string;\n\n selectedRegion?: string;\n\n private endpointBaseUrl?: string;\n\n private selectedHost?: string;\n\n private regionResolutionAttempted = false;\n\n private regionResolutionPromise?: Promise<void>;\n\n /**\n * Session operations.\n */\n readonly sessions: SessionsResource;\n\n /**\n * Persistent context operations.\n */\n readonly contexts: ContextsResource;\n\n /**\n * Browser extension operations.\n */\n readonly extensions: ExtensionsResource;\n\n private readonly httpClient: AxiosInstance;\n\n constructor(config: LexmountConfig = {}) {\n this.apiKey = config.apiKey ?? process.env.LEXMOUNT_API_KEY ?? '';\n if (!this.apiKey) {\n throw new ValidationError(\n 'apiKey must be provided or set LEXMOUNT_API_KEY environment variable'\n );\n }\n\n this.projectId = config.projectId ?? process.env.LEXMOUNT_PROJECT_ID ?? '';\n if (!this.projectId) {\n throw new ValidationError(\n 'projectId must be provided or set LEXMOUNT_PROJECT_ID environment variable'\n );\n }\n\n this.baseUrl = (\n config.baseUrl ??\n process.env.LEXMOUNT_BASE_URL ??\n 'https://api.lexmount.cn'\n ).replace(/\\/$/, '');\n this.region = config.region;\n\n if (config.logLevel) {\n setLogLevel(config.logLevel);\n }\n\n this.httpClient = axios.create({\n timeout: config.timeout ?? 60000,\n validateStatus: () => true,\n });\n\n this.sessions = new SessionsResource(this);\n this.contexts = new ContextsResource(this);\n this.extensions = new ExtensionsResource(this);\n }\n\n /**\n * Internal POST request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _post<T = unknown>(\n url: string,\n data?: unknown,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('POST', url, { ...config, data });\n }\n\n /**\n * Internal GET request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _get<T = unknown>(\n url: string,\n params?: Record<string, unknown>,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('GET', url, { ...config, params });\n }\n\n /**\n * Internal DELETE request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _delete<T = unknown>(\n url: string,\n data?: unknown,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('DELETE', url, { ...config, data });\n }\n\n async regionInfo(): Promise<RegionInfo> {\n await this.ensureRegionResolved();\n return {\n requestedRegion: this.region,\n selectedRegion: this.selectedRegion,\n baseUrl: this.baseUrl,\n endpointBaseUrl: this.endpointBaseUrl,\n host: this.selectedHost,\n resolved: this.regionResolutionAttempted,\n usingRegion: this.selectedRegion !== undefined,\n };\n }\n\n async catalogInfo(): Promise<CatalogInfo> {\n try {\n const response = await this.httpClient.get<{ regions?: unknown }>(\n `${this.baseUrl}/v1/regions/catalog`\n );\n if (response.status !== 200) {\n return {\n baseUrl: this.baseUrl,\n available: false,\n statusCode: response.status,\n regions: [],\n };\n }\n\n const regions = Array.isArray(response.data?.regions)\n ? (response.data.regions as RegionCatalogEntry[])\n : [];\n return {\n baseUrl: this.baseUrl,\n available: Array.isArray(response.data?.regions),\n statusCode: response.status,\n regions,\n error: Array.isArray(response.data?.regions) ? undefined : 'invalid catalog regions',\n };\n } catch (error) {\n return {\n baseUrl: this.baseUrl,\n available: false,\n regions: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Close the client.\n *\n * Axios does not require explicit teardown, but the method is kept for API symmetry.\n */\n close(): void {\n getLogger().debug('Closing Lexmount client');\n }\n\n /**\n * String representation of the client.\n */\n toString(): string {\n return `Lexmount(projectId='${this.projectId}', baseUrl='${this.baseUrl}')`;\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n config: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n const logger = getLogger();\n const startTime = Date.now();\n const requestUrl = this.rewriteUrl(url);\n logger.debug(`${method} request to ${requestUrl}`);\n\n try {\n const headers = {\n api_key: this.apiKey,\n project_id: this.projectId,\n ...this.getDefaultHeaders(config.data),\n ...(config.headers ?? {}),\n };\n\n const response = await this.httpClient.request<T>({\n method,\n url: requestUrl,\n ...config,\n headers,\n });\n\n const elapsed = Date.now() - startTime;\n logger.debug(\n `${method} response: status=${response.status}, duration=${elapsed.toFixed(2)}ms`\n );\n return response;\n } catch (error) {\n const elapsed = Date.now() - startTime;\n throw this.normalizeRequestError(error, elapsed);\n }\n }\n\n private normalizeRequestError(error: unknown, elapsedMs: number): Error {\n const logger = getLogger();\n\n if (!isAxiosError(error)) {\n logger.error(`Unexpected request error after ${elapsedMs.toFixed(2)}ms:`, error);\n return new APIError('Unexpected HTTP error', { response: error });\n }\n\n const axiosError = error as AxiosError<unknown>;\n\n if (axiosError.code === 'ECONNABORTED') {\n logger.error(`Request timeout after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new TimeoutError(`Request timed out: ${axiosError.message}`);\n }\n\n if (axiosError.response) {\n logger.error(`HTTP error after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new APIError(`HTTP error: ${axiosError.message}`, {\n statusCode: axiosError.response.status,\n response: axiosError.response.data,\n });\n }\n\n logger.error(`Network error after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new NetworkError(`Network error: ${axiosError.message}`);\n }\n\n private getDefaultHeaders(data: unknown): Record<string, string> {\n if (typeof data === 'undefined') {\n return {};\n }\n\n if (typeof FormData !== 'undefined' && data instanceof FormData) {\n return {};\n }\n\n return {\n 'Content-Type': 'application/json',\n };\n }\n\n private async ensureRegionResolved(): Promise<void> {\n if (this.regionResolutionAttempted) {\n return;\n }\n\n if (!this.regionResolutionPromise) {\n this.regionResolutionPromise = this.resolveRegion().finally(() => {\n this.regionResolutionAttempted = true;\n this.regionResolutionPromise = undefined;\n });\n }\n\n await this.regionResolutionPromise;\n }\n\n private async resolveRegion(): Promise<void> {\n const logger = getLogger();\n try {\n const response = await this.httpClient.get<{ regions?: unknown }>(\n `${this.baseUrl}/v1/regions/catalog`\n );\n if (response.status !== 200 || !Array.isArray(response.data?.regions)) {\n logger.debug(\n `Region catalog unavailable, falling back to baseUrl: status=${response.status}`\n );\n return;\n }\n\n const selected = this.selectCatalogRegion(response.data.regions as RegionCatalogEntry[]);\n if (!selected) {\n if (this.region) {\n logger.warn(`Requested region not found in catalog: ${this.region}`);\n } else {\n logger.debug('No default catalog region, falling back to baseUrl');\n }\n return;\n }\n\n const endpointBaseUrl = await this.probeRegionHost(selected);\n if (!endpointBaseUrl) {\n logger.debug('Region probe failed, falling back to baseUrl');\n return;\n }\n\n this.selectedRegion = selected.region_id;\n this.selectedHost = selected.host;\n this.endpointBaseUrl = endpointBaseUrl;\n } catch (error) {\n logger.debug('Region resolution failed, falling back to baseUrl:', error);\n }\n }\n\n private selectCatalogRegion(regions: RegionCatalogEntry[]): RegionCatalogEntry | undefined {\n if (this.region) {\n return regions.find((region) => region.region_id === this.region);\n }\n const defaultRegions = regions.filter((region) => region.default === true);\n return defaultRegions.length === 1 ? defaultRegions[0] : undefined;\n }\n\n private async probeRegionHost(region: RegionCatalogEntry): Promise<string | undefined> {\n const logger = getLogger();\n const host = String(region.host || '').trim();\n if (!host) {\n return undefined;\n }\n if (!this.isAllowedCatalogHost(host)) {\n logger.warn(`Ignoring invalid region catalog host: ${host}`);\n return undefined;\n }\n\n const endpointBaseUrl = `https://${host}`;\n const probePath = String(region.probe_path || '/v1/region/probe').replace(/^(?!\\/)/, '/');\n try {\n const response = await this.httpClient.get(`${endpointBaseUrl}${probePath}`);\n return response.status === 200 ? endpointBaseUrl : undefined;\n } catch {\n return undefined;\n }\n }\n\n private isAllowedCatalogHost(host: string): boolean {\n let parsed: URL;\n try {\n parsed = new URL(`https://${host}`);\n } catch {\n return false;\n }\n\n if (\n parsed.username ||\n parsed.password ||\n parsed.port ||\n parsed.pathname !== '/' ||\n parsed.search ||\n parsed.hash\n ) {\n return false;\n }\n\n const hostname = parsed.hostname.toLowerCase();\n const allowedDomains = ['lexmount.cn', 'lexmount.com', 'lexmount.net'];\n return allowedDomains.some((domain) => hostname === domain || hostname.endsWith(`.${domain}`));\n }\n\n private rewriteUrl(url: string): string {\n if (!this.endpointBaseUrl || !url.startsWith(this.baseUrl)) {\n return url;\n }\n return `${this.endpointBaseUrl}${url.slice(this.baseUrl.length)}`;\n }\n}\n\nexport default Lexmount;\n","/**\n * Context resource implementation.\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n} from './errors';\nimport { getLogger } from './logging';\nimport type {\n ContextCreateOptions,\n ContextListOptions,\n ContextMetadata,\n ContextStatus,\n ForceReleaseResponse,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction parseTimestamp(value: unknown): string | null {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return new Date(value).toISOString();\n }\n\n return null;\n}\n\nfunction normalizeContextStatus(value: unknown): ContextStatus {\n if (value === true || value === 'locked') {\n return 'locked';\n }\n\n if (value === false || value === 'available') {\n return 'available';\n }\n\n return typeof value === 'string' ? value : 'available';\n}\n\n/**\n * Context information returned by the API.\n */\nexport class ContextInfo {\n readonly id: string;\n readonly status: ContextStatus;\n readonly metadata: ContextMetadata;\n readonly createdAt: string | null;\n readonly updatedAt: string | null;\n\n constructor(options: {\n id: string;\n status: ContextStatus;\n metadata?: ContextMetadata;\n createdAt?: string | null;\n updatedAt?: string | null;\n }) {\n this.id = options.id;\n this.status = options.status;\n this.metadata = options.metadata ?? {};\n this.createdAt = options.createdAt ?? null;\n this.updatedAt = options.updatedAt ?? null;\n }\n\n get createdAtDate(): Date | null {\n if (!this.createdAt) {\n return null;\n }\n\n const date = new Date(this.createdAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n get updatedAtDate(): Date | null {\n if (!this.updatedAt) {\n return null;\n }\n\n const date = new Date(this.updatedAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n isLocked(): boolean {\n return this.status === 'locked';\n }\n\n isAvailable(): boolean {\n return this.status === 'available';\n }\n}\n\n/**\n * Response object from `contexts.list()`.\n */\nexport class ContextListResponse implements Iterable<ContextInfo> {\n readonly data: ContextInfo[];\n\n constructor(data: ContextInfo[]) {\n this.data = data;\n }\n\n get length(): number {\n return this.data.length;\n }\n\n [Symbol.iterator](): Iterator<ContextInfo> {\n return this.data[Symbol.iterator]();\n }\n\n at(index: number): ContextInfo | undefined {\n return this.data[index];\n }\n}\n\n/**\n * Context resource operations.\n */\nexport class ContextsResource {\n constructor(private readonly client: Lexmount) {}\n\n /**\n * Create a new persistent context.\n */\n async create(options: ContextCreateOptions = {}): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/create-context`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n if (options.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'create');\n }\n\n const result = asRecord(response.data);\n const contextId = getString(result.context_id);\n if (!contextId) {\n throw new APIError('Failed to create context: context_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const context = new ContextInfo({\n id: contextId,\n status: normalizeContextStatus(result.locked),\n metadata: (result.metadata as ContextMetadata | undefined) ?? options.metadata ?? {},\n createdAt: parseTimestamp(result.created_at),\n });\n\n getLogger().info(`Successfully created context '${context.id}'`);\n return context;\n }\n\n /**\n * List contexts in the current project.\n */\n async list(options: ContextListOptions = {}): Promise<ContextListResponse> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/list-contexts`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n limit: options.limit ?? 20,\n };\n\n if (options.status) {\n payload.status = options.status;\n }\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'list');\n }\n\n const result = asRecord(response.data);\n const contexts = Array.isArray(result.contexts)\n ? result.contexts.map((item) => {\n const context = asRecord(item);\n return new ContextInfo({\n id: getString(context.context_id) ?? '',\n status: normalizeContextStatus(context.locked),\n createdAt: parseTimestamp(context.created_at),\n updatedAt: parseTimestamp(context.updated_at),\n metadata: (context.metadata as ContextMetadata | undefined) ?? {},\n });\n })\n : [];\n\n getLogger().info(`Retrieved ${contexts.length} contexts`);\n return new ContextListResponse(contexts);\n }\n\n /**\n * Fetch a single context.\n */\n async get(contextId: string): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'get', contextId);\n }\n\n const result = asRecord(response.data);\n const context = asRecord(result.context);\n\n const contextInfo = new ContextInfo({\n id: getString(context.context_id) ?? contextId,\n status: normalizeContextStatus(context.locked),\n metadata: (context.metadata as ContextMetadata | undefined) ?? {},\n createdAt: parseTimestamp(context.created_at),\n updatedAt: parseTimestamp(context.updated_at),\n });\n\n getLogger().info(`Retrieved context '${contextInfo.id}' (status: ${contextInfo.status})`);\n return contextInfo;\n }\n\n /**\n * Fork an existing persistent context into a new context.\n */\n async fork(contextId: string): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/fork`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'fork', contextId);\n }\n\n const result = asRecord(response.data);\n const forkedContextId = getString(result.context_id);\n if (!forkedContextId) {\n throw new APIError('Failed to fork context: context_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const contextInfo = new ContextInfo({\n id: forkedContextId,\n status: normalizeContextStatus(result.locked),\n metadata: (result.metadata as ContextMetadata | undefined) ?? {},\n createdAt: parseTimestamp(result.created_at),\n updatedAt: parseTimestamp(result.updated_at),\n });\n\n getLogger().info(`Successfully forked context '${contextId}' -> '${contextInfo.id}'`);\n return contextInfo;\n }\n\n /**\n * Delete a persistent context.\n */\n async delete(contextId: string): Promise<void> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._delete(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'delete', contextId);\n }\n\n getLogger().info(`Successfully deleted context '${contextId}'`);\n }\n\n /**\n * Force-release a stuck lock on a context.\n */\n async forceRelease(contextId: string): Promise<ForceReleaseResponse> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/force-release`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'force_release', contextId);\n }\n\n const result = asRecord(response.data);\n return {\n status: getString(result.status) ?? 'unlocked',\n message: getString(result.message) ?? 'Lock released successfully',\n };\n }\n\n private handleError(\n response: AxiosResponse<unknown>,\n operation: string,\n contextId?: string\n ): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n const errorCode = getString(errorData.code);\n const metadata = asRecord(errorData.metadata);\n\n if (response.status === 401) {\n throw new AuthenticationError(`Authentication failed: ${errorMessage}`);\n }\n\n if (response.status === 404) {\n const suffix = contextId ? `: ${contextId}` : '';\n throw new ContextNotFoundError(`Context not found${suffix}`);\n }\n\n if (\n response.status === 409 &&\n (errorCode === 'context_locked' || errorCode === 'CONTEXT_FORK_SOURCE_LOCKED')\n ) {\n throw new ContextLockedError(errorMessage, {\n activeSessionId: getString(metadata.activeSessionId),\n retryAfter:\n typeof metadata.retryAfter === 'number' ? metadata.retryAfter : undefined,\n });\n }\n\n if (response.status === 409 && errorCode === 'session_active') {\n throw new APIError(\n `Cannot ${operation} context: ${errorMessage} (session is active)`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 500) {\n const details = getString(errorData.details);\n throw new APIError(\n `Internal server error (500) during ${operation}: ${errorMessage}${details ? `. Details: ${details}` : ''}`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 502) {\n throw new APIError(\n `Server gateway error (502) during ${operation}: The service may be temporarily unavailable. Please retry.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 503) {\n throw new APIError(\n `Service unavailable (503) during ${operation}: The service is temporarily unavailable. Please retry later.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 504) {\n throw new APIError(\n `Gateway timeout (504) during ${operation}: The request timed out. Please retry.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n throw new APIError(`Failed to ${operation} context: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n","/**\n * Extension resource implementation.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport { APIError, AuthenticationError } from './errors';\nimport { getLogger } from './logging';\nimport type {\n ExtensionInfoShape,\n ExtensionListOptions,\n ExtensionUploadOptions,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Extension metadata returned by the API.\n */\nexport class ExtensionInfo implements ExtensionInfoShape {\n readonly id: string;\n readonly name: string;\n readonly projectId: string;\n readonly createdAt?: string;\n readonly updatedAt?: string;\n\n constructor(shape: ExtensionInfoShape) {\n this.id = shape.id;\n this.name = shape.name;\n this.projectId = shape.projectId;\n this.createdAt = shape.createdAt;\n this.updatedAt = shape.updatedAt;\n }\n}\n\n/**\n * Browser extension resource operations.\n */\nexport class ExtensionsResource {\n constructor(private readonly client: Lexmount) {}\n\n async upload(filePath: string, options: ExtensionUploadOptions = {}): Promise<ExtensionInfo> {\n const fileBuffer = await readFile(filePath);\n const form = new FormData();\n const usedProjectId = options.projectId ?? this.client.projectId;\n\n form.append('project_id', usedProjectId);\n if (options.name) {\n form.append('name', options.name);\n }\n\n form.append(\n 'file',\n new Blob([fileBuffer], { type: 'application/octet-stream' }),\n path.basename(filePath)\n );\n\n const response = await this.client._post(\n `${this.client.baseUrl}/instance/v1/extension/upload`,\n form,\n {\n headers: {\n project_id: usedProjectId,\n },\n }\n );\n if (response.status >= 400) {\n this.handleError('upload extension', response);\n }\n\n getLogger().info(`Extension uploaded successfully: ${filePath}`);\n return this.parseInfo(response.data);\n }\n\n async list(options: ExtensionListOptions = {}): Promise<ExtensionInfo[]> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v1/extension/list`, {\n project_id: options.projectId ?? this.client.projectId,\n limit: options.limit ?? 20,\n offset: options.offset ?? 0,\n });\n if (response.status >= 400) {\n this.handleError('list extensions', response);\n }\n\n const result = asRecord(response.data);\n const items = Array.isArray(result.data) ? result.data : [];\n return items.map((item) => this.parseInfo(item));\n }\n\n async get(extensionId: string, projectId?: string): Promise<ExtensionInfo> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v1/extension/info`, {\n project_id: projectId ?? this.client.projectId,\n extension_id: extensionId,\n });\n if (response.status >= 400) {\n this.handleError('get extension', response);\n }\n\n return this.parseInfo(response.data);\n }\n\n async delete(extensionId: string): Promise<void> {\n const response = await this.client._delete(\n `${this.client.baseUrl}/instance/v1/extension/${extensionId}`\n );\n if (response.status >= 400) {\n this.handleError('delete extension', response);\n }\n\n getLogger().info(`Extension deleted successfully: ${extensionId}`);\n }\n\n private parseInfo(data: unknown): ExtensionInfo {\n const item = asRecord(data);\n\n return new ExtensionInfo({\n id: getString(item.id) ?? '',\n name: getString(item.name) ?? '',\n projectId: getString(item.project_id) ?? '',\n createdAt: getString(item.created_at),\n updatedAt: getString(item.updated_at),\n });\n }\n\n private handleError(action: string, response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.message) ?? getString(errorData.error) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n throw new APIError(`Failed to ${action}: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n","/**\n * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.5.6';\n\nexport {\n deregisterIntegratedAuthCallback,\n registerIntegratedAuthCallback,\n type IntegratedAuthCallback,\n type IntegratedAuthCallbackResult,\n} from './auth';\nexport { CDPClient, connectOverCDP, type CDPEventMessage } from './cdp';\nexport { Lexmount } from './client';\nexport { ContextInfo, ContextListResponse, ContextsResource } from './contexts';\nexport { ExtensionInfo, ExtensionsResource } from './extensions';\nexport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n LexmountError,\n NetworkError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nexport {\n LexmountLogger,\n disableLogging,\n enableLogging,\n getLogger,\n setLogLevel,\n type LogLevel,\n} from './logging';\nexport {\n PaginationInfo,\n SessionDownloadInfo,\n SessionDownloadsDeleteResponse,\n SessionDownloadsListResponse,\n SessionDownloadsResource,\n SessionInfo,\n SessionListResponse,\n SessionTargetInfo,\n SessionsResource,\n type SessionCreateResponse,\n} from './sessions';\nexport type {\n BrowserMode,\n ContextAccessMode,\n ContextCreateOptions,\n ContextListOptions,\n ContextMetadata,\n ContextStatus,\n ExtensionInfoShape,\n ExtensionListOptions,\n ExtensionUploadOptions,\n ForceReleaseResponse,\n CatalogInfo,\n LexmountConfig,\n PaginationInfoShape,\n RegionCatalogEntry,\n RegionInfo,\n SessionContext,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n SessionTargetInfoShape,\n} from './types';\n\nexport { Lexmount as default } from './client';\n"],"mappings":"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","names":["sessionCallbacks","asRecord","getString","asRecord","getString","config","logger"]}
|
|
1
|
+
{"version":3,"sources":["../src/cdp.ts","../src/errors.ts","../src/logging.ts","../src/sessions.ts","../src/auth.ts","../src/client.ts","../src/contexts.ts","../src/extensions.ts","../src/index.ts"],"sourcesContent":["/**\n * Chrome DevTools Protocol connection helpers.\n */\n\nimport { EventEmitter } from 'events';\nimport CDP from 'chrome-remote-interface';\nimport { ValidationError } from './errors';\nimport { getLogger } from './logging';\nimport { SessionInfo } from './sessions';\n\nexport interface CDPEventMessage {\n method: string;\n params?: Record<string, unknown>;\n sessionId?: string;\n}\n\nfunction hasExplicitPort(url: string): boolean {\n const authority = url.match(/^[a-z][a-z\\d+\\-.]*:\\/\\/([^/?#]+)/i)?.[1] ?? '';\n const host = authority.includes('@')\n ? authority.slice(authority.lastIndexOf('@') + 1)\n : authority;\n\n if (host.startsWith('[')) {\n return /\\]:\\d+$/.test(host);\n }\n\n return /:\\d+$/.test(host);\n}\n\nfunction getDefaultPort(url: string): number | undefined {\n const protocol = getProtocol(url);\n if (protocol === 'ws') {\n return 80;\n }\n if (protocol === 'wss') {\n return 443;\n }\n return undefined;\n}\n\nfunction getProtocol(url: string): string | undefined {\n return url.match(/^([a-z][a-z\\d+\\-.]*):\\/\\//i)?.[1]?.toLowerCase();\n}\n\n/**\n * Lexmount CDP client.\n *\n * It forwards Chrome DevTools Protocol notifications through EventEmitter and\n * exposes `send()` for raw CDP commands.\n */\nexport class CDPClient extends EventEmitter {\n readonly session: SessionInfo;\n private closed = false;\n private rawClient?: CDP.Client;\n\n constructor(session: SessionInfo) {\n super();\n\n const connectUrl = session.connectUrl;\n if (!connectUrl) {\n throw new ValidationError(`Session ${session.sessionId} does not include a CDP connect URL`);\n }\n\n this.session = session;\n }\n\n /**\n * Connect the CDP client to the session.\n */\n async connect(): Promise<this> {\n if (this.rawClient && !this.closed) {\n return this;\n }\n\n this.closed = false;\n getLogger().debug(`Connecting to session ${this.session.sessionId} over CDP`);\n const options: CDP.Options = {\n target: this.session.connectUrl,\n local: true,\n };\n const defaultPort = getDefaultPort(this.session.connectUrl);\n if (!hasExplicitPort(this.session.connectUrl) && defaultPort) {\n options.port = defaultPort;\n }\n if (getProtocol(this.session.connectUrl) === 'wss') {\n options.secure = true;\n }\n\n this.rawClient = await CDP(options);\n\n this.rawClient.on('event', (message: CDPEventMessage) => {\n this.emit(message.method, message.params, message.sessionId);\n });\n this.rawClient.on('error', (err) => {\n this.emit('error', err);\n });\n this.rawClient.on('disconnect', () => {\n void this.close().catch((err) => {\n getLogger().error(`Failed to close CDP client for session ${this.session.sessionId} after disconnect`, err);\n });\n this.emit('disconnect');\n });\n\n return this;\n }\n\n /**\n * Send a raw Chrome DevTools Protocol command.\n *\n * Returns `undefined` if called before the client has connected.\n */\n async send(method: string, params?: any, sessionId?: string): Promise<any | undefined> {\n if (this.closed) {\n throw new ValidationError('Cannot send CDP command after client is closed');\n }\n\n const rawClient = this.rawClient;\n if (!rawClient) {\n return undefined;\n }\n\n return rawClient.send(method, params, sessionId);\n }\n\n /**\n * Close the CDP connection and release internal listeners.\n */\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n if (this.rawClient) {\n this.rawClient.removeAllListeners('event');\n this.rawClient.removeAllListeners('disconnect');\n this.rawClient.removeAllListeners('error');\n await this.rawClient.close();\n }\n }\n}\n\n/**\n * Connect to a Lexmount browser session over Chrome DevTools Protocol.\n */\nexport async function connectOverCDP(session: SessionInfo): Promise<CDPClient> {\n const client = new CDPClient(session);\n await client.connect();\n return client;\n}\n","/**\n * Lexmount SDK error hierarchy.\n */\n\n/**\n * Base error for all Lexmount SDK failures.\n */\nexport class LexmountError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\n/**\n * Raised when API authentication fails.\n */\nexport class AuthenticationError extends LexmountError {}\n\n/**\n * Raised when a session cannot be found.\n */\nexport class SessionNotFoundError extends LexmountError {}\n\n/**\n * Raised when a context cannot be found.\n */\nexport class ContextNotFoundError extends LexmountError {}\n\n/**\n * Raised when a context is locked by another active session.\n */\nexport class ContextLockedError extends LexmountError {\n readonly activeSessionId?: string;\n readonly retryAfter?: number;\n\n constructor(\n message: string,\n options: { activeSessionId?: string; retryAfter?: number } = {}\n ) {\n const details: string[] = [];\n\n if (options.activeSessionId) {\n details.push(`locked by session: ${options.activeSessionId}`);\n }\n\n if (typeof options.retryAfter === 'number') {\n details.push(`retry after ${options.retryAfter}s`);\n }\n\n super(details.length > 0 ? `${message} (${details.join(', ')})` : message);\n this.activeSessionId = options.activeSessionId;\n this.retryAfter = options.retryAfter;\n }\n}\n\n/**\n * Raised when the Lexmount API returns a non-success response.\n */\nexport class APIError extends LexmountError {\n readonly statusCode?: number;\n readonly response?: unknown;\n\n constructor(message: string, options: { statusCode?: number; response?: unknown } = {}) {\n super(\n typeof options.statusCode === 'number'\n ? `${message} (HTTP ${options.statusCode})`\n : message\n );\n this.statusCode = options.statusCode;\n this.response = options.response;\n }\n}\n\n/**\n * Raised when a network error prevents the request from reaching the API.\n */\nexport class NetworkError extends LexmountError {}\n\n/**\n * Raised when input validation fails.\n */\nexport class ValidationError extends LexmountError {}\n\n/**\n * Raised when a request exceeds the configured timeout.\n */\nexport class TimeoutError extends LexmountError {}\n","import { ValidationError } from './errors';\n\n/**\n * Supported SDK log levels.\n */\nexport type LogLevel =\n | 'DEBUG'\n | 'INFO'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'SILENT';\n\nconst LOGGER_NAME = 'lexmount';\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n DEBUG: 10,\n INFO: 20,\n WARNING: 30,\n ERROR: 40,\n CRITICAL: 50,\n SILENT: 60,\n};\n\nlet currentLevel: LogLevel = 'WARNING';\n\nfunction isLogLevel(value: string): value is LogLevel {\n return value in LOG_LEVEL_PRIORITY;\n}\n\nfunction formatTimestamp(date: Date): string {\n return date.toISOString().replace('T', ' ').replace('Z', '');\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[currentLevel];\n}\n\nfunction emit(level: Exclude<LogLevel, 'SILENT'>, args: unknown[]): void {\n if (!shouldLog(level)) {\n return;\n }\n\n const prefix = `${formatTimestamp(new Date())} - ${LOGGER_NAME} - ${level} -`;\n\n if (level === 'ERROR' || level === 'CRITICAL') {\n console.error(prefix, ...args);\n return;\n }\n\n if (level === 'WARNING') {\n console.warn(prefix, ...args);\n return;\n }\n\n if (level === 'INFO') {\n console.info(prefix, ...args);\n return;\n }\n\n console.debug(prefix, ...args);\n}\n\n/**\n * Shared SDK logger.\n */\nexport class LexmountLogger {\n /**\n * Current SDK log level.\n */\n get level(): LogLevel {\n return currentLevel;\n }\n\n debug(...args: unknown[]): void {\n emit('DEBUG', args);\n }\n\n info(...args: unknown[]): void {\n emit('INFO', args);\n }\n\n warn(...args: unknown[]): void {\n emit('WARNING', args);\n }\n\n error(...args: unknown[]): void {\n emit('ERROR', args);\n }\n\n critical(...args: unknown[]): void {\n emit('CRITICAL', args);\n }\n}\n\nconst logger = new LexmountLogger();\n\n/**\n * Return the shared SDK logger instance.\n */\nexport function getLogger(): LexmountLogger {\n return logger;\n}\n\n/**\n * Set the SDK log level.\n */\nexport function setLogLevel(level: LogLevel | string): void {\n if (typeof level !== 'string' || level.trim() === '') {\n throw new ValidationError(\n 'Invalid log level. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL, SILENT'\n );\n }\n\n const normalizedLevel = level.toUpperCase();\n if (!isLogLevel(normalizedLevel)) {\n throw new ValidationError(\n `Invalid log level: ${level}. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL, SILENT`\n );\n }\n\n currentLevel = normalizedLevel;\n logger.debug(`Log level set to ${normalizedLevel}`);\n}\n\n/**\n * Disable all SDK logging.\n */\nexport function disableLogging(): void {\n currentLevel = 'SILENT';\n}\n\n/**\n * Re-enable SDK logging.\n */\nexport function enableLogging(level: LogLevel | string = 'INFO'): void {\n setLogLevel(level);\n}\n","/**\n * Session resource implementation.\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nimport { getLogger } from './logging';\nimport type {\n BrowserMode,\n PaginationInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n SessionTargetInfoShape,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction withRequestedRegion(client: Lexmount, payload: JsonRecord): JsonRecord {\n const regionId = client.selectedRegion ?? client.region;\n return regionId ? { ...payload, region_id: regionId } : payload;\n}\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizeContextMode(mode: string): 'read_write' | 'read_only' {\n if (mode === 'readWrite' || mode === 'read_write') {\n return 'read_write';\n }\n\n return 'read_only';\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Session pagination information.\n */\nexport class PaginationInfo implements PaginationInfoShape {\n readonly currentPage: number;\n readonly pageSize: number;\n readonly totalCount: number;\n readonly totalPages: number;\n readonly activeCount: number;\n readonly closedCount: number;\n\n constructor(shape: PaginationInfoShape) {\n this.currentPage = shape.currentPage;\n this.pageSize = shape.pageSize;\n this.totalCount = shape.totalCount;\n this.totalPages = shape.totalPages;\n this.activeCount = shape.activeCount;\n this.closedCount = shape.closedCount;\n }\n}\n\ninterface SessionInfoOptions {\n id: string;\n status: SessionStatus;\n apiKey: string;\n projectId: string;\n regionId?: string | null;\n browserType: BrowserMode | string;\n createdAt: string;\n inspectUrl: string;\n containerId: string | null;\n ws?: string | null;\n client?: Lexmount;\n}\n\n/**\n * Session information returned by the API.\n */\nexport class SessionInfo {\n readonly id: string;\n readonly sessionId: string;\n readonly status: SessionStatus;\n readonly apiKey: string;\n readonly projectId: string;\n readonly regionId: string | null;\n readonly region_id: string | null;\n readonly browserType: BrowserMode | string;\n readonly createdAt: string;\n readonly inspectUrl: string;\n readonly containerId: string | null;\n readonly ws: string | null;\n\n private readonly client?: Lexmount;\n private closed = false;\n\n /** @internal */\n constructor(options: SessionInfoOptions) {\n this.id = options.id;\n this.sessionId = options.id;\n this.status = options.status;\n this.apiKey = options.apiKey;\n this.projectId = options.projectId;\n this.regionId = options.regionId ?? null;\n this.region_id = this.regionId;\n this.browserType = options.browserType;\n this.createdAt = options.createdAt;\n this.inspectUrl = options.inspectUrl;\n this.containerId = options.containerId;\n this.ws = options.ws ?? null;\n this.client = options.client;\n }\n\n /**\n * Playwright/CDP connection URL.\n */\n get connectUrl(): string {\n return this.ws ?? '';\n }\n\n /**\n * Parsed session creation time.\n */\n get createdAtDate(): Date | null {\n const date = new Date(this.createdAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n /**\n * Close the current session.\n *\n * This method is idempotent. Errors are logged and swallowed to keep cleanup safe.\n */\n async close(): Promise<void> {\n if (this.closed) {\n getLogger().debug(`Session ${this.sessionId} is already closed.`);\n return;\n }\n\n if (!this.client) {\n getLogger().warn(\n `Cannot close session ${this.sessionId}: client was not provided during session creation.`\n );\n return;\n }\n\n try {\n getLogger().debug(`Closing session ${this.sessionId}`);\n await this.client.sessions.delete({\n sessionId: this.sessionId,\n projectId: this.projectId,\n });\n this.closed = true;\n getLogger().info(`Session closed: ${this.sessionId}`);\n } catch (error) {\n getLogger().warn(`Failed to close session ${this.sessionId}:`, error);\n }\n }\n}\n\n/**\n * Response object from `sessions.list()`.\n */\nexport class SessionListResponse implements Iterable<SessionInfo> {\n readonly sessions: SessionInfo[];\n readonly pagination: PaginationInfo;\n\n constructor(sessions: SessionInfo[], pagination: PaginationInfo) {\n this.sessions = sessions;\n this.pagination = pagination;\n }\n\n /**\n * Number of sessions in the current page.\n */\n get length(): number {\n return this.sessions.length;\n }\n\n [Symbol.iterator](): Iterator<SessionInfo> {\n return this.sessions[Symbol.iterator]();\n }\n\n at(index: number): SessionInfo | undefined {\n return this.sessions[index];\n }\n}\n\n/**\n * Session download metadata returned by the API.\n */\nexport class SessionDownloadInfo implements SessionDownloadInfoShape {\n readonly id: string;\n readonly filename: string;\n readonly contentType: string | null;\n readonly size: number;\n readonly sha256: string | null;\n readonly status: string;\n readonly createdAt: string;\n\n constructor(shape: SessionDownloadInfoShape) {\n this.id = shape.id;\n this.filename = shape.filename;\n this.contentType = shape.contentType;\n this.size = shape.size;\n this.sha256 = shape.sha256;\n this.status = shape.status;\n this.createdAt = shape.createdAt;\n }\n}\n\n/**\n * Structured response from `sessions.downloads.list()`.\n */\nexport class SessionDownloadsListResponse {\n readonly downloads: SessionDownloadInfo[];\n readonly summary: SessionDownloadsListResponseShape;\n\n constructor(downloads: SessionDownloadInfo[], summary: SessionDownloadsListResponseShape) {\n this.downloads = downloads;\n this.summary = summary;\n }\n}\n\n/**\n * Structured response from `sessions.downloads.delete()`.\n */\nexport class SessionDownloadsDeleteResponse implements SessionDownloadsDeleteResponseShape {\n readonly status: string;\n readonly deletedCount: number;\n\n constructor(shape: SessionDownloadsDeleteResponseShape) {\n this.status = shape.status;\n this.deletedCount = shape.deletedCount;\n }\n}\n\n/**\n * Session target metadata returned by `/json`.\n */\nexport class SessionTargetInfo implements SessionTargetInfoShape {\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly description: string;\n readonly inspectUrl: string | null;\n readonly webSocketDebuggerUrl: string | null;\n readonly webSocketDebuggerUrlTransformed: string | null;\n\n constructor(shape: SessionTargetInfoShape) {\n this.id = shape.id;\n this.title = shape.title;\n this.type = shape.type;\n this.url = shape.url;\n this.description = shape.description;\n this.inspectUrl = shape.inspectUrl;\n this.webSocketDebuggerUrl = shape.webSocketDebuggerUrl;\n this.webSocketDebuggerUrlTransformed = shape.webSocketDebuggerUrlTransformed;\n }\n}\n\n/**\n * Session download operations.\n */\nexport class SessionDownloadsResource {\n constructor(private readonly client: Lexmount) {}\n\n async list(sessionId: string, projectId?: string): Promise<SessionDownloadsListResponse> {\n const response = await this.client._post(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/list`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n }\n );\n if (response.status >= 400) {\n this.handleError('list session downloads', response, sessionId);\n }\n\n const result = asRecord(response.data);\n const items = Array.isArray(result.downloads) ? result.downloads : [];\n const downloads = items.map((item) => {\n const download = asRecord(item);\n return new SessionDownloadInfo({\n id: getString(download.id) ?? '',\n filename: getString(download.filename) ?? '',\n contentType: getString(download.content_type) ?? null,\n size: getNumber(download.size) ?? 0,\n sha256: getString(download.sha256) ?? null,\n status: getString(download.status) ?? 'available',\n createdAt: getString(download.created_at) ?? '',\n });\n });\n const summary = asRecord(result.summary);\n\n return new SessionDownloadsListResponse(downloads, {\n count: getNumber(summary.count) ?? downloads.length,\n totalSize: getNumber(summary.total_size) ?? 0,\n });\n }\n\n async get(sessionId: string, downloadId: string, projectId?: string): Promise<Buffer> {\n const response = await this.client._get(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/${downloadId}`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n },\n {\n responseType: 'arraybuffer',\n }\n );\n if (response.status >= 400) {\n this.handleError('fetch session download', response, sessionId);\n }\n\n return Buffer.from(response.data as ArrayBuffer);\n }\n\n async archive(sessionId: string, projectId?: string): Promise<Buffer> {\n const response = await this.client._get(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads/archive`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n },\n {\n responseType: 'arraybuffer',\n }\n );\n if (response.status >= 400) {\n this.handleError('archive session downloads', response, sessionId);\n }\n\n return Buffer.from(response.data as ArrayBuffer);\n }\n\n async delete(sessionId: string, projectId?: string): Promise<SessionDownloadsDeleteResponse> {\n const response = await this.client._delete(\n `${this.client.baseUrl}/instance/v1/sessions/${sessionId}/downloads`,\n {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n }\n );\n if (response.status >= 400) {\n this.handleError('delete session downloads', response, sessionId);\n }\n\n const result = asRecord(response.data);\n return new SessionDownloadsDeleteResponse({\n status: getString(result.status) ?? '',\n deletedCount: getNumber(result.deleted_count) ?? 0,\n });\n }\n\n private handleError(action: string, response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(`Session downloads not found for ${sessionId}: ${errorMessage}`);\n }\n\n throw new APIError(`Failed to ${action}: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n\n/**\n * Alias kept for parity with the Python SDK.\n */\nexport type SessionCreateResponse = SessionInfo;\n\n/**\n * Session resource operations.\n */\nexport class SessionsResource {\n readonly downloads: SessionDownloadsResource;\n\n constructor(private readonly client: Lexmount) {\n this.downloads = new SessionDownloadsResource(client);\n }\n\n /**\n * Create a new browser session.\n */\n async create(options: SessionCreateOptions = {}): Promise<SessionCreateResponse> {\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n browser_mode: options.browserMode ?? 'normal',\n };\n\n if (options.customImageId) {\n payload.custom_image_id = options.customImageId;\n }\n\n if (options.context) {\n const contextPayload = {\n id: options.context.id,\n mode: normalizeContextMode(options.context.mode),\n };\n payload.context = contextPayload;\n getLogger().debug(\n `Creating session with context (id=${options.context.id}, mode=${contextPayload.mode})`\n );\n } else {\n getLogger().debug(`Creating session with browser_mode=${payload.browser_mode as string}`);\n }\n\n if (options.extensionIds && options.extensionIds.length > 0) {\n payload.extension_ids = options.extensionIds;\n }\n\n if (options.proxy) {\n payload.proxy = this.normalizeProxy(options.proxy);\n }\n\n if (options.weakLock) {\n payload.weak_lock = true;\n }\n\n if (options.asyncCreate !== false) {\n return this.createAsync(withRequestedRegion(this.client, payload), options);\n }\n\n const url = `${this.client.baseUrl}/instance`;\n const response = await this.client._post(url, withRequestedRegion(this.client, payload));\n if (response.status >= 400) {\n this.handleCreateError(response);\n }\n\n const result = asRecord(response.data);\n const sessionId = getString(result.session_id);\n if (!sessionId) {\n throw new APIError('Failed to create session: session_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const containerId = getString(result.container_id) ?? null;\n const projectId = options.projectId ?? this.client.projectId;\n // The create endpoint does not return the canonical inspect URL. Re-fetch the created\n // session so the SDK can return the server-provided inspectUrl when available.\n const createdSession = await this._getCreatedSession(sessionId, projectId);\n const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n\n getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);\n\n return new SessionInfo({\n id: sessionId,\n status: createdSession?.status ?? 'active',\n apiKey: this.client.apiKey,\n projectId,\n regionId: createdSession?.regionId ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: createdSession?.browserType ?? ((options.browserMode ?? 'normal') as BrowserMode),\n createdAt: createdSession?.createdAt ?? new Date().toISOString(),\n inspectUrl:\n createdSession?.inspectUrl ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: createdSession?.containerId ?? containerId,\n ws: wsUrl ?? createdSession?.ws ?? null,\n client: this.client,\n });\n }\n\n private async createAsync(\n payload: JsonRecord,\n options: SessionCreateOptions\n ): Promise<SessionCreateResponse> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v2`, payload);\n if (response.status >= 400) {\n this.handleCreateError(response);\n }\n\n const result = asRecord(response.data);\n const sessionId = getString(result.session_id);\n if (!sessionId) {\n throw new APIError('Failed to create session: session_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const projectId = options.projectId ?? this.client.projectId;\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const pollTimeoutMs = options.pollTimeoutMs ?? 600_000;\n const deadline = Date.now() + pollTimeoutMs;\n\n while (Date.now() < deadline) {\n const info = await this.get(sessionId, projectId);\n if (info.status === 'active') {\n const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n getLogger().info(`Session created successfully (async): id=${sessionId}`);\n return new SessionInfo({\n id: sessionId,\n status: 'active',\n apiKey: this.client.apiKey,\n projectId,\n regionId: info.regionId ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: info.browserType || ((options.browserMode ?? 'normal') as BrowserMode),\n createdAt: info.createdAt,\n inspectUrl: info.inspectUrl,\n containerId: info.containerId,\n ws: wsUrl ?? info.ws,\n client: this.client,\n });\n }\n\n if (info.status === 'create_failed') {\n this.handleAsyncCreateFailed(payload);\n throw new APIError('Session creation failed', {\n statusCode: 500,\n response: { session_id: sessionId, status: info.status },\n });\n }\n\n if (info.status === 'closed') {\n throw new APIError('Session closed before activation', {\n statusCode: 500,\n response: { session_id: sessionId, status: info.status },\n });\n }\n\n await delay(pollIntervalMs);\n }\n\n throw new TimeoutError(\n `Timed out waiting for session ${sessionId} to become active after ${pollTimeoutMs}ms`\n );\n }\n\n /**\n * Fetch one session by id.\n *\n * The upstream API uses POST /instance/session for this lookup, so this SDK method\n * intentionally uses POST even though the operation is read-only.\n */\n async get(sessionId: string, projectId?: string): Promise<SessionInfo> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/session`, withRequestedRegion(this.client, {\n api_key: this.client.apiKey,\n project_id: projectId ?? this.client.projectId,\n session_id: sessionId,\n }));\n\n if (response.status >= 400) {\n this.handleGetError(response, sessionId);\n }\n\n return this.mapSessionInfo(asRecord(response.data), projectId);\n }\n\n /**\n * List sessions for the current project.\n */\n async list(options: SessionListOptions = {}): Promise<SessionListResponse> {\n const url = `${this.client.baseUrl}/instance/v2/sessions`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n };\n\n if (options.status) {\n payload.status = options.status;\n }\n\n const response = await this.client._post(url, withRequestedRegion(this.client, payload));\n if (response.status >= 400) {\n this.handleListError(response);\n }\n\n const result = asRecord(response.data);\n const sessionsData = Array.isArray(result.sessions) ? result.sessions : [];\n const paginationData = asRecord(result.pagination);\n\n const sessions = sessionsData.map((item) => this.mapSessionInfo(asRecord(item), options.projectId));\n\n const pagination = new PaginationInfo({\n currentPage: getNumber(paginationData.currentPage) ?? 1,\n pageSize: getNumber(paginationData.pageSize) ?? sessions.length,\n totalCount: getNumber(paginationData.totalCount) ?? sessions.length,\n totalPages: getNumber(paginationData.totalPages) ?? 1,\n activeCount: getNumber(paginationData.activeCount) ?? 0,\n closedCount: getNumber(paginationData.closedCount) ?? 0,\n });\n\n getLogger().info(\n `Retrieved ${sessions.length} sessions (total: ${pagination.totalCount}, active: ${pagination.activeCount}, closed: ${pagination.closedCount})`\n );\n\n return new SessionListResponse(sessions, pagination);\n }\n\n /**\n * Delete a browser session.\n */\n async delete(options: SessionDeleteOptions): Promise<void> {\n const url = `${this.client.baseUrl}/instance`;\n const payload = withRequestedRegion(this.client, {\n api_key: this.client.apiKey,\n project_id: options.projectId ?? this.client.projectId,\n session_id: options.sessionId,\n });\n\n const response = await this.client._delete(url, payload);\n if (response.status >= 400) {\n this.handleDeleteError(response, options.sessionId);\n }\n\n getLogger().info(`Session deleted successfully: ${options.sessionId}`);\n }\n\n /**\n * List target/page metadata for a session via `/json`.\n */\n async listTargets(sessionId: string): Promise<SessionTargetInfo[]> {\n const response = await this.client._get(`${this.client.baseUrl}/json`, {\n session_id: sessionId,\n });\n\n if (response.status >= 400) {\n this.handleListTargetsError(response, sessionId);\n }\n\n const result = Array.isArray(response.data) ? response.data : [];\n return result.map((item) => this.mapSessionTarget(asRecord(item)));\n }\n\n /**\n * Fetch the debugger WebSocket URL for a session.\n *\n * @internal\n */\n async _getWebSocketDebuggerUrl(sessionId: string): Promise<string | null> {\n try {\n const response = await this.client._get(`${this.client.baseUrl}/json/version`, {\n session_id: sessionId,\n });\n\n if (response.status >= 400) {\n getLogger().error('Error getting WebSocket debugger URL:', response.data);\n return null;\n }\n\n const result = asRecord(response.data);\n return (\n getString(result.webSocketDebuggerUrlTransformed) ??\n getString(result.webSocketDebuggerUrl) ??\n null\n );\n } catch (error) {\n getLogger().error('Error getting WebSocket debugger URL:', error);\n return null;\n }\n }\n\n private normalizeProxy(proxy: SessionProxyConfig): JsonRecord {\n if (!proxy.server) {\n throw new ValidationError('proxy.server is required when proxy is provided');\n }\n\n const normalizedProxy: JsonRecord = {\n type: proxy.type ?? 'external',\n server: proxy.server,\n };\n\n if (proxy.username) {\n normalizedProxy.username = proxy.username;\n }\n\n if (proxy.password) {\n normalizedProxy.password = proxy.password;\n }\n\n return normalizedProxy;\n }\n\n private handleAsyncCreateFailed(payload: JsonRecord): void {\n const context = asRecord(payload.context);\n const contextId = getString(context.id);\n const contextMode = getString(context.mode);\n\n // The async create endpoint can accept the request and only surface lock conflicts\n // later as create_failed while polling. Preserve the SDK's ContextLockedError contract\n // for read-write context creation so callers do not have to special-case APIError.\n if (contextId && contextMode === 'read_write' && payload.weak_lock !== true) {\n throw new ContextLockedError('Context is locked by another active session');\n }\n }\n\n private handleCreateError(response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n const errorCode = getString(errorData.code);\n const metadata = asRecord(errorData.metadata);\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404 && errorCode === 'context_not_found') {\n throw new ContextNotFoundError(`Context not found: ${errorMessage}`);\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(`Resource not found: ${errorMessage}`);\n }\n\n if (response.status === 409 && errorCode === 'context_locked') {\n throw new ContextLockedError(errorMessage, {\n activeSessionId: getString(metadata.activeSessionId),\n retryAfter: getNumber(metadata.retryAfter),\n });\n }\n\n throw new APIError(`Failed to create session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleGetError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`\n );\n }\n\n throw new APIError(`Failed to get session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleListError(response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n throw new APIError(`Failed to list sessions: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleListTargetsError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`\n );\n }\n\n throw new APIError(`Failed to list session targets: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private handleDeleteError(response: AxiosResponse<unknown>, sessionId: string): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n if (response.status === 404) {\n throw new SessionNotFoundError(\n `Session not found: ${errorMessage}. Session ID '${sessionId}' may have already been deleted or never existed.`\n );\n }\n\n throw new APIError(`Failed to delete session: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n private mapSessionInfo(raw: JsonRecord, projectId?: string): SessionInfo {\n const sessionId = getString(raw.session_id) ?? getString(raw.id) ?? '';\n\n return new SessionInfo({\n id: sessionId,\n status: getString(raw.status) ?? 'active',\n apiKey: getString(raw.api_key) ?? this.client.apiKey,\n projectId: getString(raw.project_id) ?? (projectId ?? this.client.projectId),\n regionId: getString(raw.region_id) ?? this.client.selectedRegion ?? this.client.region ?? null,\n browserType: getString(raw.browser_type) ?? getString(raw.browser_mode) ?? 'normal',\n createdAt: getString(raw.created_at) ?? '',\n inspectUrl:\n getString(raw.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: getString(raw.container_id) ?? null,\n ws: getString(raw.ws) ?? null,\n client: this.client,\n });\n }\n\n private mapSessionTarget(raw: JsonRecord): SessionTargetInfo {\n return new SessionTargetInfo({\n id: getString(raw.id) ?? '',\n title: getString(raw.title) ?? '',\n type: getString(raw.type) ?? '',\n url: getString(raw.url) ?? '',\n description: getString(raw.description) ?? '',\n inspectUrl: getString(raw.inspectUrl) ?? getString(raw.inspect_url) ?? null,\n webSocketDebuggerUrl:\n getString(raw.webSocketDebuggerUrl) ?? getString(raw.web_socket_debugger_url) ?? null,\n webSocketDebuggerUrlTransformed:\n getString(raw.webSocketDebuggerUrlTransformed) ??\n getString(raw.web_socket_debugger_url_transformed) ??\n null,\n });\n }\n\n private async _getCreatedSession(\n sessionId: string,\n projectId: string\n ): Promise<SessionInfo | null> {\n try {\n return await this.get(sessionId, projectId);\n } catch (error) {\n getLogger().warn(\n `Failed to fetch created session ${sessionId}; falling back to locally derived session fields:`,\n error\n );\n return null;\n }\n }\n}\n","/**\n * Integrated authentication helpers.\n */\n\nimport { CDPClient, connectOverCDP } from './cdp';\nimport { ValidationError } from './errors';\nimport { getLogger } from './logging';\nimport { SessionInfo } from './sessions';\n\nexport type IntegratedAuthCallbackResult =\n | {\n cancel: true;\n }\n | {\n cancel: false;\n scheme: string;\n token: string;\n };\n\nexport type IntegratedAuthCallback = (\n params: any,\n callback: (result: IntegratedAuthCallbackResult) => Promise<void>\n) => void | Promise<void>;\n\nconst integratedAuthCallbacks = new Map<string, Set<IntegratedAuthCallback>>();\nconst cdpClients = new Map<string, CDPClient>();\n\nfunction getIntegratedAuthKey(sessionOrClient: SessionInfo | CDPClient): string {\n const session =\n sessionOrClient instanceof SessionInfo ? sessionOrClient : sessionOrClient.session;\n const connectUrl = session.connectUrl;\n\n if (!connectUrl) {\n throw new ValidationError(`Session ${session.sessionId} does not include a CDP connect URL`);\n }\n\n return connectUrl;\n}\n\n/**\n * Register an integrated auth callback for a session.\n */\nexport async function registerIntegratedAuthCallback(\n sessionOrClient: SessionInfo | CDPClient,\n callback: IntegratedAuthCallback\n): Promise<void> {\n const key = getIntegratedAuthKey(sessionOrClient);\n\n let sessionCallbacks = integratedAuthCallbacks.get(key);\n if (sessionCallbacks?.has(callback)) {\n return;\n }\n\n let client = cdpClients.get(key);\n if (!client) {\n if (sessionOrClient instanceof SessionInfo) {\n client = await connectOverCDP(sessionOrClient);\n } else {\n client = sessionOrClient;\n }\n\n await client.send('Fetch.enable', { handleAuthRequests: true });\n cdpClients.set(key, client);\n\n client.on('disconnect', () => {\n cdpClients.delete(key);\n integratedAuthCallbacks.delete(key);\n });\n\n client.on('Fetch.requestPaused', async (event: any, sessionId: string) => {\n try {\n await client!.send(\n 'Fetch.continueRequest',\n {\n requestId: event.requestId,\n },\n sessionId\n );\n } catch (error) {\n getLogger().error('Failed to continue paused fetch request', error);\n }\n });\n\n client.on('Fetch.integratedAuthRequired', async (params: any, sessionId: string) => {\n try {\n const sessionCallbacks = integratedAuthCallbacks.get(key);\n if (!sessionCallbacks) {\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'CancelAuth',\n },\n },\n sessionId\n );\n return;\n }\n\n const sender = async (result: IntegratedAuthCallbackResult) => {\n if (result.cancel) {\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'CancelAuth',\n },\n },\n sessionId\n );\n return;\n }\n\n await client!.send(\n 'Fetch.continueWithIntegratedAuth',\n {\n requestId: params.requestId,\n authChallengeResponse: {\n response: 'ProvideIntegratedCredentials',\n scheme: result.scheme,\n token: result.token,\n },\n },\n sessionId\n );\n };\n\n for (const cb of sessionCallbacks) {\n try {\n const result = cb(params, sender);\n void Promise.resolve(result).catch((error) => {\n getLogger().error('Integrated auth callback failed', error);\n });\n } catch (error) {\n getLogger().error('Integrated auth callback failed', error);\n }\n }\n } catch (error) {\n getLogger().error('Failed to handle integrated auth request', error);\n }\n });\n }\n\n if (!sessionCallbacks) {\n sessionCallbacks = new Set();\n integratedAuthCallbacks.set(key, sessionCallbacks);\n }\n\n sessionCallbacks.add(callback);\n}\n\n/**\n * Deregister a previously registered integrated auth callback.\n */\nexport function deregisterIntegratedAuthCallback(\n sessionOrClient: SessionInfo | CDPClient,\n callback: IntegratedAuthCallback\n): void {\n const key = getIntegratedAuthKey(sessionOrClient);\n\n const sessionCallbacks = integratedAuthCallbacks.get(key);\n if (!sessionCallbacks?.has(callback)) {\n return;\n }\n\n sessionCallbacks.delete(callback);\n\n if (sessionCallbacks.size === 0) {\n integratedAuthCallbacks.delete(key);\n }\n}\n","/**\n * Lexmount API client.\n */\n\nimport { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, isAxiosError } from 'axios';\nimport axios from 'axios';\nimport * as dotenv from 'dotenv';\nimport { ContextsResource } from './contexts';\nimport { ExtensionsResource } from './extensions';\nimport { APIError, NetworkError, TimeoutError, ValidationError } from './errors';\nimport { getLogger, setLogLevel } from './logging';\nimport { SessionsResource } from './sessions';\nimport type { CatalogInfo, LexmountConfig, RegionCatalogEntry, RegionInfo } from './types';\n\ndotenv.config();\n\n/**\n * Main Lexmount SDK client.\n */\nexport class Lexmount {\n /**\n * API key used for authentication.\n */\n readonly apiKey: string;\n\n /**\n * Default project identifier used by resource methods.\n */\n readonly projectId: string;\n\n /**\n * API base URL.\n */\n readonly baseUrl: string;\n\n readonly region?: string;\n\n selectedRegion?: string;\n\n private endpointBaseUrl?: string;\n\n private selectedHost?: string;\n\n private regionResolutionAttempted = false;\n\n private regionResolutionPromise?: Promise<void>;\n\n /**\n * Session operations.\n */\n readonly sessions: SessionsResource;\n\n /**\n * Persistent context operations.\n */\n readonly contexts: ContextsResource;\n\n /**\n * Browser extension operations.\n */\n readonly extensions: ExtensionsResource;\n\n private readonly httpClient: AxiosInstance;\n\n constructor(config: LexmountConfig = {}) {\n this.apiKey = config.apiKey ?? process.env.LEXMOUNT_API_KEY ?? '';\n if (!this.apiKey) {\n throw new ValidationError(\n 'apiKey must be provided or set LEXMOUNT_API_KEY environment variable'\n );\n }\n\n this.projectId = config.projectId ?? process.env.LEXMOUNT_PROJECT_ID ?? '';\n if (!this.projectId) {\n throw new ValidationError(\n 'projectId must be provided or set LEXMOUNT_PROJECT_ID environment variable'\n );\n }\n\n this.baseUrl = (\n config.baseUrl ??\n process.env.LEXMOUNT_BASE_URL ??\n 'https://api.lexmount.cn'\n ).replace(/\\/$/, '');\n this.region = config.region;\n\n if (config.logLevel) {\n setLogLevel(config.logLevel);\n }\n\n this.httpClient = axios.create({\n timeout: config.timeout ?? 60000,\n validateStatus: () => true,\n });\n\n this.sessions = new SessionsResource(this);\n this.contexts = new ContextsResource(this);\n this.extensions = new ExtensionsResource(this);\n }\n\n /**\n * Internal POST request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _post<T = unknown>(\n url: string,\n data?: unknown,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('POST', url, { ...config, data });\n }\n\n /**\n * Internal GET request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _get<T = unknown>(\n url: string,\n params?: Record<string, unknown>,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('GET', url, { ...config, params });\n }\n\n /**\n * Internal DELETE request helper with timeout and network error mapping.\n *\n * @internal\n */\n async _delete<T = unknown>(\n url: string,\n data?: unknown,\n config: AxiosRequestConfig = {}\n ): Promise<AxiosResponse<T>> {\n await this.ensureRegionResolved();\n return this.request<T>('DELETE', url, { ...config, data });\n }\n\n async regionInfo(): Promise<RegionInfo> {\n await this.ensureRegionResolved();\n return {\n requestedRegion: this.region,\n selectedRegion: this.selectedRegion,\n baseUrl: this.baseUrl,\n endpointBaseUrl: this.endpointBaseUrl,\n host: this.selectedHost,\n resolved: this.regionResolutionAttempted,\n usingRegion: this.selectedRegion !== undefined,\n };\n }\n\n async catalogInfo(): Promise<CatalogInfo> {\n try {\n const response = await this.httpClient.get<{ regions?: unknown }>(\n `${this.baseUrl}/v1/regions/catalog`\n );\n if (response.status !== 200) {\n return {\n baseUrl: this.baseUrl,\n available: false,\n statusCode: response.status,\n regions: [],\n };\n }\n\n const regions = Array.isArray(response.data?.regions)\n ? (response.data.regions as RegionCatalogEntry[])\n : [];\n return {\n baseUrl: this.baseUrl,\n available: Array.isArray(response.data?.regions),\n statusCode: response.status,\n regions,\n error: Array.isArray(response.data?.regions) ? undefined : 'invalid catalog regions',\n };\n } catch (error) {\n return {\n baseUrl: this.baseUrl,\n available: false,\n regions: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Close the client.\n *\n * Axios does not require explicit teardown, but the method is kept for API symmetry.\n */\n close(): void {\n getLogger().debug('Closing Lexmount client');\n }\n\n /**\n * String representation of the client.\n */\n toString(): string {\n return `Lexmount(projectId='${this.projectId}', baseUrl='${this.baseUrl}')`;\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n config: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n const logger = getLogger();\n const startTime = Date.now();\n const requestUrl = this.rewriteUrl(url);\n logger.debug(`${method} request to ${requestUrl}`);\n\n try {\n const headers = {\n api_key: this.apiKey,\n project_id: this.projectId,\n ...this.getDefaultHeaders(config.data),\n ...(config.headers ?? {}),\n };\n\n const response = await this.httpClient.request<T>({\n method,\n url: requestUrl,\n ...config,\n headers,\n });\n\n const elapsed = Date.now() - startTime;\n logger.debug(\n `${method} response: status=${response.status}, duration=${elapsed.toFixed(2)}ms`\n );\n return response;\n } catch (error) {\n const elapsed = Date.now() - startTime;\n throw this.normalizeRequestError(error, elapsed);\n }\n }\n\n private normalizeRequestError(error: unknown, elapsedMs: number): Error {\n const logger = getLogger();\n\n if (!isAxiosError(error)) {\n logger.error(`Unexpected request error after ${elapsedMs.toFixed(2)}ms:`, error);\n return new APIError('Unexpected HTTP error', { response: error });\n }\n\n const axiosError = error as AxiosError<unknown>;\n\n if (axiosError.code === 'ECONNABORTED') {\n logger.error(`Request timeout after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new TimeoutError(`Request timed out: ${axiosError.message}`);\n }\n\n if (axiosError.response) {\n logger.error(`HTTP error after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new APIError(`HTTP error: ${axiosError.message}`, {\n statusCode: axiosError.response.status,\n response: axiosError.response.data,\n });\n }\n\n logger.error(`Network error after ${elapsedMs.toFixed(2)}ms:`, axiosError.message);\n return new NetworkError(`Network error: ${axiosError.message}`);\n }\n\n private getDefaultHeaders(data: unknown): Record<string, string> {\n if (typeof data === 'undefined') {\n return {};\n }\n\n if (typeof FormData !== 'undefined' && data instanceof FormData) {\n return {};\n }\n\n return {\n 'Content-Type': 'application/json',\n };\n }\n\n private async ensureRegionResolved(): Promise<void> {\n if (this.regionResolutionAttempted) {\n return;\n }\n\n if (!this.regionResolutionPromise) {\n this.regionResolutionPromise = this.resolveRegion().finally(() => {\n this.regionResolutionAttempted = true;\n this.regionResolutionPromise = undefined;\n });\n }\n\n await this.regionResolutionPromise;\n }\n\n private async resolveRegion(): Promise<void> {\n const logger = getLogger();\n try {\n const response = await this.httpClient.get<{ regions?: unknown }>(\n `${this.baseUrl}/v1/regions/catalog`\n );\n if (response.status !== 200 || !Array.isArray(response.data?.regions)) {\n logger.debug(\n `Region catalog unavailable, falling back to baseUrl: status=${response.status}`\n );\n return;\n }\n\n const selected = this.selectCatalogRegion(response.data.regions as RegionCatalogEntry[]);\n if (!selected) {\n if (this.region) {\n logger.warn(`Requested region not found in catalog: ${this.region}`);\n } else {\n logger.debug('No default catalog region, falling back to baseUrl');\n }\n return;\n }\n\n const endpointBaseUrl = await this.probeRegionHost(selected);\n if (!endpointBaseUrl) {\n logger.debug('Region probe failed, falling back to baseUrl');\n return;\n }\n\n this.selectedRegion = selected.region_id;\n this.selectedHost = selected.host;\n this.endpointBaseUrl = endpointBaseUrl;\n } catch (error) {\n logger.debug('Region resolution failed, falling back to baseUrl:', error);\n }\n }\n\n private selectCatalogRegion(regions: RegionCatalogEntry[]): RegionCatalogEntry | undefined {\n if (this.region) {\n return regions.find((region) => region.region_id === this.region);\n }\n const defaultRegions = regions.filter((region) => region.default === true);\n return defaultRegions.length === 1 ? defaultRegions[0] : undefined;\n }\n\n private async probeRegionHost(region: RegionCatalogEntry): Promise<string | undefined> {\n const logger = getLogger();\n const host = String(region.host || '').trim();\n if (!host) {\n return undefined;\n }\n if (!this.isAllowedCatalogHost(host)) {\n logger.warn(`Ignoring invalid region catalog host: ${host}`);\n return undefined;\n }\n\n const endpointBaseUrl = `https://${host}`;\n const probePath = String(region.probe_path || '/v1/region/probe').replace(/^(?!\\/)/, '/');\n try {\n const response = await this.httpClient.get(`${endpointBaseUrl}${probePath}`);\n return response.status === 200 ? endpointBaseUrl : undefined;\n } catch {\n return undefined;\n }\n }\n\n private isAllowedCatalogHost(host: string): boolean {\n let parsed: URL;\n try {\n parsed = new URL(`https://${host}`);\n } catch {\n return false;\n }\n\n if (\n parsed.username ||\n parsed.password ||\n parsed.port ||\n parsed.pathname !== '/' ||\n parsed.search ||\n parsed.hash\n ) {\n return false;\n }\n\n const hostname = parsed.hostname.toLowerCase();\n const allowedDomains = ['lexmount.cn', 'lexmount.com', 'lexmount.net'];\n return allowedDomains.some((domain) => hostname === domain || hostname.endsWith(`.${domain}`));\n }\n\n private rewriteUrl(url: string): string {\n if (!this.endpointBaseUrl || !url.startsWith(this.baseUrl)) {\n return url;\n }\n return `${this.endpointBaseUrl}${url.slice(this.baseUrl.length)}`;\n }\n}\n\nexport default Lexmount;\n","/**\n * Context resource implementation.\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n} from './errors';\nimport { getLogger } from './logging';\nimport type {\n ContextCreateOptions,\n ContextListOptions,\n ContextMetadata,\n ContextStatus,\n ForceReleaseResponse,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction parseTimestamp(value: unknown): string | null {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return new Date(value).toISOString();\n }\n\n return null;\n}\n\nfunction normalizeContextStatus(value: unknown): ContextStatus {\n if (value === true || value === 'locked') {\n return 'locked';\n }\n\n if (value === false || value === 'available') {\n return 'available';\n }\n\n return typeof value === 'string' ? value : 'available';\n}\n\n/**\n * Context information returned by the API.\n */\nexport class ContextInfo {\n readonly id: string;\n readonly status: ContextStatus;\n readonly metadata: ContextMetadata;\n readonly createdAt: string | null;\n readonly updatedAt: string | null;\n\n constructor(options: {\n id: string;\n status: ContextStatus;\n metadata?: ContextMetadata;\n createdAt?: string | null;\n updatedAt?: string | null;\n }) {\n this.id = options.id;\n this.status = options.status;\n this.metadata = options.metadata ?? {};\n this.createdAt = options.createdAt ?? null;\n this.updatedAt = options.updatedAt ?? null;\n }\n\n get createdAtDate(): Date | null {\n if (!this.createdAt) {\n return null;\n }\n\n const date = new Date(this.createdAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n get updatedAtDate(): Date | null {\n if (!this.updatedAt) {\n return null;\n }\n\n const date = new Date(this.updatedAt);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n isLocked(): boolean {\n return this.status === 'locked';\n }\n\n isAvailable(): boolean {\n return this.status === 'available';\n }\n}\n\n/**\n * Response object from `contexts.list()`.\n */\nexport class ContextListResponse implements Iterable<ContextInfo> {\n readonly data: ContextInfo[];\n\n constructor(data: ContextInfo[]) {\n this.data = data;\n }\n\n get length(): number {\n return this.data.length;\n }\n\n [Symbol.iterator](): Iterator<ContextInfo> {\n return this.data[Symbol.iterator]();\n }\n\n at(index: number): ContextInfo | undefined {\n return this.data[index];\n }\n}\n\n/**\n * Context resource operations.\n */\nexport class ContextsResource {\n constructor(private readonly client: Lexmount) {}\n\n /**\n * Create a new persistent context.\n */\n async create(options: ContextCreateOptions = {}): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/create-context`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n if (options.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'create');\n }\n\n const result = asRecord(response.data);\n const contextId = getString(result.context_id);\n if (!contextId) {\n throw new APIError('Failed to create context: context_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const context = new ContextInfo({\n id: contextId,\n status: normalizeContextStatus(result.locked),\n metadata: (result.metadata as ContextMetadata | undefined) ?? options.metadata ?? {},\n createdAt: parseTimestamp(result.created_at),\n });\n\n getLogger().info(`Successfully created context '${context.id}'`);\n return context;\n }\n\n /**\n * List contexts in the current project.\n */\n async list(options: ContextListOptions = {}): Promise<ContextListResponse> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/list-contexts`;\n const payload: JsonRecord = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n limit: options.limit ?? 20,\n };\n\n if (options.status) {\n payload.status = options.status;\n }\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'list');\n }\n\n const result = asRecord(response.data);\n const contexts = Array.isArray(result.contexts)\n ? result.contexts.map((item) => {\n const context = asRecord(item);\n return new ContextInfo({\n id: getString(context.context_id) ?? '',\n status: normalizeContextStatus(context.locked),\n createdAt: parseTimestamp(context.created_at),\n updatedAt: parseTimestamp(context.updated_at),\n metadata: (context.metadata as ContextMetadata | undefined) ?? {},\n });\n })\n : [];\n\n getLogger().info(`Retrieved ${contexts.length} contexts`);\n return new ContextListResponse(contexts);\n }\n\n /**\n * Fetch a single context.\n */\n async get(contextId: string): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'get', contextId);\n }\n\n const result = asRecord(response.data);\n const context = asRecord(result.context);\n\n const contextInfo = new ContextInfo({\n id: getString(context.context_id) ?? contextId,\n status: normalizeContextStatus(context.locked),\n metadata: (context.metadata as ContextMetadata | undefined) ?? {},\n createdAt: parseTimestamp(context.created_at),\n updatedAt: parseTimestamp(context.updated_at),\n });\n\n getLogger().info(`Retrieved context '${contextInfo.id}' (status: ${contextInfo.status})`);\n return contextInfo;\n }\n\n /**\n * Fork an existing persistent context into a new context.\n */\n async fork(contextId: string): Promise<ContextInfo> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/fork`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'fork', contextId);\n }\n\n const result = asRecord(response.data);\n const forkedContextId = getString(result.context_id);\n if (!forkedContextId) {\n throw new APIError('Failed to fork context: context_id missing from response', {\n statusCode: response.status,\n response: response.data,\n });\n }\n\n const contextInfo = new ContextInfo({\n id: forkedContextId,\n status: normalizeContextStatus(result.locked),\n metadata: (result.metadata as ContextMetadata | undefined) ?? {},\n createdAt: parseTimestamp(result.created_at),\n updatedAt: parseTimestamp(result.updated_at),\n });\n\n getLogger().info(`Successfully forked context '${contextId}' -> '${contextInfo.id}'`);\n return contextInfo;\n }\n\n /**\n * Delete a persistent context.\n */\n async delete(contextId: string): Promise<void> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._delete(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'delete', contextId);\n }\n\n getLogger().info(`Successfully deleted context '${contextId}'`);\n }\n\n /**\n * Force-release a stuck lock on a context.\n */\n async forceRelease(contextId: string): Promise<ForceReleaseResponse> {\n const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/force-release`;\n const payload = {\n api_key: this.client.apiKey,\n project_id: this.client.projectId,\n };\n\n const response = await this.client._post(url, payload);\n if (response.status >= 400) {\n this.handleError(response, 'force_release', contextId);\n }\n\n const result = asRecord(response.data);\n return {\n status: getString(result.status) ?? 'unlocked',\n message: getString(result.message) ?? 'Lock released successfully',\n };\n }\n\n private handleError(\n response: AxiosResponse<unknown>,\n operation: string,\n contextId?: string\n ): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.error) ?? getString(errorData.message) ?? 'Unknown error';\n const errorCode = getString(errorData.code);\n const metadata = asRecord(errorData.metadata);\n\n if (response.status === 401) {\n throw new AuthenticationError(`Authentication failed: ${errorMessage}`);\n }\n\n if (response.status === 404) {\n const suffix = contextId ? `: ${contextId}` : '';\n throw new ContextNotFoundError(`Context not found${suffix}`);\n }\n\n if (\n response.status === 409 &&\n (errorCode === 'context_locked' || errorCode === 'CONTEXT_FORK_SOURCE_LOCKED')\n ) {\n throw new ContextLockedError(errorMessage, {\n activeSessionId: getString(metadata.activeSessionId),\n retryAfter:\n typeof metadata.retryAfter === 'number' ? metadata.retryAfter : undefined,\n });\n }\n\n if (response.status === 409 && errorCode === 'session_active') {\n throw new APIError(\n `Cannot ${operation} context: ${errorMessage} (session is active)`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 500) {\n const details = getString(errorData.details);\n throw new APIError(\n `Internal server error (500) during ${operation}: ${errorMessage}${details ? `. Details: ${details}` : ''}`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 502) {\n throw new APIError(\n `Server gateway error (502) during ${operation}: The service may be temporarily unavailable. Please retry.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 503) {\n throw new APIError(\n `Service unavailable (503) during ${operation}: The service is temporarily unavailable. Please retry later.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n if (response.status === 504) {\n throw new APIError(\n `Gateway timeout (504) during ${operation}: The request timed out. Please retry.`,\n {\n statusCode: response.status,\n response: response.data,\n }\n );\n }\n\n throw new APIError(`Failed to ${operation} context: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n","/**\n * Extension resource implementation.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { AxiosResponse } from 'axios';\nimport type { Lexmount } from './client';\nimport { APIError, AuthenticationError } from './errors';\nimport { getLogger } from './logging';\nimport type {\n ExtensionInfoShape,\n ExtensionListOptions,\n ExtensionUploadOptions,\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Extension metadata returned by the API.\n */\nexport class ExtensionInfo implements ExtensionInfoShape {\n readonly id: string;\n readonly name: string;\n readonly projectId: string;\n readonly createdAt?: string;\n readonly updatedAt?: string;\n\n constructor(shape: ExtensionInfoShape) {\n this.id = shape.id;\n this.name = shape.name;\n this.projectId = shape.projectId;\n this.createdAt = shape.createdAt;\n this.updatedAt = shape.updatedAt;\n }\n}\n\n/**\n * Browser extension resource operations.\n */\nexport class ExtensionsResource {\n constructor(private readonly client: Lexmount) {}\n\n async upload(filePath: string, options: ExtensionUploadOptions = {}): Promise<ExtensionInfo> {\n const fileBuffer = await readFile(filePath);\n const form = new FormData();\n const usedProjectId = options.projectId ?? this.client.projectId;\n\n form.append('project_id', usedProjectId);\n if (options.name) {\n form.append('name', options.name);\n }\n\n form.append(\n 'file',\n new Blob([fileBuffer], { type: 'application/octet-stream' }),\n path.basename(filePath)\n );\n\n const response = await this.client._post(\n `${this.client.baseUrl}/instance/v1/extension/upload`,\n form,\n {\n headers: {\n project_id: usedProjectId,\n },\n }\n );\n if (response.status >= 400) {\n this.handleError('upload extension', response);\n }\n\n getLogger().info(`Extension uploaded successfully: ${filePath}`);\n return this.parseInfo(response.data);\n }\n\n async list(options: ExtensionListOptions = {}): Promise<ExtensionInfo[]> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v1/extension/list`, {\n project_id: options.projectId ?? this.client.projectId,\n limit: options.limit ?? 20,\n offset: options.offset ?? 0,\n });\n if (response.status >= 400) {\n this.handleError('list extensions', response);\n }\n\n const result = asRecord(response.data);\n const items = Array.isArray(result.data) ? result.data : [];\n return items.map((item) => this.parseInfo(item));\n }\n\n async get(extensionId: string, projectId?: string): Promise<ExtensionInfo> {\n const response = await this.client._post(`${this.client.baseUrl}/instance/v1/extension/info`, {\n project_id: projectId ?? this.client.projectId,\n extension_id: extensionId,\n });\n if (response.status >= 400) {\n this.handleError('get extension', response);\n }\n\n return this.parseInfo(response.data);\n }\n\n async delete(extensionId: string): Promise<void> {\n const response = await this.client._delete(\n `${this.client.baseUrl}/instance/v1/extension/${extensionId}`\n );\n if (response.status >= 400) {\n this.handleError('delete extension', response);\n }\n\n getLogger().info(`Extension deleted successfully: ${extensionId}`);\n }\n\n private parseInfo(data: unknown): ExtensionInfo {\n const item = asRecord(data);\n\n return new ExtensionInfo({\n id: getString(item.id) ?? '',\n name: getString(item.name) ?? '',\n projectId: getString(item.project_id) ?? '',\n createdAt: getString(item.created_at),\n updatedAt: getString(item.updated_at),\n });\n }\n\n private handleError(action: string, response: AxiosResponse<unknown>): never {\n const errorData = asRecord(response.data);\n const errorMessage =\n getString(errorData.message) ?? getString(errorData.error) ?? 'Unknown error';\n\n if (response.status === 401) {\n throw new AuthenticationError(\n `Authentication failed: ${errorMessage}. Please check your API key and project ID.`\n );\n }\n\n throw new APIError(`Failed to ${action}: ${errorMessage}`, {\n statusCode: response.status,\n response: response.data,\n });\n }\n}\n","/**\n * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.5.7';\n\nexport {\n deregisterIntegratedAuthCallback,\n registerIntegratedAuthCallback,\n type IntegratedAuthCallback,\n type IntegratedAuthCallbackResult,\n} from './auth';\nexport { CDPClient, connectOverCDP, type CDPEventMessage } from './cdp';\nexport { Lexmount } from './client';\nexport { ContextInfo, ContextListResponse, ContextsResource } from './contexts';\nexport { ExtensionInfo, ExtensionsResource } from './extensions';\nexport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n LexmountError,\n NetworkError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nexport {\n LexmountLogger,\n disableLogging,\n enableLogging,\n getLogger,\n setLogLevel,\n type LogLevel,\n} from './logging';\nexport {\n PaginationInfo,\n SessionDownloadInfo,\n SessionDownloadsDeleteResponse,\n SessionDownloadsListResponse,\n SessionDownloadsResource,\n SessionInfo,\n SessionListResponse,\n SessionTargetInfo,\n SessionsResource,\n type SessionCreateResponse,\n} from './sessions';\nexport type {\n BrowserMode,\n ContextAccessMode,\n ContextCreateOptions,\n ContextListOptions,\n ContextMetadata,\n ContextStatus,\n ExtensionInfoShape,\n ExtensionListOptions,\n ExtensionUploadOptions,\n ForceReleaseResponse,\n CatalogInfo,\n LexmountConfig,\n PaginationInfoShape,\n RegionCatalogEntry,\n RegionInfo,\n SessionContext,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n SessionTargetInfoShape,\n} from './types';\n\nexport { Lexmount as default } from './client';\n"],"mappings":"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","names":["sessionCallbacks","asRecord","getString","asRecord","getString","config","logger"]}
|