{"version":3,"sources":["../src/core/errors.ts","../src/core/circuit-breaker.ts","../src/core/rate-limiter.ts","../src/core/logger.ts","../src/core/version.ts","../src/shared/browser-utils.ts","../src/core/client.ts","../src/core/webhook-utils.ts","../src/geolocation/ciphertext.ts","../src/geolocation/client.ts","../src/risk-profile/client.ts","../src/compliance/types.ts","../src/compliance/client.ts","../src/kyc/client.ts","../src/tax/client.ts","../src/transaction/client.ts","../src/fraud/client.ts","../src/webhooks/handler.ts","../src/webhooks/middleware.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Error hierarchy for Vesant SDK\n *\n * Provides structured error handling with specific error types\n * for different failure scenarios.\n */\n\nexport class VesantError extends Error {\n  public requestId?: string;\n\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 = 'VesantError';\n    Object.setPrototypeOf(this, VesantError.prototype);\n  }\n}\n\n/** @deprecated Use VesantError instead */\nexport const CGSError = VesantError;\n/** @deprecated Use VesantError instead */\nexport type CGSError = VesantError;\n\nexport class NetworkError extends VesantError {\n  constructor(message: string, public originalError?: unknown) {\n    super(message, 'NETWORK_ERROR');\n    this.name = 'NetworkError';\n    Object.setPrototypeOf(this, NetworkError.prototype);\n  }\n}\n\nexport class ValidationError extends VesantError {\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 VesantError {\n  constructor(message: string = 'Service unavailable') {\n    super(message, 'SERVICE_UNAVAILABLE', 503);\n    this.name = 'ServiceUnavailableError';\n    Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n  }\n}\n\nexport class ComplianceBlockedError extends VesantError {\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 VesantError {\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 VesantError {\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 VesantError {\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 VesantError {\n  constructor(\n    message: string,\n    public originalError?: unknown,\n    code: string = 'COMPLIANCE_ERROR'\n  ) {\n    super(message, code);\n    this.name = 'ComplianceError';\n    Object.setPrototypeOf(this, ComplianceError.prototype);\n  }\n}\n\nexport class CircuitBreakerOpenError extends VesantError {\n  constructor() {\n    super('Circuit breaker is open — requests are temporarily blocked', 'CIRCUIT_BREAKER_OPEN', 503);\n    this.name = 'CircuitBreakerOpenError';\n    Object.setPrototypeOf(this, CircuitBreakerOpenError.prototype);\n  }\n}\n","/**\n * Circuit breaker pattern for resilient HTTP requests.\n *\n * States: closed (normal) -> open (failing) -> half-open (testing) -> closed\n */\n\nexport type CircuitBreakerState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n  /** Number of consecutive failures before opening the circuit (default: 5) */\n  failureThreshold?: number;\n  /** Time in ms to wait before transitioning from open to half-open (default: 30000) */\n  resetTimeout?: number;\n  /** Number of successes in half-open state before closing (default: 1) */\n  successThreshold?: number;\n}\n\nexport interface CircuitBreakerStatus {\n  state: CircuitBreakerState;\n  failures: number;\n  successes: number;\n  lastFailureTime: number | null;\n  nextRetryTime: number | null;\n}\n\nexport class CircuitBreaker {\n  private state: CircuitBreakerState = 'closed';\n  private failures = 0;\n  private successes = 0;\n  private lastFailureTime: number | null = null;\n\n  private readonly failureThreshold: number;\n  private readonly resetTimeout: number;\n  private readonly successThreshold: number;\n\n  constructor(config: CircuitBreakerConfig = {}) {\n    this.failureThreshold = config.failureThreshold ?? 5;\n    this.resetTimeout = config.resetTimeout ?? 30000;\n    this.successThreshold = config.successThreshold ?? 1;\n  }\n\n  /**\n   * Check if a request can proceed through the circuit breaker.\n   */\n  canExecute(): boolean {\n    if (this.state === 'closed') {\n      return true;\n    }\n\n    if (this.state === 'open') {\n      const now = Date.now();\n      if (this.lastFailureTime && now - this.lastFailureTime >= this.resetTimeout) {\n        this.state = 'half-open';\n        this.successes = 0;\n        return true;\n      }\n      return false;\n    }\n\n    // half-open: allow requests through for testing\n    return true;\n  }\n\n  /**\n   * Record a successful request.\n   */\n  onSuccess(): void {\n    if (this.state === 'half-open') {\n      this.successes++;\n      if (this.successes >= this.successThreshold) {\n        this.state = 'closed';\n        this.failures = 0;\n        this.successes = 0;\n        this.lastFailureTime = null;\n      }\n    } else if (this.state === 'closed') {\n      this.failures = 0;\n    }\n  }\n\n  /**\n   * Record a failed request.\n   */\n  onFailure(): void {\n    this.failures++;\n    this.lastFailureTime = Date.now();\n\n    if (this.state === 'half-open') {\n      this.state = 'open';\n      this.successes = 0;\n    } else if (this.state === 'closed' && this.failures >= this.failureThreshold) {\n      this.state = 'open';\n    }\n  }\n\n  /**\n   * Get current circuit breaker status.\n   */\n  getStatus(): CircuitBreakerStatus {\n    return {\n      state: this.state,\n      failures: this.failures,\n      successes: this.successes,\n      lastFailureTime: this.lastFailureTime,\n      nextRetryTime:\n        this.state === 'open' && this.lastFailureTime\n          ? this.lastFailureTime + this.resetTimeout\n          : null,\n    };\n  }\n\n  /**\n   * Reset the circuit breaker to its initial closed state.\n   */\n  reset(): void {\n    this.state = 'closed';\n    this.failures = 0;\n    this.successes = 0;\n    this.lastFailureTime = null;\n  }\n}\n","/**\n * Rate limit tracking from API response headers.\n *\n * Tracks X-RateLimit-* headers to enable pre-flight checks\n * before making requests.\n */\n\nexport interface RateLimitStatus {\n  /** Maximum requests allowed in the window */\n  limit: number | null;\n  /** Remaining requests in the current window */\n  remaining: number | null;\n  /** Unix timestamp (seconds) when the rate limit resets */\n  reset: number | null;\n  /** Seconds until the rate limit resets */\n  retryAfter: number | null;\n}\n\nexport class RateLimitTracker {\n  private limit: number | null = null;\n  private remaining: number | null = null;\n  private reset: number | null = null;\n  private retryAfter: number | null = null;\n\n  /**\n   * Extract rate limit information from response headers.\n   */\n  updateFromHeaders(headers: Headers): void {\n    const limit = headers.get('x-ratelimit-limit');\n    const remaining = headers.get('x-ratelimit-remaining');\n    const reset = headers.get('x-ratelimit-reset');\n    const retryAfter = headers.get('retry-after');\n\n    if (limit !== null) this.limit = parseInt(limit, 10);\n    if (remaining !== null) this.remaining = parseInt(remaining, 10);\n    if (reset !== null) this.reset = parseInt(reset, 10);\n    if (retryAfter !== null) this.retryAfter = parseInt(retryAfter, 10);\n  }\n\n  /**\n   * Check if the rate limit has been exceeded based on tracked headers.\n   */\n  isLimitExceeded(): boolean {\n    if (this.remaining !== null && this.remaining <= 0) {\n      // Check if the reset time has passed\n      if (this.reset !== null) {\n        const now = Math.floor(Date.now() / 1000);\n        if (now >= this.reset) {\n          // Reset window has passed, allow requests\n          this.remaining = null;\n          this.reset = null;\n          this.retryAfter = null;\n          return false;\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Get current rate limit status.\n   */\n  getStatus(): RateLimitStatus {\n    return {\n      limit: this.limit,\n      remaining: this.remaining,\n      reset: this.reset,\n      retryAfter: this.retryAfter,\n    };\n  }\n}\n","import type { Logger } from './config';\n\nexport function createConsoleLogger(): Logger {\n  return {\n    debug(message: string, meta?: Record<string, unknown>) {\n      console.log(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n    },\n    info(message: string, meta?: Record<string, unknown>) {\n      console.info(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n    },\n    warn(message: string, meta?: Record<string, unknown>) {\n      console.warn(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n    },\n    error(message: string, meta?: Record<string, unknown>) {\n      console.error(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n    },\n  };\n}\n\nexport const noopLogger: Logger = {\n  debug() {},\n  info() {},\n  warn() {},\n  error() {},\n};\n","/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '1.6.6';\n","/**\n * Shared browser utility functions.\n *\n * Extracted from ciphertext.ts and hooks.ts to avoid duplication.\n * All functions include SSR guards for safe server-side rendering.\n */\n\n/**\n * Generate a UUID v4\n */\nexport function 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 * Generate a unique device ID that persists across sessions.\n * Falls back to a random UUID when localStorage is unavailable (SSR).\n */\nexport function generateDeviceId(): string {\n  if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n    return generateUUID();\n  }\n\n  const storageKey = 'vesant_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 * Detect browser information from user agent.\n * Returns safe defaults when running server-side.\n */\nexport function getBrowserInfo(): {\n  browser: string;\n  browser_version: string;\n  os: string;\n  os_version: string;\n} {\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 * Base HTTP client for all Vesant 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, Logger, RequestInterceptor, RequestOptions } from './config';\nimport {\n  VesantError,\n  NetworkError,\n  TimeoutError,\n  AuthenticationError,\n  RateLimitError,\n  ServiceUnavailableError,\n  ValidationError,\n  CircuitBreakerOpenError,\n} from './errors';\nimport { CircuitBreaker, type CircuitBreakerStatus } from './circuit-breaker';\nimport { RateLimitTracker, type RateLimitStatus } from './rate-limiter';\nimport { createConsoleLogger } from './logger';\nimport { SDK_VERSION } from './version';\nimport { generateUUID } from '../shared/browser-utils';\n\nexport abstract class BaseClient {\n  protected config: BaseClientConfig & { timeout: number; retries: number };\n  protected logger: Logger;\n  private interceptors: RequestInterceptor[];\n  private circuitBreaker: CircuitBreaker | null = null;\n  private rateLimitTracker: RateLimitTracker | null = null;\n\n  constructor(config: BaseClientConfig) {\n    if (!config.baseURL?.trim()) {\n      throw new ValidationError('baseURL is required and must be a non-empty string', ['baseURL']);\n    }\n    if (!config.tenantId?.trim()) {\n      throw new ValidationError('tenantId is required and must be a non-empty string', ['tenantId']);\n    }\n\n    this.interceptors = config.interceptors || [];\n    this.logger = config.logger || createConsoleLogger();\n\n    // Auto-detect environment from API key prefix\n    let environment = config.environment;\n    const apiKey = config.apiKey || '';\n    if (apiKey.startsWith('pk_test_')) {\n      if (environment === 'production') {\n        this.logger.warn('Sandbox API key (pk_test_*) used with environment: \"production\" — overriding to \"sandbox\"');\n      }\n      environment = 'sandbox';\n    } else if (apiKey.startsWith('pk_live_') && environment === 'sandbox') {\n      this.logger.warn('Production API key (pk_live_*) used with environment: \"sandbox\" — sandbox isolation will still be applied for backward compatibility');\n    }\n\n    this.config = {\n      ...config,\n      apiKey,\n      environment,\n      headers: config.headers || {},\n      timeout: config.timeout || 10000,\n      retries: config.retries || 3,\n      debug: config.debug || false,\n      interceptors: this.interceptors,\n      logger: this.logger,\n    };\n\n    if (config.circuitBreaker) {\n      this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);\n    }\n    if (config.enableRateLimitTracking) {\n      this.rateLimitTracker = new RateLimitTracker();\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    requestOptions?: RequestOptions\n  ): Promise<T> {\n    const requestId = generateUUID();\n\n    // Circuit breaker check\n    if (this.circuitBreaker && !this.circuitBreaker.canExecute()) {\n      const error = new CircuitBreakerOpenError();\n      error.requestId = requestId;\n      throw error;\n    }\n\n    // Rate limit pre-check\n    if (this.rateLimitTracker && this.rateLimitTracker.isLimitExceeded()) {\n      const status = this.rateLimitTracker.getStatus();\n      const error = new RateLimitError(status.retryAfter ?? undefined);\n      error.requestId = requestId;\n      throw error;\n    }\n\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      'X-SDK-Version': `vesant-sdk-ts/${SDK_VERSION}`,\n      'X-Request-ID': requestId,\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    // Sandbox header\n    if (this.config.environment === 'sandbox') {\n      headers['X-Sandbox'] = 'true';\n    }\n\n    // Idempotency key for mutating methods\n    const method = (options.method || 'GET').toUpperCase();\n    if (['POST', 'PUT', 'PATCH'].includes(method)) {\n      headers['Idempotency-Key'] = requestOptions?.idempotencyKey || generateUUID();\n    }\n\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n    // Link consumer AbortSignal to internal controller\n    if (requestOptions?.signal) {\n      if (requestOptions.signal.aborted) {\n        controller.abort();\n      } else {\n        requestOptions.signal.addEventListener('abort', () => controller.abort(), { once: true });\n      }\n    }\n\n    try {\n      // Run onRequest interceptors\n      let finalOptions: RequestInit = { ...options, headers };\n      for (const interceptor of this.interceptors) {\n        if (interceptor.onRequest) {\n          finalOptions = await interceptor.onRequest(url, finalOptions);\n        }\n      }\n\n      if (this.config.debug) {\n        this.logger.debug(`${finalOptions.method || 'GET'} ${endpoint}`);\n      }\n\n      const response = await fetch(url, {\n        ...finalOptions,\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      // Track rate limit headers\n      if (this.rateLimitTracker) {\n        this.rateLimitTracker.updateFromHeaders(response.headers);\n      }\n\n      // Binary download path\n      if (requestOptions?.responseType === 'arraybuffer') {\n        if (!response.ok) {\n          let errData: Record<string, unknown> = {};\n          try { errData = await response.json(); } catch { /* ignore */ }\n          this.handleErrorResponse(response.status, errData, requestId);\n        }\n        this.circuitBreaker?.onSuccess();\n        const buffer = await response.arrayBuffer();\n        return buffer as unknown as T;\n      }\n\n      let data: Record<string, unknown> | undefined;\n      try {\n        data = await response.json();\n      } catch {\n        // Non-JSON response (HTML error pages, 204 No Content, etc.)\n        if (!response.ok) {\n          this.handleErrorResponse(response.status, {\n            error: `HTTP ${response.status}`,\n            message: response.statusText,\n          }, requestId);\n        }\n        // OK response but no JSON body (e.g., 204)\n        this.circuitBreaker?.onSuccess();\n        return undefined as unknown as T;\n      }\n\n      if (!response.ok) {\n        this.handleErrorResponse(response.status, data || {}, requestId);\n      }\n\n      // Record success for circuit breaker\n      this.circuitBreaker?.onSuccess();\n\n      // Run onResponse interceptors\n      let result: unknown = data;\n      for (const interceptor of this.interceptors) {\n        if (interceptor.onResponse) {\n          result = await interceptor.onResponse(url, result);\n        }\n      }\n\n      if (this.config.debug) {\n        this.logger.debug(`Response: ${response.status}`);\n      }\n\n      return result as T;\n    } catch (error) {\n      clearTimeout(timeoutId);\n\n      // Record failure for circuit breaker (skip for client errors)\n      if (\n        error instanceof VesantError &&\n        error.statusCode &&\n        error.statusCode >= 500\n      ) {\n        this.circuitBreaker?.onFailure();\n      } else if (error instanceof NetworkError || error instanceof TimeoutError) {\n        this.circuitBreaker?.onFailure();\n      }\n\n      // Attach requestId to VesantError instances\n      if (error instanceof VesantError && !error.requestId) {\n        error.requestId = requestId;\n      }\n\n      // Run onError interceptors\n      if (error instanceof Error) {\n        for (const interceptor of this.interceptors) {\n          if (interceptor.onError) {\n            await interceptor.onError(url, error);\n          }\n        }\n      }\n\n      if (error instanceof Error) {\n        if (error.name === 'AbortError') {\n          // Distinguish consumer abort from timeout\n          if (requestOptions?.signal?.aborted) {\n            const abortError = new VesantError('Request aborted', 'REQUEST_ABORTED');\n            abortError.requestId = requestId;\n            throw abortError;\n          }\n          this.circuitBreaker?.onFailure();\n          const timeoutError = new TimeoutError(this.config.timeout);\n          timeoutError.requestId = requestId;\n          throw timeoutError;\n        }\n        if (error instanceof VesantError) {\n          throw error;\n        }\n      }\n\n      const networkError = new NetworkError('Network request failed', error);\n      networkError.requestId = requestId;\n      this.circuitBreaker?.onFailure();\n      throw networkError;\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    requestOptions?: RequestOptions\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, requestOptions);\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error('Unknown error');\n\n        // Don't retry on consumer abort\n        if (requestOptions?.signal?.aborted) {\n          throw lastError;\n        }\n\n        // Don't retry on client errors (4xx), except 429 (rate limit)\n        if (\n          lastError instanceof VesantError &&\n          lastError.statusCode &&\n          lastError.statusCode >= 400 &&\n          lastError.statusCode < 500 &&\n          lastError.statusCode !== 429\n        ) {\n          throw lastError;\n        }\n\n        // Don't retry on last attempt\n        if (attempt === retries) {\n          break;\n        }\n\n        // Use Retry-After for 429, otherwise exponential backoff with jitter\n        let delay: number;\n        if (lastError instanceof RateLimitError && lastError.retryAfter) {\n          delay = lastError.retryAfter * 1000;\n        } else {\n          delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 1000, 10000);\n        }\n        await new Promise((resolve) => setTimeout(resolve, delay));\n\n        if (this.config.debug) {\n          this.logger.debug(`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: Record<string, unknown>, requestId?: string): never {\n    const message = (data.error as string) || (data.message as string) || `HTTP ${status}`;\n\n    const createError = (): VesantError => {\n      switch (status) {\n        case 400:\n          return new VesantError(message, 'BAD_REQUEST', 400);\n        case 401:\n          return new AuthenticationError(message);\n        case 403:\n          return new VesantError(message, 'FORBIDDEN', 403);\n        case 404:\n          return new VesantError(message, 'NOT_FOUND', 404);\n        case 409:\n          return new VesantError(message, 'DUPLICATE_PROFILE', 409);\n        case 429: {\n          const retryAfter = (data.retry_after as number | undefined) || (data.retryAfter as number | undefined);\n          return new RateLimitError(retryAfter);\n        }\n        case 500:\n        case 502:\n        case 503:\n        case 504:\n          return new ServiceUnavailableError(message);\n        default:\n          return new VesantError(message, 'UNKNOWN_ERROR', status);\n      }\n    };\n\n    const error = createError();\n    if (requestId) {\n      error.requestId = requestId;\n    }\n    throw error;\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    if (config.logger) {\n      this.logger = config.logger;\n    }\n    if (config.interceptors) {\n      this.interceptors = config.interceptors;\n    }\n  }\n\n  /**\n   * Get current configuration (readonly)\n   */\n  getConfig(): Readonly<BaseClientConfig> {\n    return { ...this.config };\n  }\n\n  /**\n   * Get rate limit status from tracked response headers.\n   */\n  getRateLimitStatus(): RateLimitStatus | null {\n    return this.rateLimitTracker?.getStatus() ?? null;\n  }\n\n  /**\n   * Get circuit breaker status.\n   */\n  getCircuitBreakerStatus(): CircuitBreakerStatus | null {\n    return this.circuitBreaker?.getStatus() ?? null;\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 * Webhook signature verification utilities.\n *\n * Supports both Web Crypto API (browsers, Deno, Cloudflare Workers)\n * and Node.js crypto module with automatic runtime detection.\n * Uses constant-time comparison to prevent timing attacks.\n */\n\n/**\n * Verify an HMAC-SHA256 webhook signature.\n *\n * @param payload - The raw request body string\n * @param signature - The signature from the webhook header\n * @param secret - The webhook signing secret\n * @returns true if the signature is valid\n */\nexport async function verifyWebhookSignature(\n  payload: string,\n  signature: string,\n  secret: string\n): Promise<boolean> {\n  const hexDigest = await computeHmacSha256(payload, secret);\n\n  // Backend sends \"sha256=<hex>\" format — support both prefixed and raw signatures\n  const expectedPrefixed = `sha256=${hexDigest}`;\n\n  if (signature.startsWith('sha256=')) {\n    return constantTimeEqual(signature, expectedPrefixed);\n  }\n\n  return constantTimeEqual(signature, hexDigest);\n}\n\n/**\n * Compute HMAC-SHA256 hex digest.\n * Automatically selects Web Crypto API or Node.js crypto.\n */\nasync function computeHmacSha256(message: string, secret: string): Promise<string> {\n  // Try Web Crypto API first (browsers, Deno, Cloudflare Workers, Node 18+)\n  if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n    const encoder = new TextEncoder();\n    const key = await globalThis.crypto.subtle.importKey(\n      'raw',\n      encoder.encode(secret),\n      { name: 'HMAC', hash: 'SHA-256' },\n      false,\n      ['sign']\n    );\n    const sig = await globalThis.crypto.subtle.sign('HMAC', key, encoder.encode(message));\n    return Array.from(new Uint8Array(sig))\n      .map((b) => b.toString(16).padStart(2, '0'))\n      .join('');\n  }\n\n  // Fallback to Node.js crypto module\n  try {\n    const { createHmac } = await import('crypto');\n    return createHmac('sha256', secret).update(message).digest('hex');\n  } catch {\n    throw new Error(\n      'No crypto implementation available. Requires Web Crypto API or Node.js crypto module.'\n    );\n  }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks.\n */\nfunction constantTimeEqual(a: string, b: string): boolean {\n  if (a.length !== b.length) {\n    return false;\n  }\n\n  let result = 0;\n  for (let i = 0; i < a.length; i++) {\n    result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n  }\n  return result === 0;\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  GeolocationConfigResponse,\n} from './types';\nimport { SDK_VERSION } from '../core/version';\nimport { getBrowserInfo, generateDeviceId as getOrCreateDeviceId } from '../shared/browser-utils';\n\nconst CIPHER_TEXT_EXPIRY_MINUTES = 5;\n\n/**\n * Compute HMAC-SHA256 of a message using the given key.\n * Uses Web Crypto API (browser/modern Node) with node:crypto fallback.\n */\nasync function computeHMAC(key: string, message: string): Promise<string> {\n  // Try Web Crypto API first (works in browsers and Node 18+)\n  if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n    const encoder = new TextEncoder();\n    const keyData = encoder.encode(key);\n    const msgData = encoder.encode(message);\n\n    const cryptoKey = await globalThis.crypto.subtle.importKey(\n      'raw',\n      keyData,\n      { name: 'HMAC', hash: 'SHA-256' },\n      false,\n      ['sign'],\n    );\n\n    const signature = await globalThis.crypto.subtle.sign('HMAC', cryptoKey, msgData);\n    const bytes = new Uint8Array(signature);\n    return Array.from(bytes)\n      .map((b) => b.toString(16).padStart(2, '0'))\n      .join('');\n  }\n\n  // Fallback: Node.js crypto module\n  // eslint-disable-next-line @typescript-eslint/no-var-requires\n  const { createHmac } = await import('node:crypto');\n  return createHmac('sha256', key).update(message).digest('hex');\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        const { latitude, longitude, accuracy } = position.coords;\n\n        // Validate coordinates\n        if (latitude < -90 || latitude > 90) {\n          resolve(null);\n          return;\n        }\n        if (longitude < -180 || longitude > 180) {\n          resolve(null);\n          return;\n        }\n        if (accuracy !== null && accuracy !== undefined && accuracy <= 0) {\n          resolve(null);\n          return;\n        }\n\n        resolve({\n          latitude,\n          longitude,\n          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 * 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(\n  options: CipherTextOptions,\n  config?: GeolocationConfigResponse\n): Promise<CipherTextResult> {\n  const warnings: string[] = [];\n\n  // Auto-enable GPS if tenant config requires it for this event type\n  let requestLocation = options.requestLocation ?? false;\n  let gpsRequiredByConfig = false;\n  if (config?.require_gps) {\n    const reason = options.reason;\n    if (\n      (reason === 'login' && config.require_gps.login) ||\n      (reason === 'registration' && config.require_gps.registration) ||\n      (reason === 'transaction' && config.require_gps.transaction)\n    ) {\n      if (!requestLocation) {\n        gpsRequiredByConfig = true;\n      }\n      requestLocation = true;\n    }\n  }\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 (requestLocation) {\n    const location = await requestGPSLocation(\n      options.locationTimeout || 10000,\n      options.highAccuracy !== false\n    );\n\n    if (location) {\n      locationData = location;\n    } else if (gpsRequiredByConfig) {\n      throw new Error(\n        `GPS location is required for ${options.reason} by tenant configuration, but GPS was not available or permission was denied`\n      );\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  const timestamp = now.getTime().toString(36); // Base36 timestamp\n\n  let cipherText: string;\n  const hmacKey = options.signingKey || options.apiKey;\n  if (hmacKey) {\n    // v02: HMAC-signed — format: 02.{timestamp}.{base64}.{hmac}\n    const message = `02.${timestamp}.${encoded}`;\n    const hmac = await computeHMAC(hmacKey, message);\n    cipherText = `${message}.${hmac}`;\n  } else {\n    // v01: unsigned (backwards compat)\n    cipherText = `01.${timestamp}.${encoded}`;\n  }\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    // v01: 3 parts, v02: 4 parts (4th is HMAC — ignored when decoding)\n    if (parts.length !== 3 && parts.length !== 4) return null;\n\n    const [version, , encodedB64] = parts;\n    if (version !== '01' && version !== '02') return null;\n\n    // Decode matches encode: just base64 decode (no obfuscation)\n    const json = decodeURIComponent(escape(atob(encodedB64)));\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 && parts.length !== 4) 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// Re-export types\nexport type { CipherTextPayload, CipherTextOptions, CipherTextResult, CipherTextReason, GeolocationConfigResponse };\n","/**\n * GeolocationClient - TypeScript SDK for Vesant 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 { ValidationError } from '../core/errors';\nimport { generateDeviceId, getBrowserInfo } from '../shared/browser-utils';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n  GeolocationClientConfig,\n  GeolocationConfigResponse,\n  VerifyIPRequest,\n  LocationVerification,\n  ComplianceCheckResponse,\n  PaginationParams,\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  CipherTextCustomerData,\n  CipherTextOptions,\n  CipherTextResult,\n} from './types';\nimport { generateCipherText as generateCipherTextUtil } from './ciphertext';\n\n/**\n * GeolocationClient extends BaseClient for:\n * - Consistent retry logic with exponential backoff\n * - Unified error handling (VesantError, 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  private cachedSigningKey?: string;\n\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      logger: config.logger,\n      environment: config.environment,\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, requestOptions?: RequestOptions): Promise<LocationVerification> {\n    if (!request.ip_address?.trim()) {\n      throw new ValidationError('ip_address is required and must be a non-empty string', ['ip_address']);\n    }\n\n    // Auto-collect device fingerprint when not provided by the caller.\n    // This ensures device trust detection (new device, fingerprint changes)\n    // works even when the integrator doesn't explicitly pass device data.\n    const enrichedRequest = request.device_fingerprint\n      ? request\n      : { ...request, device_fingerprint: collectDeviceFingerprint() };\n\n    // Use requestWithRetry for critical verification calls\n    return this.requestWithRetry<LocationVerification>('/api/v1/geo/verify', {\n      method: 'POST',\n      body: JSON.stringify(enrichedRequest),\n    }, undefined, undefined, requestOptions);\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, requestOptions?: RequestOptions): 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      }, undefined, undefined, requestOptions\n    );\n  }\n\n  // ============================================================================\n  // GPS Configuration\n  // ============================================================================\n\n  /**\n   * Get the tenant's GPS requirement configuration\n   *\n   * Returns which event types require GPS location to be collected.\n   * Use this to auto-enable GPS collection in generateCipherText when required.\n   *\n   * @returns GPS requirement config per event type\n   *\n   * @example\n   * ```typescript\n   * const config = await client.getGPSConfig();\n   * if (config.require_gps.login) {\n   *   // GPS is required for login — auto-enable location\n   * }\n   * ```\n   */\n  async getGPSConfig(requestOptions?: RequestOptions): Promise<GeolocationConfigResponse> {\n    const config = await this.requestWithRetry<GeolocationConfigResponse>('/api/v1/geo/config', undefined, undefined, undefined, requestOptions);\n    if (config.signing_key) {\n      this.cachedSigningKey = config.signing_key;\n    }\n    return config;\n  }\n\n  /**\n   * Fetch the signing key from the dedicated authenticated endpoint.\n   *\n   * Falls back to getGPSConfig() for backward compatibility with older servers\n   * that don't expose `/api/v1/geo/signing-key`.\n   *\n   * @returns The signing key string, or undefined if unavailable\n   */\n  async fetchSigningKey(requestOptions?: RequestOptions): Promise<string | undefined> {\n    try {\n      const response = await this.requestWithRetry<{ signing_key: string }>(\n        '/api/v1/geo/signing-key', undefined, undefined, undefined, requestOptions,\n      );\n      if (response.signing_key) {\n        this.cachedSigningKey = response.signing_key;\n        return response.signing_key;\n      }\n    } catch {\n      // Older servers may not have this endpoint — fall back to config\n    }\n\n    const config = await this.getGPSConfig(requestOptions);\n    return config.signing_key;\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   * @param customerData - Optional customer data for risk profile creation (used when user is blocked)\n   * @returns Validation result with device info, location, and risk assessment\n   *\n   * @example\n   * ```typescript\n   * // Validate cipherText during registration with customer data\n   * const result = await client.validateCipherText(\n   *   cipherText,\n   *   \"user_123\",\n   *   \"registration\",\n   *   clientIP,\n   *   {\n   *     full_name: \"John Doe\",\n   *     email: \"john@example.com\",\n   *     country: \"US\",\n   *     state: \"CA\"\n   *   }\n   * );\n   *\n   * if (!result.valid) {\n   *   console.log(\"CipherText validation failed:\", result.errors);\n   *   return;\n   * }\n   *\n   * if (result.risk.is_blocked) {\n   *   console.log(\"Access blocked:\", result.risk.block_reasons);\n   *   // A risk profile with full customer data has been created for the alert\n   * }\n   * ```\n   */\n  async validateCipherText(\n    cipherText: string,\n    userId: string,\n    eventType: CipherTextReason,\n    expectedIP?: string,\n    customerData?: CipherTextCustomerData,\n    requestOptions?: RequestOptions\n  ): Promise<ValidateCipherTextResponse> {\n    if (!cipherText?.trim()) {\n      throw new ValidationError('cipherText is required and must be a non-empty string', ['cipherText']);\n    }\n    if (!userId?.trim()) {\n      throw new ValidationError('userId is required and must be a non-empty string', ['userId']);\n    }\n\n    const request: ValidateCipherTextRequest = {\n      cipher_text: cipherText,\n      user_id: userId,\n      event_type: eventType,\n      expected_ip: expectedIP,\n      customer_data: customerData,\n    };\n\n    return this.requestWithRetry<ValidateCipherTextResponse>(\n      '/api/v1/geo/validate-ciphertext',\n      {\n        method: 'POST',\n        body: JSON.stringify(request),\n      }, undefined, undefined, requestOptions\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    requestOptions?: RequestOptions\n  ): Promise<{\n    ciphertext_valid: boolean;\n    ciphertext_result: ValidateCipherTextResponse;\n    location: LocationVerification;\n  }> {\n    // validate-ciphertext already performs full geo verification on the server\n    // (IP lookup, risk scoring, alert triggering, device tracking). A separate\n    // verifyIP call would create duplicate geolocation records and alerts.\n    const cipherTextResult = await this.validateCipherText(\n      cipherText,\n      userId,\n      eventType,\n      ipAddress,\n      undefined,\n      requestOptions\n    );\n\n    // Build LocationVerification from the enriched ciphertext response.\n    // If risk data is missing (partial response), fall back to verifyIP.\n    const loc = cipherTextResult.location;\n    const risk = cipherTextResult.risk;\n\n    if (!risk) {\n      const locationResult = await this.verifyIP({\n        ip_address: ipAddress,\n        user_id: userId,\n        event_type: eventType,\n      }, requestOptions);\n      return {\n        ciphertext_valid: cipherTextResult.valid,\n        ciphertext_result: cipherTextResult,\n        location: locationResult,\n      };\n    }\n\n    const location: LocationVerification = {\n      ip_address: cipherTextResult.ip_address,\n      location: {\n        country: loc?.country ?? '',\n        country_iso: loc?.country_iso ?? '',\n        city: loc?.city ?? '',\n        region: loc?.region ?? '',\n        postal_code: '',\n        latitude: loc?.latitude ?? 0,\n        longitude: loc?.longitude ?? 0,\n        timezone: '',\n        is_vpn: risk.is_vpn ?? false,\n        is_proxy: risk.is_proxy ?? false,\n        is_tor: risk.is_tor ?? false,\n        is_hosting: risk.is_hosting ?? false,\n        is_anonymizer: risk.is_vpn || risk.is_proxy || risk.is_tor,\n      },\n      is_compliant: cipherTextResult.is_compliant ?? !risk.is_blocked,\n      is_blocked: risk.is_blocked ?? false,\n      risk_level: risk.level ?? 'low',\n      risk_score: risk.score ?? 0,\n      risk_reasons: risk.is_blocked && risk.block_reasons\n        ? risk.block_reasons\n        : (risk.factors ?? []),\n      jurisdiction: cipherTextResult.jurisdiction,\n      geofence_evaluation: cipherTextResult.geofence_evaluation,\n      record_id: cipherTextResult.record_id ?? '',\n      gps_required: cipherTextResult.gps_required,\n    };\n\n    return {\n      ciphertext_valid: cipherTextResult.valid,\n      ciphertext_result: cipherTextResult,\n      location,\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    requestOptions?: RequestOptions\n  ): Promise<LocationRequestResult> {\n    return this.request<LocationRequestResult>('/api/v1/location-requests', {\n      method: 'POST',\n      body: JSON.stringify(request),\n    }, undefined, requestOptions);\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, requestOptions?: RequestOptions): Promise<LocationRequest> {\n    return this.request<LocationRequest>(`/api/v1/location-requests/${requestId}`, undefined, undefined, requestOptions);\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    requestOptions?: RequestOptions\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      undefined, undefined, requestOptions\n    );\n  }\n\n  /**\n   * Cancel a pending location request\n   *\n   * @param requestId - Location request ID\n   */\n  async cancelLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<void> {\n    await this.request(`/api/v1/location-requests/${requestId}/cancel`, {\n      method: 'POST',\n    }, undefined, requestOptions);\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    requestOptions?: RequestOptions\n  ): Promise<void> {\n    await this.request(`/api/v1/location-requests/${requestId}/resend`, {\n      method: 'POST',\n      body: JSON.stringify(contact),\n    }, undefined, requestOptions);\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, requestOptions?: RequestOptions): Promise<LocationShareInfo> {\n    return this.request<LocationShareInfo>(`/api/v1/location/share/${token}`, undefined, undefined, requestOptions);\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    requestOptions?: RequestOptions\n  ): Promise<LocationCaptureResponse> {\n    return this.request<LocationCaptureResponse>(`/api/v1/location/share/${token}`, {\n      method: 'POST',\n      body: JSON.stringify(capture),\n    }, undefined, requestOptions);\n  }\n\n  // ============================================================================\n  // CipherText Generation\n  // ============================================================================\n\n  /**\n   * Generate a signed cipherText containing device and location data.\n   *\n   * Automatically passes the client's API key for HMAC signing (v02 format).\n   * If no API key is configured, falls back to unsigned v01 format.\n   *\n   * @param options - Options for cipherText generation\n   * @param gpsConfig - Optional GPS config (from getGPSConfig)\n   * @returns CipherText result with the signed string\n   *\n   * @example\n   * ```typescript\n   * const result = await client.generateCipherText({ reason: 'login' });\n   * console.log(result.cipherText); // v02 signed cipherText\n   * ```\n   */\n  async generateCipherText(\n    options: Omit<CipherTextOptions, 'apiKey' | 'signingKey'>,\n    gpsConfig?: GeolocationConfigResponse,\n  ): Promise<CipherTextResult> {\n    // Use cached signing key, or fetch from dedicated endpoint (with fallback)\n    let signingKey = this.cachedSigningKey;\n    let resolvedGpsConfig = gpsConfig;\n    if (!signingKey) {\n      signingKey = await this.fetchSigningKey();\n    }\n    // Fetch GPS config for auto-enable when caller didn't provide one\n    if (!resolvedGpsConfig) {\n      resolvedGpsConfig = await this.getGPSConfig();\n    }\n    return generateCipherTextUtil(\n      { ...options, signingKey: signingKey || undefined },\n      resolvedGpsConfig,\n    );\n  }\n\n  // ============================================================================\n  // Utility Methods (inherited from BaseClient: healthCheck, updateConfig, getConfig, buildQueryString)\n  // ============================================================================\n}\n\n/**\n * Auto-collect device fingerprint from the browser environment.\n * Returns safe defaults when running server-side (SSR/Node.js).\n */\nfunction collectDeviceFingerprint(): VerifyIPRequest['device_fingerprint'] {\n  const deviceId = generateDeviceId();\n  const browserInfo = getBrowserInfo();\n  const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : 'server';\n  const platform = typeof navigator !== 'undefined' ? (navigator.platform || 'unknown') : 'server';\n\n  return {\n    device_id: deviceId,\n    user_agent: userAgent,\n    platform,\n    browser: browserInfo.browser,\n    browser_version: browserInfo.browser_version,\n    os: browserInfo.os,\n    os_version: browserInfo.os_version,\n    screen_resolution: typeof screen !== 'undefined' ? `${screen.width}x${screen.height}` : undefined,\n    language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n    timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone,\n  };\n}\n","/**\n * RiskProfileClient - Customer Risk Profile Management\n *\n * Provides methods to create, retrieve, and manage customer risk profiles\n * in the Vesant Compliance Platform.\n */\n\nimport { BaseClient } from '../core/client';\nimport { VesantError } from '../core/errors';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n  CustomerProfile,\n  CreateProfileRequest,\n  UpdateProfileRequest,\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, requestOptions?: RequestOptions): Promise<CustomerProfile> {\n    return this.request<CustomerProfile>('/api/v1/profiles', {\n      method: 'POST',\n      body: JSON.stringify(request),\n    }, undefined, requestOptions);\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   * ```\n   */\n  async getProfile(customerId: string, requestOptions?: RequestOptions): Promise<CustomerProfile> {\n    try {\n      // Use the SDK-authenticated endpoint (API key auth)\n      return await this.request<CustomerProfile>(\n        `/api/v1/profiles?customer_id=${encodeURIComponent(customerId)}`,\n        undefined, undefined, requestOptions\n      );\n    } catch (error) {\n      // Normalize to NOT_FOUND for consistent error handling in getOrCreateProfile\n      if (error instanceof VesantError && (error.statusCode === 404 || error.code === 'NOT_FOUND')) {\n        throw new VesantError('Profile not found', 'NOT_FOUND', 404);\n      }\n      throw error;\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    requestOptions?: RequestOptions\n  ): Promise<CustomerProfile> {\n    return this.request<CustomerProfile>(`/api/v1/profiles/${profileId}`, {\n      method: 'PUT',\n      body: JSON.stringify(updates),\n    }, undefined, requestOptions);\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    requestOptions?: RequestOptions\n  ): Promise<CustomerProfile> {\n    try {\n      return await this.getProfile(customerId, requestOptions);\n    } catch (error) {\n      // Only treat NOT_FOUND as \"profile doesn't exist\" — re-throw other errors\n      if (error instanceof VesantError && error.code === 'NOT_FOUND') {\n        return await this.createProfile(createRequest, requestOptions);\n      }\n      throw error;\n    }\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 { ValidateCipherTextResponse } 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  cipherText?: string;\n\n  // Additional data\n  metadata?: Record<string, unknown>;\n}\n\nexport interface RegistrationVerificationResponse {\n  allowed: boolean;\n  geolocation: LocationVerification;\n  profile: CustomerProfile | null;\n  requiresKYC: boolean;\n  requiresEDD: boolean;\n  blockReasons: string[];\n  processingTime: number;\n  cipherTextValidation?: ValidateCipherTextResponse;\n}\n\n// ============================================================================\n// Login Verification Types\n// ============================================================================\n\nexport interface LoginVerificationRequest {\n  customerId: string;\n  ipAddress: string;\n  deviceFingerprint?: DeviceFingerprintRequest;\n  cipherText?: string;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface LoginVerificationResponse {\n  allowed: boolean;\n  geolocation: LocationVerification;\n  profile: CustomerProfile | null;\n  requiresStepUp: boolean;\n  blockReasons: string[];\n  processingTime: number;\n  cipherTextValidation?: ValidateCipherTextResponse;\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  cipherText?: string;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface TransactionVerificationResponse {\n  allowed: boolean;\n  geolocation: LocationVerification;\n  profile: CustomerProfile | null;\n  transactionRisk: TransactionRiskResult;\n  requiresApproval: boolean;\n  blockReasons: string[];\n  processingTime: number;\n  cipherTextValidation?: ValidateCipherTextResponse;\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  cipherText?: string;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface EventVerificationResponse {\n  allowed: boolean;\n  geolocation: LocationVerification;\n  blockReasons: string[];\n  processingTime: number;\n  cipherTextValidation?: ValidateCipherTextResponse;\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// 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 * SDK is the primary data injection point for compliance verification.\n */\n\nimport { GeolocationClient } from '../geolocation/client';\nimport { RiskProfileClient } from '../risk-profile/client';\nimport type { VesantConfig, Logger, RequestOptions, RequiredVesantConfig, RequestInterceptor } from '../core/config';\nimport { ComplianceError, ValidationError, VesantError } from '../core/errors';\nimport { createConsoleLogger } from '../core/logger';\nimport type { JurisdictionConfig, LocationVerification, ValidateCipherTextResponse } 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: RequiredVesantConfig;\n  private logger: Logger;\n  private currencyRates: CurrencyRates;\n  private _currencyRatesCustomized: boolean = false;\n  private _currencyRatesWarned: boolean = false;\n\n  constructor(config: VesantConfig) {\n    this.logger = config.logger || createConsoleLogger();\n    const interceptors: RequestInterceptor[] = config.interceptors || [];\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      autoCreateProfiles: config.autoCreateProfiles !== false, // default true\n      syncMode: config.syncMode || 'sync',\n      environment: config.environment,\n      interceptors,\n      logger: this.logger,\n    };\n\n    this.geoClient = new GeolocationClient({\n      baseURL: this.config.baseURL,\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      logger: this.logger,\n      environment: this.config.environment,\n    });\n\n    this.riskClient = new RiskProfileClient({\n      baseURL: this.config.baseURL,\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      interceptors,\n      logger: this.logger,\n      environment: this.config.environment,\n    });\n\n    this.currencyRates = DEFAULT_CURRENCY_RATES;\n  }\n\n  // ============================================================================\n  // Sub-Client Accessors\n  // ============================================================================\n\n  /** Get the underlying GeolocationClient for direct geolocation API access */\n  getGeolocationClient(): GeolocationClient {\n    return this.geoClient;\n  }\n\n  /** Get the underlying RiskProfileClient for direct risk profile API access */\n  getRiskProfileClient(): RiskProfileClient {\n    return this.riskClient;\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    requestOptions?: RequestOptions\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    let cipherTextResult: ValidateCipherTextResponse | undefined;\n\n    try {\n      if (this.config.debug) {\n        this.logger.debug('Starting registration verification', { customerId: request.customerId });\n      }\n\n      // When cipherText is present, validate-ciphertext performs full geo verification\n      // server-side. Calling verifyIP separately would create duplicate records/alerts.\n      if (request.cipherText) {\n        cipherTextResult = await this.executeCipherTextValidation(\n          request.cipherText,\n          request.customerId,\n          'registration',\n          request.ipAddress,\n          {\n            full_name: request.fullName,\n            email: request.emailAddress,\n            phone: request.phoneNumber,\n            date_of_birth: request.dateOfBirth,\n          },\n          requestOptions\n        );\n        geoVerification = (cipherTextResult && this.buildLocationFromCipherText(cipherTextResult, request.ipAddress))\n          ?? await this.geoClient.verifyIP({\n              ip_address: request.ipAddress,\n              user_id: request.customerId,\n              event_type: 'registration',\n              device_fingerprint: request.deviceFingerprint,\n            }, requestOptions);\n      } else {\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        }, requestOptions);\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, cipherTextResult);\n\n      if (blockReasons.length > 0) {\n        if (this.config.debug) {\n          this.logger.debug('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,\n          requiresKYC: false,\n          requiresEDD: false,\n          blockReasons: blockReasons,\n          processingTime: Date.now() - startTime,\n          cipherTextValidation: cipherTextResult,\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      }, requestOptions);\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        this.logger.debug('Registration verification complete', {\n          allowed: true,\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        cipherTextValidation: cipherTextResult,\n      };\n    } catch (error) {\n      if (this.config.debug) {\n        this.logger.error('Registration verification failed', {\n          code: error instanceof Error ? (error as any).code : undefined,\n          message: error instanceof Error ? error.message : 'Unknown error',\n        });\n      }\n\n      // Preserve DUPLICATE_PROFILE errors so callers can distinguish\n      // duplicate registrations from other failures\n      if (error instanceof VesantError && error.code === 'DUPLICATE_PROFILE') {\n        throw error;\n      }\n\n      throw new ComplianceError(\n        'Registration verification failed',\n        error instanceof Error ? error.message : undefined,\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(\n    geoVerification: LocationVerification,\n    cipherTextResult?: ValidateCipherTextResponse\n  ): 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    // CipherText-based blocks (only when cipherText was provided)\n    if (cipherTextResult) {\n      if (!cipherTextResult.valid) {\n        blockReasons.push('ciphertext_validation_failed');\n      }\n      if (cipherTextResult.risk?.is_blocked) {\n        blockReasons.push(...(cipherTextResult.risk.block_reasons || []));\n      }\n      if (cipherTextResult.risk?.location_mismatch) {\n        blockReasons.push('gps_ip_location_mismatch');\n      }\n    }\n\n    // GPS required but no cipherText provided — block\n    if (geoVerification.gps_required && !cipherTextResult) {\n      blockReasons.push('gps_verification_required');\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  private validateLoginRequest(request: LoginVerificationRequest): 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 (errors.length > 0) {\n      throw new ValidationError(`Invalid login request: ${errors.join(', ')}`, errors);\n    }\n  }\n\n  private validateTransactionRequest(request: TransactionVerificationRequest): 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.amount <= 0) {\n      errors.push('amount must be greater than 0');\n    }\n\n    if (!request.currency?.trim()) {\n      errors.push('currency is required');\n    }\n\n    if (errors.length > 0) {\n      throw new ValidationError(`Invalid transaction request: ${errors.join(', ')}`, errors);\n    }\n  }\n\n  private validateEventRequest(request: EventVerificationRequest): 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.eventType?.trim()) {\n      errors.push('eventType is required');\n    }\n\n    if (errors.length > 0) {\n      throw new ValidationError(`Invalid event request: ${errors.join(', ')}`, errors);\n    }\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    requestOptions?: RequestOptions\n  ): Promise<LoginVerificationResponse> {\n    const startTime = Date.now();\n\n    this.validateLoginRequest(request);\n\n    try {\n      if (this.config.debug) {\n        this.logger.debug('Starting login verification', { customerId: request.customerId });\n      }\n\n      // Step 1: Verify geolocation, cipherText, and fetch profile in parallel.\n      // When cipherText is present, validate-ciphertext performs full geo verification\n      // server-side — calling verifyIP separately would create duplicate records/alerts.\n      let cipherTextResult: ValidateCipherTextResponse | undefined;\n      let geoVerification: LocationVerification;\n      let profileResult: CustomerProfile | null;\n\n      if (request.cipherText) {\n        [cipherTextResult, profileResult] = await Promise.all([\n          this.executeCipherTextValidation(\n            request.cipherText, request.customerId, 'login', request.ipAddress,\n            undefined, requestOptions\n          ),\n          this.riskClient.getProfile(request.customerId, requestOptions).catch(() => null),\n        ]);\n        geoVerification = (cipherTextResult && this.buildLocationFromCipherText(cipherTextResult, request.ipAddress))\n          ?? await this.geoClient.verifyIP({\n              ip_address: request.ipAddress,\n              user_id: request.customerId,\n              event_type: 'login',\n              device_fingerprint: request.deviceFingerprint,\n            }, requestOptions);\n      } else {\n        [, geoVerification, profileResult] = await Promise.all([\n          Promise.resolve(undefined),\n          this.geoClient.verifyIP({\n            ip_address: request.ipAddress,\n            user_id: request.customerId,\n            event_type: 'login',\n            device_fingerprint: request.deviceFingerprint,\n          }, requestOptions),\n          this.riskClient.getProfile(request.customerId, requestOptions).catch(() => null),\n        ]);\n      }\n\n      // Step 2: Check if login should be blocked BEFORE creating/updating profile\n      const loginBlockReasons = this.getBlockReasons(geoVerification, profileResult, cipherTextResult);\n      const isBlocked =\n        !geoVerification.is_compliant ||\n        geoVerification.is_blocked ||\n        !!(cipherTextResult?.risk?.is_blocked) ||\n        cipherTextResult?.valid === false ||\n        (geoVerification.gps_required && !cipherTextResult);\n\n      if (isBlocked && !profileResult) {\n        // Blocked and no existing profile — return without creating one\n        return {\n          allowed: false,\n          geolocation: geoVerification,\n          profile: null,\n          requiresStepUp: false,\n          blockReasons: loginBlockReasons,\n          processingTime: Date.now() - startTime,\n          cipherTextValidation: cipherTextResult,\n        };\n      }\n\n      // Step 3: Get or create profile (only reached if not blocked, or profile already exists)\n      let profile: CustomerProfile;\n      if (profileResult) {\n        profile = profileResult;\n\n        // Update last activity and location\n        if (!isBlocked && this.shouldUpdateProfile(profile, geoVerification.location.city)) {\n          profile = 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          }, requestOptions);\n        }\n      } else {\n        // Profile doesn't exist - this shouldn't happen for login\n        if (this.config.autoCreateProfiles && this.config.debug) {\n          this.logger.warn('Profile not found for login, creating...');\n        }\n        profile = await this.createProfileFromGeo(request.customerId, geoVerification);\n      }\n\n      const requiresStepUp =\n        geoVerification.risk_level === 'high' ||\n        geoVerification.risk_level === 'critical' ||\n        (cipherTextResult?.risk?.location_mismatch === true);\n\n      return {\n        allowed: !isBlocked && profile.customer_status !== 'suspended',\n        geolocation: geoVerification,\n        profile: profile,\n        requiresStepUp: requiresStepUp,\n        blockReasons: isBlocked || profile.customer_status === 'suspended'\n          ? this.getBlockReasons(geoVerification, profile, cipherTextResult)\n          : [],\n        processingTime: Date.now() - startTime,\n        cipherTextValidation: cipherTextResult,\n      };\n    } catch (error) {\n      throw new ComplianceError('Login verification failed', error instanceof Error ? error.message : undefined);\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    requestOptions?: RequestOptions\n  ): Promise<TransactionVerificationResponse> {\n    const startTime = Date.now();\n\n    this.validateTransactionRequest(request);\n\n    try {\n      if (this.config.debug) {\n        this.logger.debug('Starting transaction verification', {\n          customerId: request.customerId,\n          amount: request.amount,\n          currency: request.currency,\n        });\n      }\n\n      // Step 1: Verify geolocation, cipherText, and fetch profile in parallel.\n      // When cipherText is present, validate-ciphertext performs full geo verification\n      // server-side — calling verifyIP separately would create duplicate records/alerts.\n      let cipherTextResult: ValidateCipherTextResponse | undefined;\n      let geoVerification: LocationVerification;\n      let profileResult: CustomerProfile | null;\n\n      if (request.cipherText) {\n        [cipherTextResult, profileResult] = await Promise.all([\n          this.executeCipherTextValidation(\n            request.cipherText, request.customerId, 'transaction', request.ipAddress,\n            undefined, requestOptions\n          ),\n          this.riskClient.getProfile(request.customerId, requestOptions).catch(() => null),\n        ]);\n        geoVerification = (cipherTextResult && this.buildLocationFromCipherText(cipherTextResult, request.ipAddress))\n          ?? await this.geoClient.verifyIP({\n              ip_address: request.ipAddress,\n              user_id: request.customerId,\n              event_type: 'transaction',\n              device_fingerprint: request.deviceFingerprint,\n            }, requestOptions);\n      } else {\n        [, geoVerification, profileResult] = await Promise.all([\n          Promise.resolve(undefined),\n          this.geoClient.verifyIP({\n            ip_address: request.ipAddress,\n            user_id: request.customerId,\n            event_type: 'transaction',\n            device_fingerprint: request.deviceFingerprint,\n          }, requestOptions),\n          this.riskClient.getProfile(request.customerId, requestOptions).catch(() => null),\n        ]);\n      }\n\n      // Step 2: Check if blocked before proceeding with risk calculation\n      const geoBlocked =\n        !geoVerification.is_compliant ||\n        geoVerification.is_blocked ||\n        !!(cipherTextResult?.risk?.is_blocked) ||\n        cipherTextResult?.valid === false ||\n        (geoVerification.gps_required && !cipherTextResult);\n\n      if (geoBlocked && !profileResult) {\n        // Blocked and no profile — return early without risk calculation\n        return {\n          allowed: false,\n          geolocation: geoVerification,\n          profile: null,\n          transactionRisk: { score: 0, level: 'low' as const, factors: [], allowed: false, requiresManualReview: false },\n          requiresApproval: false,\n          blockReasons: this.getTransactionBlockReasons(\n            geoVerification,\n            { score: 0, level: 'low', factors: [], allowed: false, requiresManualReview: false },\n            true,\n            cipherTextResult\n          ),\n          processingTime: Date.now() - startTime,\n          cipherTextValidation: cipherTextResult,\n        };\n      }\n\n      if (!profileResult) {\n        throw new ComplianceError('Customer profile not found', request.customerId);\n      }\n      const profile = profileResult;\n\n      // Step 3: Calculate transaction risk\n      const transactionRisk = this.calculateTransactionRisk(\n        request.amount,\n        request.currency,\n        geoVerification,\n        profile,\n        cipherTextResult\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        !geoBlocked &&\n        jurisdictionAllowed &&\n        transactionRisk.allowed &&\n        profile.customer_status !== 'suspended';\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, transactionRisk, jurisdictionAllowed, cipherTextResult\n        ),\n        processingTime: Date.now() - startTime,\n        cipherTextValidation: cipherTextResult,\n      };\n    } catch (error) {\n      throw new ComplianceError('Transaction verification failed', error instanceof Error ? error.message : undefined);\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, requestOptions?: RequestOptions): Promise<EventVerificationResponse> {\n    const startTime = Date.now();\n\n    this.validateEventRequest(request);\n\n    // When cipherText is present, validate-ciphertext performs full geo verification\n    // server-side — calling verifyIP separately would create duplicate records/alerts.\n    let cipherTextResult: ValidateCipherTextResponse | undefined;\n    let geoVerification: LocationVerification;\n\n    if (request.cipherText) {\n      cipherTextResult = await this.executeCipherTextValidation(\n        request.cipherText, request.customerId, request.eventType, request.ipAddress,\n        undefined, requestOptions\n      );\n      geoVerification = (cipherTextResult && this.buildLocationFromCipherText(cipherTextResult, request.ipAddress))\n        ?? 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          }, requestOptions);\n    } else {\n      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      }, requestOptions);\n    }\n\n    // Optionally update profile activity\n    if (this.config.autoCreateProfiles) {\n      try {\n        const profile = await this.riskClient.getProfile(request.customerId, requestOptions);\n        await this.riskClient.updateProfile(profile.id, {\n          last_recorded_activity: new Date().toISOString(),\n        }, requestOptions);\n      } catch (error) {\n        // Profile doesn't exist, ignore or create based on config\n        if (this.config.debug) {\n          this.logger.warn('Profile not found for event');\n        }\n      }\n    }\n\n    const cipherTextBlocked = cipherTextResult\n      ? (!cipherTextResult.valid || cipherTextResult.risk?.is_blocked === true)\n      : false;\n\n    const blockReasons = [...(geoVerification.risk_reasons ?? [])];\n    if (cipherTextResult) {\n      if (!cipherTextResult.valid) {\n        blockReasons.push('ciphertext_validation_failed');\n      }\n      if (cipherTextResult.risk?.is_blocked) {\n        blockReasons.push(...(cipherTextResult.risk.block_reasons || []));\n      }\n    }\n\n    // GPS required but no cipherText provided — block\n    const gpsBlocked = geoVerification.gps_required && !cipherTextResult;\n    if (gpsBlocked) {\n      blockReasons.push('gps_verification_required');\n    }\n\n    return {\n      allowed: geoVerification.is_compliant && !geoVerification.is_blocked && !cipherTextBlocked && !gpsBlocked,\n      geolocation: geoVerification,\n      blockReasons: [...new Set(blockReasons)],\n      processingTime: Date.now() - startTime,\n      cipherTextValidation: cipherTextResult,\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: LocationVerification,\n    customerData?: {\n      fullName?: string;\n      email?: string;\n      phone?: string;\n      dateOfBirth?: string;\n    }\n  ): Promise<CustomerProfile> {\n    // Warn if creating profile without proper customer data\n    if (!customerData?.email || !customerData?.fullName) {\n      this.logger.warn(\n        'Creating profile with incomplete data. ' +\n        'Profiles should be created during registration with complete customer information.'\n      );\n    }\n\n    return this.riskClient.createProfile({\n      customer_id: customerId,\n      entity_type: 'individual',\n      customer_status: 'active',\n      full_name: customerData?.fullName || undefined,\n      email_address: customerData?.email || '',\n      primary_phone_number: customerData?.phone || undefined,\n      date_of_birth: customerData?.dateOfBirth || undefined,\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  /**\n   * Execute cipherText validation with graceful degradation.\n   * Returns undefined if cipherText is not provided or validation fails.\n   */\n  private async executeCipherTextValidation(\n    cipherText: string | undefined,\n    userId: string,\n    eventType: 'registration' | 'login' | 'transaction' | string,\n    ipAddress: string,\n    customerData?: {\n      full_name?: string;\n      email?: string;\n      phone?: string;\n      date_of_birth?: string;\n    },\n    requestOptions?: RequestOptions\n  ): Promise<ValidateCipherTextResponse | undefined> {\n    if (!cipherText) return undefined;\n\n    try {\n      return await this.geoClient.validateCipherText(\n        cipherText,\n        userId,\n        eventType as any,\n        ipAddress,\n        customerData,\n        requestOptions\n      );\n    } catch (err) {\n      this.logger.warn('CipherText validation failed, proceeding with IP-only', {\n        error: err instanceof Error ? err.message : 'Unknown error',\n      });\n      return undefined;\n    }\n  }\n\n  /**\n   * Build a LocationVerification from a ValidateCipherTextResponse.\n   * The validate-ciphertext endpoint now returns the full geo-verification data\n   * (is_compliant, jurisdiction, geofence_evaluation, record_id, gps_required),\n   * so a separate verifyIP call is unnecessary.\n   */\n  private buildLocationFromCipherText(ct: ValidateCipherTextResponse, ipAddress: string): LocationVerification | null {\n    const loc = ct.location;\n    const risk = ct.risk;\n    if (!risk) return null;\n\n    return {\n      ip_address: ct.ip_address || ipAddress,\n      location: {\n        country: loc?.country ?? '',\n        country_iso: loc?.country_iso ?? '',\n        city: loc?.city ?? '',\n        region: loc?.region ?? '',\n        postal_code: '',\n        latitude: loc?.latitude ?? 0,\n        longitude: loc?.longitude ?? 0,\n        timezone: '',\n        is_vpn: risk.is_vpn,\n        is_proxy: risk.is_proxy,\n        is_tor: risk.is_tor,\n        is_hosting: risk.is_hosting ?? false,\n        is_anonymizer: risk.is_vpn || risk.is_proxy || risk.is_tor,\n      },\n      is_compliant: ct.is_compliant ?? !risk.is_blocked,\n      is_blocked: risk.is_blocked,\n      risk_level: risk.level,\n      risk_score: risk.score,\n      risk_reasons: risk.is_blocked && risk.block_reasons\n        ? risk.block_reasons\n        : (risk.factors ?? []),\n      jurisdiction: ct.jurisdiction,\n      geofence_evaluation: ct.geofence_evaluation,\n      record_id: ct.record_id ?? '',\n      gps_required: ct.gps_required,\n    };\n  }\n\n  private calculateTransactionRisk(\n    amount: number,\n    currency: string,\n    geoVerification: LocationVerification,\n    profile: CustomerProfile,\n    cipherTextResult?: ValidateCipherTextResponse\n  ): TransactionRiskResult {\n    if (!this._currencyRatesCustomized && !this._currencyRatesWarned) {\n      this._currencyRatesWarned = true;\n      this.logger.warn(\n        'Using default currency exchange rates. ' +\n        'Call updateCurrencyRates() or fetchCurrencyRates() for accurate transaction risk calculation.'\n      );\n    }\n\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    // CipherText risk factors\n    if (cipherTextResult) {\n      if (cipherTextResult.risk?.location_mismatch) {\n        riskScore += 20;\n        factors.push('gps_ip_location_mismatch');\n      }\n      if (cipherTextResult.risk?.score) {\n        riskScore += cipherTextResult.risk.score * 0.2;\n      }\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(\n    geoVerification: LocationVerification,\n    profile: CustomerProfile | null,\n    cipherTextResult?: ValidateCipherTextResponse\n  ): string[] {\n    const reasons: string[] = [];\n\n    if (geoVerification.is_blocked) {\n      reasons.push(...(geoVerification.risk_reasons ?? []));\n    }\n\n    if (profile) {\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\n    if (cipherTextResult) {\n      if (!cipherTextResult.valid) {\n        reasons.push('ciphertext_validation_failed');\n      }\n      if (cipherTextResult.risk?.is_blocked) {\n        reasons.push(...(cipherTextResult.risk.block_reasons || []));\n      }\n    }\n\n    // GPS required but no cipherText provided — block\n    if (geoVerification.gps_required && !cipherTextResult) {\n      reasons.push('gps_verification_required');\n    }\n\n    return [...new Set(reasons)];\n  }\n\n  private getTransactionBlockReasons(\n    geoVerification: LocationVerification,\n    transactionRisk: TransactionRiskResult,\n    jurisdictionAllowed: boolean,\n    cipherTextResult?: ValidateCipherTextResponse\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    if (cipherTextResult) {\n      if (!cipherTextResult.valid) {\n        reasons.push('ciphertext_validation_failed');\n      }\n      if (cipherTextResult.risk?.is_blocked) {\n        reasons.push(...(cipherTextResult.risk.block_reasons || []));\n      }\n    }\n\n    // GPS required but no cipherText provided — block\n    if (geoVerification.gps_required && !cipherTextResult) {\n      reasons.push('gps_verification_required');\n    }\n\n    return [...new Set(reasons)];\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    requestOptions?: RequestOptions\n  ): Promise<ComplianceLocationRequestResult> {\n    if (this.config.debug) {\n      this.logger.debug('Creating location request for customer', { customerId: 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, requestOptions);\n    } catch (error) {\n      if (this.config.debug) {\n        this.logger.warn('Customer profile not found', { customerId: 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    }, requestOptions);\n\n    if (this.config.debug) {\n      this.logger.debug('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, requestOptions?: RequestOptions): Promise<LocationRequest> {\n    return this.geoClient.getLocationRequest(requestId, requestOptions);\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    requestOptions?: RequestOptions\n  ): Promise<LocationRequestListResponse> {\n    return this.geoClient.listLocationRequests(filters, pagination, requestOptions);\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, requestOptions?: RequestOptions): Promise<void> {\n    if (this.config.debug) {\n      this.logger.debug('Cancelling location request', { requestId });\n    }\n    await this.geoClient.cancelLocationRequest(requestId, requestOptions);\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    requestOptions?: RequestOptions\n  ): Promise<void> {\n    if (this.config.debug) {\n      this.logger.debug('Resending location request', { requestId });\n    }\n    await this.geoClient.resendLocationRequest(requestId, contact, requestOptions);\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    this._currencyRatesCustomized = true;\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","/**\n * KycClient - TypeScript SDK for Vesant KYC (Know Your Customer) Service\n *\n * Provides type-safe methods to interact with the KYC 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  KycClientConfig,\n  KycRequest,\n  KycRequestFilters,\n  KycRequestListResponse,\n  DocumentVerificationRequest,\n  DocumentVerificationResponse,\n  UpdateKycStatusRequest,\n  RequestAdditionalDocumentsRequest,\n  RequestKycSubmitLinkRequest,\n  RequestKycSubmitLinkResponse,\n  CheckKycStatusRequest,\n  CheckKycStatusResponse,\n  ProofDownloadURL,\n  KycOverview,\n  KycAlert,\n  KycAlertFilters,\n  KycAlertListResponse,\n  UpdateKycAlertRequest,\n  KycPreferences,\n  UpdateKycPreferencesRequest,\n  PaginationParams,\n  CustomerProfile,\n  CustomerProfileFilters,\n  CustomerProfileListResponse,\n  CreateCustomerProfileRequest,\n  CreateReuseKycSessionRequest,\n  CreateReuseKycSessionResponse,\n  SubmitReuseKycSessionRequest,\n} from './types';\n\n/** Helper to add filter value to params, joining arrays with commas */\nfunction addFilterParam(\n  params: Record<string, unknown>,\n  key: string,\n  value: string | string[] | undefined\n): void {\n  if (value !== undefined) {\n    params[key] = Array.isArray(value) ? value.join(',') : value;\n  }\n}\n\n/** Helper to add simple filter values to params */\nfunction addSimpleParams(\n  params: Record<string, unknown>,\n  source: Record<string, unknown>,\n  keys: string[]\n): void {\n  for (const key of keys) {\n    if (source[key] !== undefined) {\n      params[key] = source[key];\n    }\n  }\n}\n\n/**\n * KycClient extends BaseClient for:\n * - Consistent retry logic with exponential backoff\n * - Unified error handling (VesantError, NetworkError, TimeoutError, etc.)\n * - Automatic timeout management\n * - Debug logging\n *\n * All KYC verification calls use requestWithRetry() to handle\n * transient failures gracefully.\n */\nexport class KycClient extends BaseClient {\n  private userId?: string;\n  private riskProfileBaseURL?: string;\n\n  constructor(config: KycClientConfig) {\n    // Convert KycClientConfig 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 KYC calls\n      debug: config.debug,\n      environment: config.environment,\n    };\n    super(baseConfig);\n    this.userId = config.userId;\n    this.riskProfileBaseURL = config.riskProfileBaseURL;\n  }\n\n  /**\n   * Set the user ID for operations requiring user context\n   */\n  setUserId(userId: string): void {\n    this.userId = userId;\n  }\n\n  /**\n   * Get current user ID\n   */\n  getUserId(): string | undefined {\n    return this.userId;\n  }\n\n  /**\n   * Build headers including user ID if available\n   */\n  private getUserHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {};\n    if (this.userId) {\n      headers['X-User-ID'] = this.userId;\n    }\n    return headers;\n  }\n\n  // ============================================================================\n  // Document Verification\n  // ============================================================================\n\n  /**\n   * Request a KYC submission redirect URL for a user\n   *\n   * Generates a link that the user can visit to submit their KYC documents.\n   *\n   * @param request - Request containing the user ID, redirect URL, callback URL, and trigger event\n   * @returns Response containing kyc_required, can_skip, and optionally the redirect link and KYC ID\n   *\n   * @example\n   * ```typescript\n   * const result = await client.requestKycSubmitLink({\n   *   user_id: \"user_123\",\n   *   redirect_url: \"https://merchant.com/kyc-complete\",\n   *   callback_url: \"https://merchant.com/api/kyc-webhook\",\n   *   trigger_event: \"onboarding\"\n   * });\n   *\n   * if (result.kyc_required && result.link) {\n   *   console.log(`Redirect user to: ${result.link}`);\n   * } else if (result.can_skip) {\n   *   console.log(\"KYC not required, user can proceed\");\n   * }\n   * ```\n   */\n  async requestKycSubmitLink(\n    request: RequestKycSubmitLinkRequest\n  ): Promise<RequestKycSubmitLinkResponse> {\n    return this.requestWithRetry<RequestKycSubmitLinkResponse>('/api/v1/kyc/request', {\n      method: 'POST',\n      body: JSON.stringify(request),\n      headers: this.getUserHeaders(),\n    });\n  }\n\n  /**\n   * Create a reuse KYC session for validate a user with existing KYC verification\n   *\n   * @param request - Request containing the reference, customer_id, optional redirect URL, and callback URL (receives POST requests)\n   */\n  async createReuseKycSession(request: CreateReuseKycSessionRequest): Promise<CreateReuseKycSessionResponse> {\n    return this.requestWithRetry<CreateReuseKycSessionResponse>('/api/v1/kyc/face/session', {\n      method: 'POST',\n      body: JSON.stringify(request),\n      headers: this.getUserHeaders(),\n    });\n  }\n\n  /**\n   * Submit a reuse KYC session for validate a user with existing KYC verification\n   *\n   * @param request - Request containing the reference, token and proof (receives POST requests)\n   */\n  async submitReuseKycSession(request: SubmitReuseKycSessionRequest): Promise<CheckKycStatusResponse> {\n    return this.requestWithRetry<CheckKycStatusResponse>('/api/v1/kyc/face/submit', {\n      method: 'POST',\n      body: JSON.stringify(request),\n      headers: this.getUserHeaders(),\n    });\n  }\n\n  /**\n   * Check reuse KYC session status for a reference\n   * @param reference - The unique reference used for the reuse KYC session (e.g., customer ID or transaction ID)\n   * @returns Response with kyc_status and message (reason)\n   * **/\n  async getReuseKycSessionStatus(reference: string): Promise<CheckKycStatusResponse> {\n    return this.requestWithRetry<CheckKycStatusResponse>(`/api/v1/kyc/face/verify/${encodeURIComponent(reference)}`, {\n      method: 'GET',\n      headers: this.getUserHeaders(),\n    });\n  }\n  /**\n   * Check KYC status for a user\n   *\n   * Returns the current KYC status:\n   * - \"complete\" → KYC verified, show \"Continue to Login\"\n   * - \"processing\" → Under review, show \"Continue to Login\"\n   * - \"failed\" / \"declined\" → Show error + retry option\n   * - \"pending\" / \"in_progress\" → Keep polling\n   *\n   * @param request - Request containing user_id and token\n   * @returns Response with kyc_status and message (reason)\n   *\n   * @example\n   * ```typescript\n   * const result = await client.checkKycStatus({\n   *   user_id: \"user_123\",\n   *   token: \"auth_token_xyz\"\n   * });\n   *\n   * if (result.kyc_status === 'complete') {\n   *   // Show \"Continue to Login\"\n   * } else if (result.kyc_status === 'failed' || result.kyc_status === 'declined') {\n   *   // Show error + retry option\n   * } else {\n   *   // Keep polling\n   * }\n   * ```\n   */\n  async checkKycStatus(\n    request: CheckKycStatusRequest\n  ): Promise<CheckKycStatusResponse> {\n    const params = {\n      user_id: request.user_id,\n      kyc_id: request.kyc_id,\n    };\n\n    return this.requestWithRetry<CheckKycStatusResponse>(\n      `/api/v1/kyc/request/status${this.buildQueryString(params)}`,\n      {\n        method: 'GET',\n        headers: this.getUserHeaders(),\n      }\n    );\n  }\n\n  /**\n   * Submit a document verification request with OCR\n   *\n   * Uses requestWithRetry() for automatic retry on transient failures.\n   *\n   * @param request - Document verification request with documents and customer info\n   * @returns Verification response with status and reference\n   *\n   * @example\n   * ```typescript\n   * const result = await client.submitVerification({\n   *   reference: \"customer_123\",\n   *   email: \"customer@example.com\",\n   *   country: \"US\",\n   *   document: {\n   *     proof: base64EncodedImage,\n   *     selected_type: [\"id_card\", \"passport\"],\n   *     name: { first_name: \"John\", last_name: \"Doe\" },\n   *     dob: \"1990-01-15\"\n   *   },\n   *   face: {\n   *     proof: base64EncodedSelfie\n   *   }\n   * });\n   *\n   * console.log(`Verification submitted: ${result.reference}`);\n   * ```\n   */\n  async submitVerification(\n    request: DocumentVerificationRequest\n  ): Promise<DocumentVerificationResponse> {\n    return this.requestWithRetry<DocumentVerificationResponse>('/api/v1/kyc/submit', {\n      method: 'POST',\n      body: JSON.stringify(request),\n      headers: this.getUserHeaders(),\n    });\n  }\n\n  /**\n   * Get a KYC request by ID\n   *\n   * @param id - KYC request ID\n   * @returns KYC request details including proofs and alerts\n   *\n   * @example\n   * ```typescript\n   * const kyc = await client.getKycRequest(\"kyc_abc123\");\n   * console.log(`Status: ${kyc.status}, ID Verified: ${kyc.id_verified}`);\n   * ```\n   */\n  async getKycRequest(id: string): Promise<KycRequest> {\n    return this.request<KycRequest>(`/api/v1/kyc/requests/${id}`);\n  }\n\n  /**\n   * List KYC requests with filters and pagination\n   *\n   * @param filters - Optional filters (status, search, date range)\n   * @param pagination - Optional pagination (page, page_size)\n   * @returns Paginated list of KYC requests\n   *\n   * @example\n   * ```typescript\n   * const requests = await client.listKycRequests(\n   *   { status: \"pending\", search: \"john\" },\n   *   { page: 1, page_size: 20 }\n   * );\n   * console.log(`Found ${requests.total} pending requests`);\n   * ```\n   */\n  async listKycRequests(\n    filters?: KycRequestFilters,\n    pagination?: PaginationParams\n  ): Promise<KycRequestListResponse> {\n    const params: Record<string, unknown> = {};\n\n    if (filters) {\n      addFilterParam(params, 'status', filters.status);\n      addSimpleParams(params, filters as unknown as Record<string, unknown>, ['search', 'fromDate', 'toDate', 'sortBy', 'order']);\n    }\n\n    if (pagination) {\n      if (pagination.page) params.page = pagination.page;\n      if (pagination.page_size) params.limit = pagination.page_size;\n    }\n\n    return this.request<KycRequestListResponse>(\n      `/api/v1/kyc/requests${this.buildQueryString(params)}`,\n      { headers: this.getUserHeaders() }\n    );\n  }\n\n  /**\n   * Update KYC request status (accept/decline)\n   *\n   * @param request - Status update request with reference, status, and reason\n   *\n   * @example\n   * ```typescript\n   * // Accept a KYC request\n   * await client.updateKycStatus({\n   *   reference: \"shufti_ref_123\",\n   *   status: \"accepted\",\n   *   reason: \"All documents verified successfully\"\n   * });\n   *\n   * // Decline a KYC request\n   * await client.updateKycStatus({\n   *   reference: \"shufti_ref_456\",\n   *   status: \"declined\",\n   *   reason: \"Document expired\"\n   * });\n   * ```\n   */\n  async updateKycStatus(request: UpdateKycStatusRequest): Promise<void> {\n    await this.request('/api/v1/kyc/status', {\n      method: 'PUT',\n      body: JSON.stringify(request),\n      headers: this.getUserHeaders(),\n    });\n  }\n\n  /**\n   * Request additional documents from customer\n   *\n   * @param request - Request with KYC ID and document types needed\n   *\n   * @example\n   * ```typescript\n   * await client.requestAdditionalDocuments({\n   *   id: \"kyc_abc123\",\n   *   document_types: [\"address\", \"document_two\"],\n   *   message: \"Please provide proof of address and secondary ID\"\n   * });\n   * ```\n   */\n  async requestAdditionalDocuments(\n    request: RequestAdditionalDocumentsRequest\n  ): Promise<void> {\n    await this.request('/api/v1/kyc/requests', {\n      method: 'PUT',\n      body: JSON.stringify(request),\n      headers: this.getUserHeaders(),\n    });\n  }\n\n  /**\n   * Get downloadable URLs for KYC proofs/documents\n   *\n   * @param kycId - KYC request ID\n   * @returns Array of proof download URLs with expiration\n   *\n   * @example\n   * ```typescript\n   * const proofs = await client.getProofDownloadURLs(\"kyc_abc123\");\n   * proofs.forEach(proof => {\n   *   console.log(`${proof.type}: ${proof.url} (expires: ${proof.expires_at})`);\n   * });\n   * ```\n   */\n  async getProofDownloadURLs(kycId: string): Promise<ProofDownloadURL[]> {\n    return this.request<ProofDownloadURL[]>(\n      `/api/v1/kyc/proofs/${kycId}`,\n      { headers: this.getUserHeaders() }\n    );\n  }\n\n  // ============================================================================\n  // KYC Overview & Statistics\n  // ============================================================================\n\n  /**\n   * Get KYC overview statistics\n   *\n   * @param fromDate - Optional start date (ISO 8601)\n   * @param toDate - Optional end date (ISO 8601)\n   * @returns KYC statistics including counts by status\n   *\n   * @example\n   * ```typescript\n   * const overview = await client.getOverview(\n   *   \"2024-01-01T00:00:00Z\",\n   *   \"2024-12-31T23:59:59Z\"\n   * );\n   * console.log(`Total: ${overview.total}, Pending: ${overview.pending}`);\n   * console.log(`Approved: ${overview.approved}, Rejected: ${overview.rejected}`);\n   * ```\n   */\n  async getOverview(fromDate?: string, toDate?: string): Promise<KycOverview> {\n    const params: Record<string, unknown> = {};\n    if (fromDate) params.fromDate = fromDate;\n    if (toDate) params.toDate = toDate;\n\n    return this.request<KycOverview>(\n      `/api/v1/kyc/overview${this.buildQueryString(params)}`\n    );\n  }\n\n  // ============================================================================\n  // Alert Management\n  // ============================================================================\n\n  /**\n   * Get a KYC alert by ID\n   *\n   * @param alertId - Alert ID\n   * @returns Alert details\n   */\n  async getAlert(alertId: string): Promise<KycAlert> {\n    return this.request<KycAlert>(`/api/v1/kyc/alerts/${alertId}`);\n  }\n\n  /**\n   * List KYC alerts with filters and pagination\n   *\n   * @param filters - Optional filters (status, risk, alert_type, assigned_for, etc.)\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   *   {\n   *     status: [\"pending\", \"in_progress\"],\n   *     risk: \"critical\",\n   *     alert_type: \"kyc\"\n   *   },\n   *   { page: 1, page_size: 20 }\n   * );\n   * console.log(`Found ${alerts.total} alerts`);\n   * ```\n   */\n  async listAlerts(\n    filters?: KycAlertFilters,\n    pagination?: PaginationParams\n  ): Promise<KycAlertListResponse> {\n    const params: Record<string, unknown> = {};\n\n    if (filters) {\n      // Array filters that need comma joining\n      addFilterParam(params, 'kyc_id', filters.kyc_id);\n      addFilterParam(params, 'alert_type', filters.alert_type);\n      addFilterParam(params, 'assigned_for', filters.assigned_for);\n      addFilterParam(params, 'status', filters.status);\n      addFilterParam(params, 'risk', filters.risk);\n      // Simple filters\n      addSimpleParams(params, filters as unknown as Record<string, unknown>, ['search', 'fromDate', 'toDate', 'sort_by', 'order']);\n    }\n\n    if (pagination) {\n      if (pagination.page) params.page = pagination.page;\n      if (pagination.page_size) params.limit = pagination.page_size;\n    }\n\n    return this.request<KycAlertListResponse>(\n      `/api/v1/kyc/alerts${this.buildQueryString(params)}`\n    );\n  }\n\n  /**\n   * Update a KYC alert\n   *\n   * @param alertId - Alert ID\n   * @param update - Fields to update (status, assigned_for, reason, alert_type)\n   *\n   * @example\n   * ```typescript\n   * // Assign an alert\n   * await client.updateAlert(\"alert_123\", {\n   *   assigned_for: \"analyst_user_id\",\n   *   status: \"in_progress\"\n   * });\n   *\n   * // Resolve an alert\n   * await client.updateAlert(\"alert_123\", {\n   *   status: \"resolved\",\n   *   reason: \"Customer verified via phone call\"\n   * });\n   *\n   * // Escalate an alert\n   * await client.updateAlert(\"alert_123\", {\n   *   status: \"escalated\",\n   *   assigned_for: \"manager_user_id\",\n   *   reason: \"Requires senior review - suspicious documents\"\n   * });\n   * ```\n   */\n  async updateAlert(alertId: string, update: UpdateKycAlertRequest): Promise<void> {\n    await this.request(`/api/v1/kyc/alerts/${alertId}`, {\n      method: 'PUT',\n      body: JSON.stringify(update),\n      headers: this.getUserHeaders(),\n    });\n  }\n\n  // ============================================================================\n  // KYC Preferences\n  // ============================================================================\n\n  /**\n   * Get KYC preferences for the tenant\n   *\n   * @returns KYC preferences configuration\n   *\n   * @example\n   * ```typescript\n   * const prefs = await client.getPreferences();\n   * console.log(`Face verification required: ${prefs.is_face_verification_required}`);\n   * console.log(`Required documents: ${prefs.required_document_count}`);\n   * ```\n   */\n  async getPreferences(): Promise<KycPreferences> {\n    return this.request<KycPreferences>('/api/v1/kyc/preferences');\n  }\n\n  /**\n   * Update KYC preferences for the tenant\n   *\n   * @param update - Fields to update\n   * @returns Updated preferences\n   *\n   * @example\n   * ```typescript\n   * await client.updatePreferences({\n   *   is_face_verification_required: true,\n   *   is_address_verification_required: true,\n   *   required_document_count: 2,\n   *   reasons: [\n   *     \"Documents verified\",\n   *     \"Identity confirmed\",\n   *     \"Address matched\"\n   *   ]\n   * });\n   * ```\n   */\n  async updatePreferences(\n    update: UpdateKycPreferencesRequest\n  ): Promise<KycPreferences> {\n    return this.request<KycPreferences>('/api/v1/kyc/preferences', {\n      method: 'PUT',\n      body: JSON.stringify(update),\n    });\n  }\n\n  // ============================================================================\n  // Customer Profile Management (Risk Profile Service)\n  // ============================================================================\n\n  /**\n   * Make a request to the Risk Profile Service\n   * Uses riskProfileBaseURL if configured, otherwise falls back to baseURL\n   */\n  private async riskProfileRequest<T>(\n    path: string,\n    options: RequestInit = {}\n  ): Promise<T> {\n    if (!this.riskProfileBaseURL) {\n      throw new Error(\n        'Risk Profile Service URL not configured. Please provide riskProfileBaseURL in KycClientConfig.'\n      );\n    }\n\n    return this.request<T>(path, {\n      ...options,\n      headers: {\n        ...this.getUserHeaders(),\n        ...(options.headers as Record<string, string>),\n      },\n    }, this.riskProfileBaseURL);\n  }\n\n  /**\n   * List customer profiles for the tenant\n   *\n   * @param filters - Optional filters (risk_category, entity_type, status, search, etc.)\n   * @param pagination - Optional pagination (limit, offset)\n   * @returns Paginated list of customer profiles\n   *\n   * @example\n   * ```typescript\n   * const profiles = await client.listCustomerProfiles(\n   *   { risk_category: 'high', entity_type: 'individual' },\n   *   { limit: 20, offset: 0 }\n   * );\n   * console.log(`Found ${profiles.total} profiles`);\n   * profiles.profiles.forEach(p => console.log(p.customer_id, p.full_name));\n   * ```\n   */\n  async listCustomerProfiles(\n    filters?: CustomerProfileFilters,\n    pagination?: { limit?: number; offset?: number }\n  ): Promise<CustomerProfileListResponse> {\n    const params: Record<string, unknown> = {};\n\n    if (filters) {\n      // Array filters (keep as arrays for this API)\n      if (filters.risk_category) {\n        params.risk_category = Array.isArray(filters.risk_category)\n          ? filters.risk_category\n          : [filters.risk_category];\n      }\n      if (filters.entity_type) {\n        params.entity_type = Array.isArray(filters.entity_type)\n          ? filters.entity_type\n          : [filters.entity_type];\n      }\n      if (filters.status) {\n        params.status = Array.isArray(filters.status)\n          ? filters.status\n          : [filters.status];\n      }\n      // Simple filters\n      addSimpleParams(params, filters as unknown as Record<string, unknown>, [\n        'search', 'is_pep', 'has_sanctions', 'requires_edd', 'sort_by', 'sort_order'\n      ]);\n    }\n\n    if (pagination) {\n      addSimpleParams(params, pagination, ['limit', 'offset']);\n    }\n\n    return this.riskProfileRequest<CustomerProfileListResponse>(\n      `/api/v1/risk-dashboard/profiles${this.buildQueryString(params)}`\n    );\n  }\n\n  /**\n   * Get a customer profile by ID\n   *\n   * @param profileId - The profile UUID\n   * @returns Customer profile details\n   *\n   * @example\n   * ```typescript\n   * const profile = await client.getCustomerProfile('uuid-here');\n   * console.log(`Customer: ${profile.full_name}, Risk: ${profile.risk_category}`);\n   * ```\n   */\n  async getCustomerProfile(profileId: string): Promise<CustomerProfile> {\n    return this.riskProfileRequest<CustomerProfile>(\n      `/api/v1/risk-dashboard/profiles/${profileId}`\n    );\n  }\n\n  /**\n   * Create a new customer profile\n   *\n   * A customer profile must exist before submitting KYC verification.\n   * The customer_id field will be used as the 'reference' in KYC submissions.\n   *\n   * @param profile - Customer profile data\n   * @returns Created customer profile\n   *\n   * @example\n   * ```typescript\n   * const profile = await client.createCustomerProfile({\n   *   customer_id: 'cust_123',\n   *   entity_type: 'individual',\n   *   full_name: 'John Doe',\n   *   email_address: 'john@example.com',\n   *   country_of_residence: 'US'\n   * });\n   * console.log(`Created profile: ${profile.id}`);\n   *\n   * // Now you can submit KYC using the customer_id as reference\n   * await client.submitVerification({\n   *   reference: profile.customer_id, // 'cust_123'\n   *   email: 'john@example.com',\n   *   // ... other fields\n   * });\n   * ```\n   */\n  async createCustomerProfile(\n    profile: CreateCustomerProfileRequest\n  ): Promise<CustomerProfile> {\n    return this.riskProfileRequest<CustomerProfile>('/api/v1/profiles', {\n      method: 'POST',\n      body: JSON.stringify(profile),\n    });\n  }\n\n  // ============================================================================\n  // Utility Methods (inherited from BaseClient: healthCheck, updateConfig, getConfig, buildQueryString)\n  // ============================================================================\n}\n","import { BaseClient } from '../core/client';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n  TaxClientConfig,\n  CustomerTaxProfileRecord,\n  CustomerTaxProfileDocuments,\n  ReRequestTaxFormInput,\n  EnableWithholdingInput,\n  EnableWithholdingResponse,\n  TINCheckResult,\n  TaxRules,\n  UpdateTaxRulesInput,\n  UpdateReminderConfigInput,\n  TaxRuleVersion,\n  ComplianceStats,\n  ComplianceStatsFilters,\n  GlobalTaxRule,\n  TreatyCountry,\n  TreatyCountryListResponse,\n  RunRemindersResponse,\n} from './types';\n\nexport class TaxClient extends BaseClient {\n  constructor(config: TaxClientConfig) {\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,\n      debug: config.debug,\n      environment: config.environment,\n    };\n    super(baseConfig);\n  }\n\n  // ==========================================================================\n  // P1 — Customer Tax Profile (core compliance flow)\n  // ==========================================================================\n\n  async getCustomerTaxProfileRecord(customerID: string): Promise<CustomerTaxProfileRecord> {\n    return this.request<CustomerTaxProfileRecord>(\n      `/api/v1/tax/customer-tax-profiles/${customerID}`\n    );\n  }\n\n  async requestTaxForm(customerID: string): Promise<CustomerTaxProfileRecord> {\n    return this.request<CustomerTaxProfileRecord>(\n      `/api/v1/tax/customer-tax-profiles/${customerID}/request-form`,\n      { method: 'POST' }\n    );\n  }\n\n  async checkTINStatus(customerID: string): Promise<TINCheckResult> {\n    return this.requestWithRetry<TINCheckResult>(\n      `/api/v1/tax/customer-tax-profiles/${customerID}/check-tin`,\n      { method: 'POST' }\n    );\n  }\n\n  async reRequestTaxForm(\n    customerID: string,\n    input: ReRequestTaxFormInput\n  ): Promise<CustomerTaxProfileRecord> {\n    return this.request<CustomerTaxProfileRecord>(\n      `/api/v1/tax/customer-tax-profiles/${customerID}/re-request-form`,\n      {\n        method: 'POST',\n        body: JSON.stringify(input),\n      }\n    );\n  }\n\n  async enableBackupWithholding(\n    customerID: string,\n    input: EnableWithholdingInput\n  ): Promise<EnableWithholdingResponse> {\n    return this.request<EnableWithholdingResponse>(\n      `/api/v1/tax/customer-tax-profiles/${customerID}/enable-withholding`,\n      {\n        method: 'POST',\n        body: JSON.stringify(input),\n      }\n    );\n  }\n\n  async getCustomerDocuments(customerID: string): Promise<CustomerTaxProfileDocuments> {\n    return this.request<CustomerTaxProfileDocuments>(\n      `/api/v1/tax/customer-tax-profiles/${customerID}/documents`\n    );\n  }\n\n  async downloadTaxForm(\n    customerID: string,\n    requestOptions?: RequestOptions\n  ): Promise<ArrayBuffer> {\n    return this.request<ArrayBuffer>(\n      `/api/v1/tax/customer-tax-profiles/${customerID}/download-form`,\n      { method: 'GET' },\n      undefined,\n      { ...requestOptions, responseType: 'arraybuffer' }\n    );\n  }\n\n  async runReminders(): Promise<RunRemindersResponse> {\n    return this.request<RunRemindersResponse>('/api/v1/tax/reminders/run', {\n      method: 'POST',\n    });\n  }\n\n  /**\n   * Update only the reminder configuration (frequency + max count) without\n   * touching any other tax rule settings. Fetches current rules first and\n   * merges the reminder fields before sending the update.\n   *\n   * Requires the caller to be authenticated as a Tenant Super Admin.\n   * Throws VesantError with status 403 if the role requirement is not met.\n   */\n  async updateReminderConfig(input: UpdateReminderConfigInput): Promise<TaxRuleVersion> {\n    const current = await this.getTaxRules();\n    return this.updateTaxRules({\n      trigger_account_creation: current.trigger_account_creation,\n      trigger_first_withdrawal: current.trigger_first_withdrawal,\n      trigger_threshold: current.trigger_threshold,\n      trigger_manual: current.trigger_manual,\n      trigger_tin_invalid: current.trigger_tin_invalid,\n      trigger_w8ben_expiry: current.trigger_w8ben_expiry,\n      trigger_tin_expired: current.trigger_tin_expired,\n      us_withholding_enabled: current.us_withholding_enabled,\n      non_us_withholding_enabled: current.non_us_withholding_enabled,\n      transaction_action: current.transaction_action,\n      w8ben_expiry_warning_days: current.w8ben_expiry_warning_days,\n      tin_verification_due_date: current.tin_verification_due_date,\n      email_sending_method: current.email_sending_method,\n      display_tin_links_on_platform: current.display_tin_links_on_platform,\n      tax_treaty_support: current.tax_treaty_support,\n      reminder_frequency_days: input.reminder_frequency_days,\n      reminder_max_count: input.reminder_max_count,\n    });\n  }\n\n  // ==========================================================================\n  // P2 — Tenant Tax Rules\n  // ==========================================================================\n\n  async getTaxRules(): Promise<TaxRules> {\n    const res = await this.request<{ rules: TaxRules }>('/api/v1/tax/rules');\n    return res.rules;\n  }\n\n  async updateTaxRules(input: UpdateTaxRulesInput): Promise<TaxRuleVersion> {\n    const res = await this.request<{ version: TaxRuleVersion }>('/api/v1/tax/rules', {\n      method: 'PUT',\n      body: JSON.stringify({ rules: input }),\n    });\n    return res.version;\n  }\n\n  async getComplianceStats(filters?: ComplianceStatsFilters): Promise<ComplianceStats> {\n    const params: Record<string, unknown> = {};\n    if (filters?.time_range) params.time_range = filters.time_range;\n    if (filters?.from_date) params.from_date = filters.from_date;\n    if (filters?.to_date) params.to_date = filters.to_date;\n    return this.request<ComplianceStats>(\n      `/api/v1/tax/tenant/w-form-tenant-stats${this.buildQueryString(params)}`\n    );\n  }\n\n  // ==========================================================================\n  // P3 — Global Tax Rule & Treaty Countries\n  // ==========================================================================\n\n  async getCurrentGlobalTaxRule(): Promise<GlobalTaxRule> {\n    const res = await this.request<{ success: boolean; message: string; data: GlobalTaxRule }>(\n      '/api/v1/tm/tenant/global-tax-rules/current'\n    );\n    return res.data;\n  }\n\n  async listTreatyCountries(): Promise<TreatyCountryListResponse> {\n    return this.request<TreatyCountryListResponse>('/api/v1/tax/treaty-countries');\n  }\n\n  async getTreatyCountry(code: string): Promise<TreatyCountry> {\n    const res = await this.request<{ treaty_country: TreatyCountry }>(\n      `/api/v1/tax/treaty-countries/${encodeURIComponent(code)}`\n    );\n    return res.treaty_country;\n  }\n}\n","/**\n * TransactionClient - TypeScript SDK for the Transaction Monitoring service\n *\n * Provides a thin wrapper around the TM service endpoints.  Currently only the\n * creation endpoint is implemented, but additional helpers (list, getById,\n * etc.) can be added later.\n */\n\nimport { BaseClient } from '../core/client';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type { TransactionCreateDTO, TransactionCreateResponse } from './types';\n\nexport class TransactionClient extends BaseClient {\n  constructor(config: BaseClientConfig) {\n    // no special config needed; simply forward to BaseClient\n    super(config);\n  }\n\n  // ==========================================================================\n  // Transaction creation\n  // ==========================================================================\n\n  /**\n   * Submit a new transaction record to the monitoring service.\n   *\n   * The gateway endpoint is `POST /api/v1/tm/transactions` and returns 201\n   * with no body on success.  The SDK method resolves to `void` to reflect\n   * that behaviour.\n   *\n   * @param request - Data required to create the transaction\n   * @param requestOptions - Optional request options (e.g. AbortSignal)\n   *\n   * @example\n   * ```ts\n   * const client = new TransactionClient({\n   *   baseURL: process.env.API_GATEWAY_URL!,\n   *   tenantId: 'tenant-123',\n   *   apiKey: 'pk_test_...',\n   * });\n   *\n   * await client.createTransaction({\n   *   tx_id: 'tx-1',\n   *   reference: 'ref-1',\n   *   tenant_id: 'tenant-123',\n   *   customer_id: 'cust-1',\n   *   transaction_type: 'deposit',\n   *   transaction_mode: 'ach',\n   *   amount: '100.00',\n   *   currency: 'USD',\n   *   status: 'pending',\n   *   source_account: 'acct-1',\n   *   destination_account: 'acct-2',\n   *   country: 'US',\n   *   ip_address: '10.0.0.1',\n   *   metadata: {},\n   *   benificiary_comment: '',\n   *   transaction_date: new Date().toISOString(),\n   * });\n   * ```\n   */\n  async createTransaction(\n    request: TransactionCreateDTO,\n    requestOptions?: RequestOptions\n  ): Promise<TransactionCreateResponse> {\n    const data = await this.requestWithRetry<TransactionCreateResponse>('/api/v1/tm/transactions', {\n      method: 'POST',\n      body: JSON.stringify(request),\n    }, undefined, undefined, requestOptions);\n    return data\n  }\n\n  /**\n   * \n   * @param transactionId tx_id of the transaction \n   * @param requestOptions  optional request options (e.g. AbortSignal)\n   */\n  async getTransaction(transactionId: string, requestOptions?: RequestOptions): Promise<void> {\n    await this.requestWithRetry<void>(`/api/v1/tm/transactions/status/${transactionId}`, {\n      method: 'GET',\n    }, undefined, undefined, requestOptions);\n  }\n}\n\n","/**\n * Fraud scoring API client.\n */\n\nimport { BaseClient } from '../core/client';\nimport type { RequestOptions } from '../core/config';\nimport { ValidationError } from '../core/errors';\nimport type {\n  FraudScoreRequest,\n  FraudScoreResponseData,\n  FraudScoreResponseEnvelope,\n} from './types';\n\nexport class FraudClient extends BaseClient {\n  /**\n   * Submit a single fraud event for scoring.\n   */\n  async scoreEvent(\n    request: FraudScoreRequest,\n    requestOptions?: RequestOptions\n  ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>> {\n    this.validateScoreRequest(request);\n\n    return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData>>(\n      '/api/v1/fraud/score',\n      {\n        method: 'POST',\n        body: JSON.stringify(request),\n      },\n      undefined,\n      undefined,\n      requestOptions\n    );\n  }\n\n  /**\n   * Submit multiple fraud events for scoring.\n   */\n  async scoreEventsBulk(\n    requests: FraudScoreRequest[],\n    requestOptions?: RequestOptions\n  ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData[]>> {\n    if (!Array.isArray(requests) || requests.length === 0) {\n      throw new ValidationError(\n        'Invalid bulk score request: at least one score request is required',\n        ['requests']\n      );\n    }\n\n    requests.forEach((request, index) => this.validateScoreRequest(request, index));\n\n    return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>(\n      '/api/v1/fraud/score/bulk',\n      {\n        method: 'POST',\n        body: JSON.stringify(requests),\n      },\n      undefined,\n      undefined,\n      requestOptions\n    );\n  }\n\n  private validateScoreRequest(request: FraudScoreRequest, index?: number): void {\n    const errors: string[] = [];\n    const prefix = index === undefined ? '' : `requests[${index}].`;\n\n    if (!request.customer_id?.trim()) {\n      errors.push(`${prefix}customer_id is required`);\n    }\n    if (!request.sift_user_id?.trim()) {\n      errors.push(`${prefix}sift_user_id is required`);\n    }\n    if (!request.event_type?.trim()) {\n      errors.push(`${prefix}event_type is required`);\n    }\n\n    if (errors.length > 0) {\n      throw new ValidationError(`Invalid fraud score request: ${errors.join(', ')}`, errors);\n    }\n  }\n}\n","/**\n * Webhook event handler with signature verification and typed dispatch.\n */\n\nimport { verifyWebhookSignature } from '../core/webhook-utils';\nimport type {\n  WebhookEvent,\n  WebhookEventType,\n  WebhookEventHandler,\n  WebhookAnyHandler,\n  WebhookHandlerConfig,\n} from './types';\n\nexport class WebhookHandler {\n  private handlers = new Map<WebhookEventType, WebhookEventHandler[]>();\n  private anyHandlers: WebhookAnyHandler[] = [];\n  private readonly secret: string;\n  private readonly tolerance: number;\n\n  constructor(config: WebhookHandlerConfig) {\n    this.secret = config.secret;\n    this.tolerance = config.tolerance ?? 300000; // 5 minutes\n  }\n\n  /**\n   * Register a handler for a specific event type.\n   */\n  on<T extends WebhookEventType>(\n    eventType: T,\n    handler: WebhookEventHandler<T>\n  ): this {\n    const existing = this.handlers.get(eventType) || [];\n    existing.push(handler as unknown as WebhookEventHandler);\n    this.handlers.set(eventType, existing);\n    return this;\n  }\n\n  /**\n   * Register a catch-all handler for all event types.\n   */\n  onAny(handler: WebhookAnyHandler): this {\n    this.anyHandlers.push(handler);\n    return this;\n  }\n\n  /**\n   * Verify signature and parse the webhook body.\n   */\n  async verifyAndParse(body: string, signature: string): Promise<WebhookEvent> {\n    const isValid = await verifyWebhookSignature(body, signature, this.secret);\n    if (!isValid) {\n      throw new Error('Invalid webhook signature');\n    }\n\n    return this.parseAndValidate(body);\n  }\n\n  /**\n   * Verify signature, parse, and dispatch to registered handlers.\n   */\n  async handle(body: string, signature: string): Promise<void> {\n    const event = await this.verifyAndParse(body, signature);\n    await this.dispatch(event);\n  }\n\n  /**\n   * Parse an event without signature verification (for testing).\n   */\n  parseEvent(body: string): WebhookEvent {\n    return this.parseAndValidate(body);\n  }\n\n  private parseAndValidate(body: string): WebhookEvent {\n    const event = JSON.parse(body) as WebhookEvent;\n\n    if (!event.type || !event.id || !event.timestamp) {\n      throw new Error('Invalid webhook event: missing required fields (type, id, timestamp)');\n    }\n\n    // Timestamp tolerance check\n    if (this.tolerance > 0) {\n      const eventTime = new Date(event.timestamp).getTime();\n      const now = Date.now();\n      if (Math.abs(now - eventTime) > this.tolerance) {\n        throw new Error(\n          `Webhook event timestamp is outside tolerance window (${this.tolerance}ms)`\n        );\n      }\n    }\n\n    return event;\n  }\n\n  private async dispatch(event: WebhookEvent): Promise<void> {\n    const typeHandlers = this.handlers.get(event.type) || [];\n    const allHandlers = [...typeHandlers, ...this.anyHandlers];\n\n    for (const handler of allHandlers) {\n      await (handler as WebhookAnyHandler)(event);\n    }\n  }\n}\n","/**\n * Framework middleware helpers for webhook handling.\n *\n * Provides pre-built integrations for Express/Connect and Next.js App Router.\n */\n\nimport { WebhookHandler } from './handler';\nimport type { WebhookHandlerConfig, WebhookEventType, WebhookEventHandler, WebhookAnyHandler } from './types';\n\nexport interface WebhookMiddlewareOptions extends WebhookHandlerConfig {\n  /** Event handlers to register */\n  handlers?: Partial<Record<WebhookEventType, WebhookEventHandler>>;\n  /** Catch-all handler */\n  onAny?: WebhookAnyHandler;\n}\n\n/**\n * Create an Express/Connect-compatible middleware for webhook handling.\n *\n * Expects the raw body to be available as `req.body` (string).\n * Use `express.raw({ type: 'application/json' })` or similar middleware upstream.\n */\nexport function createWebhookMiddleware(options: WebhookMiddlewareOptions) {\n  const handler = buildHandler(options);\n  const signatureHeader = options.signatureHeader || 'x-webhook-signature';\n\n  return async (\n    req: { body: string | Buffer; headers: Record<string, string | string[] | undefined> },\n    res: { status(code: number): { json(body: unknown): void }; json?(body: unknown): void },\n    next?: (err?: unknown) => void\n  ) => {\n    try {\n      const body = typeof req.body === 'string' ? req.body : req.body.toString('utf-8');\n      const signature = req.headers[signatureHeader];\n\n      if (!signature || typeof signature !== 'string') {\n        res.status(401).json({ error: 'Missing webhook signature' });\n        return;\n      }\n\n      await handler.handle(body, signature);\n      res.status(200).json({ received: true });\n    } catch (error) {\n      const message = error instanceof Error ? error.message : 'Webhook processing failed';\n\n      if (message.includes('signature')) {\n        res.status(401).json({ error: message });\n      } else if (message.includes('tolerance') || message.includes('timestamp')) {\n        res.status(400).json({ error: message });\n      } else if (next) {\n        next(error);\n      } else {\n        res.status(500).json({ error: message });\n      }\n    }\n  };\n}\n\n/**\n * Create a Next.js App Router-compatible webhook handler.\n *\n * Returns an async function `(request: Request) => Promise<Response>`.\n */\nexport function createNextWebhookHandler(\n  options: WebhookMiddlewareOptions\n): (request: Request) => Promise<Response> {\n  const handler = buildHandler(options);\n  const signatureHeader = options.signatureHeader || 'x-webhook-signature';\n\n  return async (request: Request): Promise<Response> => {\n    try {\n      const body = await request.text();\n      const signature = request.headers.get(signatureHeader);\n\n      if (!signature) {\n        return new Response(JSON.stringify({ error: 'Missing webhook signature' }), {\n          status: 401,\n          headers: { 'Content-Type': 'application/json' },\n        });\n      }\n\n      await handler.handle(body, signature);\n\n      return new Response(JSON.stringify({ received: true }), {\n        status: 200,\n        headers: { 'Content-Type': 'application/json' },\n      });\n    } catch (error) {\n      const message = error instanceof Error ? error.message : 'Webhook processing failed';\n      const status = message.includes('signature')\n        ? 401\n        : message.includes('tolerance') || message.includes('timestamp')\n          ? 400\n          : 500;\n\n      return new Response(JSON.stringify({ error: message }), {\n        status,\n        headers: { 'Content-Type': 'application/json' },\n      });\n    }\n  };\n}\n\nfunction buildHandler(options: WebhookMiddlewareOptions): WebhookHandler {\n  const handler = new WebhookHandler(options);\n\n  if (options.handlers) {\n    for (const [eventType, eventHandler] of Object.entries(options.handlers)) {\n      if (eventHandler) {\n        handler.on(eventType as WebhookEventType, eventHandler);\n      }\n    }\n  }\n\n  if (options.onAny) {\n    handler.onAny(options.onAny);\n  }\n\n  return handler;\n}\n"]}