lexmount 0.2.5 → 0.2.6

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/README.md CHANGED
@@ -149,6 +149,14 @@ const details = await client.contexts.get(context.id);
149
149
  console.log(details.status);
150
150
  ```
151
151
 
152
+ Fork an available context into a new context:
153
+
154
+ ```ts
155
+ const source = await client.contexts.create();
156
+ const forked = await client.contexts.fork(source.id);
157
+ console.log(forked.id);
158
+ ```
159
+
152
160
  List contexts:
153
161
 
154
162
  ```ts
@@ -164,6 +172,13 @@ Force release a stuck lock:
164
172
  await client.contexts.forceRelease('context-id');
165
173
  ```
166
174
 
175
+ Current `context fork` limitations:
176
+
177
+ - Only supports offline snapshot copy from an `available` context
178
+ - Does not support hot fork from a `locked` context
179
+ - Does not support copy-on-write
180
+ - Does not support parent/child lineage tracking
181
+
167
182
  ### Extensions
168
183
 
169
184
  Upload an extension archive:
@@ -271,6 +286,7 @@ Example scripts live in [examples](./examples):
271
286
  - `playwright-basic.ts`
272
287
  - `session-management.ts`
273
288
  - `context-basic.ts`
289
+ - `context-fork.ts`
274
290
  - `context-list-get.ts`
275
291
  - `context-modes.ts`
276
292
  - `context-lock-handling.ts`
@@ -283,6 +299,7 @@ Run them with:
283
299
  ```bash
284
300
  cd examples
285
301
  npm install
302
+ npm run context-fork
286
303
  npm run playwright-basic
287
304
  npm run session-management
288
305
  npm run extension-basic
@@ -450,6 +467,14 @@ const details = await client.contexts.get(context.id);
450
467
  console.log(details.status);
451
468
  ```
452
469
 
470
+ 基于一个 `available` context 创建新的 fork:
471
+
472
+ ```ts
473
+ const source = await client.contexts.create();
474
+ const forked = await client.contexts.fork(source.id);
475
+ console.log(forked.id);
476
+ ```
477
+
453
478
  列出 context:
454
479
 
455
480
  ```ts
@@ -465,6 +490,13 @@ const contexts = await client.contexts.list({
465
490
  await client.contexts.forceRelease('context-id');
466
491
  ```
467
492
 
493
+ 当前 `context fork` 第一版限制:
494
+
495
+ - 只支持对 `available context` 做离线快照复制
496
+ - 不支持 `locked` context 的热 fork
497
+ - 不支持 copy-on-write
498
+ - 不支持父子链追踪
499
+
468
500
  ### Extensions
469
501
 
470
502
  上传扩展压缩包:
@@ -572,6 +604,7 @@ npm run docs:html
572
604
  - `playwright-basic.ts`
573
605
  - `session-management.ts`
574
606
  - `context-basic.ts`
607
+ - `context-fork.ts`
575
608
  - `context-list-get.ts`
576
609
  - `context-modes.ts`
577
610
  - `context-lock-handling.ts`
@@ -584,6 +617,7 @@ npm run docs:html
584
617
  ```bash
585
618
  cd examples
586
619
  npm install
620
+ npm run context-fork
587
621
  npm run playwright-basic
588
622
  npm run session-management
589
623
  npm run extension-basic
package/dist/index.d.mts CHANGED
@@ -334,6 +334,10 @@ declare class ContextsResource {
334
334
  * Fetch a single context.
335
335
  */
336
336
  get(contextId: string): Promise<ContextInfo>;
337
+ /**
338
+ * Fork an existing persistent context into a new context.
339
+ */
340
+ fork(contextId: string): Promise<ContextInfo>;
337
341
  /**
338
342
  * Delete a persistent context.
339
343
  */
package/dist/index.d.ts CHANGED
@@ -334,6 +334,10 @@ declare class ContextsResource {
334
334
  * Fetch a single context.
335
335
  */
336
336
  get(contextId: string): Promise<ContextInfo>;
337
+ /**
338
+ * Fork an existing persistent context into a new context.
339
+ */
340
+ fork(contextId: string): Promise<ContextInfo>;
337
341
  /**
338
342
  * Delete a persistent context.
339
343
  */
package/dist/index.js CHANGED
@@ -360,6 +360,37 @@ var ContextsResource = class {
360
360
  getLogger().info(`Retrieved context '${contextInfo.id}' (status: ${contextInfo.status})`);
361
361
  return contextInfo;
362
362
  }
363
+ /**
364
+ * Fork an existing persistent context into a new context.
365
+ */
366
+ async fork(contextId) {
367
+ const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/fork`;
368
+ const payload = {
369
+ api_key: this.client.apiKey,
370
+ project_id: this.client.projectId
371
+ };
372
+ const response = await this.client._post(url, payload);
373
+ if (response.status >= 400) {
374
+ this.handleError(response, "fork", contextId);
375
+ }
376
+ const result = asRecord(response.data);
377
+ const forkedContextId = getString(result.context_id);
378
+ if (!forkedContextId) {
379
+ throw new APIError("Failed to fork context: context_id missing from response", {
380
+ statusCode: response.status,
381
+ response: response.data
382
+ });
383
+ }
384
+ const contextInfo = new ContextInfo({
385
+ id: forkedContextId,
386
+ status: normalizeContextStatus(result.locked),
387
+ metadata: result.metadata ?? {},
388
+ createdAt: parseTimestamp(result.created_at),
389
+ updatedAt: parseTimestamp(result.updated_at)
390
+ });
391
+ getLogger().info(`Successfully forked context '${contextId}' -> '${contextInfo.id}'`);
392
+ return contextInfo;
393
+ }
363
394
  /**
364
395
  * Delete a persistent context.
365
396
  */
@@ -406,7 +437,7 @@ var ContextsResource = class {
406
437
  const suffix = contextId ? `: ${contextId}` : "";
407
438
  throw new ContextNotFoundError(`Context not found${suffix}`);
408
439
  }
409
- if (response.status === 409 && errorCode === "context_locked") {
440
+ if (response.status === 409 && (errorCode === "context_locked" || errorCode === "CONTEXT_FORK_SOURCE_LOCKED")) {
410
441
  throw new ContextLockedError(errorMessage, {
411
442
  activeSessionId: getString(metadata.activeSessionId),
412
443
  retryAfter: typeof metadata.retryAfter === "number" ? metadata.retryAfter : void 0
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.2.5';\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 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 LexmountConfig,\n PaginationInfoShape,\n SessionContext,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n} from './types';\n\nexport { Lexmount as default } from './client';\n","/**\n * Lexmount API client.\n */\n\nimport {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n isAxiosError,\n} 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 { LexmountConfig } 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 /**\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\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 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 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 return this.request<T>('DELETE', url, { ...config, data });\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 logger.debug(`${method} request to ${url}`);\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,\n ...config,\n headers,\n });\n\n const elapsed = Date.now() - startTime;\n logger.debug(`${method} response: status=${response.status}, duration=${elapsed.toFixed(2)}ms`);\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\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 * 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 (response.status === 409 && errorCode === 'context_locked') {\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 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} 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\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 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 url = `${this.client.baseUrl}/instance`;\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 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 /**\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 * 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 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 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.2.5';\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 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 LexmountConfig,\n PaginationInfoShape,\n SessionContext,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n} from './types';\n\nexport { Lexmount as default } from './client';\n","/**\n * Lexmount API client.\n */\n\nimport {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n isAxiosError,\n} 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 { LexmountConfig } 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 /**\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\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 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 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 return this.request<T>('DELETE', url, { ...config, data });\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 logger.debug(`${method} request to ${url}`);\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,\n ...config,\n headers,\n });\n\n const elapsed = Date.now() - startTime;\n logger.debug(`${method} response: status=${response.status}, duration=${elapsed.toFixed(2)}ms`);\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\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 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} 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\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 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 url = `${this.client.baseUrl}/instance`;\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 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 /**\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 * 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 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 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
@@ -297,6 +297,37 @@ var ContextsResource = class {
297
297
  getLogger().info(`Retrieved context '${contextInfo.id}' (status: ${contextInfo.status})`);
298
298
  return contextInfo;
299
299
  }
300
+ /**
301
+ * Fork an existing persistent context into a new context.
302
+ */
303
+ async fork(contextId) {
304
+ const url = `${this.client.baseUrl}/instance/v1/contexts/${contextId}/fork`;
305
+ const payload = {
306
+ api_key: this.client.apiKey,
307
+ project_id: this.client.projectId
308
+ };
309
+ const response = await this.client._post(url, payload);
310
+ if (response.status >= 400) {
311
+ this.handleError(response, "fork", contextId);
312
+ }
313
+ const result = asRecord(response.data);
314
+ const forkedContextId = getString(result.context_id);
315
+ if (!forkedContextId) {
316
+ throw new APIError("Failed to fork context: context_id missing from response", {
317
+ statusCode: response.status,
318
+ response: response.data
319
+ });
320
+ }
321
+ const contextInfo = new ContextInfo({
322
+ id: forkedContextId,
323
+ status: normalizeContextStatus(result.locked),
324
+ metadata: result.metadata ?? {},
325
+ createdAt: parseTimestamp(result.created_at),
326
+ updatedAt: parseTimestamp(result.updated_at)
327
+ });
328
+ getLogger().info(`Successfully forked context '${contextId}' -> '${contextInfo.id}'`);
329
+ return contextInfo;
330
+ }
300
331
  /**
301
332
  * Delete a persistent context.
302
333
  */
@@ -343,7 +374,7 @@ var ContextsResource = class {
343
374
  const suffix = contextId ? `: ${contextId}` : "";
344
375
  throw new ContextNotFoundError(`Context not found${suffix}`);
345
376
  }
346
- if (response.status === 409 && errorCode === "context_locked") {
377
+ if (response.status === 409 && (errorCode === "context_locked" || errorCode === "CONTEXT_FORK_SOURCE_LOCKED")) {
347
378
  throw new ContextLockedError(errorMessage, {
348
379
  activeSessionId: getString(metadata.activeSessionId),
349
380
  retryAfter: typeof metadata.retryAfter === "number" ? metadata.retryAfter : void 0
@@ -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 {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n isAxiosError,\n} 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 { LexmountConfig } 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 /**\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\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 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 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 return this.request<T>('DELETE', url, { ...config, data });\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 logger.debug(`${method} request to ${url}`);\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,\n ...config,\n headers,\n });\n\n const elapsed = Date.now() - startTime;\n logger.debug(`${method} response: status=${response.status}, duration=${elapsed.toFixed(2)}ms`);\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\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 * 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 (response.status === 409 && errorCode === 'context_locked') {\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 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} 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\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 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 url = `${this.client.baseUrl}/instance`;\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 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 /**\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 * 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 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 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.2.5';\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 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 LexmountConfig,\n PaginationInfoShape,\n SessionContext,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\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 {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n isAxiosError,\n} 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 { LexmountConfig } 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 /**\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\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 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 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 return this.request<T>('DELETE', url, { ...config, data });\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 logger.debug(`${method} request to ${url}`);\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,\n ...config,\n headers,\n });\n\n const elapsed = Date.now() - startTime;\n logger.debug(`${method} response: status=${response.status}, duration=${elapsed.toFixed(2)}ms`);\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\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 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} 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\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 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 url = `${this.client.baseUrl}/instance`;\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 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 /**\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 * 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 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 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.2.5';\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 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 LexmountConfig,\n PaginationInfoShape,\n SessionContext,\n SessionCreateOptions,\n SessionDeleteOptions,\n SessionDownloadInfoShape,\n SessionDownloadsDeleteResponseShape,\n SessionDownloadsListResponseShape,\n SessionListOptions,\n SessionProxyConfig,\n SessionStatus,\n} from './types';\n\nexport { Lexmount as default } from './client';\n"],"mappings":"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","names":["asRecord","getString","asRecord","getString","config","logger"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lexmount",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "Node.js SDK for Lexmount browser automation service",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",