lexmount 0.2.3 → 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
@@ -399,7 +399,6 @@ interface SessionInfoOptions {
399
399
  createdAt: string;
400
400
  inspectUrl: string;
401
401
  containerId: string | null;
402
- inspectUrlDbg?: string;
403
402
  ws?: string | null;
404
403
  client?: Lexmount;
405
404
  }
@@ -416,7 +415,6 @@ declare class SessionInfo {
416
415
  readonly createdAt: string;
417
416
  readonly inspectUrl: string;
418
417
  readonly containerId: string | null;
419
- readonly inspectUrlDbg?: string;
420
418
  readonly ws: string | null;
421
419
  private readonly client?;
422
420
  private closed;
@@ -507,6 +505,13 @@ declare class SessionsResource {
507
505
  * Create a new browser session.
508
506
  */
509
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>;
510
515
  /**
511
516
  * List sessions for the current project.
512
517
  */
@@ -523,8 +528,11 @@ declare class SessionsResource {
523
528
  _getWebSocketDebuggerUrl(sessionId: string): Promise<string | null>;
524
529
  private normalizeProxy;
525
530
  private handleCreateError;
531
+ private handleGetError;
526
532
  private handleListError;
527
533
  private handleDeleteError;
534
+ private mapSessionInfo;
535
+ private _getCreatedSession;
528
536
  }
529
537
 
530
538
  /**
@@ -659,6 +667,6 @@ declare class TimeoutError extends LexmountError {
659
667
  /**
660
668
  * Lexmount Node.js SDK.
661
669
  */
662
- declare const VERSION = "0.2.0";
670
+ declare const VERSION = "0.2.5";
663
671
 
664
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
@@ -399,7 +399,6 @@ interface SessionInfoOptions {
399
399
  createdAt: string;
400
400
  inspectUrl: string;
401
401
  containerId: string | null;
402
- inspectUrlDbg?: string;
403
402
  ws?: string | null;
404
403
  client?: Lexmount;
405
404
  }
@@ -416,7 +415,6 @@ declare class SessionInfo {
416
415
  readonly createdAt: string;
417
416
  readonly inspectUrl: string;
418
417
  readonly containerId: string | null;
419
- readonly inspectUrlDbg?: string;
420
418
  readonly ws: string | null;
421
419
  private readonly client?;
422
420
  private closed;
@@ -507,6 +505,13 @@ declare class SessionsResource {
507
505
  * Create a new browser session.
508
506
  */
509
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>;
510
515
  /**
511
516
  * List sessions for the current project.
512
517
  */
@@ -523,8 +528,11 @@ declare class SessionsResource {
523
528
  _getWebSocketDebuggerUrl(sessionId: string): Promise<string | null>;
524
529
  private normalizeProxy;
525
530
  private handleCreateError;
531
+ private handleGetError;
526
532
  private handleListError;
527
533
  private handleDeleteError;
534
+ private mapSessionInfo;
535
+ private _getCreatedSession;
528
536
  }
529
537
 
530
538
  /**
@@ -659,6 +667,6 @@ declare class TimeoutError extends LexmountError {
659
667
  /**
660
668
  * Lexmount Node.js SDK.
661
669
  */
662
- declare const VERSION = "0.2.0";
670
+ declare const VERSION = "0.2.5";
663
671
 
664
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
@@ -611,7 +611,6 @@ var SessionInfo = class {
611
611
  this.createdAt = options.createdAt;
612
612
  this.inspectUrl = options.inspectUrl;
613
613
  this.containerId = options.containerId;
614
- this.inspectUrlDbg = options.inspectUrlDbg;
615
614
  this.ws = options.ws ?? null;
616
615
  this.client = options.client;
617
616
  }
@@ -845,22 +844,40 @@ var SessionsResource = class {
845
844
  });
846
845
  }
847
846
  const containerId = getString3(result.container_id) ?? null;
848
- const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);
849
847
  const projectId = options.projectId ?? this.client.projectId;
848
+ const createdSession = await this._getCreatedSession(sessionId, projectId);
849
+ const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);
850
850
  getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);
851
851
  return new SessionInfo({
852
852
  id: sessionId,
853
- status: "active",
853
+ status: createdSession?.status ?? "active",
854
854
  apiKey: this.client.apiKey,
855
855
  projectId,
856
- browserType: options.browserMode ?? "normal",
857
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
858
- inspectUrl: `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
859
- containerId,
860
- 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,
861
861
  client: this.client
862
862
  });
863
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
+ }
864
881
  /**
865
882
  * List sessions for the current project.
866
883
  */
@@ -880,23 +897,7 @@ var SessionsResource = class {
880
897
  const result = asRecord3(response.data);
881
898
  const sessionsData = Array.isArray(result.sessions) ? result.sessions : [];
882
899
  const paginationData = asRecord3(result.pagination);
883
- const sessions = sessionsData.map((item) => {
884
- const session = asRecord3(item);
885
- const sessionId = getString3(session.id) ?? "";
886
- return new SessionInfo({
887
- id: sessionId,
888
- status: getString3(session.status) ?? "active",
889
- apiKey: getString3(session.api_key) ?? this.client.apiKey,
890
- projectId: getString3(session.project_id) ?? (options.projectId ?? this.client.projectId),
891
- browserType: getString3(session.browser_type) ?? "normal",
892
- createdAt: getString3(session.created_at) ?? "",
893
- inspectUrl: getString3(session.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
894
- containerId: getString3(session.container_id) ?? null,
895
- inspectUrlDbg: getString3(session.inspect_url_dbg),
896
- ws: getString3(session.ws) ?? null,
897
- client: this.client
898
- });
899
- });
900
+ const sessions = sessionsData.map((item) => this.mapSessionInfo(asRecord3(item), options.projectId));
900
901
  const pagination = new PaginationInfo({
901
902
  currentPage: getNumber(paginationData.currentPage) ?? 1,
902
903
  pageSize: getNumber(paginationData.pageSize) ?? sessions.length,
@@ -990,6 +991,24 @@ var SessionsResource = class {
990
991
  response: response.data
991
992
  });
992
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
+ }
993
1012
  handleListError(response) {
994
1013
  const errorData = asRecord3(response.data);
995
1014
  const errorMessage = getString3(errorData.error) ?? getString3(errorData.message) ?? "Unknown error";
@@ -1021,6 +1040,32 @@ var SessionsResource = class {
1021
1040
  response: response.data
1022
1041
  });
1023
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
+ }
1024
1069
  };
1025
1070
 
1026
1071
  // src/client.ts
@@ -1149,7 +1194,7 @@ var Lexmount = class {
1149
1194
  };
1150
1195
 
1151
1196
  // src/index.ts
1152
- var VERSION = "0.2.0";
1197
+ var VERSION = "0.2.5";
1153
1198
  // Annotate the CommonJS export names for ESM import in node:
1154
1199
  0 && (module.exports = {
1155
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.0';\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 inspectUrlDbg?: string;\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 inspectUrlDbg?: string;\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.inspectUrlDbg = options.inspectUrlDbg;\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 inspectUrlDbg: getString(session.inspect_url_dbg),\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
@@ -548,7 +548,6 @@ var SessionInfo = class {
548
548
  this.createdAt = options.createdAt;
549
549
  this.inspectUrl = options.inspectUrl;
550
550
  this.containerId = options.containerId;
551
- this.inspectUrlDbg = options.inspectUrlDbg;
552
551
  this.ws = options.ws ?? null;
553
552
  this.client = options.client;
554
553
  }
@@ -782,22 +781,40 @@ var SessionsResource = class {
782
781
  });
783
782
  }
784
783
  const containerId = getString3(result.container_id) ?? null;
785
- const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);
786
784
  const projectId = options.projectId ?? this.client.projectId;
785
+ const createdSession = await this._getCreatedSession(sessionId, projectId);
786
+ const wsUrl = await this._getWebSocketDebuggerUrl(sessionId);
787
787
  getLogger().info(`Session created successfully: id=${sessionId}, container_id=${containerId}`);
788
788
  return new SessionInfo({
789
789
  id: sessionId,
790
- status: "active",
790
+ status: createdSession?.status ?? "active",
791
791
  apiKey: this.client.apiKey,
792
792
  projectId,
793
- browserType: options.browserMode ?? "normal",
794
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
795
- inspectUrl: `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
796
- containerId,
797
- 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,
798
798
  client: this.client
799
799
  });
800
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
+ }
801
818
  /**
802
819
  * List sessions for the current project.
803
820
  */
@@ -817,23 +834,7 @@ var SessionsResource = class {
817
834
  const result = asRecord3(response.data);
818
835
  const sessionsData = Array.isArray(result.sessions) ? result.sessions : [];
819
836
  const paginationData = asRecord3(result.pagination);
820
- const sessions = sessionsData.map((item) => {
821
- const session = asRecord3(item);
822
- const sessionId = getString3(session.id) ?? "";
823
- return new SessionInfo({
824
- id: sessionId,
825
- status: getString3(session.status) ?? "active",
826
- apiKey: getString3(session.api_key) ?? this.client.apiKey,
827
- projectId: getString3(session.project_id) ?? (options.projectId ?? this.client.projectId),
828
- browserType: getString3(session.browser_type) ?? "normal",
829
- createdAt: getString3(session.created_at) ?? "",
830
- inspectUrl: getString3(session.inspect_url) ?? `${this.client.baseUrl}/inspect?session_id=${sessionId}`,
831
- containerId: getString3(session.container_id) ?? null,
832
- inspectUrlDbg: getString3(session.inspect_url_dbg),
833
- ws: getString3(session.ws) ?? null,
834
- client: this.client
835
- });
836
- });
837
+ const sessions = sessionsData.map((item) => this.mapSessionInfo(asRecord3(item), options.projectId));
837
838
  const pagination = new PaginationInfo({
838
839
  currentPage: getNumber(paginationData.currentPage) ?? 1,
839
840
  pageSize: getNumber(paginationData.pageSize) ?? sessions.length,
@@ -927,6 +928,24 @@ var SessionsResource = class {
927
928
  response: response.data
928
929
  });
929
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
+ }
930
949
  handleListError(response) {
931
950
  const errorData = asRecord3(response.data);
932
951
  const errorMessage = getString3(errorData.error) ?? getString3(errorData.message) ?? "Unknown error";
@@ -958,6 +977,32 @@ var SessionsResource = class {
958
977
  response: response.data
959
978
  });
960
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
+ }
961
1006
  };
962
1007
 
963
1008
  // src/client.ts
@@ -1086,7 +1131,7 @@ var Lexmount = class {
1086
1131
  };
1087
1132
 
1088
1133
  // src/index.ts
1089
- var VERSION = "0.2.0";
1134
+ var VERSION = "0.2.5";
1090
1135
  export {
1091
1136
  APIError,
1092
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 inspectUrlDbg?: string;\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 inspectUrlDbg?: string;\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.inspectUrlDbg = options.inspectUrlDbg;\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 inspectUrlDbg: getString(session.inspect_url_dbg),\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.0';\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":";AAIA;AAAA,EAKE;AAAA,OACK;AACP,OAAO,WAAW;AAClB,YAAY,YAAY;;;ACLjB,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO,WAAW;AAAA,EACzB;AACF;AAKO,IAAM,sBAAN,cAAkC,cAAc;AAAC;AAKjD,IAAM,uBAAN,cAAmC,cAAc;AAAC;AAKlD,IAAM,uBAAN,cAAmC,cAAc;AAAC;AAKlD,IAAM,qBAAN,cAAiC,cAAc;AAAA,EAIpD,YACE,SACA,UAA6D,CAAC,GAC9D;AACA,UAAM,UAAoB,CAAC;AAE3B,QAAI,QAAQ,iBAAiB;AAC3B,cAAQ,KAAK,sBAAsB,QAAQ,eAAe,EAAE;AAAA,IAC9D;AAEA,QAAI,OAAO,QAAQ,eAAe,UAAU;AAC1C,cAAQ,KAAK,eAAe,QAAQ,UAAU,GAAG;AAAA,IACnD;AAEA,UAAM,QAAQ,SAAS,IAAI,GAAG,OAAO,KAAK,QAAQ,KAAK,IAAI,CAAC,MAAM,OAAO;AACzE,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,aAAa,QAAQ;AAAA,EAC5B;AACF;AAKO,IAAM,WAAN,cAAuB,cAAc;AAAA,EAI1C,YAAY,SAAiB,UAAuD,CAAC,GAAG;AACtF;AAAA,MACE,OAAO,QAAQ,eAAe,WAC1B,GAAG,OAAO,UAAU,QAAQ,UAAU,MACtC;AAAA,IACN;AACA,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACF;AAKO,IAAM,eAAN,cAA2B,cAAc;AAAC;AAK1C,IAAM,kBAAN,cAA8B,cAAc;AAAC;AAK7C,IAAM,eAAN,cAA2B,cAAc;AAAC;;;AC1EjD,IAAM,cAAc;AAEpB,IAAM,qBAA+C;AAAA,EACnD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AACV;AAEA,IAAI,eAAyB;AAE7B,SAAS,WAAW,OAAkC;AACpD,SAAO,SAAS;AAClB;AAEA,SAAS,gBAAgB,MAAoB;AAC3C,SAAO,KAAK,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,QAAQ,KAAK,EAAE;AAC7D;AAEA,SAAS,UAAU,OAA0B;AAC3C,SAAO,mBAAmB,KAAK,KAAK,mBAAmB,YAAY;AACrE;AAEA,SAAS,KAAK,OAAoC,MAAuB;AACvE,MAAI,CAAC,UAAU,KAAK,GAAG;AACrB;AAAA,EACF;AAEA,QAAM,SAAS,GAAG,gBAAgB,oBAAI,KAAK,CAAC,CAAC,MAAM,WAAW,MAAM,KAAK;AAEzE,MAAI,UAAU,WAAW,UAAU,YAAY;AAC7C,YAAQ,MAAM,QAAQ,GAAG,IAAI;AAC7B;AAAA,EACF;AAEA,MAAI,UAAU,WAAW;AACvB,YAAQ,KAAK,QAAQ,GAAG,IAAI;AAC5B;AAAA,EACF;AAEA,MAAI,UAAU,QAAQ;AACpB,YAAQ,KAAK,QAAQ,GAAG,IAAI;AAC5B;AAAA,EACF;AAEA,UAAQ,MAAM,QAAQ,GAAG,IAAI;AAC/B;AAKO,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA,EAI1B,IAAI,QAAkB;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,MAAuB;AAC9B,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,QAAQ,MAAuB;AAC7B,SAAK,QAAQ,IAAI;AAAA,EACnB;AAAA,EAEA,QAAQ,MAAuB;AAC7B,SAAK,WAAW,IAAI;AAAA,EACtB;AAAA,EAEA,SAAS,MAAuB;AAC9B,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,YAAY,MAAuB;AACjC,SAAK,YAAY,IAAI;AAAA,EACvB;AACF;AAEA,IAAM,SAAS,IAAI,eAAe;AAK3B,SAAS,YAA4B;AAC1C,SAAO;AACT;AAKO,SAAS,YAAY,OAAgC;AAC1D,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM,YAAY;AAC1C,MAAI,CAAC,WAAW,eAAe,GAAG;AAChC,UAAM,IAAI;AAAA,MACR,sBAAsB,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,iBAAe;AACf,SAAO,MAAM,oBAAoB,eAAe,EAAE;AACpD;AAKO,SAAS,iBAAuB;AACrC,iBAAe;AACjB;AAKO,SAAS,cAAc,QAA2B,QAAc;AACrE,cAAY,KAAK;AACnB;;;AClHA,SAAS,SAAS,OAA4B;AAC5C,SAAO,OAAO,UAAU,YAAY,UAAU,OAAQ,QAAuB,CAAC;AAChF;AAEA,SAAS,UAAU,OAAoC;AACrD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,eAAe,OAA+B;AACrD,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,IAAI,KAAK,KAAK,EAAE,YAAY;AAAA,EACrC;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAA+B;AAC7D,MAAI,UAAU,QAAQ,UAAU,UAAU;AACxC,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,SAAS,UAAU,aAAa;AAC5C,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAKO,IAAM,cAAN,MAAkB;AAAA,EAOvB,YAAY,SAMT;AACD,SAAK,KAAK,QAAQ;AAClB,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW,QAAQ,YAAY,CAAC;AACrC,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEA,IAAI,gBAA6B;AAC/B,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,IAAI,KAAK,KAAK,SAAS;AACpC,WAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI,gBAA6B;AAC/B,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,IAAI,KAAK,KAAK,SAAS;AACpC,WAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,OAAO;AAAA,EAC/C;AAAA,EAEA,WAAoB;AAClB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AACF;AAKO,IAAM,sBAAN,MAA2D;AAAA,EAGhE,YAAY,MAAqB;AAC/B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,CAAC,OAAO,QAAQ,IAA2B;AACzC,WAAO,KAAK,KAAK,OAAO,QAAQ,EAAE;AAAA,EACpC;AAAA,EAEA,GAAG,OAAwC;AACzC,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB;AACF;AAKO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,QAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,MAAM,OAAO,UAAgC,CAAC,GAAyB;AACrE,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO;AAClC,UAAM,UAAsB;AAAA,MAC1B,SAAS,KAAK,OAAO;AAAA,MACrB,YAAY,KAAK,OAAO;AAAA,IAC1B;AAEA,QAAI,QAAQ,UAAU;AACpB,cAAQ,WAAW,QAAQ;AAAA,IAC7B;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO;AACrD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,UAAU,QAAQ;AAAA,IACrC;AAEA,UAAM,SAAS,SAAS,SAAS,IAAI;AACrC,UAAM,YAAY,UAAU,OAAO,UAAU;AAC7C,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,SAAS,8DAA8D;AAAA,QAC/E,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,IAAI,YAAY;AAAA,MAC9B,IAAI;AAAA,MACJ,QAAQ,uBAAuB,OAAO,MAAM;AAAA,MAC5C,UAAW,OAAO,YAA4C,QAAQ,YAAY,CAAC;AAAA,MACnF,WAAW,eAAe,OAAO,UAAU;AAAA,IAC7C,CAAC;AAED,cAAU,EAAE,KAAK,iCAAiC,QAAQ,EAAE,GAAG;AAC/D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,UAA8B,CAAC,GAAiC;AACzE,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO;AAClC,UAAM,UAAsB;AAAA,MAC1B,SAAS,KAAK,OAAO;AAAA,MACrB,YAAY,KAAK,OAAO;AAAA,MACxB,OAAO,QAAQ,SAAS;AAAA,IAC1B;AAEA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,SAAS,QAAQ;AAAA,IAC3B;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO;AACrD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,UAAU,MAAM;AAAA,IACnC;AAEA,UAAM,SAAS,SAAS,SAAS,IAAI;AACrC,UAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAC1C,OAAO,SAAS,IAAI,CAAC,SAAS;AAC5B,YAAM,UAAU,SAAS,IAAI;AAC7B,aAAO,IAAI,YAAY;AAAA,QACrB,IAAI,UAAU,QAAQ,UAAU,KAAK;AAAA,QACrC,QAAQ,uBAAuB,QAAQ,MAAM;AAAA,QAC7C,WAAW,eAAe,QAAQ,UAAU;AAAA,QAC5C,WAAW,eAAe,QAAQ,UAAU;AAAA,QAC5C,UAAW,QAAQ,YAA4C,CAAC;AAAA,MAClE,CAAC;AAAA,IACH,CAAC,IACD,CAAC;AAEL,cAAU,EAAE,KAAK,aAAa,SAAS,MAAM,WAAW;AACxD,WAAO,IAAI,oBAAoB,QAAQ;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,WAAyC;AACjD,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,yBAAyB,SAAS;AACpE,UAAM,UAAU;AAAA,MACd,SAAS,KAAK,OAAO;AAAA,MACrB,YAAY,KAAK,OAAO;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO;AACrD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,UAAU,OAAO,SAAS;AAAA,IAC7C;AAEA,UAAM,SAAS,SAAS,SAAS,IAAI;AACrC,UAAM,UAAU,SAAS,OAAO,OAAO;AAEvC,UAAM,cAAc,IAAI,YAAY;AAAA,MAClC,IAAI,UAAU,QAAQ,UAAU,KAAK;AAAA,MACrC,QAAQ,uBAAuB,QAAQ,MAAM;AAAA,MAC7C,UAAW,QAAQ,YAA4C,CAAC;AAAA,MAChE,WAAW,eAAe,QAAQ,UAAU;AAAA,MAC5C,WAAW,eAAe,QAAQ,UAAU;AAAA,IAC9C,CAAC;AAED,cAAU,EAAE,KAAK,sBAAsB,YAAY,EAAE,cAAc,YAAY,MAAM,GAAG;AACxF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,WAAkC;AAC7C,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,yBAAyB,SAAS;AACpE,UAAM,UAAU;AAAA,MACd,SAAS,KAAK,OAAO;AAAA,MACrB,YAAY,KAAK,OAAO;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,KAAK,OAAO;AACvD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,UAAU,UAAU,SAAS;AAAA,IAChD;AAEA,cAAU,EAAE,KAAK,iCAAiC,SAAS,GAAG;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,WAAkD;AACnE,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,yBAAyB,SAAS;AACpE,UAAM,UAAU;AAAA,MACd,SAAS,KAAK,OAAO;AAAA,MACrB,YAAY,KAAK,OAAO;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO;AACrD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,UAAU,iBAAiB,SAAS;AAAA,IACvD;AAEA,UAAM,SAAS,SAAS,SAAS,IAAI;AACrC,WAAO;AAAA,MACL,QAAQ,UAAU,OAAO,MAAM,KAAK;AAAA,MACpC,SAAS,UAAU,OAAO,OAAO,KAAK;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,YACN,UACA,WACA,WACO;AACP,UAAM,YAAY,SAAS,SAAS,IAAI;AACxC,UAAM,eACJ,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,OAAO,KAAK;AAChE,UAAM,YAAY,UAAU,UAAU,IAAI;AAC1C,UAAM,WAAW,SAAS,UAAU,QAAQ;AAE5C,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,oBAAoB,0BAA0B,YAAY,EAAE;AAAA,IACxE;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,SAAS,YAAY,KAAK,SAAS,KAAK;AAC9C,YAAM,IAAI,qBAAqB,oBAAoB,MAAM,EAAE;AAAA,IAC7D;AAEA,QAAI,SAAS,WAAW,OAAO,cAAc,kBAAkB;AAC7D,YAAM,IAAI,mBAAmB,cAAc;AAAA,QACzC,iBAAiB,UAAU,SAAS,eAAe;AAAA,QACnD,YACE,OAAO,SAAS,eAAe,WAAW,SAAS,aAAa;AAAA,MACpE,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,WAAW,OAAO,cAAc,kBAAkB;AAC7D,YAAM,IAAI;AAAA,QACR,UAAU,SAAS,aAAa,YAAY;AAAA,QAC5C;AAAA,UACE,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,YAAM,IAAI;AAAA,QACR,sCAAsC,SAAS,KAAK,YAAY,GAAG,UAAU,cAAc,OAAO,KAAK,EAAE;AAAA,QACzG;AAAA,UACE,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,qCAAqC,SAAS;AAAA,QAC9C;AAAA,UACE,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,oCAAoC,SAAS;AAAA,QAC7C;AAAA,UACE,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,gCAAgC,SAAS;AAAA,QACzC;AAAA,UACE,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,SAAS,aAAa,SAAS,aAAa,YAAY,IAAI;AAAA,MACpE,YAAY,SAAS;AAAA,MACrB,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;AC1WA,SAAS,gBAAgB;AACzB,OAAO,UAAU;AAajB,SAASA,UAAS,OAA4B;AAC5C,SAAO,OAAO,UAAU,YAAY,UAAU,OAAQ,QAAuB,CAAC;AAChF;AAEA,SAASC,WAAU,OAAoC;AACrD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAKO,IAAM,gBAAN,MAAkD;AAAA,EAOvD,YAAY,OAA2B;AACrC,SAAK,KAAK,MAAM;AAChB,SAAK,OAAO,MAAM;AAClB,SAAK,YAAY,MAAM;AACvB,SAAK,YAAY,MAAM;AACvB,SAAK,YAAY,MAAM;AAAA,EACzB;AACF;AAKO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,QAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,MAAM,OAAO,UAAkB,UAAkC,CAAC,GAA2B;AAC3F,UAAM,aAAa,MAAM,SAAS,QAAQ;AAC1C,UAAM,OAAO,IAAI,SAAS;AAC1B,UAAM,gBAAgB,QAAQ,aAAa,KAAK,OAAO;AAEvD,SAAK,OAAO,cAAc,aAAa;AACvC,QAAI,QAAQ,MAAM;AAChB,WAAK,OAAO,QAAQ,QAAQ,IAAI;AAAA,IAClC;AAEA,SAAK;AAAA,MACH;AAAA,MACA,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAAA,MAC3D,KAAK,SAAS,QAAQ;AAAA,IACxB;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC,GAAG,KAAK,OAAO,OAAO;AAAA,MACtB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,UACP,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,oBAAoB,QAAQ;AAAA,IAC/C;AAEA,cAAU,EAAE,KAAK,oCAAoC,QAAQ,EAAE;AAC/D,WAAO,KAAK,UAAU,SAAS,IAAI;AAAA,EACrC;AAAA,EAEA,MAAM,KAAK,UAAgC,CAAC,GAA6B;AACvE,UAAM,WAAW,MAAM,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,OAAO,+BAA+B;AAAA,MAC5F,YAAY,QAAQ,aAAa,KAAK,OAAO;AAAA,MAC7C,OAAO,QAAQ,SAAS;AAAA,MACxB,QAAQ,QAAQ,UAAU;AAAA,IAC5B,CAAC;AACD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,mBAAmB,QAAQ;AAAA,IAC9C;AAEA,UAAM,SAASD,UAAS,SAAS,IAAI;AACrC,UAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,OAAO,CAAC;AAC1D,WAAO,MAAM,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA,EACjD;AAAA,EAEA,MAAM,IAAI,aAAqB,WAA4C;AACzE,UAAM,WAAW,MAAM,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,OAAO,+BAA+B;AAAA,MAC5F,YAAY,aAAa,KAAK,OAAO;AAAA,MACrC,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,iBAAiB,QAAQ;AAAA,IAC5C;AAEA,WAAO,KAAK,UAAU,SAAS,IAAI;AAAA,EACrC;AAAA,EAEA,MAAM,OAAO,aAAoC;AAC/C,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC,GAAG,KAAK,OAAO,OAAO,0BAA0B,WAAW;AAAA,IAC7D;AACA,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,oBAAoB,QAAQ;AAAA,IAC/C;AAEA,cAAU,EAAE,KAAK,mCAAmC,WAAW,EAAE;AAAA,EACnE;AAAA,EAEQ,UAAU,MAA8B;AAC9C,UAAM,OAAOA,UAAS,IAAI;AAE1B,WAAO,IAAI,cAAc;AAAA,MACvB,IAAIC,WAAU,KAAK,EAAE,KAAK;AAAA,MAC1B,MAAMA,WAAU,KAAK,IAAI,KAAK;AAAA,MAC9B,WAAWA,WAAU,KAAK,UAAU,KAAK;AAAA,MACzC,WAAWA,WAAU,KAAK,UAAU;AAAA,MACpC,WAAWA,WAAU,KAAK,UAAU;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,QAAgB,UAAyC;AAC3E,UAAM,YAAYD,UAAS,SAAS,IAAI;AACxC,UAAM,eACJC,WAAU,UAAU,OAAO,KAAKA,WAAU,UAAU,KAAK,KAAK;AAEhE,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,0BAA0B,YAAY;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,IAAI,SAAS,aAAa,MAAM,KAAK,YAAY,IAAI;AAAA,MACzD,YAAY,SAAS;AAAA,MACrB,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;ACxHA,SAASC,UAAS,OAA4B;AAC5C,SAAO,OAAO,UAAU,YAAY,UAAU,OAAQ,QAAuB,CAAC;AAChF;AAEA,SAASC,WAAU,OAAoC;AACrD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,UAAU,OAAoC;AACrD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,qBAAqB,MAA0C;AACtE,MAAI,SAAS,eAAe,SAAS,cAAc;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,IAAM,iBAAN,MAAoD;AAAA,EAQzD,YAAY,OAA4B;AACtC,SAAK,cAAc,MAAM;AACzB,SAAK,WAAW,MAAM;AACtB,SAAK,aAAa,MAAM;AACxB,SAAK,aAAa,MAAM;AACxB,SAAK,cAAc,MAAM;AACzB,SAAK,cAAc,MAAM;AAAA,EAC3B;AACF;AAmBO,IAAM,cAAN,MAAkB;AAAA;AAAA,EAiBvB,YAAY,SAA6B;AAHzC,SAAQ,SAAS;AAIf,SAAK,KAAK,QAAQ;AAClB,SAAK,YAAY,QAAQ;AACzB,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ;AACzB,SAAK,cAAc,QAAQ;AAC3B,SAAK,YAAY,QAAQ;AACzB,SAAK,aAAa,QAAQ;AAC1B,SAAK,cAAc,QAAQ;AAC3B,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,KAAK,QAAQ,MAAM;AACxB,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAqB;AACvB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAA6B;AAC/B,UAAM,OAAO,IAAI,KAAK,KAAK,SAAS;AACpC,WAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAQ;AACf,gBAAU,EAAE,MAAM,WAAW,KAAK,SAAS,qBAAqB;AAChE;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,QAAQ;AAChB,gBAAU,EAAE;AAAA,QACV,wBAAwB,KAAK,SAAS;AAAA,MACxC;AACA;AAAA,IACF;AAEA,QAAI;AACF,gBAAU,EAAE,MAAM,mBAAmB,KAAK,SAAS,EAAE;AACrD,YAAM,KAAK,OAAO,SAAS,OAAO;AAAA,QAChC,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,WAAK,SAAS;AACd,gBAAU,EAAE,KAAK,mBAAmB,KAAK,SAAS,EAAE;AAAA,IACtD,SAAS,OAAO;AACd,gBAAU,EAAE,KAAK,2BAA2B,KAAK,SAAS,KAAK,KAAK;AAAA,IACtE;AAAA,EACF;AACF;AAKO,IAAM,sBAAN,MAA2D;AAAA,EAIhE,YAAY,UAAyB,YAA4B;AAC/D,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAiB;AACnB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,CAAC,OAAO,QAAQ,IAA2B;AACzC,WAAO,KAAK,SAAS,OAAO,QAAQ,EAAE;AAAA,EACxC;AAAA,EAEA,GAAG,OAAwC;AACzC,WAAO,KAAK,SAAS,KAAK;AAAA,EAC5B;AACF;AAKO,IAAM,sBAAN,MAA8D;AAAA,EASnE,YAAY,OAAiC;AAC3C,SAAK,KAAK,MAAM;AAChB,SAAK,WAAW,MAAM;AACtB,SAAK,cAAc,MAAM;AACzB,SAAK,OAAO,MAAM;AAClB,SAAK,SAAS,MAAM;AACpB,SAAK,SAAS,MAAM;AACpB,SAAK,YAAY,MAAM;AAAA,EACzB;AACF;AAKO,IAAM,+BAAN,MAAmC;AAAA,EAIxC,YAAY,WAAkC,SAA4C;AACxF,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,EACjB;AACF;AAKO,IAAM,iCAAN,MAAoF;AAAA,EAIzF,YAAY,OAA4C;AACtD,SAAK,SAAS,MAAM;AACpB,SAAK,eAAe,MAAM;AAAA,EAC5B;AACF;AAKO,IAAM,2BAAN,MAA+B;AAAA,EACpC,YAA6B,QAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,MAAM,KAAK,WAAmB,WAA2D;AACvF,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC,GAAG,KAAK,OAAO,OAAO,yBAAyB,SAAS;AAAA,MACxD;AAAA,QACE,SAAS,KAAK,OAAO;AAAA,QACrB,YAAY,aAAa,KAAK,OAAO;AAAA,MACvC;AAAA,IACF;AACA,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,0BAA0B,UAAU,SAAS;AAAA,IAChE;AAEA,UAAM,SAASD,UAAS,SAAS,IAAI;AACrC,UAAM,QAAQ,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAY,CAAC;AACpE,UAAM,YAAY,MAAM,IAAI,CAAC,SAAS;AACpC,YAAM,WAAWA,UAAS,IAAI;AAC9B,aAAO,IAAI,oBAAoB;AAAA,QAC7B,IAAIC,WAAU,SAAS,EAAE,KAAK;AAAA,QAC9B,UAAUA,WAAU,SAAS,QAAQ,KAAK;AAAA,QAC1C,aAAaA,WAAU,SAAS,YAAY,KAAK;AAAA,QACjD,MAAM,UAAU,SAAS,IAAI,KAAK;AAAA,QAClC,QAAQA,WAAU,SAAS,MAAM,KAAK;AAAA,QACtC,QAAQA,WAAU,SAAS,MAAM,KAAK;AAAA,QACtC,WAAWA,WAAU,SAAS,UAAU,KAAK;AAAA,MAC/C,CAAC;AAAA,IACH,CAAC;AACD,UAAM,UAAUD,UAAS,OAAO,OAAO;AAEvC,WAAO,IAAI,6BAA6B,WAAW;AAAA,MACjD,OAAO,UAAU,QAAQ,KAAK,KAAK,UAAU;AAAA,MAC7C,WAAW,UAAU,QAAQ,UAAU,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,WAAmB,YAAoB,WAAqC;AACpF,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC,GAAG,KAAK,OAAO,OAAO,yBAAyB,SAAS,cAAc,UAAU;AAAA,MAChF;AAAA,QACE,SAAS,KAAK,OAAO;AAAA,QACrB,YAAY,aAAa,KAAK,OAAO;AAAA,MACvC;AAAA,MACA;AAAA,QACE,cAAc;AAAA,MAChB;AAAA,IACF;AACA,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,0BAA0B,UAAU,SAAS;AAAA,IAChE;AAEA,WAAO,OAAO,KAAK,SAAS,IAAmB;AAAA,EACjD;AAAA,EAEA,MAAM,QAAQ,WAAmB,WAAqC;AACpE,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC,GAAG,KAAK,OAAO,OAAO,yBAAyB,SAAS;AAAA,MACxD;AAAA,QACE,SAAS,KAAK,OAAO;AAAA,QACrB,YAAY,aAAa,KAAK,OAAO;AAAA,MACvC;AAAA,MACA;AAAA,QACE,cAAc;AAAA,MAChB;AAAA,IACF;AACA,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,6BAA6B,UAAU,SAAS;AAAA,IACnE;AAEA,WAAO,OAAO,KAAK,SAAS,IAAmB;AAAA,EACjD;AAAA,EAEA,MAAM,OAAO,WAAmB,WAA6D;AAC3F,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC,GAAG,KAAK,OAAO,OAAO,yBAAyB,SAAS;AAAA,MACxD;AAAA,QACE,SAAS,KAAK,OAAO;AAAA,QACrB,YAAY,aAAa,KAAK,OAAO;AAAA,MACvC;AAAA,IACF;AACA,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,YAAY,4BAA4B,UAAU,SAAS;AAAA,IAClE;AAEA,UAAM,SAASA,UAAS,SAAS,IAAI;AACrC,WAAO,IAAI,+BAA+B;AAAA,MACxC,QAAQC,WAAU,OAAO,MAAM,KAAK;AAAA,MACpC,cAAc,UAAU,OAAO,aAAa,KAAK;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,QAAgB,UAAkC,WAA0B;AAC9F,UAAM,YAAYD,UAAS,SAAS,IAAI;AACxC,UAAM,eACJC,WAAU,UAAU,KAAK,KAAKA,WAAU,UAAU,OAAO,KAAK;AAEhE,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,0BAA0B,YAAY;AAAA,MACxC;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,qBAAqB,mCAAmC,SAAS,KAAK,YAAY,EAAE;AAAA,IAChG;AAEA,UAAM,IAAI,SAAS,aAAa,MAAM,KAAK,YAAY,IAAI;AAAA,MACzD,YAAY,SAAS;AAAA,MACrB,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AACF;AAUO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAA6B,QAAkB;AAAlB;AAC3B,SAAK,YAAY,IAAI,yBAAyB,MAAM;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,UAAgC,CAAC,GAAmC;AAC/E,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO;AAClC,UAAM,UAAsB;AAAA,MAC1B,SAAS,KAAK,OAAO;AAAA,MACrB,YAAY,QAAQ,aAAa,KAAK,OAAO;AAAA,MAC7C,cAAc,QAAQ,eAAe;AAAA,IACvC;AAEA,QAAI,QAAQ,SAAS;AACnB,YAAM,iBAAiB;AAAA,QACrB,IAAI,QAAQ,QAAQ;AAAA,QACpB,MAAM,qBAAqB,QAAQ,QAAQ,IAAI;AAAA,MACjD;AACA,cAAQ,UAAU;AAClB,gBAAU,EAAE;AAAA,QACV,qCAAqC,QAAQ,QAAQ,EAAE,UAAU,eAAe,IAAI;AAAA,MACtF;AAAA,IACF,OAAO;AACL,gBAAU,EAAE,MAAM,sCAAsC,QAAQ,YAAsB,EAAE;AAAA,IAC1F;AAEA,QAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC3D,cAAQ,gBAAgB,QAAQ;AAAA,IAClC;AAEA,QAAI,QAAQ,OAAO;AACjB,cAAQ,QAAQ,KAAK,eAAe,QAAQ,KAAK;AAAA,IACnD;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO;AACrD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,kBAAkB,QAAQ;AAAA,IACjC;AAEA,UAAM,SAASD,UAAS,SAAS,IAAI;AACrC,UAAM,YAAYC,WAAU,OAAO,UAAU;AAC7C,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,SAAS,8DAA8D;AAAA,QAC/E,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,cAAcA,WAAU,OAAO,YAAY,KAAK;AACtD,UAAM,QAAQ,MAAM,KAAK,yBAAyB,SAAS;AAC3D,UAAM,YAAY,QAAQ,aAAa,KAAK,OAAO;AAEnD,cAAU,EAAE,KAAK,oCAAoC,SAAS,kBAAkB,WAAW,EAAE;AAE7F,WAAO,IAAI,YAAY;AAAA,MACrB,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,QAAQ,KAAK,OAAO;AAAA,MACpB;AAAA,MACA,aAAc,QAAQ,eAAe;AAAA,MACrC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,YAAY,GAAG,KAAK,OAAO,OAAO,uBAAuB,SAAS;AAAA,MAClE;AAAA,MACA,IAAI;AAAA,MACJ,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,UAA8B,CAAC,GAAiC;AACzE,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO;AAClC,UAAM,UAAsB;AAAA,MAC1B,SAAS,KAAK,OAAO;AAAA,MACrB,YAAY,QAAQ,aAAa,KAAK,OAAO;AAAA,IAC/C;AAEA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,SAAS,QAAQ;AAAA,IAC3B;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO;AACrD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,gBAAgB,QAAQ;AAAA,IAC/B;AAEA,UAAM,SAASD,UAAS,SAAS,IAAI;AACrC,UAAM,eAAe,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AACzE,UAAM,iBAAiBA,UAAS,OAAO,UAAU;AAEjD,UAAM,WAAW,aAAa,IAAI,CAAC,SAAS;AAC1C,YAAM,UAAUA,UAAS,IAAI;AAC7B,YAAM,YAAYC,WAAU,QAAQ,EAAE,KAAK;AAC3C,aAAO,IAAI,YAAY;AAAA,QACrB,IAAI;AAAA,QACJ,QAAQA,WAAU,QAAQ,MAAM,KAAK;AAAA,QACrC,QAAQA,WAAU,QAAQ,OAAO,KAAK,KAAK,OAAO;AAAA,QAClD,WAAWA,WAAU,QAAQ,UAAU,MAAM,QAAQ,aAAa,KAAK,OAAO;AAAA,QAC9E,aAAaA,WAAU,QAAQ,YAAY,KAAK;AAAA,QAChD,WAAWA,WAAU,QAAQ,UAAU,KAAK;AAAA,QAC5C,YACEA,WAAU,QAAQ,WAAW,KAC7B,GAAG,KAAK,OAAO,OAAO,uBAAuB,SAAS;AAAA,QACxD,aAAaA,WAAU,QAAQ,YAAY,KAAK;AAAA,QAChD,eAAeA,WAAU,QAAQ,eAAe;AAAA,QAChD,IAAIA,WAAU,QAAQ,EAAE,KAAK;AAAA,QAC7B,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAED,UAAM,aAAa,IAAI,eAAe;AAAA,MACpC,aAAa,UAAU,eAAe,WAAW,KAAK;AAAA,MACtD,UAAU,UAAU,eAAe,QAAQ,KAAK,SAAS;AAAA,MACzD,YAAY,UAAU,eAAe,UAAU,KAAK,SAAS;AAAA,MAC7D,YAAY,UAAU,eAAe,UAAU,KAAK;AAAA,MACpD,aAAa,UAAU,eAAe,WAAW,KAAK;AAAA,MACtD,aAAa,UAAU,eAAe,WAAW,KAAK;AAAA,IACxD,CAAC;AAED,cAAU,EAAE;AAAA,MACV,aAAa,SAAS,MAAM,qBAAqB,WAAW,UAAU,aAAa,WAAW,WAAW,aAAa,WAAW,WAAW;AAAA,IAC9I;AAEA,WAAO,IAAI,oBAAoB,UAAU,UAAU;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAA8C;AACzD,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO;AAClC,UAAM,UAAU;AAAA,MACd,SAAS,KAAK,OAAO;AAAA,MACrB,YAAY,QAAQ,aAAa,KAAK,OAAO;AAAA,MAC7C,YAAY,QAAQ;AAAA,IACtB;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,KAAK,OAAO;AACvD,QAAI,SAAS,UAAU,KAAK;AAC1B,WAAK,kBAAkB,UAAU,QAAQ,SAAS;AAAA,IACpD;AAEA,cAAU,EAAE,KAAK,iCAAiC,QAAQ,SAAS,EAAE;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,yBAAyB,WAA2C;AACxE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO,KAAK,GAAG,KAAK,OAAO,OAAO,iBAAiB;AAAA,QAC7E,YAAY;AAAA,MACd,CAAC;AAED,UAAI,SAAS,UAAU,KAAK;AAC1B,kBAAU,EAAE,MAAM,yCAAyC,SAAS,IAAI;AACxE,eAAO;AAAA,MACT;AAEA,YAAM,SAASD,UAAS,SAAS,IAAI;AACrC,aACEC,WAAU,OAAO,+BAA+B,KAChDA,WAAU,OAAO,oBAAoB,KACrC;AAAA,IAEJ,SAAS,OAAO;AACd,gBAAU,EAAE,MAAM,yCAAyC,KAAK;AAChE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,OAAuC;AAC5D,QAAI,CAAC,MAAM,QAAQ;AACjB,YAAM,IAAI,gBAAgB,iDAAiD;AAAA,IAC7E;AAEA,UAAM,kBAA8B;AAAA,MAClC,MAAM,MAAM,QAAQ;AAAA,MACpB,QAAQ,MAAM;AAAA,IAChB;AAEA,QAAI,MAAM,UAAU;AAClB,sBAAgB,WAAW,MAAM;AAAA,IACnC;AAEA,QAAI,MAAM,UAAU;AAClB,sBAAgB,WAAW,MAAM;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,UAAyC;AACjE,UAAM,YAAYD,UAAS,SAAS,IAAI;AACxC,UAAM,eACJC,WAAU,UAAU,KAAK,KAAKA,WAAU,UAAU,OAAO,KAAK;AAChE,UAAM,YAAYA,WAAU,UAAU,IAAI;AAC1C,UAAM,WAAWD,UAAS,UAAU,QAAQ;AAE5C,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,0BAA0B,YAAY;AAAA,MACxC;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,OAAO,cAAc,qBAAqB;AAChE,YAAM,IAAI,qBAAqB,sBAAsB,YAAY,EAAE;AAAA,IACrE;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,qBAAqB,uBAAuB,YAAY,EAAE;AAAA,IACtE;AAEA,QAAI,SAAS,WAAW,OAAO,cAAc,kBAAkB;AAC7D,YAAM,IAAI,mBAAmB,cAAc;AAAA,QACzC,iBAAiBC,WAAU,SAAS,eAAe;AAAA,QACnD,YAAY,UAAU,SAAS,UAAU;AAAA,MAC3C,CAAC;AAAA,IACH;AAEA,UAAM,IAAI,SAAS,6BAA6B,YAAY,IAAI;AAAA,MAC9D,YAAY,SAAS;AAAA,MACrB,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAgB,UAAyC;AAC/D,UAAM,YAAYD,UAAS,SAAS,IAAI;AACxC,UAAM,eACJC,WAAU,UAAU,KAAK,KAAKA,WAAU,UAAU,OAAO,KAAK;AAEhE,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,0BAA0B,YAAY;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,IAAI,SAAS,4BAA4B,YAAY,IAAI;AAAA,MAC7D,YAAY,SAAS;AAAA,MACrB,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB,UAAkC,WAA0B;AACpF,UAAM,YAAYD,UAAS,SAAS,IAAI;AACxC,UAAM,eACJC,WAAU,UAAU,KAAK,KAAKA,WAAU,UAAU,OAAO,KAAK;AAEhE,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,0BAA0B,YAAY;AAAA,MACxC;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,sBAAsB,YAAY,iBAAiB,SAAS;AAAA,MAC9D;AAAA,IACF;AAEA,UAAM,IAAI,SAAS,6BAA6B,YAAY,IAAI;AAAA,MAC9D,YAAY,SAAS;AAAA,MACrB,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;AL9mBO,cAAO;AAKP,IAAM,WAAN,MAAe;AAAA,EAiCpB,YAAYC,UAAyB,CAAC,GAAG;AACvC,SAAK,SAASA,QAAO,UAAU,QAAQ,IAAI,oBAAoB;AAC/D,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,SAAK,YAAYA,QAAO,aAAa,QAAQ,IAAI,uBAAuB;AACxE,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,SAAK,WACHA,QAAO,WACP,QAAQ,IAAI,qBACZ,2BACA,QAAQ,OAAO,EAAE;AAEnB,QAAIA,QAAO,UAAU;AACnB,kBAAYA,QAAO,QAAQ;AAAA,IAC7B;AAEA,SAAK,aAAa,MAAM,OAAO;AAAA,MAC7B,SAASA,QAAO,WAAW;AAAA,MAC3B,gBAAgB,MAAM;AAAA,IACxB,CAAC;AAED,SAAK,WAAW,IAAI,iBAAiB,IAAI;AACzC,SAAK,WAAW,IAAI,iBAAiB,IAAI;AACzC,SAAK,aAAa,IAAI,mBAAmB,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MACJ,KACA,MACAA,UAA6B,CAAC,GACH;AAC3B,WAAO,KAAK,QAAW,QAAQ,KAAK,EAAE,GAAGA,SAAQ,KAAK,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KACJ,KACA,QACAA,UAA6B,CAAC,GACH;AAC3B,WAAO,KAAK,QAAW,OAAO,KAAK,EAAE,GAAGA,SAAQ,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QACJ,KACA,MACAA,UAA6B,CAAC,GACH;AAC3B,WAAO,KAAK,QAAW,UAAU,KAAK,EAAE,GAAGA,SAAQ,KAAK,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAc;AACZ,cAAU,EAAE,MAAM,yBAAyB;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAmB;AACjB,WAAO,uBAAuB,KAAK,SAAS,eAAe,KAAK,OAAO;AAAA,EACzE;AAAA,EAEA,MAAc,QACZ,QACA,KACAA,SAC2B;AAC3B,UAAMC,UAAS,UAAU;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,IAAAA,QAAO,MAAM,GAAG,MAAM,eAAe,GAAG,EAAE;AAE1C,QAAI;AACF,YAAM,UAAU;AAAA,QACd,SAAS,KAAK;AAAA,QACd,YAAY,KAAK;AAAA,QACjB,GAAG,KAAK,kBAAkBD,QAAO,IAAI;AAAA,QACrC,GAAIA,QAAO,WAAW,CAAC;AAAA,MACzB;AAEA,YAAM,WAAW,MAAM,KAAK,WAAW,QAAW;AAAA,QAChD;AAAA,QACA;AAAA,QACA,GAAGA;AAAA,QACH;AAAA,MACF,CAAC;AAED,YAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,MAAAC,QAAO,MAAM,GAAG,MAAM,qBAAqB,SAAS,MAAM,cAAc,QAAQ,QAAQ,CAAC,CAAC,IAAI;AAC9F,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,YAAM,KAAK,sBAAsB,OAAO,OAAO;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,sBAAsB,OAAgB,WAA0B;AACtE,UAAMA,UAAS,UAAU;AAEzB,QAAI,CAAC,aAAa,KAAK,GAAG;AACxB,MAAAA,QAAO,MAAM,kCAAkC,UAAU,QAAQ,CAAC,CAAC,OAAO,KAAK;AAC/E,aAAO,IAAI,SAAS,yBAAyB,EAAE,UAAU,MAAM,CAAC;AAAA,IAClE;AAEA,UAAM,aAAa;AAEnB,QAAI,WAAW,SAAS,gBAAgB;AACtC,MAAAA,QAAO,MAAM,yBAAyB,UAAU,QAAQ,CAAC,CAAC,OAAO,WAAW,OAAO;AACnF,aAAO,IAAI,aAAa,sBAAsB,WAAW,OAAO,EAAE;AAAA,IACpE;AAEA,QAAI,WAAW,UAAU;AACvB,MAAAA,QAAO,MAAM,oBAAoB,UAAU,QAAQ,CAAC,CAAC,OAAO,WAAW,OAAO;AAC9E,aAAO,IAAI,SAAS,eAAe,WAAW,OAAO,IAAI;AAAA,QACvD,YAAY,WAAW,SAAS;AAAA,QAChC,UAAU,WAAW,SAAS;AAAA,MAChC,CAAC;AAAA,IACH;AAEA,IAAAA,QAAO,MAAM,uBAAuB,UAAU,QAAQ,CAAC,CAAC,OAAO,WAAW,OAAO;AACjF,WAAO,IAAI,aAAa,kBAAkB,WAAW,OAAO,EAAE;AAAA,EAChE;AAAA,EAEQ,kBAAkB,MAAuC;AAC/D,QAAI,OAAO,SAAS,aAAa;AAC/B,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,OAAO,aAAa,eAAe,gBAAgB,UAAU;AAC/D,aAAO,CAAC;AAAA,IACV;AAEA,WAAO;AAAA,MACL,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;;;AMzNO,IAAM,UAAU;","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.3",
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",