lexmount 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -505,6 +505,13 @@ declare class SessionsResource {
505
505
  * Create a new browser session.
506
506
  */
507
507
  create(options?: SessionCreateOptions): Promise<SessionCreateResponse>;
508
+ /**
509
+ * Fetch one session by id.
510
+ *
511
+ * The upstream API uses POST /instance/session for this lookup, so this SDK method
512
+ * intentionally uses POST even though the operation is read-only.
513
+ */
514
+ get(sessionId: string, projectId?: string): Promise<SessionInfo>;
508
515
  /**
509
516
  * List sessions for the current project.
510
517
  */
@@ -521,8 +528,11 @@ declare class SessionsResource {
521
528
  _getWebSocketDebuggerUrl(sessionId: string): Promise<string | null>;
522
529
  private normalizeProxy;
523
530
  private handleCreateError;
531
+ private handleGetError;
524
532
  private handleListError;
525
533
  private handleDeleteError;
534
+ private mapSessionInfo;
535
+ private _getCreatedSession;
526
536
  }
527
537
 
528
538
  /**
@@ -657,6 +667,6 @@ declare class TimeoutError extends LexmountError {
657
667
  /**
658
668
  * Lexmount Node.js SDK.
659
669
  */
660
- declare const VERSION = "0.2.4";
670
+ declare const VERSION = "0.2.5";
661
671
 
662
672
  export { APIError, AuthenticationError, type BrowserMode, type ContextAccessMode, type ContextCreateOptions, ContextInfo, type ContextListOptions, ContextListResponse, ContextLockedError, type ContextMetadata, ContextNotFoundError, type ContextStatus, ContextsResource, ExtensionInfo, type ExtensionInfoShape, type ExtensionListOptions, type ExtensionUploadOptions, ExtensionsResource, type ForceReleaseResponse, Lexmount, type LexmountConfig, LexmountError, LexmountLogger, type LogLevel, NetworkError, PaginationInfo, type PaginationInfoShape, type SessionContext, type SessionCreateOptions, type SessionCreateResponse, type SessionDeleteOptions, SessionDownloadInfo, type SessionDownloadInfoShape, SessionDownloadsDeleteResponse, type SessionDownloadsDeleteResponseShape, SessionDownloadsListResponse, type SessionDownloadsListResponseShape, SessionDownloadsResource, SessionInfo, type SessionListOptions, SessionListResponse, SessionNotFoundError, type SessionProxyConfig, type SessionStatus, SessionsResource, TimeoutError, VERSION, ValidationError, Lexmount as default, disableLogging, enableLogging, getLogger, setLogLevel };
package/dist/index.d.ts CHANGED
@@ -505,6 +505,13 @@ declare class SessionsResource {
505
505
  * Create a new browser session.
506
506
  */
507
507
  create(options?: SessionCreateOptions): Promise<SessionCreateResponse>;
508
+ /**
509
+ * Fetch one session by id.
510
+ *
511
+ * The upstream API uses POST /instance/session for this lookup, so this SDK method
512
+ * intentionally uses POST even though the operation is read-only.
513
+ */
514
+ get(sessionId: string, projectId?: string): Promise<SessionInfo>;
508
515
  /**
509
516
  * List sessions for the current project.
510
517
  */
@@ -521,8 +528,11 @@ declare class SessionsResource {
521
528
  _getWebSocketDebuggerUrl(sessionId: string): Promise<string | null>;
522
529
  private normalizeProxy;
523
530
  private handleCreateError;
531
+ private handleGetError;
524
532
  private handleListError;
525
533
  private handleDeleteError;
534
+ private mapSessionInfo;
535
+ private _getCreatedSession;
526
536
  }
527
537
 
528
538
  /**
@@ -657,6 +667,6 @@ declare class TimeoutError extends LexmountError {
657
667
  /**
658
668
  * Lexmount Node.js SDK.
659
669
  */
660
- declare const VERSION = "0.2.4";
670
+ declare const VERSION = "0.2.5";
661
671
 
662
672
  export { APIError, AuthenticationError, type BrowserMode, type ContextAccessMode, type ContextCreateOptions, ContextInfo, type ContextListOptions, ContextListResponse, ContextLockedError, type ContextMetadata, ContextNotFoundError, type ContextStatus, ContextsResource, ExtensionInfo, type ExtensionInfoShape, type ExtensionListOptions, type ExtensionUploadOptions, ExtensionsResource, type ForceReleaseResponse, Lexmount, type LexmountConfig, LexmountError, LexmountLogger, type LogLevel, NetworkError, PaginationInfo, type PaginationInfoShape, type SessionContext, type SessionCreateOptions, type SessionCreateResponse, type SessionDeleteOptions, SessionDownloadInfo, type SessionDownloadInfoShape, SessionDownloadsDeleteResponse, type SessionDownloadsDeleteResponseShape, SessionDownloadsListResponse, type SessionDownloadsListResponseShape, SessionDownloadsResource, SessionInfo, type SessionListOptions, SessionListResponse, SessionNotFoundError, type SessionProxyConfig, type SessionStatus, SessionsResource, TimeoutError, VERSION, ValidationError, Lexmount as default, disableLogging, enableLogging, getLogger, setLogLevel };
package/dist/index.js CHANGED
@@ -844,22 +844,40 @@ var SessionsResource = class {
844
844
  });
845
845
  }
846
846
  const containerId = getString3(result.container_id) ?? null;
847
- const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);
848
847
  const projectId = options.projectId ?? this.client.projectId;
848
+ const createdSession = await this._getCreatedSession(sessionId, projectId);
849
+ const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);
849
850
  getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);
850
851
  return new SessionInfo({
851
852
  id: sessionId,
852
- status: "active",
853
+ status: createdSession?.status ?? "active",
853
854
  apiKey: this.client.apiKey,
854
855
  projectId,
855
- browserType: options.browserMode ?? "normal",
856
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
857
- inspectUrl: `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
858
- containerId,
859
- ws: wsUrl,
856
+ browserType: createdSession?.browserType ?? (options.browserMode ?? "normal"),
857
+ createdAt: createdSession?.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
858
+ inspectUrl: createdSession?.inspectUrl ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
859
+ containerId: createdSession?.containerId ?? containerId,
860
+ ws: wsUrl ?? createdSession?.ws ?? null,
860
861
  client: this.client
861
862
  });
862
863
  }
864
+ /**
865
+ * Fetch one session by id.
866
+ *
867
+ * The upstream API uses POST /instance/session for this lookup, so this SDK method
868
+ * intentionally uses POST even though the operation is read-only.
869
+ */
870
+ async get(sessionId, projectId) {
871
+ const response = await this.client._post(`${this.client.baseUrl}/instance/session`, {
872
+ api_key: this.client.apiKey,
873
+ project_id: projectId ?? this.client.projectId,
874
+ session_id: sessionId
875
+ });
876
+ if (response.status >= 400) {
877
+ this.handleGetError(response, sessionId);
878
+ }
879
+ return this.mapSessionInfo(asRecord3(response.data), projectId);
880
+ }
863
881
  /**
864
882
  * List sessions for the current project.
865
883
  */
@@ -879,22 +897,7 @@ var SessionsResource = class {
879
897
  const result = asRecord3(response.data);
880
898
  const sessionsData = Array.isArray(result.sessions) ? result.sessions : [];
881
899
  const paginationData = asRecord3(result.pagination);
882
- const sessions = sessionsData.map((item) => {
883
- const session = asRecord3(item);
884
- const sessionId = getString3(session.id) ?? "";
885
- return new SessionInfo({
886
- id: sessionId,
887
- status: getString3(session.status) ?? "active",
888
- apiKey: getString3(session.api_key) ?? this.client.apiKey,
889
- projectId: getString3(session.project_id) ?? (options.projectId ?? this.client.projectId),
890
- browserType: getString3(session.browser_type) ?? "normal",
891
- createdAt: getString3(session.created_at) ?? "",
892
- inspectUrl: getString3(session.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
893
- containerId: getString3(session.container_id) ?? null,
894
- ws: getString3(session.ws) ?? null,
895
- client: this.client
896
- });
897
- });
900
+ const sessions = sessionsData.map((item) => this.mapSessionInfo(asRecord3(item), options.projectId));
898
901
  const pagination = new PaginationInfo({
899
902
  currentPage: getNumber(paginationData.currentPage) ?? 1,
900
903
  pageSize: getNumber(paginationData.pageSize) ?? sessions.length,
@@ -988,6 +991,24 @@ var SessionsResource = class {
988
991
  response: response.data
989
992
  });
990
993
  }
994
+ handleGetError(response, sessionId) {
995
+ const errorData = asRecord3(response.data);
996
+ const errorMessage = getString3(errorData.error) ?? getString3(errorData.message) ?? "Unknown error";
997
+ if (response.status === 401) {
998
+ throw new AuthenticationError(
999
+ `Authentication failed: ${errorMessage}. Please check your API key and project ID.`
1000
+ );
1001
+ }
1002
+ if (response.status === 404) {
1003
+ throw new SessionNotFoundError(
1004
+ `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`
1005
+ );
1006
+ }
1007
+ throw new APIError(`Failed to get session: ${errorMessage}`, {
1008
+ statusCode: response.status,
1009
+ response: response.data
1010
+ });
1011
+ }
991
1012
  handleListError(response) {
992
1013
  const errorData = asRecord3(response.data);
993
1014
  const errorMessage = getString3(errorData.error) ?? getString3(errorData.message) ?? "Unknown error";
@@ -1019,6 +1040,32 @@ var SessionsResource = class {
1019
1040
  response: response.data
1020
1041
  });
1021
1042
  }
1043
+ mapSessionInfo(raw, projectId) {
1044
+ const sessionId = getString3(raw.session_id) ?? getString3(raw.id) ?? "";
1045
+ return new SessionInfo({
1046
+ id: sessionId,
1047
+ status: getString3(raw.status) ?? "active",
1048
+ apiKey: getString3(raw.api_key) ?? this.client.apiKey,
1049
+ projectId: getString3(raw.project_id) ?? (projectId ?? this.client.projectId),
1050
+ browserType: getString3(raw.browser_type) ?? getString3(raw.browser_mode) ?? "normal",
1051
+ createdAt: getString3(raw.created_at) ?? "",
1052
+ inspectUrl: getString3(raw.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
1053
+ containerId: getString3(raw.container_id) ?? null,
1054
+ ws: getString3(raw.ws) ?? null,
1055
+ client: this.client
1056
+ });
1057
+ }
1058
+ async _getCreatedSession(sessionId, projectId) {
1059
+ try {
1060
+ return await this.get(sessionId, projectId);
1061
+ } catch (error) {
1062
+ getLogger().warn(
1063
+ `Failed to fetch created session ${sessionId}; falling back to locally derived session fields:`,
1064
+ error
1065
+ );
1066
+ return null;
1067
+ }
1068
+ }
1022
1069
  };
1023
1070
 
1024
1071
  // src/client.ts
@@ -1147,7 +1194,7 @@ var Lexmount = class {
1147
1194
  };
1148
1195
 
1149
1196
  // src/index.ts
1150
- var VERSION = "0.2.4";
1197
+ var VERSION = "0.2.5";
1151
1198
  // Annotate the CommonJS export names for ESM import in node:
1152
1199
  0 && (module.exports = {
1153
1200
  APIError,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/logging.ts","../src/contexts.ts","../src/extensions.ts","../src/sessions.ts"],"sourcesContent":["/**\n * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.2.4';\n\nexport { Lexmount } from './client';\nexport { ContextInfo, ContextListResponse, ContextsResource } from './contexts';\nexport { ExtensionInfo, ExtensionsResource } from './extensions';\nexport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n LexmountError,\n NetworkError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nexport {\n LexmountLogger,\n disableLogging,\n enableLogging,\n getLogger,\n setLogLevel,\n type LogLevel,\n} from './logging';\nexport {\n PaginationInfo,\n SessionDownloadInfo,\n SessionDownloadsDeleteResponse,\n SessionDownloadsListResponse,\n SessionDownloadsResource,\n SessionInfo,\n SessionListResponse,\n 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 wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n const projectId = options.projectId ?? this.client.projectId;\n\n getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);\n\n return new SessionInfo({\n id: sessionId,\n status: 'active',\n apiKey: this.client.apiKey,\n projectId,\n browserType: (options.browserMode ?? 'normal') as BrowserMode,\n createdAt: new Date().toISOString(),\n inspectUrl: `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId,\n ws: wsUrl,\n client: this.client,\n });\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) => {\n const session = asRecord(item);\n const sessionId = getString(session.id) ?? '';\n return new SessionInfo({\n id: sessionId,\n status: getString(session.status) ?? 'active',\n apiKey: getString(session.api_key) ?? this.client.apiKey,\n projectId: getString(session.project_id) ?? (options.projectId ?? this.client.projectId),\n browserType: getString(session.browser_type) ?? 'normal',\n createdAt: getString(session.created_at) ?? '',\n inspectUrl:\n getString(session.inspect_url) ??\n `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: getString(session.container_id) ?? null,\n ws: getString(session.ws) ?? null,\n client: this.client,\n });\n });\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 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"],"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 * 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"]}
package/dist/index.mjs CHANGED
@@ -781,22 +781,40 @@ var SessionsResource = class {
781
781
  });
782
782
  }
783
783
  const containerId = getString3(result.container_id) ?? null;
784
- const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);
785
784
  const projectId = options.projectId ?? this.client.projectId;
785
+ const createdSession = await this._getCreatedSession(sessionId, projectId);
786
+ const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);
786
787
  getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);
787
788
  return new SessionInfo({
788
789
  id: sessionId,
789
- status: "active",
790
+ status: createdSession?.status ?? "active",
790
791
  apiKey: this.client.apiKey,
791
792
  projectId,
792
- browserType: options.browserMode ?? "normal",
793
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
794
- inspectUrl: `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
795
- containerId,
796
- ws: wsUrl,
793
+ browserType: createdSession?.browserType ?? (options.browserMode ?? "normal"),
794
+ createdAt: createdSession?.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
795
+ inspectUrl: createdSession?.inspectUrl ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
796
+ containerId: createdSession?.containerId ?? containerId,
797
+ ws: wsUrl ?? createdSession?.ws ?? null,
797
798
  client: this.client
798
799
  });
799
800
  }
801
+ /**
802
+ * Fetch one session by id.
803
+ *
804
+ * The upstream API uses POST /instance/session for this lookup, so this SDK method
805
+ * intentionally uses POST even though the operation is read-only.
806
+ */
807
+ async get(sessionId, projectId) {
808
+ const response = await this.client._post(`${this.client.baseUrl}/instance/session`, {
809
+ api_key: this.client.apiKey,
810
+ project_id: projectId ?? this.client.projectId,
811
+ session_id: sessionId
812
+ });
813
+ if (response.status >= 400) {
814
+ this.handleGetError(response, sessionId);
815
+ }
816
+ return this.mapSessionInfo(asRecord3(response.data), projectId);
817
+ }
800
818
  /**
801
819
  * List sessions for the current project.
802
820
  */
@@ -816,22 +834,7 @@ var SessionsResource = class {
816
834
  const result = asRecord3(response.data);
817
835
  const sessionsData = Array.isArray(result.sessions) ? result.sessions : [];
818
836
  const paginationData = asRecord3(result.pagination);
819
- const sessions = sessionsData.map((item) => {
820
- const session = asRecord3(item);
821
- const sessionId = getString3(session.id) ?? "";
822
- return new SessionInfo({
823
- id: sessionId,
824
- status: getString3(session.status) ?? "active",
825
- apiKey: getString3(session.api_key) ?? this.client.apiKey,
826
- projectId: getString3(session.project_id) ?? (options.projectId ?? this.client.projectId),
827
- browserType: getString3(session.browser_type) ?? "normal",
828
- createdAt: getString3(session.created_at) ?? "",
829
- inspectUrl: getString3(session.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
830
- containerId: getString3(session.container_id) ?? null,
831
- ws: getString3(session.ws) ?? null,
832
- client: this.client
833
- });
834
- });
837
+ const sessions = sessionsData.map((item) => this.mapSessionInfo(asRecord3(item), options.projectId));
835
838
  const pagination = new PaginationInfo({
836
839
  currentPage: getNumber(paginationData.currentPage) ?? 1,
837
840
  pageSize: getNumber(paginationData.pageSize) ?? sessions.length,
@@ -925,6 +928,24 @@ var SessionsResource = class {
925
928
  response: response.data
926
929
  });
927
930
  }
931
+ handleGetError(response, sessionId) {
932
+ const errorData = asRecord3(response.data);
933
+ const errorMessage = getString3(errorData.error) ?? getString3(errorData.message) ?? "Unknown error";
934
+ if (response.status === 401) {
935
+ throw new AuthenticationError(
936
+ `Authentication failed: ${errorMessage}. Please check your API key and project ID.`
937
+ );
938
+ }
939
+ if (response.status === 404) {
940
+ throw new SessionNotFoundError(
941
+ `Session not found: ${errorMessage}. Session ID '${sessionId}' may not exist in this project.`
942
+ );
943
+ }
944
+ throw new APIError(`Failed to get session: ${errorMessage}`, {
945
+ statusCode: response.status,
946
+ response: response.data
947
+ });
948
+ }
928
949
  handleListError(response) {
929
950
  const errorData = asRecord3(response.data);
930
951
  const errorMessage = getString3(errorData.error) ?? getString3(errorData.message) ?? "Unknown error";
@@ -956,6 +977,32 @@ var SessionsResource = class {
956
977
  response: response.data
957
978
  });
958
979
  }
980
+ mapSessionInfo(raw, projectId) {
981
+ const sessionId = getString3(raw.session_id) ?? getString3(raw.id) ?? "";
982
+ return new SessionInfo({
983
+ id: sessionId,
984
+ status: getString3(raw.status) ?? "active",
985
+ apiKey: getString3(raw.api_key) ?? this.client.apiKey,
986
+ projectId: getString3(raw.project_id) ?? (projectId ?? this.client.projectId),
987
+ browserType: getString3(raw.browser_type) ?? getString3(raw.browser_mode) ?? "normal",
988
+ createdAt: getString3(raw.created_at) ?? "",
989
+ inspectUrl: getString3(raw.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
990
+ containerId: getString3(raw.container_id) ?? null,
991
+ ws: getString3(raw.ws) ?? null,
992
+ client: this.client
993
+ });
994
+ }
995
+ async _getCreatedSession(sessionId, projectId) {
996
+ try {
997
+ return await this.get(sessionId, projectId);
998
+ } catch (error) {
999
+ getLogger().warn(
1000
+ `Failed to fetch created session ${sessionId}; falling back to locally derived session fields:`,
1001
+ error
1002
+ );
1003
+ return null;
1004
+ }
1005
+ }
959
1006
  };
960
1007
 
961
1008
  // src/client.ts
@@ -1084,7 +1131,7 @@ var Lexmount = class {
1084
1131
  };
1085
1132
 
1086
1133
  // src/index.ts
1087
- var VERSION = "0.2.4";
1134
+ var VERSION = "0.2.5";
1088
1135
  export {
1089
1136
  APIError,
1090
1137
  AuthenticationError,
@@ -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 wsUrl = await this._getWebSocketDebuggerUrl(sessionId);\n const projectId = options.projectId ?? this.client.projectId;\n\n getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);\n\n return new SessionInfo({\n id: sessionId,\n status: 'active',\n apiKey: this.client.apiKey,\n projectId,\n browserType: (options.browserMode ?? 'normal') as BrowserMode,\n createdAt: new Date().toISOString(),\n inspectUrl: `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId,\n ws: wsUrl,\n client: this.client,\n });\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) => {\n const session = asRecord(item);\n const sessionId = getString(session.id) ?? '';\n return new SessionInfo({\n id: sessionId,\n status: getString(session.status) ?? 'active',\n apiKey: getString(session.api_key) ?? this.client.apiKey,\n projectId: getString(session.project_id) ?? (options.projectId ?? this.client.projectId),\n browserType: getString(session.browser_type) ?? 'normal',\n createdAt: getString(session.created_at) ?? '',\n inspectUrl:\n getString(session.inspect_url) ??\n `${this.client.baseUrl}/inspect?session_id=${sessionId}`,\n containerId: getString(session.container_id) ?? null,\n ws: getString(session.ws) ?? null,\n client: this.client,\n });\n });\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 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","/**\n * Lexmount Node.js SDK.\n */\n\nexport const VERSION = '0.2.4';\n\nexport { Lexmount } from './client';\nexport { ContextInfo, ContextListResponse, ContextsResource } from './contexts';\nexport { ExtensionInfo, ExtensionsResource } from './extensions';\nexport {\n APIError,\n AuthenticationError,\n ContextLockedError,\n ContextNotFoundError,\n LexmountError,\n NetworkError,\n SessionNotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nexport {\n LexmountLogger,\n disableLogging,\n enableLogging,\n getLogger,\n setLogLevel,\n type LogLevel,\n} from './logging';\nexport {\n PaginationInfo,\n SessionDownloadInfo,\n SessionDownloadsDeleteResponse,\n SessionDownloadsListResponse,\n SessionDownloadsResource,\n SessionInfo,\n SessionListResponse,\n 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 * 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lexmount",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Node.js SDK for Lexmount browser automation service",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",