{"version":3,"sources":["../src/core/errors.ts","../src/core/client.ts","../src/geolocation/client.ts","../src/geolocation/ciphertext.ts","../src/risk-profile/client.ts","../src/compliance/types.ts","../src/compliance/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Error hierarchy for CGS SDK\n *\n * Provides structured error handling with specific error types\n * for different failure scenarios.\n */\n\nexport class CGSError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public statusCode?: number,\n    public details?: Record<string, unknown>\n  ) {\n    super(message);\n    this.name = 'CGSError';\n    Object.setPrototypeOf(this, CGSError.prototype);\n  }\n}\n\nexport class NetworkError extends CGSError {\n  constructor(message: string, public originalError?: unknown) {\n    super(message, 'NETWORK_ERROR', undefined, { originalError });\n    this.name = 'NetworkError';\n    Object.setPrototypeOf(this, NetworkError.prototype);\n  }\n}\n\nexport class ValidationError extends CGSError {\n  constructor(message: string, fields?: string[]) {\n    super(message, 'VALIDATION_ERROR', 400, { fields });\n    this.name = 'ValidationError';\n    Object.setPrototypeOf(this, ValidationError.prototype);\n  }\n}\n\nexport class ServiceUnavailableError extends CGSError {\n  constructor(service: string) {\n    super(`${service} is unavailable`, 'SERVICE_UNAVAILABLE', 503, { service });\n    this.name = 'ServiceUnavailableError';\n    Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n  }\n}\n\nexport class ComplianceBlockedError extends CGSError {\n  constructor(reasons: string[]) {\n    super('Access blocked due to compliance rules', 'COMPLIANCE_BLOCKED', 403, { reasons });\n    this.name = 'ComplianceBlockedError';\n    Object.setPrototypeOf(this, ComplianceBlockedError.prototype);\n  }\n}\n\nexport class AuthenticationError extends CGSError {\n  constructor(message: string = 'Authentication failed') {\n    super(message, 'AUTHENTICATION_ERROR', 401);\n    this.name = 'AuthenticationError';\n    Object.setPrototypeOf(this, AuthenticationError.prototype);\n  }\n}\n\nexport class RateLimitError extends CGSError {\n  constructor(public retryAfter?: number) {\n    super('Rate limit exceeded', 'RATE_LIMIT_EXCEEDED', 429, { retryAfter });\n    this.name = 'RateLimitError';\n    Object.setPrototypeOf(this, RateLimitError.prototype);\n  }\n}\n\nexport class TimeoutError extends CGSError {\n  constructor(public timeout: number) {\n    super(`Request timeout after ${timeout}ms`, 'TIMEOUT', 408, { timeout });\n    this.name = 'TimeoutError';\n    Object.setPrototypeOf(this, TimeoutError.prototype);\n  }\n}\n\nexport class ComplianceError extends CGSError {\n  constructor(\n    message: string,\n    public originalError?: unknown,\n    code: string = 'COMPLIANCE_ERROR'\n  ) {\n    super(message, code, undefined, { originalError });\n    this.name = 'ComplianceError';\n    Object.setPrototypeOf(this, ComplianceError.prototype);\n  }\n}\n","/**\n * Base HTTP client for all CGS SDK clients\n *\n * Provides common functionality:\n * - Request/response handling\n * - Error handling\n * - Retry logic with exponential backoff\n * - Timeout management\n * - Debug logging\n */\n\nimport type { BaseClientConfig, RequiredBaseClientConfig } from './config';\nimport {\n  CGSError,\n  NetworkError,\n  TimeoutError,\n  AuthenticationError,\n  RateLimitError,\n  ServiceUnavailableError,\n} from './errors';\n\nexport abstract class BaseClient {\n  protected config: RequiredBaseClientConfig;\n\n  constructor(config: BaseClientConfig) {\n    this.config = {\n      baseURL: config.baseURL,\n      tenantId: config.tenantId,\n      apiKey: config.apiKey || '',\n      headers: config.headers || {},\n      timeout: config.timeout || 10000,\n      retries: config.retries || 3,\n      debug: config.debug || false,\n    };\n  }\n\n  /**\n   * Make an HTTP request with timeout and error handling\n   */\n  protected async request<T>(\n    endpoint: string,\n    options: RequestInit = {},\n    serviceURL?: string\n  ): Promise<T> {\n    const url = `${serviceURL || this.config.baseURL}${endpoint}`;\n\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      'X-Tenant-ID': this.config.tenantId,\n      ...this.config.headers,\n      ...((options.headers as Record<string, string>) || {}),\n    };\n\n    if (this.config.apiKey) {\n      headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n    }\n\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n    try {\n      if (this.config.debug) {\n        console.log(`[CGS SDK] ${options.method || 'GET'} ${url}`, {\n          headers,\n          body: options.body,\n        });\n      }\n\n      const response = await fetch(url, {\n        ...options,\n        headers,\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      const data = await response.json();\n\n      if (!response.ok) {\n        this.handleErrorResponse(response.status, data);\n      }\n\n      if (this.config.debug) {\n        console.log(`[CGS SDK] Response:`, data);\n      }\n\n      return data as T;\n    } catch (error) {\n      clearTimeout(timeoutId);\n\n      if (error instanceof Error) {\n        if (error.name === 'AbortError') {\n          throw new TimeoutError(this.config.timeout);\n        }\n        if (error instanceof CGSError) {\n          throw error;\n        }\n      }\n\n      throw new NetworkError('Network request failed', error);\n    }\n  }\n\n  /**\n   * Make an HTTP request with retry logic\n   */\n  protected async requestWithRetry<T>(\n    endpoint: string,\n    options: RequestInit = {},\n    serviceURL?: string,\n    retries: number = this.config.retries\n  ): Promise<T> {\n    let lastError: Error | undefined;\n\n    for (let attempt = 0; attempt <= retries; attempt++) {\n      try {\n        return await this.request<T>(endpoint, options, serviceURL);\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error('Unknown error');\n\n        // Don't retry on client errors (4xx) or authentication errors\n        if (\n          lastError instanceof CGSError &&\n          lastError.statusCode &&\n          lastError.statusCode >= 400 &&\n          lastError.statusCode < 500\n        ) {\n          throw lastError;\n        }\n\n        // Don't retry on last attempt\n        if (attempt === retries) {\n          break;\n        }\n\n        // Exponential backoff with jitter\n        const delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 1000, 10000);\n        await new Promise((resolve) => setTimeout(resolve, delay));\n\n        if (this.config.debug) {\n          console.log(`[CGS SDK] Retry attempt ${attempt + 1}/${retries} after ${delay.toFixed(0)}ms`);\n        }\n      }\n    }\n\n    throw new NetworkError(`Request failed after ${retries} retries`, lastError);\n  }\n\n  /**\n   * Handle error responses from API\n   */\n  protected handleErrorResponse(status: number, data: any): never {\n    const message = data.error || data.message || `HTTP ${status}`;\n\n    switch (status) {\n      case 400:\n        throw new CGSError(message, 'BAD_REQUEST', 400, data);\n      case 401:\n        throw new AuthenticationError(message);\n      case 403:\n        throw new CGSError(message, 'FORBIDDEN', 403, data);\n      case 404:\n        throw new CGSError(message, 'NOT_FOUND', 404, data);\n      case 429:\n        const retryAfter = data.retry_after || data.retryAfter;\n        throw new RateLimitError(retryAfter);\n      case 500:\n      case 502:\n      case 503:\n      case 504:\n        throw new ServiceUnavailableError(message);\n      default:\n        throw new CGSError(message, 'UNKNOWN_ERROR', status, data);\n    }\n  }\n\n  /**\n   * Build query string from parameters\n   */\n  protected buildQueryString(params: Record<string, unknown>): string {\n    const query = new URLSearchParams();\n\n    Object.entries(params).forEach(([key, value]) => {\n      if (value !== undefined && value !== null) {\n        if (Array.isArray(value)) {\n          value.forEach((item) => query.append(key, String(item)));\n        } else {\n          query.append(key, String(value));\n        }\n      }\n    });\n\n    const queryString = query.toString();\n    return queryString ? `?${queryString}` : '';\n  }\n\n  /**\n   * Update client configuration\n   */\n  updateConfig(config: Partial<BaseClientConfig>): void {\n    this.config = {\n      ...this.config,\n      ...config,\n      headers: {\n        ...this.config.headers,\n        ...(config.headers || {}),\n      },\n    };\n  }\n\n  /**\n   * Get current configuration (readonly)\n   */\n  getConfig(): Readonly<BaseClientConfig> {\n    return { ...this.config };\n  }\n\n  /**\n   * Health check endpoint\n   */\n  async healthCheck(): Promise<{ status: string; timestamp: string }> {\n    return this.request('/api/v1/health');\n  }\n}\n","/**\n * GeolocationClient - TypeScript SDK for CGS Geolocation & Compliance Service\n *\n * Provides type-safe methods to interact with the geolocation service API.\n * Extends BaseClient for consistent retry logic, timeout handling, and error management.\n */\n\nimport { BaseClient } from '../core/client';\nimport type { BaseClientConfig } from '../core/config';\nimport type {\n  GeolocationClientConfig,\n  VerifyIPRequest,\n  LocationVerification,\n  ComplianceCheckResponse,\n  GeolocationAlert,\n  AlertFilters,\n  PaginationParams,\n  AlertListResponse,\n  DashboardMetrics,\n  JurisdictionConfig,\n  CreateJurisdictionRequest,\n  UpdateJurisdictionRequest,\n  GeofenceRule,\n  CreateGeofenceRuleRequest,\n  UpdateGeofenceRuleRequest,\n  DeviceFingerprint,\n  GeolocationRecord,\n  AlertStatus,\n  // Location Request Types\n  LocationRequest,\n  CreateLocationRequestRequest,\n  LocationRequestResult,\n  LocationRequestFilters,\n  LocationRequestListResponse,\n  ResendLocationRequestRequest,\n  LocationShareInfo,\n  LocationCaptureRequest,\n  LocationCaptureResponse,\n  // CipherText Types\n  ValidateCipherTextRequest,\n  ValidateCipherTextResponse,\n  CipherTextReason,\n} from './types';\n\n/**\n * GeolocationClient extends BaseClient for:\n * - Consistent retry logic with exponential backoff\n * - Unified error handling (CGSError, NetworkError, TimeoutError, etc.)\n * - Automatic timeout management\n * - Debug logging\n *\n * All geolocation verification calls use requestWithRetry() to handle\n * transient failures gracefully.\n */\nexport class GeolocationClient extends BaseClient {\n  constructor(config: GeolocationClientConfig) {\n    // Convert GeolocationClientConfig to BaseClientConfig\n    const baseConfig: BaseClientConfig = {\n      baseURL: config.baseURL,\n      tenantId: config.tenantId,\n      apiKey: config.apiKey,\n      headers: config.headers,\n      timeout: config.timeout,\n      retries: 3, // Default retry count for geolocation calls\n      debug: config.debug,\n    };\n    super(baseConfig);\n  }\n\n  // ============================================================================\n  // IP Verification & Compliance\n  // ============================================================================\n\n  /**\n   * Verify an IP address and check compliance\n   *\n   * Uses requestWithRetry() for automatic retry on transient failures.\n   *\n   * @param request - Verification request with IP, user ID, event type, and optional device fingerprint\n   * @returns Location verification result with risk assessment\n   *\n   * @example\n   * ```typescript\n   * const result = await client.verifyIP({\n   *   ip_address: \"8.8.8.8\",\n   *   user_id: \"user_123\",\n   *   event_type: \"login\",\n   *   device_fingerprint: {\n   *     device_id: \"device_abc\",\n   *     user_agent: navigator.userAgent,\n   *     platform: \"web\"\n   *   }\n   * });\n   *\n   * if (result.is_blocked) {\n   *   console.log(\"Access blocked:\", result.risk_reasons);\n   * }\n   * ```\n   */\n  async verifyIP(request: VerifyIPRequest): Promise<LocationVerification> {\n    // Use requestWithRetry for critical verification calls\n    return this.requestWithRetry<LocationVerification>('/api/v1/geo/verify', {\n      method: 'POST',\n      body: JSON.stringify(request),\n    });\n  }\n\n  /**\n   * Check compliance for a specific country\n   *\n   * @param countryISO - ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\")\n   * @returns Jurisdiction configuration and compliance status\n   *\n   * @example\n   * ```typescript\n   * const compliance = await client.checkCompliance(\"KP\"); // North Korea\n   * if (!compliance.is_compliant) {\n   *   console.log(\"Country is not allowed:\", compliance.jurisdiction?.status);\n   * }\n   * ```\n   */\n  async checkCompliance(countryISO: string): Promise<ComplianceCheckResponse> {\n    return this.requestWithRetry<ComplianceCheckResponse>(\n      `/api/v1/geo/check-compliance`,\n      {\n        method: 'POST',\n        body: JSON.stringify({ country_iso: countryISO }),\n      }\n    );\n  }\n\n  // ============================================================================\n  // CipherText Validation\n  // ============================================================================\n\n  /**\n   * Validate a cipherText generated by the frontend SDK\n   *\n   * The cipherText contains encrypted device fingerprint and optional location data.\n   * This method decrypts and validates the data, returning device info, location,\n   * and risk assessment.\n   *\n   * @param cipherText - The encrypted cipherText string from generateCipherText()\n   * @param userId - User ID associated with this verification\n   * @param eventType - Reason for verification (login, registration, etc.)\n   * @param expectedIP - Optional expected IP address for additional validation\n   * @returns Validation result with device info, location, and risk assessment\n   *\n   * @example\n   * ```typescript\n   * // Validate cipherText during login\n   * const result = await client.validateCipherText(\n   *   cipherText,\n   *   \"user_123\",\n   *   \"login\"\n   * );\n   *\n   * if (!result.valid) {\n   *   console.log(\"CipherText validation failed:\", result.errors);\n   *   return;\n   * }\n   *\n   * console.log(\"Device UUID:\", result.device_uuid);\n   * console.log(\"IP Address:\", result.ip_address);\n   * console.log(\"Risk Level:\", result.risk.level);\n   *\n   * if (result.risk.is_vpn) {\n   *   console.log(\"VPN detected\");\n   * }\n   * ```\n   */\n  async validateCipherText(\n    cipherText: string,\n    userId: string,\n    eventType: CipherTextReason,\n    expectedIP?: string\n  ): Promise<ValidateCipherTextResponse> {\n    const request: ValidateCipherTextRequest = {\n      cipher_text: cipherText,\n      user_id: userId,\n      event_type: eventType,\n      expected_ip: expectedIP,\n    };\n\n    return this.requestWithRetry<ValidateCipherTextResponse>(\n      '/api/v1/geo/validate-ciphertext',\n      {\n        method: 'POST',\n        body: JSON.stringify(request),\n      }\n    );\n  }\n\n  /**\n   * Validate cipherText and verify IP in a single call\n   *\n   * Combines cipherText validation with IP verification for complete\n   * location and device verification in one request.\n   *\n   * @param cipherText - The encrypted cipherText string\n   * @param ipAddress - Client IP address\n   * @param userId - User ID\n   * @param eventType - Event type (login, registration, etc.)\n   * @returns Combined validation and verification result\n   *\n   * @example\n   * ```typescript\n   * const result = await client.validateAndVerify(\n   *   cipherText,\n   *   clientIP,\n   *   \"user_123\",\n   *   \"registration\"\n   * );\n   *\n   * if (!result.ciphertext_valid) {\n   *   throw new Error(\"Device verification failed\");\n   * }\n   *\n   * if (result.location.is_blocked) {\n   *   throw new Error(\"Location not allowed\");\n   * }\n   * ```\n   */\n  async validateAndVerify(\n    cipherText: string,\n    ipAddress: string,\n    userId: string,\n    eventType: CipherTextReason\n  ): Promise<{\n    ciphertext_valid: boolean;\n    ciphertext_result: ValidateCipherTextResponse;\n    location: LocationVerification;\n  }> {\n    // First validate cipherText to get device info\n    const cipherTextResult = await this.validateCipherText(\n      cipherText,\n      userId,\n      eventType,\n      ipAddress\n    );\n\n    // Then verify IP with device fingerprint from cipherText\n    const locationResult = await this.verifyIP({\n      ip_address: ipAddress,\n      user_id: userId,\n      event_type: eventType,\n      device_fingerprint: cipherTextResult.valid && cipherTextResult.device\n        ? {\n            device_id: cipherTextResult.device_uuid,\n            user_agent: '',\n            platform: cipherTextResult.device.platform,\n            browser: cipherTextResult.device.browser,\n            os: cipherTextResult.device.os,\n          }\n        : undefined,\n    });\n\n    return {\n      ciphertext_valid: cipherTextResult.valid,\n      ciphertext_result: cipherTextResult,\n      location: locationResult,\n    };\n  }\n\n  /**\n   * Get location history for a user\n   *\n   * @param userId - User ID to retrieve history for\n   * @param limit - Maximum number of records to return (default: 100)\n   * @returns Array of geolocation records\n   */\n  async getUserLocationHistory(\n    userId: string,\n    limit: number = 100\n  ): Promise<GeolocationRecord[]> {\n    return this.request<GeolocationRecord[]>(\n      `/api/v1/geo/user/?user_id=${userId}&limit=${limit}`\n    );\n  }\n\n  // ============================================================================\n  // Alert Management\n  // ============================================================================\n\n  /**\n   * Get a specific alert by ID\n   *\n   * @param alertId - Alert ID\n   * @returns Alert details\n   */\n  async getAlert(alertId: string): Promise<GeolocationAlert> {\n    return this.request<GeolocationAlert>(`/api/v1/alerts/${alertId}`);\n  }\n\n  /**\n   * List alerts with filters and pagination\n   *\n   * @param filters - Optional filters (status, severity, type, user, dates)\n   * @param pagination - Optional pagination (page, page_size)\n   * @returns Paginated list of alerts\n   *\n   * @example\n   * ```typescript\n   * const alerts = await client.listAlerts(\n   *   { status: \"active\", severity: \"critical\" },\n   *   { page: 1, page_size: 20 }\n   * );\n   * console.log(`Found ${alerts.total} critical alerts`);\n   * ```\n   */\n  async listAlerts(\n    filters?: AlertFilters,\n    pagination?: PaginationParams\n  ): Promise<AlertListResponse> {\n    const params: Record<string, unknown> = {\n      ...filters,\n      ...pagination,\n    };\n\n    return this.request<AlertListResponse>(`/api/v1/alerts${this.buildQueryString(params)}`);\n  }\n\n  /**\n   * Update alert status\n   *\n   * @param alertId - Alert ID\n   * @param status - New status\n   */\n  async updateAlertStatus(alertId: string, status: AlertStatus): Promise<void> {\n    await this.request(`/api/v1/alerts/${alertId}/status`, {\n      method: 'PUT',\n      body: JSON.stringify({ status }),\n    });\n  }\n\n  /**\n   * Assign an alert to an analyst\n   *\n   * @param alertId - Alert ID\n   * @param assignedTo - User ID to assign to\n   */\n  async assignAlert(alertId: string, assignedTo: string): Promise<void> {\n    await this.request(`/api/v1/alerts/${alertId}/assign`, {\n      method: 'POST',\n      body: JSON.stringify({ assigned_to: assignedTo }),\n    });\n  }\n\n  /**\n   * Resolve an alert\n   *\n   * @param alertId - Alert ID\n   * @param resolution - Resolution type\n   * @param notes - Optional notes\n   */\n  async resolveAlert(\n    alertId: string,\n    resolution: string,\n    notes?: string\n  ): Promise<void> {\n    await this.request(`/api/v1/alerts/${alertId}/resolve`, {\n      method: 'POST',\n      body: JSON.stringify({ resolution, notes }),\n    });\n  }\n\n  /**\n   * Dismiss an alert as false positive\n   *\n   * @param alertId - Alert ID\n   * @param notes - Optional notes explaining why it's a false positive\n   */\n  async dismissAlert(alertId: string, notes?: string): Promise<void> {\n    await this.request(`/api/v1/alerts/${alertId}/dismiss`, {\n      method: 'POST',\n      body: JSON.stringify({ notes }),\n    });\n  }\n\n  /**\n   * Escalate an alert to higher severity or different assignee\n   *\n   * @param alertId - Alert ID\n   * @param assignedTo - New assignee user ID\n   * @param severity - New severity level\n   * @param notes - Escalation notes\n   */\n  async escalateAlert(\n    alertId: string,\n    assignedTo: string,\n    severity: string,\n    notes: string\n  ): Promise<void> {\n    await this.request(`/api/v1/alerts/${alertId}/escalate`, {\n      method: 'POST',\n      body: JSON.stringify({ assigned_to: assignedTo, severity, notes }),\n    });\n  }\n\n  /**\n   * Block an alert (mark as blocked)\n   *\n   * @param alertId - Alert ID\n   * @param notes - Optional notes\n   */\n  async blockAlert(alertId: string, notes?: string): Promise<void> {\n    await this.request(`/api/v1/alerts/${alertId}/block`, {\n      method: 'POST',\n      body: JSON.stringify({ notes }),\n    });\n  }\n\n  /**\n   * Get dashboard metrics\n   *\n   * @param timeRangeHours - Time range in hours (default: 24)\n   * @returns Dashboard metrics and statistics\n   *\n   * @example\n   * ```typescript\n   * const metrics = await client.getDashboardMetrics(168); // Last 7 days\n   * console.log(`${metrics.critical_alerts} critical alerts in last week`);\n   * ```\n   */\n  async getDashboardMetrics(timeRangeHours: number = 24): Promise<DashboardMetrics> {\n    return this.request<DashboardMetrics>(\n      `/api/v1/alerts/metrics?time_range_hours=${timeRangeHours}`\n    );\n  }\n\n  // ============================================================================\n  // Jurisdiction Configuration\n  // ============================================================================\n\n  /**\n   * List all jurisdiction configurations\n   *\n   * @returns Array of jurisdiction configurations\n   */\n  async listJurisdictions(): Promise<JurisdictionConfig[]> {\n    return this.request<JurisdictionConfig[]>('/api/v1/jurisdictions');\n  }\n\n  /**\n   * Get a jurisdiction configuration by ID\n   *\n   * @param jurisdictionId - Jurisdiction ID\n   * @returns Jurisdiction configuration\n   */\n  async getJurisdiction(jurisdictionId: string): Promise<JurisdictionConfig> {\n    return this.request<JurisdictionConfig>(`/api/v1/jurisdictions/${jurisdictionId}`);\n  }\n\n  /**\n   * Create a new jurisdiction configuration\n   *\n   * @param request - Jurisdiction configuration data\n   * @returns Created jurisdiction\n   *\n   * @example\n   * ```typescript\n   * const jurisdiction = await client.createJurisdiction({\n   *   country_iso: \"US\",\n   *   country_name: \"United States\",\n   *   status: \"allowed\",\n   *   risk_level: \"low\",\n   *   allow_login: true,\n   *   allow_registration: true,\n   *   allow_transactions: true,\n   *   require_kyc: false,\n   *   require_enhanced_verification: false\n   * });\n   * ```\n   */\n  async createJurisdiction(request: CreateJurisdictionRequest): Promise<JurisdictionConfig> {\n    return this.request<JurisdictionConfig>('/api/v1/jurisdictions', {\n      method: 'POST',\n      body: JSON.stringify(request),\n    });\n  }\n\n  /**\n   * Update a jurisdiction configuration\n   *\n   * @param jurisdictionId - Jurisdiction ID\n   * @param request - Updated fields\n   * @returns Updated jurisdiction\n   */\n  async updateJurisdiction(\n    jurisdictionId: string,\n    request: UpdateJurisdictionRequest\n  ): Promise<JurisdictionConfig> {\n    return this.request<JurisdictionConfig>(`/api/v1/jurisdictions/${jurisdictionId}`, {\n      method: 'PUT',\n      body: JSON.stringify(request),\n    });\n  }\n\n  /**\n   * Delete a jurisdiction configuration\n   *\n   * @param jurisdictionId - Jurisdiction ID\n   */\n  async deleteJurisdiction(jurisdictionId: string): Promise<void> {\n    await this.request(`/api/v1/jurisdictions/${jurisdictionId}`, {\n      method: 'DELETE',\n    });\n  }\n\n  // ============================================================================\n  // Geofence Rules\n  // ============================================================================\n\n  /**\n   * List all geofence rules\n   *\n   * @returns Array of geofence rules\n   */\n  async listGeofenceRules(): Promise<GeofenceRule[]> {\n    return this.request<GeofenceRule[]>('/api/v1/geofence-rules');\n  }\n\n  /**\n   * Get a geofence rule by ID\n   *\n   * @param ruleId - Geofence rule ID\n   * @returns Geofence rule\n   */\n  async getGeofenceRule(ruleId: string): Promise<GeofenceRule> {\n    return this.request<GeofenceRule>(`/api/v1/geofence-rules/${ruleId}`);\n  }\n\n  /**\n   * Create a new geofence rule\n   *\n   * @param request - Geofence rule data\n   * @returns Created geofence rule\n   *\n   * @example\n   * ```typescript\n   * const rule = await client.createGeofenceRule({\n   *   name: \"Block High Risk Countries\",\n   *   rule_type: \"block_list\",\n   *   action: \"block\",\n   *   countries: [\"KP\", \"IR\", \"SY\"],\n   *   event_types: [\"login\", \"transaction\"],\n   *   priority: 100\n   * });\n   * ```\n   */\n  async createGeofenceRule(request: CreateGeofenceRuleRequest): Promise<GeofenceRule> {\n    return this.request<GeofenceRule>('/api/v1/geofence-rules', {\n      method: 'POST',\n      body: JSON.stringify(request),\n    });\n  }\n\n  /**\n   * Update a geofence rule\n   *\n   * @param ruleId - Geofence rule ID\n   * @param request - Updated fields\n   * @returns Updated geofence rule\n   */\n  async updateGeofenceRule(\n    ruleId: string,\n    request: UpdateGeofenceRuleRequest\n  ): Promise<GeofenceRule> {\n    return this.request<GeofenceRule>(`/api/v1/geofence-rules/${ruleId}`, {\n      method: 'PUT',\n      body: JSON.stringify(request),\n    });\n  }\n\n  /**\n   * Delete a geofence rule\n   *\n   * @param ruleId - Geofence rule ID\n   */\n  async deleteGeofenceRule(ruleId: string): Promise<void> {\n    await this.request(`/api/v1/geofence-rules/${ruleId}`, {\n      method: 'DELETE',\n    });\n  }\n\n  // ============================================================================\n  // Device Fingerprinting\n  // ============================================================================\n\n  /**\n   * Get all devices for a user\n   *\n   * @param userId - User ID\n   * @returns Array of device fingerprints\n   */\n  async getUserDevices(userId: string): Promise<DeviceFingerprint[]> {\n    return this.request<DeviceFingerprint[]>(`/api/v1/devices/user/?user_id=${userId}`);\n  }\n\n  /**\n   * Get a specific device by device ID\n   *\n   * @param deviceId - Device ID\n   * @returns Device fingerprint\n   */\n  async getDevice(deviceId: string): Promise<DeviceFingerprint> {\n    return this.request<DeviceFingerprint>(`/api/v1/devices/?device_id=${deviceId}`);\n  }\n\n  /**\n   * Update device trust status\n   *\n   * @param deviceId - Device ID\n   * @param action - \"trust\" or \"untrust\"\n   *\n   * @example\n   * ```typescript\n   * // Mark a device as trusted\n   * await client.updateDeviceTrust(\"device_abc\", \"trust\");\n   *\n   * // Mark a device as untrusted\n   * await client.updateDeviceTrust(\"device_xyz\", \"untrust\");\n   * ```\n   */\n  async updateDeviceTrust(\n    deviceId: string,\n    action: 'trust' | 'untrust'\n  ): Promise<void> {\n    await this.request(`/api/v1/devices/?device_id=${deviceId}&action=${action}`, {\n      method: 'POST',\n    });\n  }\n\n  // ============================================================================\n  // Location Request (Live Location Tracking)\n  // ============================================================================\n\n  /**\n   * Create a location request to get customer's live location\n   *\n   * @param request - Location request details\n   * @returns Location request result with share link\n   *\n   * @example\n   * ```typescript\n   * const result = await client.createLocationRequest({\n   *   user_id: \"customer_123\",\n   *   channel: \"sms\",\n   *   phone: \"+1234567890\",\n   *   reason: \"Verification for high-value transaction\"\n   * });\n   *\n   * console.log(`Share link sent: ${result.share_link}`);\n   * console.log(`Expires at: ${result.token_expiry}`);\n   * ```\n   */\n  async createLocationRequest(\n    request: CreateLocationRequestRequest\n  ): Promise<LocationRequestResult> {\n    return this.request<LocationRequestResult>('/api/v1/location-requests', {\n      method: 'POST',\n      body: JSON.stringify(request),\n    });\n  }\n\n  /**\n   * Get a location request by ID\n   *\n   * @param requestId - Location request ID\n   * @returns Location request details\n   */\n  async getLocationRequest(requestId: string): Promise<LocationRequest> {\n    return this.request<LocationRequest>(`/api/v1/location-requests/${requestId}`);\n  }\n\n  /**\n   * List location requests with filters and pagination\n   *\n   * @param filters - Optional filters\n   * @param pagination - Optional pagination\n   * @returns Paginated list of location requests\n   *\n   * @example\n   * ```typescript\n   * const requests = await client.listLocationRequests(\n   *   { status: \"completed\", user_id: \"customer_123\" },\n   *   { page: 1, limit: 20 }\n   * );\n   * ```\n   */\n  async listLocationRequests(\n    filters?: LocationRequestFilters,\n    pagination?: PaginationParams\n  ): Promise<LocationRequestListResponse> {\n    const params: Record<string, unknown> = {\n      ...filters,\n      ...pagination,\n    };\n\n    return this.request<LocationRequestListResponse>(\n      `/api/v1/location-requests${this.buildQueryString(params)}`\n    );\n  }\n\n  /**\n   * Cancel a pending location request\n   *\n   * @param requestId - Location request ID\n   */\n  async cancelLocationRequest(requestId: string): Promise<void> {\n    await this.request(`/api/v1/location-requests/${requestId}/cancel`, {\n      method: 'POST',\n    });\n  }\n\n  /**\n   * Resend notification for a location request\n   *\n   * @param requestId - Location request ID\n   * @param contact - Email or phone to send to\n   */\n  async resendLocationRequest(\n    requestId: string,\n    contact: ResendLocationRequestRequest\n  ): Promise<void> {\n    await this.request(`/api/v1/location-requests/${requestId}/resend`, {\n      method: 'POST',\n      body: JSON.stringify(contact),\n    });\n  }\n\n  // ============================================================================\n  // Location Share (Customer-facing - for SDK integration in customer apps)\n  // ============================================================================\n\n  /**\n   * Get location share info (customer-facing)\n   * This is called from the customer's device to get request details\n   *\n   * @param token - Secure token from share link\n   * @returns Location share info\n   */\n  async getLocationShareInfo(token: string): Promise<LocationShareInfo> {\n    return this.request<LocationShareInfo>(`/api/v1/location/share/${token}`);\n  }\n\n  /**\n   * Submit location capture (customer-facing)\n   * This is called from the customer's device to submit their location\n   *\n   * @param token - Secure token from share link\n   * @param capture - Location capture data (GPS or WiFi)\n   * @returns Capture response\n   *\n   * @example\n   * ```typescript\n   * // Using GPS (preferred)\n   * const result = await client.captureLocation(token, {\n   *   latitude: 37.7749,\n   *   longitude: -122.4194,\n   *   accuracy: 10\n   * });\n   *\n   * // Using WiFi positioning (fallback)\n   * const result = await client.captureLocation(token, {\n   *   wifi_networks: [\n   *     { macAddress: \"00:11:22:33:44:55\", signalStrength: -50 },\n   *     { macAddress: \"AA:BB:CC:DD:EE:FF\", signalStrength: -70 }\n   *   ]\n   * });\n   * ```\n   */\n  async captureLocation(\n    token: string,\n    capture: LocationCaptureRequest\n  ): Promise<LocationCaptureResponse> {\n    return this.request<LocationCaptureResponse>(`/api/v1/location/share/${token}`, {\n      method: 'POST',\n      body: JSON.stringify(capture),\n    });\n  }\n\n  // ============================================================================\n  // Utility Methods (inherited from BaseClient: healthCheck, updateConfig, getConfig, buildQueryString)\n  // ============================================================================\n}\n","/**\n * CipherText Generation Utility\n *\n * Collects device fingerprint and location data from the browser,\n * encrypts it into a cipherText that can be validated by the server.\n *\n * The cipherText is used for:\n * - Registration verification\n * - Login verification\n * - Transaction verification\n * - Periodic location checks\n */\n\nimport type {\n  CipherTextPayload,\n  CipherTextOptions,\n  CipherTextResult,\n  CipherTextReason,\n} from './types';\n\nconst SDK_VERSION = '2.0.8';\nconst CIPHER_TEXT_EXPIRY_MINUTES = 5;\n\n/**\n * Generate a unique device ID that persists across sessions\n */\nfunction getOrCreateDeviceId(): string {\n  if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n    return generateUUID();\n  }\n\n  const storageKey = 'cgs_device_id';\n  let deviceId = localStorage.getItem(storageKey);\n\n  if (!deviceId) {\n    deviceId = generateUUID();\n    localStorage.setItem(storageKey, deviceId);\n  }\n\n  return deviceId;\n}\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n  if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n    return crypto.randomUUID();\n  }\n\n  // Fallback for older browsers\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\n/**\n * Detect browser information from user agent\n */\nfunction getBrowserInfo(): { browser: string; browser_version: string; os: string; os_version: string } {\n  if (typeof navigator === 'undefined') {\n    return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n  }\n\n  const ua = navigator.userAgent;\n  let browser = 'unknown';\n  let browserVersion = '';\n  let os = 'unknown';\n  let osVersion = '';\n\n  // Detect browser\n  if (ua.includes('Firefox/')) {\n    browser = 'Firefox';\n    browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Edg/')) {\n    browser = 'Edge';\n    browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Chrome/')) {\n    browser = 'Chrome';\n    browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n    browser = 'Safari';\n    browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n    browser = 'Opera';\n    browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n  }\n\n  // Detect OS\n  if (ua.includes('Windows')) {\n    os = 'Windows';\n    if (ua.includes('Windows NT 10.0')) osVersion = '10';\n    else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n    else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n    else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n  } else if (ua.includes('Mac OS X')) {\n    os = 'macOS';\n    osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n  } else if (ua.includes('Linux')) {\n    os = 'Linux';\n  } else if (ua.includes('Android')) {\n    os = 'Android';\n    osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n  } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n    os = 'iOS';\n    osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n  }\n\n  return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n\n/**\n * Get WebGL renderer information for fingerprinting\n */\nfunction getWebGLInfo(): { vendor: string; renderer: string } | null {\n  if (typeof document === 'undefined') return null;\n\n  try {\n    const canvas = document.createElement('canvas');\n    const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n    if (!gl) return null;\n\n    const debugInfo = (gl as WebGLRenderingContext).getExtension('WEBGL_debug_renderer_info');\n    if (!debugInfo) return null;\n\n    return {\n      vendor: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '',\n      renderer: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '',\n    };\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Get network information if available\n */\nfunction getNetworkInfo(): CipherTextPayload['network'] | undefined {\n  if (typeof navigator === 'undefined') return undefined;\n\n  const connection = (navigator as any).connection ||\n    (navigator as any).mozConnection ||\n    (navigator as any).webkitConnection;\n\n  if (!connection) return undefined;\n\n  return {\n    effective_type: connection.effectiveType,\n    downlink: connection.downlink,\n    rtt: connection.rtt,\n    save_data: connection.saveData,\n  };\n}\n\n/**\n * Request GPS location from the browser\n */\nasync function requestGPSLocation(\n  timeout: number = 10000,\n  highAccuracy: boolean = true\n): Promise<CipherTextPayload['location'] | null> {\n  if (typeof navigator === 'undefined' || !navigator.geolocation) {\n    return null;\n  }\n\n  return new Promise((resolve) => {\n    navigator.geolocation.getCurrentPosition(\n      (position) => {\n        resolve({\n          latitude: position.coords.latitude,\n          longitude: position.coords.longitude,\n          accuracy: position.coords.accuracy,\n          altitude: position.coords.altitude ?? undefined,\n          altitude_accuracy: position.coords.altitudeAccuracy ?? undefined,\n          heading: position.coords.heading ?? undefined,\n          speed: position.coords.speed ?? undefined,\n          timestamp: position.timestamp,\n        });\n      },\n      () => {\n        // Location denied or error - resolve with null (non-fatal)\n        resolve(null);\n      },\n      {\n        enableHighAccuracy: highAccuracy,\n        timeout: timeout,\n        maximumAge: 0,\n      }\n    );\n  });\n}\n\n/**\n * Collect device fingerprint data\n */\nfunction collectDeviceData(includeWebGL: boolean): CipherTextPayload['device'] {\n  const browserInfo = getBrowserInfo();\n  const webglInfo = includeWebGL ? getWebGLInfo() : null;\n\n  return {\n    device_id: getOrCreateDeviceId(),\n    user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n    platform: typeof navigator !== 'undefined' ? navigator.platform : '',\n    browser: browserInfo.browser,\n    browser_version: browserInfo.browser_version,\n    os: browserInfo.os,\n    os_version: browserInfo.os_version,\n    screen_resolution:\n      typeof screen !== 'undefined' ? `${screen.width}x${screen.height}` : undefined,\n    language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n    timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone,\n    color_depth: typeof screen !== 'undefined' ? screen.colorDepth : undefined,\n    hardware_concurrency:\n      typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : undefined,\n    device_memory: typeof navigator !== 'undefined' ? (navigator as any).deviceMemory : undefined,\n    touch_support:\n      typeof navigator !== 'undefined' ? navigator.maxTouchPoints > 0 : undefined,\n    webgl_vendor: webglInfo?.vendor,\n    webgl_renderer: webglInfo?.renderer,\n  };\n}\n\n/**\n * Encode payload to base64\n */\nfunction encodePayload(payload: CipherTextPayload): string {\n  const json = JSON.stringify(payload);\n\n  if (typeof btoa !== 'undefined') {\n    // Browser\n    return btoa(unescape(encodeURIComponent(json)));\n  } else if (typeof Buffer !== 'undefined') {\n    // Node.js\n    return Buffer.from(json, 'utf-8').toString('base64');\n  }\n\n  throw new Error('No base64 encoding method available');\n}\n\n/**\n * Simple XOR cipher for obfuscation (not cryptographic security)\n * The actual security comes from HTTPS and server-side validation\n */\nfunction obfuscate(data: string, key: string): string {\n  let result = '';\n  for (let i = 0; i < data.length; i++) {\n    result += String.fromCharCode(data.charCodeAt(i) ^ key.charCodeAt(i % key.length));\n  }\n  return result;\n}\n\n/**\n * Generate a cipherText containing encrypted device and location data\n *\n * @param options - Options for cipherText generation\n * @returns CipherText result with the encrypted string\n *\n * @example\n * ```typescript\n * // Basic usage for login\n * const result = await generateCipherText({ reason: 'login' });\n * console.log(result.cipherText);\n *\n * // With GPS location for registration\n * const result = await generateCipherText({\n *   reason: 'registration',\n *   requestLocation: true,\n *   locationTimeout: 15000\n * });\n *\n * if (result.locationCaptured) {\n *   console.log('GPS location included');\n * }\n * ```\n */\nexport async function generateCipherText(options: CipherTextOptions): Promise<CipherTextResult> {\n  const warnings: string[] = [];\n\n  // Collect device data\n  const deviceData = collectDeviceData(options.includeWebGL !== false);\n\n  // Optionally request GPS location\n  let locationData: CipherTextPayload['location'] | undefined;\n  if (options.requestLocation) {\n    const location = await requestGPSLocation(\n      options.locationTimeout || 10000,\n      options.highAccuracy !== false\n    );\n\n    if (location) {\n      locationData = location;\n    } else {\n      warnings.push('GPS location not available or permission denied');\n    }\n  }\n\n  // Collect network info\n  let networkData: CipherTextPayload['network'] | undefined;\n  if (options.includeNetworkInfo !== false) {\n    networkData = getNetworkInfo();\n  }\n\n  // Build payload\n  const now = new Date();\n  const expiry = new Date(now.getTime() + CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000);\n\n  const payload: CipherTextPayload = {\n    device: deviceData,\n    location: locationData,\n    network: networkData,\n    metadata: {\n      collected_at: now.toISOString(),\n      sdk_version: SDK_VERSION,\n      collection_reason: options.reason,\n      page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n      referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n    },\n  };\n\n  // Encode payload (no obfuscation - HTTPS provides transport security)\n  const encoded = encodePayload(payload);\n\n  // Create final cipherText with version and timestamp prefix\n  // Format: version.timestamp.base64(json)\n  const version = '01'; // CipherText format version\n  const timestamp = now.getTime().toString(36); // Base36 timestamp\n  const cipherText = `${version}.${timestamp}.${encoded}`;\n\n  return {\n    cipherText,\n    locationCaptured: !!locationData,\n    warnings: warnings.length > 0 ? warnings : undefined,\n    generatedAt: now.toISOString(),\n    expiresAt: expiry.toISOString(),\n  };\n}\n\n/**\n * Decode a cipherText (for debugging/testing - not for production use)\n * In production, decryption happens on the server\n */\nexport function decodeCipherText(cipherText: string): CipherTextPayload | null {\n  try {\n    const parts = cipherText.split('.');\n    if (parts.length !== 3) return null;\n\n    const [version, timestampB36, obfuscatedB64] = parts;\n    if (version !== '01') return null;\n\n    const timestamp = parseInt(timestampB36, 36);\n    const obfuscated = atob(obfuscatedB64);\n\n    // We need the device_id to reconstruct the key, which we can get from localStorage\n    const deviceId = getOrCreateDeviceId();\n    const obfuscationKey = `cgs_${timestamp}_${deviceId.slice(0, 8)}`;\n\n    const encoded = obfuscate(obfuscated, obfuscationKey); // XOR is symmetric\n    const json = decodeURIComponent(escape(atob(encoded)));\n\n    return JSON.parse(json) as CipherTextPayload;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Check if a cipherText is expired\n */\nexport function isCipherTextExpired(cipherText: string): boolean {\n  try {\n    const parts = cipherText.split('.');\n    if (parts.length !== 3) return true;\n\n    const timestampB36 = parts[1];\n    const timestamp = parseInt(timestampB36, 36);\n    const now = Date.now();\n    const expiryMs = CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000;\n\n    return now - timestamp > expiryMs;\n  } catch {\n    return true;\n  }\n}\n\n/**\n * React hook for generating cipherText\n *\n * @example\n * ```tsx\n * function LoginForm() {\n *   const { generate, isGenerating, error } = useCipherText();\n *\n *   const handleLogin = async () => {\n *     const result = await generate({ reason: 'login' });\n *     if (result) {\n *       await loginMutation({ email, password, cipherText: result.cipherText });\n *     }\n *   };\n * }\n * ```\n */\nexport function useCipherText() {\n  // This is a simple wrapper that can be used in React components\n  // Import useState and useCallback from React when using\n\n  const generate = async (options: CipherTextOptions): Promise<CipherTextResult | null> => {\n    try {\n      return await generateCipherText(options);\n    } catch (error) {\n      console.error('[CGS SDK] Failed to generate cipherText:', error);\n      return null;\n    }\n  };\n\n  return { generate };\n}\n\n// Re-export types\nexport type { CipherTextPayload, CipherTextOptions, CipherTextResult, CipherTextReason };\n","/**\n * RiskProfileClient - Customer Risk Profile Management\n *\n * Provides methods to create, retrieve, and manage customer risk profiles\n * in the CGS Compliance Platform.\n */\n\nimport { BaseClient } from '../core/client';\nimport type { BaseClientConfig } from '../core/config';\nimport type {\n  CustomerProfile,\n  CreateProfileRequest,\n  UpdateProfileRequest,\n  ProfileDetailsResponse,\n  ProfileFilters,\n  ProfileListResponse,\n  RiskDashboardMetrics,\n  RiskConfiguration,\n} from './types';\n\nexport class RiskProfileClient extends BaseClient {\n  constructor(config: BaseClientConfig) {\n    super(config);\n  }\n\n  // ============================================================================\n  // Profile Management\n  // ============================================================================\n\n  /**\n   * Create a new customer risk profile\n   *\n   * @param request - Profile creation data\n   * @returns Created customer profile\n   *\n   * @example\n   * ```typescript\n   * const profile = await client.createProfile({\n   *   customer_id: 'CUST-12345',\n   *   entity_type: 'individual',\n   *   customer_status: 'active',\n   *   full_name: 'John Doe',\n   *   email_address: 'john@example.com',\n   *   date_of_birth: '1990-01-15',\n   *   country_of_residence: 'US'\n   * });\n   * ```\n   */\n  async createProfile(request: CreateProfileRequest): Promise<CustomerProfile> {\n    return this.request<CustomerProfile>('/api/v1/profiles', {\n      method: 'POST',\n      body: JSON.stringify(request),\n    });\n  }\n\n  /**\n   * Get customer profile by customer ID\n   *\n   * Note: This searches for the profile using the customer_id field.\n   * Returns the first matching profile for the tenant.\n   *\n   * @param customerId - Customer ID to search for\n   * @returns Customer profile\n   *\n   * @example\n   * ```typescript\n   * const profile = await client.getProfile('CUST-12345');\n   * console.log('Risk score:', profile.risk_score);\n   * ```\n   */\n  async getProfile(customerId: string): Promise<CustomerProfile> {\n    const response = await this.queryProfiles({\n      search: customerId,\n      page: 1,\n      page_size: 1,\n    });\n\n    if (response.data.length === 0) {\n      throw new Error(`Profile not found for customer ID: ${customerId}`);\n    }\n\n    return response.data[0];\n  }\n\n  /**\n   * Get profile by UUID\n   *\n   * @param profileId - Profile UUID\n   * @returns Customer profile\n   */\n  async getProfileById(profileId: string): Promise<CustomerProfile> {\n    // Note: The dashboard endpoint provides detailed profile view\n    const details = await this.getProfileDetails(profileId);\n    return details.profile;\n  }\n\n  /**\n   * Get detailed profile information including risk factors and history\n   *\n   * @param profileId - Profile UUID\n   * @returns Detailed profile response with risk factors and history\n   *\n   * @example\n   * ```typescript\n   * const details = await client.getProfileDetails(profileId);\n   * console.log('Risk factors:', details.risk_factors);\n   * console.log('Risk history:', details.risk_history);\n   * console.log('Alert counts:', {\n   *   watchlist: details.watchlist_alert_count,\n   *   fraud: details.fraud_alert_count,\n   *   geo: details.geolocation_alert_count\n   * });\n   * ```\n   */\n  async getProfileDetails(profileId: string): Promise<ProfileDetailsResponse> {\n    return this.request<ProfileDetailsResponse>(\n      `/api/v1/risk-dashboard/profiles/${profileId}`\n    );\n  }\n\n  /**\n   * Update customer profile\n   *\n   * @param profileId - Profile UUID\n   * @param updates - Fields to update\n   * @returns Updated customer profile\n   *\n   * @example\n   * ```typescript\n   * const updated = await client.updateProfile(profileId, {\n   *   location: 'New York, USA',\n   *   location_compliance: 'compliant',\n   *   last_recorded_activity: new Date().toISOString()\n   * });\n   * ```\n   */\n  async updateProfile(\n    profileId: string,\n    updates: UpdateProfileRequest\n  ): Promise<CustomerProfile> {\n    return this.request<CustomerProfile>(`/api/v1/profiles/${profileId}`, {\n      method: 'PUT',\n      body: JSON.stringify(updates),\n    });\n  }\n\n  /**\n   * Manually recalculate risk score for a profile\n   *\n   * Triggers immediate risk score recalculation based on current risk factors.\n   *\n   * @param profileId - Profile UUID\n   * @param reason - Optional reason for recalculation\n   *\n   * @example\n   * ```typescript\n   * await client.recalculateRiskScore(profileId, 'Manual review completed');\n   * ```\n   */\n  async recalculateRiskScore(profileId: string, reason?: string): Promise<void> {\n    const body = reason ? JSON.stringify({ reason }) : undefined;\n    await this.request(`/api/v1/profiles/recalculate/${profileId}`, {\n      method: 'POST',\n      body,\n    });\n  }\n\n  // ============================================================================\n  // Query & Search\n  // ============================================================================\n\n  /**\n   * Query profiles with advanced filters\n   *\n   * @param filters - Filter criteria and pagination\n   * @returns Paginated list of profiles\n   *\n   * @example\n   * ```typescript\n   * const results = await client.queryProfiles({\n   *   risk_category: ['high', 'critical'],\n   *   kyc_status: ['pending'],\n   *   is_pep: true,\n   *   page: 1,\n   *   page_size: 20,\n   *   sort_by: 'risk_score',\n   *   sort_order: 'desc'\n   * });\n   *\n   * console.log(`Found ${results.total} high-risk profiles`);\n   * results.data.forEach(profile => {\n   *   console.log(`${profile.full_name}: ${profile.risk_score}`);\n   * });\n   * ```\n   */\n  async queryProfiles(filters: ProfileFilters = {}): Promise<ProfileListResponse> {\n    const queryString = this.buildQueryString(filters as Record<string, unknown>);\n    return this.request<ProfileListResponse>(\n      `/api/v1/risk-dashboard/profiles${queryString}`\n    );\n  }\n\n  /**\n   * Search profiles by text (searches name, email, customer_id, account_number)\n   *\n   * @param searchText - Text to search for\n   * @param limit - Maximum results to return (default: 10)\n   * @returns Array of matching profiles\n   */\n  async searchProfiles(searchText: string, limit: number = 10): Promise<CustomerProfile[]> {\n    const response = await this.queryProfiles({\n      search: searchText,\n      page: 1,\n      page_size: limit,\n    });\n    return response.data;\n  }\n\n  /**\n   * Get all high-risk profiles (high + critical)\n   *\n   * @param limit - Maximum results to return (default: 50)\n   * @returns Array of high-risk profiles\n   */\n  async getHighRiskProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n    const response = await this.queryProfiles({\n      risk_category: ['high', 'critical'],\n      page: 1,\n      page_size: limit,\n      sort_by: 'risk_score',\n      sort_order: 'desc',\n    });\n    return response.data;\n  }\n\n  /**\n   * Get profiles requiring PEP review\n   *\n   * @param limit - Maximum results to return (default: 50)\n   * @returns Array of PEP profiles\n   */\n  async getPEPProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n    const response = await this.queryProfiles({\n      is_pep: true,\n      page: 1,\n      page_size: limit,\n    });\n    return response.data;\n  }\n\n  /**\n   * Get profiles with sanctions matches\n   *\n   * @param limit - Maximum results to return (default: 50)\n   * @returns Array of sanctioned profiles\n   */\n  async getSanctionedProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n    const response = await this.queryProfiles({\n      has_sanctions: true,\n      page: 1,\n      page_size: limit,\n    });\n    return response.data;\n  }\n\n  // ============================================================================\n  // Dashboard & Metrics\n  // ============================================================================\n\n  /**\n   * Get risk dashboard metrics and statistics\n   *\n   * @param startDate - Optional start date for metrics (ISO format)\n   * @param endDate - Optional end date for metrics (ISO format)\n   * @returns Dashboard metrics\n   *\n   * @example\n   * ```typescript\n   * const metrics = await client.getDashboardMetrics();\n   * console.log('Total risky profiles:', metrics.total_risky_profiles);\n   * console.log('Critical profiles:', metrics.total_critical_profiles);\n   * console.log('Average risk score:', metrics.average_risk_score);\n   *\n   * metrics.risk_distribution.forEach(item => {\n   *   console.log(`${item.category}: ${item.count} (${item.percentage}%)`);\n   * });\n   * ```\n   */\n  async getDashboardMetrics(\n    startDate?: string,\n    endDate?: string\n  ): Promise<RiskDashboardMetrics> {\n    const params: Record<string, string> = {};\n    if (startDate) params.start_date = startDate;\n    if (endDate) params.end_date = endDate;\n\n    const queryString = this.buildQueryString(params);\n    return this.request<RiskDashboardMetrics>(\n      `/api/v1/risk-dashboard/metrics${queryString}`\n    );\n  }\n\n  // ============================================================================\n  // Bulk Operations\n  // ============================================================================\n\n  /**\n   * Get or create profile (idempotent operation)\n   *\n   * Attempts to get existing profile by customer_id, creates if not found.\n   *\n   * @param customerId - Customer ID\n   * @param createRequest - Profile data to use if creating new profile\n   * @returns Existing or newly created profile\n   *\n   * @example\n   * ```typescript\n   * const profile = await client.getOrCreateProfile('CUST-123', {\n   *   customer_id: 'CUST-123',\n   *   entity_type: 'individual',\n   *   full_name: 'John Doe',\n   *   email_address: 'john@example.com'\n   * });\n   * ```\n   */\n  async getOrCreateProfile(\n    customerId: string,\n    createRequest: CreateProfileRequest\n  ): Promise<CustomerProfile> {\n    try {\n      return await this.getProfile(customerId);\n    } catch (error) {\n      // Profile doesn't exist, create it\n      return await this.createProfile(createRequest);\n    }\n  }\n\n  /**\n   * Batch get profiles by customer IDs\n   *\n   * @param customerIds - Array of customer IDs\n   * @returns Array of profiles (may be less than input if some not found)\n   */\n  async batchGetProfiles(customerIds: string[]): Promise<CustomerProfile[]> {\n    // Note: Current API doesn't have batch endpoint, so we query with search\n    // In production, this should use a dedicated batch endpoint\n    const profiles: CustomerProfile[] = [];\n\n    for (const customerId of customerIds) {\n      try {\n        const profile = await this.getProfile(customerId);\n        profiles.push(profile);\n      } catch (error) {\n        // Profile not found, skip\n        if (this.config.debug) {\n          console.warn(`[RiskProfileClient] Profile not found for: ${customerId}`);\n        }\n      }\n    }\n\n    return profiles;\n  }\n\n  // ============================================================================\n  // Configuration\n  // ============================================================================\n\n  /**\n   * Get risk configuration for tenant\n   *\n   * Returns the risk scoring weights and thresholds configured for the tenant.\n   *\n   * @returns Risk configuration\n   */\n  async getRiskConfiguration(): Promise<RiskConfiguration> {\n    return this.request<RiskConfiguration>('/api/v1/risk-config');\n  }\n\n  /**\n   * Update risk configuration for tenant\n   *\n   * Updates risk scoring weights and/or thresholds.\n   *\n   * @param config - Configuration updates\n   * @returns Updated risk configuration\n   */\n  async updateRiskConfiguration(\n    config: Partial<RiskConfiguration>\n  ): Promise<RiskConfiguration> {\n    return this.request<RiskConfiguration>('/api/v1/risk-config', {\n      method: 'PUT',\n      body: JSON.stringify(config),\n    });\n  }\n}\n","/**\n * Compliance orchestration types\n *\n * Types for unified compliance verification flows that combine\n * geolocation verification with customer risk profiling.\n */\n\nimport type { LocationVerification, DeviceFingerprintRequest } from '../geolocation/types';\nimport type { CustomerProfile, EntityType } from '../risk-profile/types';\n\n// ============================================================================\n// Registration Verification Types\n// ============================================================================\n\nexport interface RegistrationVerificationRequest {\n  // Identity\n  customerId: string;\n  fullName: string;\n  emailAddress: string;\n  phoneNumber?: string;\n  dateOfBirth?: string;\n  address?: string;\n  entityType?: EntityType;\n\n  // Geolocation\n  ipAddress: string;\n  deviceFingerprint?: DeviceFingerprintRequest;\n\n  // Additional data\n  metadata?: Record<string, unknown>;\n}\n\nexport interface RegistrationVerificationResponse {\n  allowed: boolean;\n  geolocation: LocationVerification;\n  profile: CustomerProfile;\n  requiresKYC: boolean;\n  requiresEDD: boolean;\n  blockReasons: string[];\n  processingTime: number;\n}\n\n// ============================================================================\n// Login Verification Types\n// ============================================================================\n\nexport interface LoginVerificationRequest {\n  customerId: string;\n  ipAddress: string;\n  deviceFingerprint?: DeviceFingerprintRequest;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface LoginVerificationResponse {\n  allowed: boolean;\n  geolocation: LocationVerification;\n  profile: CustomerProfile;\n  requiresStepUp: boolean;\n  blockReasons: string[];\n  processingTime: number;\n}\n\n// ============================================================================\n// Transaction Verification Types\n// ============================================================================\n\nexport interface TransactionVerificationRequest {\n  customerId: string;\n  ipAddress: string;\n  amount: number;\n  currency: string;\n  transactionType?: 'deposit' | 'withdrawal' | 'bet' | 'transfer' | 'payout';\n  deviceFingerprint?: DeviceFingerprintRequest;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface TransactionVerificationResponse {\n  allowed: boolean;\n  geolocation: LocationVerification;\n  profile: CustomerProfile;\n  transactionRisk: TransactionRiskResult;\n  requiresApproval: boolean;\n  blockReasons: string[];\n  processingTime: number;\n}\n\nexport interface TransactionRiskResult {\n  score: number;\n  level: 'low' | 'medium' | 'high' | 'critical';\n  factors: string[];\n  allowed: boolean;\n  requiresManualReview: boolean;\n}\n\n// ============================================================================\n// Generic Event Verification Types\n// ============================================================================\n\nexport interface EventVerificationRequest {\n  customerId: string;\n  ipAddress: string;\n  eventType: string;\n  deviceFingerprint?: DeviceFingerprintRequest;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface EventVerificationResponse {\n  allowed: boolean;\n  geolocation: LocationVerification;\n  blockReasons: string[];\n  processingTime: number;\n}\n\n// ============================================================================\n// Currency Exchange Rates (for transaction risk calculation)\n// ============================================================================\n\nexport interface CurrencyRates {\n  [currency: string]: number; // Rate to USD\n}\n\nexport const DEFAULT_CURRENCY_RATES: CurrencyRates = {\n  USD: 1.0,\n  EUR: 1.1,\n  GBP: 1.27,\n  CAD: 0.74,\n  AUD: 0.66,\n  JPY: 0.0067,\n  CHF: 1.13,\n  CNY: 0.14,\n  INR: 0.012,\n  BRL: 0.20,\n  MXN: 0.058,\n  ZAR: 0.055,\n};\n\n// ============================================================================\n// Pre-check Types\n// ============================================================================\n\nexport interface RegistrationPreCheckResult {\n  canRegister: boolean;\n  jurisdiction: import('../geolocation/types').JurisdictionConfig | null;\n  blockReasons: string[];\n  riskLevel: 'low' | 'medium' | 'high' | 'critical';\n  requiresKYC: boolean;\n  requiresEDD: boolean;\n  location: {\n    country: string;\n    countryISO: string;\n    city: string;\n  };\n}\n\n// ============================================================================\n// Sync Registration Types\n// ============================================================================\n\nexport interface RegistrationSyncOptions {\n  /** Maximum time to wait for risk calculation in milliseconds (default: 5000) */\n  maxWaitMs?: number;\n  /** Polling interval in milliseconds (default: 500) */\n  pollIntervalMs?: number;\n}\n\nexport interface RegistrationVerificationResponseWithSync extends RegistrationVerificationResponse {\n  /** Whether the risk score was successfully synchronized */\n  riskSynced: boolean;\n}\n\n// ============================================================================\n// Location Request Types (re-exported from geolocation for convenience)\n// ============================================================================\n\nexport type {\n  LocationRequest,\n  LocationRequestStatus,\n  LocationRequestChannel,\n  CreateLocationRequestRequest,\n  LocationRequestResult,\n  LocationRequestFilters,\n  LocationRequestListResponse,\n  ResendLocationRequestRequest,\n  LocationShareInfo,\n  LocationCaptureRequest,\n  LocationCaptureResponse,\n} from '../geolocation/types';\n\n// ============================================================================\n// Compliance-specific Location Request Types\n// ============================================================================\n\nexport interface ComplianceLocationRequestInput {\n  /** Customer user ID to request location from */\n  customerId: string;\n  /** Notification channel to use */\n  channel: 'sms' | 'email' | 'push';\n  /** Reason for requesting location (for compliance/audit) */\n  reason: string;\n  /** Customer email (required for email channel) */\n  email?: string;\n  /** Customer phone (required for SMS channel) */\n  phone?: string;\n  /** Custom expiry time in hours (default: 24) */\n  expiryHours?: number;\n}\n\nexport interface ComplianceLocationRequestResult {\n  /** The created location request */\n  request: import('../geolocation/types').LocationRequest;\n  /** Shareable link for the customer */\n  shareLink: string;\n  /** Token expiration time */\n  tokenExpiry: string;\n  /** Customer profile (if available) */\n  profile?: import('../risk-profile/types').CustomerProfile;\n}\n","/**\n * ComplianceClient - Unified Compliance Orchestration\n *\n * Main integration point for casino platforms. Orchestrates geolocation\n * verification with customer risk profiling for complete compliance coverage.\n *\n * GeoComply-style approach: SDK is the primary data injection point.\n */\n\nimport { GeolocationClient } from '../geolocation/client';\nimport { RiskProfileClient } from '../risk-profile/client';\nimport type { CGSConfig, RequiredCGSConfig } from '../core/config';\nimport { ComplianceError, ValidationError } from '../core/errors';\nimport type { JurisdictionConfig, LocationVerification } from '../geolocation/types';\nimport type { CustomerProfile } from '../risk-profile/types';\nimport type {\n  RegistrationVerificationRequest,\n  RegistrationVerificationResponse,\n  LoginVerificationRequest,\n  LoginVerificationResponse,\n  TransactionVerificationRequest,\n  TransactionVerificationResponse,\n  TransactionRiskResult,\n  EventVerificationRequest,\n  EventVerificationResponse,\n  CurrencyRates,\n  ComplianceLocationRequestInput,\n  ComplianceLocationRequestResult,\n} from './types';\nimport { DEFAULT_CURRENCY_RATES } from './types';\nimport type {\n  LocationRequest,\n  LocationRequestFilters,\n  LocationRequestListResponse,\n  PaginationParams,\n} from '../geolocation/types';\n\nexport class ComplianceClient {\n  private geoClient: GeolocationClient;\n  private riskClient: RiskProfileClient;\n  private config: RequiredCGSConfig;\n  private currencyRates: CurrencyRates;\n\n  constructor(config: CGSConfig) {\n    this.config = {\n      apiGatewayURL: config.apiGatewayURL,\n      tenantId: config.tenantId,\n      apiKey: config.apiKey || '',\n      headers: config.headers || {},\n      timeout: config.timeout || 10000,\n      retries: config.retries || 3,\n      debug: config.debug || false,\n      autoCreateProfiles: config.autoCreateProfiles !== false, // default true\n      syncMode: config.syncMode || 'sync',\n    };\n\n    // All clients use the API Gateway URL\n    // The gateway routes to the appropriate backend service\n    this.geoClient = new GeolocationClient({\n      baseURL: this.config.apiGatewayURL,\n      tenantId: this.config.tenantId,\n      apiKey: this.config.apiKey,\n      headers: this.config.headers,\n      timeout: this.config.timeout,\n      debug: this.config.debug,\n    });\n\n    this.riskClient = new RiskProfileClient({\n      baseURL: this.config.apiGatewayURL,\n      tenantId: this.config.tenantId,\n      apiKey: this.config.apiKey,\n      headers: this.config.headers,\n      timeout: this.config.timeout,\n      debug: this.config.debug,\n    });\n\n    this.currencyRates = DEFAULT_CURRENCY_RATES;\n  }\n\n  // ============================================================================\n  // Main Verification Methods\n  // ============================================================================\n\n  /**\n   * Verify customer registration with automatic profile creation\n   *\n   * This is the primary integration point for new customer sign-ups.\n   * Combines geolocation verification with customer risk profile creation.\n   *\n   * Important: Profile is only created if geolocation verification passes.\n   * This prevents orphaned geolocation records when registration is blocked.\n   *\n   * @param request - Registration verification request\n   * @returns Verification response with profile and compliance status\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.verifyAtRegistration({\n   *   customerId: 'CUST-12345',\n   *   fullName: 'John Doe',\n   *   emailAddress: 'john@example.com',\n   *   ipAddress: req.ip,\n   *   deviceFingerprint: getDeviceFingerprint()\n   * });\n   *\n   * if (result.allowed) {\n   *   // Create account\n   *   console.log('Profile created:', result.profile);\n   *   if (result.requiresKYC) {\n   *     // Redirect to KYC flow\n   *   }\n   * } else {\n   *   // Block registration\n   *   console.log('Blocked:', result.blockReasons);\n   * }\n   * ```\n   */\n  async verifyAtRegistration(\n    request: RegistrationVerificationRequest\n  ): Promise<RegistrationVerificationResponse> {\n    const startTime = Date.now();\n\n    // Validate required fields before making any API calls\n    this.validateRegistrationRequest(request);\n\n    let geoVerification: LocationVerification | null = null;\n\n    try {\n      // Step 1: Verify geolocation\n      if (this.config.debug) {\n        console.log('[ComplianceSDK] Starting registration verification for:', request.customerId);\n      }\n\n      geoVerification = await this.geoClient.verifyIP({\n        ip_address: request.ipAddress,\n        user_id: request.customerId,\n        event_type: 'registration',\n        device_fingerprint: request.deviceFingerprint,\n      });\n\n      // Step 2: Check if registration should be blocked BEFORE creating profile\n      // This prevents orphaned geo records and ensures atomic behavior\n      const blockReasons = this.evaluateRegistrationBlock(geoVerification);\n\n      if (blockReasons.length > 0) {\n        if (this.config.debug) {\n          console.log('[ComplianceSDK] Registration blocked at geo stage:', blockReasons);\n        }\n\n        // Return early without creating profile - prevents orphaned records\n        return {\n          allowed: false,\n          geolocation: geoVerification,\n          profile: null as unknown as CustomerProfile, // Type assertion for blocked case\n          requiresKYC: false,\n          requiresEDD: false,\n          blockReasons: blockReasons,\n          processingTime: Date.now() - startTime,\n        };\n      }\n\n      // Step 3: Create customer risk profile (only if geo passed)\n      const profile = await this.riskClient.createProfile({\n        customer_id: request.customerId,\n        entity_type: request.entityType || 'individual',\n        customer_status: 'active',\n        full_name: request.fullName,\n        email_address: request.emailAddress,\n        primary_phone_number: request.phoneNumber,\n        date_of_birth: request.dateOfBirth,\n        residential_address: request.address,\n        country_of_residence: geoVerification.location.country_iso,\n\n        // Geolocation data\n        location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n        location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n\n        // Initial KYC status\n        kyc_status: 'pending',\n      });\n\n      // Step 4: Determine final status and requirements\n      const requiresKYC = geoVerification.jurisdiction?.require_kyc || false;\n      const requiresEDD = geoVerification.jurisdiction?.require_enhanced_verification || false;\n\n      if (this.config.debug) {\n        console.log('[ComplianceSDK] Registration verification complete:', {\n          allowed: true,\n          riskScore: geoVerification.risk_score,\n          profileId: profile.id,\n          requiresKYC,\n          requiresEDD,\n        });\n      }\n\n      return {\n        allowed: true,\n        geolocation: geoVerification,\n        profile: profile,\n        requiresKYC: requiresKYC,\n        requiresEDD: requiresEDD,\n        blockReasons: [],\n        processingTime: Date.now() - startTime,\n      };\n    } catch (error) {\n      if (this.config.debug) {\n        console.error('[ComplianceSDK] Registration verification failed:', error);\n      }\n\n      // Provide detailed error context for debugging\n      throw new ComplianceError(\n        'Registration verification failed',\n        {\n          stage: geoVerification ? 'profile_creation' : 'geo_verification',\n          geoRecordId: geoVerification?.record_id,\n          customerId: request.customerId,\n          cause: error,\n        },\n        geoVerification ? 'PROFILE_CREATION_FAILED' : 'GEO_VERIFICATION_FAILED'\n      );\n    }\n  }\n\n  /**\n   * Evaluate if registration should be blocked based on geolocation verification\n   *\n   * Checks:\n   * 1. General compliance status (is_compliant)\n   * 2. Explicit block flag (is_blocked)\n   * 3. Jurisdiction-specific registration allowance (allow_registration)\n   * 4. Risk level thresholds\n   *\n   * @param geoVerification - Geolocation verification result\n   * @returns Array of block reasons (empty if allowed)\n   */\n  private evaluateRegistrationBlock(geoVerification: LocationVerification): string[] {\n    const blockReasons: string[] = [];\n\n    // Check if explicitly blocked\n    if (geoVerification.is_blocked) {\n      blockReasons.push(...geoVerification.risk_reasons);\n    }\n\n    // Check general compliance\n    if (!geoVerification.is_compliant) {\n      if (!blockReasons.includes('non_compliant_jurisdiction')) {\n        blockReasons.push('non_compliant_jurisdiction');\n      }\n    }\n\n    // CRITICAL: Check if registration is specifically allowed in this jurisdiction\n    // Some jurisdictions may allow login but not new registrations\n    const jurisdiction = geoVerification.jurisdiction;\n    if (jurisdiction) {\n      if (jurisdiction.allow_registration === false) {\n        blockReasons.push('registration_not_allowed_in_jurisdiction');\n      }\n\n      // Check jurisdiction status for registration-specific blocks\n      if (jurisdiction.status === 'blocked' || jurisdiction.status === 'sanctioned') {\n        if (!blockReasons.includes('blocked_jurisdiction')) {\n          blockReasons.push('blocked_jurisdiction');\n        }\n      }\n\n      // Restricted jurisdictions need explicit registration permission\n      if (jurisdiction.status === 'restricted' && jurisdiction.allow_registration === false) {\n        if (!blockReasons.includes('restricted_jurisdiction_no_registration')) {\n          blockReasons.push('restricted_jurisdiction_no_registration');\n        }\n      }\n    }\n\n    // Check geofence rule evaluation\n    if (geoVerification.geofence_evaluation?.blocked) {\n      blockReasons.push(...geoVerification.geofence_evaluation.reasons);\n    }\n\n    // Critical risk level should block registration\n    if (geoVerification.risk_level === 'critical') {\n      if (!blockReasons.includes('critical_risk_level')) {\n        blockReasons.push('critical_risk_level');\n      }\n    }\n\n    return [...new Set(blockReasons)]; // Deduplicate\n  }\n\n  /**\n   * Validate registration request has all required fields\n   *\n   * @param request - Registration request to validate\n   * @throws ValidationError if required fields are missing or invalid\n   */\n  private validateRegistrationRequest(request: RegistrationVerificationRequest): void {\n    const errors: string[] = [];\n\n    if (!request.customerId?.trim()) {\n      errors.push('customerId is required');\n    }\n\n    if (!request.ipAddress?.trim()) {\n      errors.push('ipAddress is required');\n    } else if (!this.isValidIP(request.ipAddress)) {\n      errors.push('ipAddress format is invalid');\n    }\n\n    if (!request.emailAddress?.trim()) {\n      errors.push('emailAddress is required');\n    } else if (!this.isValidEmail(request.emailAddress)) {\n      errors.push('emailAddress format is invalid');\n    }\n\n    if (!request.fullName?.trim()) {\n      errors.push('fullName is required');\n    }\n\n    if (errors.length > 0) {\n      throw new ValidationError(`Invalid registration request: ${errors.join(', ')}`, errors);\n    }\n  }\n\n  /**\n   * Validate IP address format (IPv4 or IPv6)\n   */\n  private isValidIP(ip: string): boolean {\n    // IPv4 pattern\n    const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n    // Simplified IPv6 pattern (covers most common cases)\n    const ipv6Regex = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){0,6}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$/;\n\n    return ipv4Regex.test(ip) || ipv6Regex.test(ip);\n  }\n\n  /**\n   * Validate email address format\n   */\n  private isValidEmail(email: string): boolean {\n    const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n    return emailRegex.test(email);\n  }\n\n  /**\n   * Verify customer login with profile activity update\n   *\n   * Verifies geolocation and updates customer profile with latest activity.\n   *\n   * @param request - Login verification request\n   * @returns Verification response with compliance status\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.verifyAtLogin({\n   *   customerId: 'CUST-12345',\n   *   ipAddress: req.ip,\n   *   deviceFingerprint: getDeviceFingerprint()\n   * });\n   *\n   * if (result.allowed) {\n   *   // Allow login\n   *   if (result.requiresStepUp) {\n   *     // Trigger MFA or additional verification\n   *   }\n   * } else {\n   *   // Block login\n   *   console.log('Blocked:', result.blockReasons);\n   * }\n   * ```\n   */\n  async verifyAtLogin(\n    request: LoginVerificationRequest\n  ): Promise<LoginVerificationResponse> {\n    const startTime = Date.now();\n\n    try {\n      if (this.config.debug) {\n        console.log('[ComplianceSDK] Starting login verification for:', request.customerId);\n      }\n\n      // Step 1: Verify geolocation\n      const geoVerification = await this.geoClient.verifyIP({\n        ip_address: request.ipAddress,\n        user_id: request.customerId,\n        event_type: 'login',\n        device_fingerprint: request.deviceFingerprint,\n      });\n\n      // Step 2: Get or create profile\n      let profile: CustomerProfile;\n      try {\n        profile = await this.riskClient.getProfile(request.customerId);\n\n        // Update last activity and location\n        if (this.shouldUpdateProfile(profile, geoVerification.location.city)) {\n          await this.riskClient.updateProfile(profile.id, {\n            last_recorded_activity: new Date().toISOString(),\n            location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n            location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n          });\n\n          // Refresh profile\n          profile = await this.riskClient.getProfile(request.customerId);\n        }\n      } catch (error) {\n        // Profile doesn't exist - this shouldn't happen for login\n        if (this.config.autoCreateProfiles && this.config.debug) {\n          console.warn('[ComplianceSDK] Profile not found for login, creating...');\n        }\n        profile = await this.createProfileFromGeo(request.customerId, geoVerification);\n      }\n\n      // Step 3: Determine if login allowed\n      const isAllowed =\n        geoVerification.is_compliant &&\n        !geoVerification.is_blocked &&\n        profile.customer_status !== 'suspended';\n\n      const requiresStepUp =\n        geoVerification.risk_level === 'high' || geoVerification.risk_level === 'critical';\n\n      return {\n        allowed: isAllowed,\n        geolocation: geoVerification,\n        profile: profile,\n        requiresStepUp: requiresStepUp,\n        blockReasons: this.getBlockReasons(geoVerification, profile),\n        processingTime: Date.now() - startTime,\n      };\n    } catch (error) {\n      throw new ComplianceError('Login verification failed', error);\n    }\n  }\n\n  /**\n   * Verify transaction with amount-based risk assessment\n   *\n   * Combines geolocation verification with transaction amount analysis\n   * and customer risk profile for comprehensive transaction screening.\n   *\n   * @param request - Transaction verification request\n   * @returns Verification response with transaction risk assessment\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.verifyAtTransaction({\n   *   customerId: 'CUST-12345',\n   *   ipAddress: req.ip,\n   *   amount: 5000,\n   *   currency: 'USD',\n   *   transactionType: 'withdrawal',\n   *   deviceFingerprint: getDeviceFingerprint()\n   * });\n   *\n   * if (result.allowed) {\n   *   // Process transaction\n   * } else if (result.requiresApproval) {\n   *   // Queue for manual review\n   * } else {\n   *   // Block transaction\n   *   console.log('Blocked:', result.blockReasons);\n   * }\n   * ```\n   */\n  async verifyAtTransaction(\n    request: TransactionVerificationRequest\n  ): Promise<TransactionVerificationResponse> {\n    const startTime = Date.now();\n\n    try {\n      if (this.config.debug) {\n        console.log('[ComplianceSDK] Starting transaction verification:', {\n          customerId: request.customerId,\n          amount: request.amount,\n          currency: request.currency,\n        });\n      }\n\n      // Step 1: Verify geolocation\n      const geoVerification = await this.geoClient.verifyIP({\n        ip_address: request.ipAddress,\n        user_id: request.customerId,\n        event_type: 'transaction',\n        device_fingerprint: request.deviceFingerprint,\n      });\n\n      // Step 2: Get profile\n      const profile = await this.riskClient.getProfile(request.customerId);\n\n      // Step 3: Calculate transaction risk\n      const transactionRisk = this.calculateTransactionRisk(\n        request.amount,\n        request.currency,\n        geoVerification,\n        profile\n      );\n\n      // Step 4: Check jurisdiction limits\n      const jurisdictionAllowed = this.checkJurisdictionLimits(\n        request.amount,\n        request.currency,\n        geoVerification.jurisdiction\n      );\n\n      // Step 5: Determine if transaction is allowed\n      const isAllowed =\n        geoVerification.is_compliant &&\n        !geoVerification.is_blocked &&\n        jurisdictionAllowed &&\n        transactionRisk.allowed;\n\n      return {\n        allowed: isAllowed,\n        geolocation: geoVerification,\n        profile: profile,\n        transactionRisk: transactionRisk,\n        requiresApproval: transactionRisk.requiresManualReview,\n        blockReasons: this.getTransactionBlockReasons(\n          geoVerification,\n          transactionRisk,\n          jurisdictionAllowed\n        ),\n        processingTime: Date.now() - startTime,\n      };\n    } catch (error) {\n      throw new ComplianceError('Transaction verification failed', error);\n    }\n  }\n\n  /**\n   * Generic event verification (for other touchpoints)\n   *\n   * @param request - Event verification request\n   * @returns Verification response\n   */\n  async verifyEvent(request: EventVerificationRequest): Promise<EventVerificationResponse> {\n    const startTime = Date.now();\n\n    const geoVerification = await this.geoClient.verifyIP({\n      ip_address: request.ipAddress,\n      user_id: request.customerId,\n      event_type: request.eventType,\n      device_fingerprint: request.deviceFingerprint,\n    });\n\n    // Optionally update profile activity\n    if (this.config.autoCreateProfiles) {\n      try {\n        const profile = await this.riskClient.getProfile(request.customerId);\n        await this.riskClient.updateProfile(profile.id, {\n          last_recorded_activity: new Date().toISOString(),\n        });\n      } catch (error) {\n        // Profile doesn't exist, ignore or create based on config\n        if (this.config.debug) {\n          console.warn('[ComplianceSDK] Profile not found for event');\n        }\n      }\n    }\n\n    return {\n      allowed: geoVerification.is_compliant && !geoVerification.is_blocked,\n      geolocation: geoVerification,\n      blockReasons: geoVerification.risk_reasons,\n      processingTime: Date.now() - startTime,\n    };\n  }\n\n  // ============================================================================\n  // Helper Methods\n  // ============================================================================\n\n  private shouldUpdateProfile(profile: CustomerProfile, newCity: string): boolean {\n    // Update if location changed significantly\n    return !profile.location || !profile.location.includes(newCity);\n  }\n\n  private async createProfileFromGeo(\n    customerId: string,\n    geoVerification: any\n  ): Promise<CustomerProfile> {\n    return this.riskClient.createProfile({\n      customer_id: customerId,\n      entity_type: 'individual',\n      customer_status: 'active',\n      email_address: `${customerId}@placeholder.local`, // Temporary email\n      location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n      location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n      country_of_residence: geoVerification.location.country_iso,\n      kyc_status: 'pending',\n    });\n  }\n\n  private calculateTransactionRisk(\n    amount: number,\n    currency: string,\n    geoVerification: any,\n    profile: CustomerProfile\n  ): TransactionRiskResult {\n    let riskScore = 0;\n    const factors: string[] = [];\n\n    // Amount-based risk (normalized to USD)\n    const normalizedAmount = this.normalizeToUSD(amount, currency);\n    if (normalizedAmount > 10000) {\n      riskScore += 30;\n      factors.push('high_transaction_amount');\n    } else if (normalizedAmount > 5000) {\n      riskScore += 15;\n      factors.push('elevated_transaction_amount');\n    }\n\n    // Geo risk\n    riskScore += geoVerification.risk_score * 0.4;\n    if (geoVerification.risk_level === 'high' || geoVerification.risk_level === 'critical') {\n      factors.push('high_risk_location');\n    }\n\n    // Profile risk\n    riskScore += profile.risk_score * 0.3;\n    if (profile.risk_category === 'high' || profile.risk_category === 'critical') {\n      factors.push('high_risk_customer');\n    }\n\n    // VPN/anonymizer during transaction\n    if (geoVerification.location.is_vpn || geoVerification.location.is_proxy) {\n      riskScore += 20;\n      factors.push('anonymization_detected');\n    }\n\n    // Suspended account\n    if (profile.customer_status === 'suspended') {\n      riskScore += 50;\n      factors.push('account_suspended');\n    }\n\n    return {\n      score: Math.min(riskScore, 100),\n      level: this.getRiskLevel(riskScore),\n      factors: factors,\n      allowed: riskScore < 70,\n      requiresManualReview: riskScore >= 60 && riskScore < 70,\n    };\n  }\n\n  private checkJurisdictionLimits(\n    amount: number,\n    currency: string,\n    jurisdiction?: JurisdictionConfig\n  ): boolean {\n    if (!jurisdiction || !jurisdiction.max_transaction_amount) {\n      return true;\n    }\n\n    const normalizedAmount = this.normalizeToUSD(amount, currency);\n    return normalizedAmount <= jurisdiction.max_transaction_amount;\n  }\n\n  private normalizeToUSD(amount: number, currency: string): number {\n    const rate = this.currencyRates[currency.toUpperCase()] || 1;\n    return amount * rate;\n  }\n\n  private getRiskLevel(score: number): 'low' | 'medium' | 'high' | 'critical' {\n    if (score >= 80) return 'critical';\n    if (score >= 60) return 'high';\n    if (score >= 40) return 'medium';\n    return 'low';\n  }\n\n  private getBlockReasons(geoVerification: any, profile: CustomerProfile): string[] {\n    const reasons: string[] = [];\n\n    if (geoVerification.is_blocked) {\n      reasons.push(...geoVerification.risk_reasons);\n    }\n\n    if (profile.customer_status === 'suspended') {\n      reasons.push('account_suspended');\n    }\n\n    if (profile.has_sanctions) {\n      reasons.push('sanctions_match');\n    }\n\n    return reasons;\n  }\n\n  private getTransactionBlockReasons(\n    geoVerification: any,\n    transactionRisk: TransactionRiskResult,\n    jurisdictionAllowed: boolean\n  ): string[] {\n    const reasons: string[] = [];\n\n    if (!geoVerification.is_compliant) {\n      reasons.push('non_compliant_jurisdiction');\n    }\n\n    if (!jurisdictionAllowed) {\n      reasons.push('exceeds_jurisdiction_limit');\n    }\n\n    if (!transactionRisk.allowed) {\n      reasons.push(...transactionRisk.factors);\n    }\n\n    return reasons;\n  }\n\n  // ============================================================================\n  // Advanced Registration Methods\n  // ============================================================================\n\n  /**\n   * Verify registration with synchronized risk calculation\n   *\n   * This method extends verifyAtRegistration by waiting for the geolocation\n   * risk factor to be processed by the backend. Use this when you need\n   * the accurate risk score immediately after registration.\n   *\n   * Note: This adds latency (up to `maxWaitMs`) but provides accurate risk data.\n   *\n   * @param request - Registration verification request\n   * @param options - Sync options\n   * @returns Verification response with updated risk score\n   *\n   * @example\n   * ```typescript\n   * const result = await sdk.verifyAtRegistrationWithSync(\n   *   {\n   *     customerId: 'CUST-12345',\n   *     fullName: 'John Doe',\n   *     emailAddress: 'john@example.com',\n   *     ipAddress: req.ip,\n   *   },\n   *   { maxWaitMs: 5000, pollIntervalMs: 500 }\n   * );\n   *\n   * // profile.risk_score now reflects geolocation risk factor\n   * console.log('Synced risk score:', result.profile?.risk_score);\n   * ```\n   */\n  async verifyAtRegistrationWithSync(\n    request: RegistrationVerificationRequest,\n    options: {\n      maxWaitMs?: number;\n      pollIntervalMs?: number;\n    } = {}\n  ): Promise<RegistrationVerificationResponse & { riskSynced: boolean }> {\n    const { maxWaitMs = 5000, pollIntervalMs = 500 } = options;\n\n    // First, do the standard registration verification\n    const result = await this.verifyAtRegistration(request);\n\n    // If registration was blocked, no need to wait for risk sync\n    if (!result.allowed || !result.profile) {\n      return { ...result, riskSynced: false };\n    }\n\n    // Wait for risk score to be calculated (initial score is 0)\n    const syncedProfile = await this.waitForRiskCalculation(\n      result.profile.id,\n      maxWaitMs,\n      pollIntervalMs\n    );\n\n    if (syncedProfile) {\n      return {\n        ...result,\n        profile: syncedProfile,\n        riskSynced: true,\n      };\n    }\n\n    // Return original result if sync failed\n    if (this.config.debug) {\n      console.warn('[ComplianceSDK] Risk sync timed out, returning unsynchronized profile');\n    }\n    return { ...result, riskSynced: false };\n  }\n\n  /**\n   * Wait for risk score to be calculated\n   *\n   * Polls the profile until risk_score > 0 or risk_last_calculated is set,\n   * indicating that risk factors have been processed.\n   *\n   * @param profileId - Profile UUID to poll\n   * @param maxWaitMs - Maximum wait time in milliseconds\n   * @param pollIntervalMs - Polling interval in milliseconds\n   * @returns Updated profile or null if timeout\n   */\n  private async waitForRiskCalculation(\n    profileId: string,\n    maxWaitMs: number,\n    pollIntervalMs: number\n  ): Promise<CustomerProfile | null> {\n    const startTime = Date.now();\n\n    while (Date.now() - startTime < maxWaitMs) {\n      try {\n        const profile = await this.riskClient.getProfileById(profileId);\n\n        // Check if risk has been calculated\n        // risk_last_calculated is set when first risk factor is processed\n        if (profile.risk_last_calculated || profile.risk_score > 0) {\n          return profile;\n        }\n      } catch (error) {\n        if (this.config.debug) {\n          console.warn('[ComplianceSDK] Error polling profile:', error);\n        }\n      }\n\n      // Wait before next poll\n      await this.sleep(pollIntervalMs);\n    }\n\n    return null;\n  }\n\n  /**\n   * Pre-check if registration would be allowed from an IP address\n   *\n   * Use this before showing the registration form to provide early feedback\n   * to users in blocked jurisdictions.\n   *\n   * @param ipAddress - IP address to check\n   * @returns Pre-check result with jurisdiction info\n   *\n   * @example\n   * ```typescript\n   * const preCheck = await sdk.preCheckRegistration(req.ip);\n   *\n   * if (!preCheck.canRegister) {\n   *   return res.render('blocked', { reasons: preCheck.blockReasons });\n   * }\n   *\n   * if (preCheck.requiresKYC) {\n   *   // Prepare KYC flow\n   * }\n   * ```\n   */\n  async preCheckRegistration(ipAddress: string): Promise<{\n    canRegister: boolean;\n    jurisdiction: JurisdictionConfig | null;\n    blockReasons: string[];\n    riskLevel: 'low' | 'medium' | 'high' | 'critical';\n    requiresKYC: boolean;\n    requiresEDD: boolean;\n    location: {\n      country: string;\n      countryISO: string;\n      city: string;\n    };\n  }> {\n    // Verify without creating any records (using temporary user ID)\n    const geoCheck = await this.geoClient.verifyIP({\n      ip_address: ipAddress,\n      user_id: `_precheck_${Date.now()}`, // Temporary ID for pre-check\n      event_type: 'registration',\n    });\n\n    const blockReasons = this.evaluateRegistrationBlock(geoCheck);\n    const jurisdiction = geoCheck.jurisdiction || null;\n\n    return {\n      canRegister: blockReasons.length === 0,\n      jurisdiction,\n      blockReasons,\n      riskLevel: geoCheck.risk_level,\n      requiresKYC: jurisdiction?.require_kyc || false,\n      requiresEDD: jurisdiction?.require_enhanced_verification || false,\n      location: {\n        country: geoCheck.location.country,\n        countryISO: geoCheck.location.country_iso,\n        city: geoCheck.location.city,\n      },\n    };\n  }\n\n  // ============================================================================\n  // Location Request Methods\n  // ============================================================================\n\n  /**\n   * Request live location from a customer\n   *\n   * Creates a location request and sends a notification to the customer\n   * via the specified channel (SMS, email, or push). The customer receives\n   * a link to share their location.\n   *\n   * @param input - Location request details\n   * @returns Location request result with share link\n   *\n   * @example\n   * ```typescript\n   * // Request location via SMS for transaction verification\n   * const result = await sdk.requestCustomerLocation({\n   *   customerId: 'CUST-12345',\n   *   channel: 'sms',\n   *   phone: '+1234567890',\n   *   reason: 'Verification required for high-value transaction'\n   * });\n   *\n   * console.log('Share link sent:', result.shareLink);\n   * console.log('Expires at:', result.tokenExpiry);\n   *\n   * // Request location via email\n   * const emailResult = await sdk.requestCustomerLocation({\n   *   customerId: 'CUST-12345',\n   *   channel: 'email',\n   *   email: 'customer@example.com',\n   *   reason: 'Account verification',\n   *   expiryHours: 48\n   * });\n   * ```\n   */\n  async requestCustomerLocation(\n    input: ComplianceLocationRequestInput\n  ): Promise<ComplianceLocationRequestResult> {\n    if (this.config.debug) {\n      console.log('[ComplianceSDK] Creating location request for customer:', input.customerId);\n    }\n\n    // Validate input\n    this.validateLocationRequestInput(input);\n\n    // Get customer profile if available\n    let profile: CustomerProfile | undefined;\n    try {\n      profile = await this.riskClient.getProfile(input.customerId);\n    } catch (error) {\n      if (this.config.debug) {\n        console.warn('[ComplianceSDK] Customer profile not found:', input.customerId);\n      }\n    }\n\n    // Use profile data if contact info not provided\n    const phone = input.phone || profile?.primary_phone_number;\n    const email = input.email || profile?.email_address;\n\n    // Create the location request\n    const result = await this.geoClient.createLocationRequest({\n      user_id: input.customerId,\n      channel: input.channel,\n      reason: input.reason,\n      phone: phone,\n      email: email,\n      expiry_hours: input.expiryHours,\n    });\n\n    if (this.config.debug) {\n      console.log('[ComplianceSDK] Location request created:', {\n        requestId: result.request.id,\n        channel: input.channel,\n        expiresAt: result.token_expiry,\n      });\n    }\n\n    return {\n      request: result.request,\n      shareLink: result.share_link,\n      tokenExpiry: result.token_expiry,\n      profile: profile,\n    };\n  }\n\n  /**\n   * Get a specific location request by ID\n   *\n   * @param requestId - Location request ID\n   * @returns Location request details\n   *\n   * @example\n   * ```typescript\n   * const request = await sdk.getLocationRequest('req_abc123');\n   * console.log('Status:', request.status);\n   * if (request.latitude && request.longitude) {\n   *   console.log('Location captured:', request.latitude, request.longitude);\n   * }\n   * ```\n   */\n  async getLocationRequest(requestId: string): Promise<LocationRequest> {\n    return this.geoClient.getLocationRequest(requestId);\n  }\n\n  /**\n   * List location requests with filters and pagination\n   *\n   * @param filters - Optional filters\n   * @param pagination - Optional pagination\n   * @returns Paginated list of location requests\n   *\n   * @example\n   * ```typescript\n   * // Get pending requests for a customer\n   * const pending = await sdk.listLocationRequests(\n   *   { status: 'pending', user_id: 'CUST-12345' },\n   *   { page: 1, limit: 20 }\n   * );\n   *\n   * // Get all completed requests from last week\n   * const completed = await sdk.listLocationRequests({\n   *   status: 'completed',\n   *   date_from: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString()\n   * });\n   * ```\n   */\n  async listLocationRequests(\n    filters?: LocationRequestFilters,\n    pagination?: PaginationParams\n  ): Promise<LocationRequestListResponse> {\n    return this.geoClient.listLocationRequests(filters, pagination);\n  }\n\n  /**\n   * Cancel a pending location request\n   *\n   * @param requestId - Location request ID\n   *\n   * @example\n   * ```typescript\n   * await sdk.cancelLocationRequest('req_abc123');\n   * ```\n   */\n  async cancelLocationRequest(requestId: string): Promise<void> {\n    if (this.config.debug) {\n      console.log('[ComplianceSDK] Cancelling location request:', requestId);\n    }\n    await this.geoClient.cancelLocationRequest(requestId);\n  }\n\n  /**\n   * Resend notification for a location request\n   *\n   * @param requestId - Location request ID\n   * @param contact - Contact details (email or phone)\n   *\n   * @example\n   * ```typescript\n   * // Resend to a different phone number\n   * await sdk.resendLocationRequest('req_abc123', { phone: '+0987654321' });\n   *\n   * // Resend to email\n   * await sdk.resendLocationRequest('req_abc123', { email: 'new@example.com' });\n   * ```\n   */\n  async resendLocationRequest(\n    requestId: string,\n    contact: { email?: string; phone?: string }\n  ): Promise<void> {\n    if (this.config.debug) {\n      console.log('[ComplianceSDK] Resending location request:', requestId);\n    }\n    await this.geoClient.resendLocationRequest(requestId, contact);\n  }\n\n  /**\n   * Validate location request input\n   */\n  private validateLocationRequestInput(input: ComplianceLocationRequestInput): void {\n    const errors: string[] = [];\n\n    if (!input.customerId?.trim()) {\n      errors.push('customerId is required');\n    }\n\n    if (!input.channel) {\n      errors.push('channel is required');\n    }\n\n    if (!input.reason?.trim()) {\n      errors.push('reason is required for compliance/audit purposes');\n    }\n\n    // Channel-specific validation\n    if (input.channel === 'sms' && !input.phone) {\n      errors.push('phone is required for SMS channel');\n    }\n\n    if (input.channel === 'email' && !input.email) {\n      errors.push('email is required for email channel');\n    }\n\n    if (errors.length > 0) {\n      throw new ValidationError(`Invalid location request: ${errors.join(', ')}`, errors);\n    }\n  }\n\n  // ============================================================================\n  // Configuration\n  // ============================================================================\n\n  /**\n   * Update currency exchange rates\n   *\n   * Use this to keep currency rates current for accurate transaction risk\n   * calculation. Rates should be updated regularly (e.g., daily).\n   *\n   * @param rates - Currency to USD exchange rates\n   *\n   * @example\n   * ```typescript\n   * // Update specific rates\n   * sdk.updateCurrencyRates({\n   *   EUR: 1.08,\n   *   GBP: 1.25,\n   *   BTC: 42000, // For crypto support\n   * });\n   *\n   * // Or fetch from external service\n   * const rates = await fetchExchangeRates();\n   * sdk.updateCurrencyRates(rates);\n   * ```\n   */\n  updateCurrencyRates(rates: CurrencyRates): void {\n    this.currencyRates = { ...this.currencyRates, ...rates };\n  }\n\n  /**\n   * Get current currency rates\n   *\n   * @returns Current currency to USD exchange rates\n   */\n  getCurrencyRates(): Readonly<CurrencyRates> {\n    return { ...this.currencyRates };\n  }\n\n  /**\n   * Fetch and update currency rates from an external API\n   *\n   * This method allows integration with external exchange rate providers.\n   * Pass a fetcher function that returns the new rates.\n   *\n   * @param fetcher - Async function that returns currency rates\n   * @returns The fetched rates\n   *\n   * @example\n   * ```typescript\n   * // Using a rate provider\n   * const rates = await sdk.fetchCurrencyRates(async () => {\n   *   const response = await fetch('https://api.exchangerate.host/latest?base=USD');\n   *   const data = await response.json();\n   *   return data.rates;\n   * });\n   *\n   * console.log('Updated rates:', rates);\n   * ```\n   */\n  async fetchCurrencyRates(\n    fetcher: () => Promise<CurrencyRates>\n  ): Promise<CurrencyRates> {\n    try {\n      const rates = await fetcher();\n      this.updateCurrencyRates(rates);\n      return rates;\n    } catch (error) {\n      if (this.config.debug) {\n        console.error('[ComplianceSDK] Failed to fetch currency rates:', error);\n      }\n      throw new ComplianceError('Failed to fetch currency rates', error);\n    }\n  }\n\n  /**\n   * Get underlying geolocation client\n   */\n  getGeolocationClient(): GeolocationClient {\n    return this.geoClient;\n  }\n\n  /**\n   * Get underlying risk profile client\n   */\n  getRiskProfileClient(): RiskProfileClient {\n    return this.riskClient;\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: Partial<CGSConfig>): void {\n    this.config = { ...this.config, ...config };\n    this.geoClient.updateConfig(config as any);\n    this.riskClient.updateConfig(config as any);\n  }\n\n  /**\n   * Helper to create a delay\n   */\n  private sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n"]}