lexmount 0.5.2 → 0.5.4
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 +13 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -464,6 +464,7 @@ interface SessionInfoOptions {
|
|
|
464
464
|
status: SessionStatus;
|
|
465
465
|
apiKey: string;
|
|
466
466
|
projectId: string;
|
|
467
|
+
regionId?: string | null;
|
|
467
468
|
browserType: BrowserMode | string;
|
|
468
469
|
createdAt: string;
|
|
469
470
|
inspectUrl: string;
|
|
@@ -480,6 +481,8 @@ declare class SessionInfo {
|
|
|
480
481
|
readonly status: SessionStatus;
|
|
481
482
|
readonly apiKey: string;
|
|
482
483
|
readonly projectId: string;
|
|
484
|
+
readonly regionId: string | null;
|
|
485
|
+
readonly region_id: string | null;
|
|
483
486
|
readonly browserType: BrowserMode | string;
|
|
484
487
|
readonly createdAt: string;
|
|
485
488
|
readonly inspectUrl: string;
|
|
@@ -615,6 +618,7 @@ declare class SessionsResource {
|
|
|
615
618
|
*/
|
|
616
619
|
_getWebSocketDebuggerUrl(sessionId: string): Promise<string | null>;
|
|
617
620
|
private normalizeProxy;
|
|
621
|
+
private handleAsyncCreateFailed;
|
|
618
622
|
private handleCreateError;
|
|
619
623
|
private handleGetError;
|
|
620
624
|
private handleListError;
|
|
@@ -771,6 +775,6 @@ declare class TimeoutError extends LexmountError {
|
|
|
771
775
|
/**
|
|
772
776
|
* Lexmount Node.js SDK.
|
|
773
777
|
*/
|
|
774
|
-
declare const VERSION = "0.5.
|
|
778
|
+
declare const VERSION = "0.5.4";
|
|
775
779
|
|
|
776
780
|
export { APIError, AuthenticationError, type BrowserMode, 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, 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, Lexmount as default, disableLogging, enableLogging, getLogger, setLogLevel };
|
package/dist/index.d.ts
CHANGED
|
@@ -464,6 +464,7 @@ interface SessionInfoOptions {
|
|
|
464
464
|
status: SessionStatus;
|
|
465
465
|
apiKey: string;
|
|
466
466
|
projectId: string;
|
|
467
|
+
regionId?: string | null;
|
|
467
468
|
browserType: BrowserMode | string;
|
|
468
469
|
createdAt: string;
|
|
469
470
|
inspectUrl: string;
|
|
@@ -480,6 +481,8 @@ declare class SessionInfo {
|
|
|
480
481
|
readonly status: SessionStatus;
|
|
481
482
|
readonly apiKey: string;
|
|
482
483
|
readonly projectId: string;
|
|
484
|
+
readonly regionId: string | null;
|
|
485
|
+
readonly region_id: string | null;
|
|
483
486
|
readonly browserType: BrowserMode | string;
|
|
484
487
|
readonly createdAt: string;
|
|
485
488
|
readonly inspectUrl: string;
|
|
@@ -615,6 +618,7 @@ declare class SessionsResource {
|
|
|
615
618
|
*/
|
|
616
619
|
_getWebSocketDebuggerUrl(sessionId: string): Promise<string | null>;
|
|
617
620
|
private normalizeProxy;
|
|
621
|
+
private handleAsyncCreateFailed;
|
|
618
622
|
private handleCreateError;
|
|
619
623
|
private handleGetError;
|
|
620
624
|
private handleListError;
|
|
@@ -771,6 +775,6 @@ declare class TimeoutError extends LexmountError {
|
|
|
771
775
|
/**
|
|
772
776
|
* Lexmount Node.js SDK.
|
|
773
777
|
*/
|
|
774
|
-
declare const VERSION = "0.5.
|
|
778
|
+
declare const VERSION = "0.5.4";
|
|
775
779
|
|
|
776
780
|
export { APIError, AuthenticationError, type BrowserMode, 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, 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, Lexmount as default, disableLogging, enableLogging, getLogger, setLogLevel };
|
package/dist/index.js
CHANGED
|
@@ -644,6 +644,8 @@ var SessionInfo = class {
|
|
|
644
644
|
this.status = options.status;
|
|
645
645
|
this.apiKey = options.apiKey;
|
|
646
646
|
this.projectId = options.projectId;
|
|
647
|
+
this.regionId = options.regionId ?? null;
|
|
648
|
+
this.region_id = this.regionId;
|
|
647
649
|
this.browserType = options.browserType;
|
|
648
650
|
this.createdAt = options.createdAt;
|
|
649
651
|
this.inspectUrl = options.inspectUrl;
|
|
@@ -952,6 +954,7 @@ var SessionsResource = class {
|
|
|
952
954
|
});
|
|
953
955
|
}
|
|
954
956
|
if (info.status === "create_failed") {
|
|
957
|
+
this.handleAsyncCreateFailed(payload);
|
|
955
958
|
throw new APIError("Session creation failed", {
|
|
956
959
|
statusCode: 500,
|
|
957
960
|
response: { session_id: sessionId, status: info.status }
|
|
@@ -1085,6 +1088,14 @@ var SessionsResource = class {
|
|
|
1085
1088
|
}
|
|
1086
1089
|
return normalizedProxy;
|
|
1087
1090
|
}
|
|
1091
|
+
handleAsyncCreateFailed(payload) {
|
|
1092
|
+
const context = asRecord3(payload.context);
|
|
1093
|
+
const contextId = getString3(context.id);
|
|
1094
|
+
const contextMode = getString3(context.mode);
|
|
1095
|
+
if (contextId && contextMode === "read_write" && payload.weak_lock !== true) {
|
|
1096
|
+
throw new ContextLockedError("Context is locked by another active session");
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1088
1099
|
handleCreateError(response) {
|
|
1089
1100
|
const errorData = asRecord3(response.data);
|
|
1090
1101
|
const errorMessage = getString3(errorData.error) ?? getString3(errorData.message) ?? "Unknown error";
|
|
@@ -1186,6 +1197,7 @@ var SessionsResource = class {
|
|
|
1186
1197
|
status: getString3(raw.status) ?? "active",
|
|
1187
1198
|
apiKey: getString3(raw.api_key) ?? this.client.apiKey,
|
|
1188
1199
|
projectId: getString3(raw.project_id) ?? (projectId ?? this.client.projectId),
|
|
1200
|
+
regionId: getString3(raw.region_id) ?? this.client.selectedRegion ?? this.client.region ?? null,
|
|
1189
1201
|
browserType: getString3(raw.browser_type) ?? getString3(raw.browser_mode) ?? "normal",
|
|
1190
1202
|
createdAt: getString3(raw.created_at) ?? "",
|
|
1191
1203
|
inspectUrl: getString3(raw.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
|
|
@@ -1486,7 +1498,7 @@ var Lexmount = class {
|
|
|
1486
1498
|
};
|
|
1487
1499
|
|
|
1488
1500
|
// src/index.ts
|
|
1489
|
-
var VERSION = "0.5.
|
|
1501
|
+
var VERSION = "0.5.4";
|
|
1490
1502
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1491
1503
|
0 && (module.exports = {
|
|
1492
1504
|
APIError,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/logging.ts","../src/contexts.ts","../src/extensions.ts","../src/sessions.ts"],"sourcesContent":["/**\n * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.5.2';\n\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 * 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 * 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 * 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 * 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 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 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 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.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(payload, options);\n }\n\n const url = `${this.client.baseUrl}/instance`;\n const response = await this.client._post(url, 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 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 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 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`, {\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, 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 = {\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 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 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"],"mappings":"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","names":["import_axios","asRecord","getString","path","asRecord","getString","config","axios","logger"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/logging.ts","../src/contexts.ts","../src/extensions.ts","../src/sessions.ts"],"sourcesContent":["/**\n * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.5.4';\n\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 * 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 * 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 * 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 * 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 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(payload, options);\n }\n\n const url = `${this.client.baseUrl}/instance`;\n const response = await this.client._post(url, 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 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 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`, {\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, 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 = {\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"],"mappings":"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","names":["import_axios","asRecord","getString","path","asRecord","getString","config","axios","logger"]}
|
package/dist/index.mjs
CHANGED
|
@@ -578,6 +578,8 @@ var SessionInfo = class {
|
|
|
578
578
|
this.status = options.status;
|
|
579
579
|
this.apiKey = options.apiKey;
|
|
580
580
|
this.projectId = options.projectId;
|
|
581
|
+
this.regionId = options.regionId ?? null;
|
|
582
|
+
this.region_id = this.regionId;
|
|
581
583
|
this.browserType = options.browserType;
|
|
582
584
|
this.createdAt = options.createdAt;
|
|
583
585
|
this.inspectUrl = options.inspectUrl;
|
|
@@ -886,6 +888,7 @@ var SessionsResource = class {
|
|
|
886
888
|
});
|
|
887
889
|
}
|
|
888
890
|
if (info.status === "create_failed") {
|
|
891
|
+
this.handleAsyncCreateFailed(payload);
|
|
889
892
|
throw new APIError("Session creation failed", {
|
|
890
893
|
statusCode: 500,
|
|
891
894
|
response: { session_id: sessionId, status: info.status }
|
|
@@ -1019,6 +1022,14 @@ var SessionsResource = class {
|
|
|
1019
1022
|
}
|
|
1020
1023
|
return normalizedProxy;
|
|
1021
1024
|
}
|
|
1025
|
+
handleAsyncCreateFailed(payload) {
|
|
1026
|
+
const context = asRecord3(payload.context);
|
|
1027
|
+
const contextId = getString3(context.id);
|
|
1028
|
+
const contextMode = getString3(context.mode);
|
|
1029
|
+
if (contextId && contextMode === "read_write" && payload.weak_lock !== true) {
|
|
1030
|
+
throw new ContextLockedError("Context is locked by another active session");
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1022
1033
|
handleCreateError(response) {
|
|
1023
1034
|
const errorData = asRecord3(response.data);
|
|
1024
1035
|
const errorMessage = getString3(errorData.error) ?? getString3(errorData.message) ?? "Unknown error";
|
|
@@ -1120,6 +1131,7 @@ var SessionsResource = class {
|
|
|
1120
1131
|
status: getString3(raw.status) ?? "active",
|
|
1121
1132
|
apiKey: getString3(raw.api_key) ?? this.client.apiKey,
|
|
1122
1133
|
projectId: getString3(raw.project_id) ?? (projectId ?? this.client.projectId),
|
|
1134
|
+
regionId: getString3(raw.region_id) ?? this.client.selectedRegion ?? this.client.region ?? null,
|
|
1123
1135
|
browserType: getString3(raw.browser_type) ?? getString3(raw.browser_mode) ?? "normal",
|
|
1124
1136
|
createdAt: getString3(raw.created_at) ?? "",
|
|
1125
1137
|
inspectUrl: getString3(raw.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
|
|
@@ -1420,7 +1432,7 @@ var Lexmount = class {
|
|
|
1420
1432
|
};
|
|
1421
1433
|
|
|
1422
1434
|
// src/index.ts
|
|
1423
|
-
var VERSION = "0.5.
|
|
1435
|
+
var VERSION = "0.5.4";
|
|
1424
1436
|
export {
|
|
1425
1437
|
APIError,
|
|
1426
1438
|
AuthenticationError,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/logging.ts","../src/contexts.ts","../src/extensions.ts","../src/sessions.ts","../src/index.ts"],"sourcesContent":["/**\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 * 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 * 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 * 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 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 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 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.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(payload, options);\n }\n\n const url = `${this.client.baseUrl}/instance`;\n const response = await this.client._post(url, 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 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 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 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`, {\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, 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 = {\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 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 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 * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.5.2';\n\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":["asRecord","getString","asRecord","getString","config","logger"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/logging.ts","../src/contexts.ts","../src/extensions.ts","../src/sessions.ts","../src/index.ts"],"sourcesContent":["/**\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 * 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 * 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 * 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 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(payload, options);\n }\n\n const url = `${this.client.baseUrl}/instance`;\n const response = await this.client._post(url, 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 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 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`, {\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, 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 = {\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 * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.5.4';\n\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":["asRecord","getString","asRecord","getString","config","logger"]}
|