{"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/kyc/client.ts"],"names":[],"mappings":"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","file":"core.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 * 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"]}