{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/fetch.ts","../src/ws-envelope.ts","../src/discovery.ts","../src/login-session.ts","../src/ksign.ts"],"sourcesContent":["export { KSign } from './ksign.js';\nexport {\n  discoverAgent,\n  DISCOVERY_PING_PATHS,\n  DISCOVERY_PING_PATHS_SECURE,\n  agentFetchInit,\n  discoveryCandidates,\n} from './discovery.js';\nexport {\n  AgentNotAvailableError,\n  AgentDiscoveryError,\n  KSignError,\n  LoginFailedError,\n  PinRetryRequiredError,\n  mapBackendError,\n} from './errors.js';\nexport type {\n  KSignConfig,\n  LoginOptions,\n  LoginResult,\n  LoginSessionEvent,\n  AgentDiscoveryResult,\n  WSCertificateSummary,\n  ChallengeData,\n  WebSocketConstructor,\n  WebSocketLike,\n} from './types.js';\n","export class KSignError extends Error {\n  readonly code: number;\n  readonly success: false = false;\n\n  constructor(code: number, message: string) {\n    super(message);\n    this.name = 'KSignError';\n    this.code = code;\n  }\n}\n\nexport class AgentNotAvailableError extends KSignError {\n  constructor(message = 'KSign Agent is not available on this device') {\n    super(0, message);\n    this.name = 'AgentNotAvailableError';\n  }\n}\n\nexport class AgentDiscoveryError extends AgentNotAvailableError {\n  constructor() {\n    super(\n      'KSign Agent discovery failed — ensure Agent is running, Local Root CA is trusted, and allow local network access when the browser prompts',\n    );\n    this.name = 'AgentDiscoveryError';\n  }\n}\n\n/** Terminal WebSocket login failure (`LOGIN_FAILED` / `ERROR` / transport). */\nexport class LoginFailedError extends Error {\n  readonly code: string;\n  readonly challengeId?: string;\n  readonly backendCode?: number;\n  readonly success: false = false;\n\n  constructor(\n    code: string,\n    message: string,\n    options?: { challengeId?: string; backendCode?: number },\n  ) {\n    super(message);\n    this.name = 'LoginFailedError';\n    this.code = code;\n    this.challengeId = options?.challengeId;\n    this.backendCode = options?.backendCode;\n  }\n}\n\n/** Wrong PIN — Agent sent PIN_RETRY and no onPinRetry handler was provided. */\nexport class PinRetryRequiredError extends LoginFailedError {\n  constructor(reason = 'wrong_pin') {\n    super('pin_retry', `PIN rejected (${reason}); provide onPinRetry to continue`);\n    this.name = 'PinRetryRequiredError';\n  }\n}\n\nexport function mapBackendError(body: { code?: number; message?: string }): KSignError {\n  return new KSignError(body.code ?? 1000, body.message ?? 'request failed');\n}\n","/**\n * Browser `fetch` must run with Window/WorkerGlobalScope as `this`.\n * Storing a bare `fetch` reference and calling it unbound throws:\n * \"'fetch' called on an object that does not implement interface Window.\"\n */\nexport function resolveFetchImpl(custom?: typeof fetch): typeof fetch {\n  if (custom) {\n    return custom;\n  }\n  return (input: RequestInfo | URL, init?: RequestInit): Promise<Response> =>\n    globalThis.fetch(input, init);\n}\n","import type { WSCertificateSummary, WSEnvelope } from './types.js';\n\nexport function newMessageId(): string {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  return `msg-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n}\n\nexport function encodeWSEnvelope(input: {\n  type: string;\n  sessionId?: string | null;\n  payload?: Record<string, unknown>;\n}): string {\n  const envelope: WSEnvelope = {\n    id: newMessageId(),\n    type: input.type,\n    session_id: input.sessionId ?? null,\n    timestamp: Math.floor(Date.now() / 1000),\n    payload: input.payload ?? {},\n  };\n  return JSON.stringify(envelope);\n}\n\nexport function decodeWSEnvelope(raw: unknown): WSEnvelope {\n  const text =\n    typeof raw === 'string'\n      ? raw\n      : raw instanceof ArrayBuffer\n        ? new TextDecoder().decode(raw)\n        : String(raw);\n  const parsed = JSON.parse(text) as WSEnvelope;\n  if (!parsed || typeof parsed !== 'object' || typeof parsed.type !== 'string') {\n    throw new Error('invalid WebSocket envelope');\n  }\n  return {\n    id: typeof parsed.id === 'string' ? parsed.id : newMessageId(),\n    type: parsed.type,\n    session_id: parsed.session_id ?? null,\n    timestamp: typeof parsed.timestamp === 'number' ? parsed.timestamp : 0,\n    payload: (parsed.payload && typeof parsed.payload === 'object'\n      ? parsed.payload\n      : {}) as Record<string, unknown>,\n  };\n}\n\nexport function parseCertificateSummaries(payload: Record<string, unknown>): WSCertificateSummary[] {\n  const list = payload.certificates;\n  if (!Array.isArray(list)) {\n    return [];\n  }\n  const out: WSCertificateSummary[] = [];\n  for (const item of list) {\n    if (!item || typeof item !== 'object') {\n      continue;\n    }\n    const row = item as Record<string, unknown>;\n    const certificateId = String(row.certificate_id ?? '');\n    if (!certificateId) {\n      continue;\n    }\n    const summary: WSCertificateSummary = {\n      certificateId,\n      subject: String(row.subject ?? ''),\n      issuer: String(row.issuer ?? ''),\n      serialNumber: String(row.serial_number ?? ''),\n      validFrom: Number(row.valid_from ?? 0),\n      validTo: Number(row.valid_to ?? 0),\n      certificateType: String(row.certificate_type ?? 'signature'),\n    };\n    if (row.key_usage != null) {\n      summary.keyUsage = String(row.key_usage);\n    }\n    out.push(summary);\n  }\n  return out;\n}\n\nexport function toWsLoginUrl(agentBaseUrl: string): string {\n  const url = new URL(agentBaseUrl);\n  url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n  url.pathname = '/ws/v1/login';\n  url.search = '';\n  url.hash = '';\n  return url.toString();\n}\n","import type { AgentDiscoveryResult } from './types.js';\nimport { AgentDiscoveryError } from './errors.js';\nimport { resolveFetchImpl } from './fetch.js';\nimport { toWsLoginUrl } from './ws-envelope.js';\n\nconst DEFAULT_AGENT_PORT = 57601;\n/** Canonical Agent hostname (public DNS → 127.0.0.1). No IP discovery fallback. */\nexport const AGENT_HOST = 'localsign.ksign.tr';\n\n/** Full order (HTTP pages / Node). HTTPS pages use a secure subset. */\nexport const DISCOVERY_PING_PATHS = [\n  { scheme: 'https', host: AGENT_HOST },\n  { scheme: 'http', host: AGENT_HOST },\n] as const;\n\n/** HTTPS page: only HTTPS candidates (mixed content otherwise). */\nexport const DISCOVERY_PING_PATHS_SECURE = [\n  { scheme: 'https', host: AGENT_HOST },\n] as const;\n\nexport type TargetAddressSpace = 'loopback' | 'local' | 'public';\n\n/** Fetch init for Agent on loopback — required for Chrome Local Network Access (LNA). */\nexport function agentFetchInit(init: RequestInit = {}): RequestInit {\n  return {\n    ...init,\n    // Chrome 142+: public site → localsign.ksign.tr (loopback via DNS) needs explicit loopback intent.\n    // Browsers that ignore unknown options still work.\n    ...({ targetAddressSpace: 'loopback' as TargetAddressSpace } as RequestInit),\n  };\n}\n\nexport function isSecureBrowserContext(): boolean {\n  if (typeof globalThis === 'undefined') {\n    return false;\n  }\n  const loc = (globalThis as { location?: { protocol?: string } }).location;\n  return loc?.protocol === 'https:';\n}\n\nexport function discoveryCandidates(\n  secureContext: boolean = isSecureBrowserContext(),\n): readonly { scheme: string; host: string }[] {\n  return secureContext ? DISCOVERY_PING_PATHS_SECURE : DISCOVERY_PING_PATHS;\n}\n\nexport async function discoverAgent(\n  port: number = DEFAULT_AGENT_PORT,\n  fetchImpl: typeof fetch = resolveFetchImpl(),\n  timeoutMs = 3000,\n): Promise<AgentDiscoveryResult> {\n  const boundFetch = resolveFetchImpl(fetchImpl);\n  const candidates = discoveryCandidates();\n  for (const candidate of candidates) {\n    const pingUrl = `${candidate.scheme}://${candidate.host}:${port}/ping`;\n    const controller = new AbortController();\n    const timer = setTimeout(() => controller.abort(), timeoutMs);\n    try {\n      const response = await boundFetch(\n        pingUrl,\n        agentFetchInit({\n          method: 'GET',\n          signal: controller.signal,\n        }),\n      );\n      if (!response.ok) {\n        continue;\n      }\n      const body = (await response.json()) as { success?: boolean; status?: string };\n      if (body.success !== true || body.status !== 'running') {\n        continue;\n      }\n      const agentBaseUrl = `${candidate.scheme}://${candidate.host}:${port}`;\n      return {\n        pingUrl,\n        agentBaseUrl,\n        wsLoginUrl: toWsLoginUrl(agentBaseUrl),\n        agentApiBase: `${agentBaseUrl}/api/v1`,\n      };\n    } catch {\n      // try next candidate\n    } finally {\n      clearTimeout(timer);\n    }\n  }\n  throw new AgentDiscoveryError();\n}\n\nexport function resolveOrigin(configOrigin?: string): string {\n  if (configOrigin) {\n    return configOrigin;\n  }\n  if (typeof globalThis !== 'undefined' && 'location' in globalThis) {\n    const loc = (globalThis as { location?: { origin?: string } }).location;\n    if (loc?.origin) {\n      return loc.origin;\n    }\n  }\n  throw new Error('origin is required when not running in a browser');\n}\n\nexport function resolveWebSocketImpl(\n  custom?: new (url: string, protocols?: string | string[]) => import('./types.js').WebSocketLike,\n): new (url: string, protocols?: string | string[]) => import('./types.js').WebSocketLike {\n  if (custom) {\n    return custom;\n  }\n  const impl = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket;\n  if (!impl) {\n    throw new Error('WebSocket is not available in this environment');\n  }\n  return impl as unknown as new (\n    url: string,\n    protocols?: string | string[],\n  ) => import('./types.js').WebSocketLike;\n}\n","import { LoginFailedError, mapBackendError, PinRetryRequiredError } from './errors.js';\nimport type {\n  ChallengeData,\n  LoginOptions,\n  LoginResult,\n  LoginSessionEvent,\n  WebSocketConstructor,\n  WebSocketLike,\n  WSCertificateSummary,\n} from './types.js';\nimport {\n  decodeWSEnvelope,\n  encodeWSEnvelope,\n  parseCertificateSummaries,\n} from './ws-envelope.js';\n\ntype SocketEventTarget = WebSocketLike & {\n  on?: (event: string, listener: (...args: unknown[]) => void) => void;\n  addEventListener?: (event: string, listener: (...args: unknown[]) => void) => void;\n};\n\nfunction attachSocketHandlers(\n  socket: SocketEventTarget,\n  handlers: {\n    open: () => void;\n    message: (data: unknown) => void;\n    error: () => void;\n    close: (ev: { code?: number; reason?: string }) => void;\n  },\n): void {\n  // Node `ws` package is an EventEmitter; browsers expose onopen/onmessage properties.\n  if (typeof socket.on === 'function') {\n    socket.on('open', handlers.open);\n    socket.on('message', (data: unknown) => {\n      if (typeof data === 'string') {\n        handlers.message(data);\n      } else if (data instanceof ArrayBuffer) {\n        handlers.message(data);\n      } else if (data && typeof data === 'object' && 'toString' in data) {\n        handlers.message(String(data));\n      } else {\n        handlers.message(String(data));\n      }\n    });\n    socket.on('error', handlers.error);\n    socket.on('close', (code: unknown, reason: unknown) => {\n      handlers.close({\n        code: typeof code === 'number' ? code : undefined,\n        reason: reason == null ? undefined : String(reason),\n      });\n    });\n    return;\n  }\n\n  socket.onopen = () => handlers.open();\n  socket.onmessage = (ev) => handlers.message(ev.data);\n  socket.onerror = () => handlers.error();\n  socket.onclose = (ev) => handlers.close(ev);\n}\n\nexport interface LoginSessionParams {\n  wsLoginUrl: string;\n  challenge: ChallengeData;\n  origin: string;\n  options: LoginOptions;\n  WebSocketImpl: WebSocketConstructor;\n  createWebSocket?: (url: string) => WebSocketLike;\n}\n\n/**\n * Mode A WebSocket login state machine (`AGENT_WS_PROTOCOL.md`).\n *\n * Browser never sends/receives signature, certificate DER, or JWT on this channel.\n */\nexport function runLoginSession(params: LoginSessionParams): Promise<LoginResult> {\n  const { wsLoginUrl, challenge, options, WebSocketImpl, createWebSocket } = params;\n  const pinMode = options.pinMode ?? 'browser';\n  const isAgentMode = pinMode === 'agent';\n\n  return new Promise<LoginResult>((resolve, reject) => {\n    let settled = false;\n    let sessionId: string | null = null;\n    let pinSubmitted = false;\n    let currentPin = typeof options.pin === 'string' ? options.pin : '';\n    let socket: WebSocketLike;\n\n    const emit = (event: LoginSessionEvent) => {\n      try {\n        options.onEvent?.(event);\n      } catch {\n        // Listener errors must not break the login session.\n      }\n    };\n\n    const settleReject = (error: Error) => {\n      if (settled) {\n        return;\n      }\n      settled = true;\n      try {\n        socket.close();\n      } catch {\n        // ignore\n      }\n      reject(error);\n    };\n\n    const settleResolve = (result: LoginResult) => {\n      if (settled) {\n        return;\n      }\n      settled = true;\n      try {\n        socket.close();\n      } catch {\n        // ignore\n      }\n      resolve(result);\n    };\n\n    const send = (type: string, payload: Record<string, unknown> = {}) => {\n      socket.send(\n        encodeWSEnvelope({\n          type,\n          sessionId,\n          payload,\n        }),\n      );\n    };\n\n    const selectCertificateId = async (\n      certificates: WSCertificateSummary[],\n    ): Promise<string> => {\n      if (options.certificateId) {\n        const match = certificates.find((c) => c.certificateId === options.certificateId);\n        if (!match) {\n          throw new Error('certificateId not present in CERTIFICATE_LIST');\n        }\n        return match.certificateId;\n      }\n      if (options.onSelectCertificate) {\n        return options.onSelectCertificate(certificates);\n      }\n      if (certificates.length === 1) {\n        return certificates[0].certificateId;\n      }\n      if (certificates.length === 0) {\n        throw mapBackendError({ code: 1501, message: 'no certificates available on token' });\n      }\n      throw new Error('multiple certificates found — specify certificateId or onSelectCertificate');\n    };\n\n    const resolvePin = async (reason?: string): Promise<string> => {\n      if (!reason && currentPin.length > 0) {\n        return currentPin;\n      }\n      if (!reason && options.onRequestPin) {\n        const pin = await options.onRequestPin();\n        if (typeof pin !== 'string' || pin.length === 0) {\n          throw new Error('onRequestPin must return a non-empty PIN');\n        }\n        currentPin = pin;\n        return currentPin;\n      }\n      if (options.onPinRetry) {\n        const pin = await options.onPinRetry(reason ?? 'pin_required');\n        if (typeof pin !== 'string' || pin.length === 0) {\n          throw new Error('onPinRetry must return a non-empty PIN');\n        }\n        currentPin = pin;\n        return currentPin;\n      }\n      if (reason) {\n        throw new PinRetryRequiredError(reason);\n      }\n      throw new Error('pin is required, or provide onRequestPin / onPinRetry');\n    };\n\n    const handleMessage = async (raw: unknown) => {\n      let envelope;\n      try {\n        envelope = decodeWSEnvelope(raw);\n      } catch (error) {\n        settleReject(error instanceof Error ? error : new Error('invalid WebSocket message'));\n        return;\n      }\n\n      if (envelope.session_id) {\n        sessionId = envelope.session_id;\n      }\n\n      const payload = envelope.payload;\n\n      switch (envelope.type) {\n        case 'READY': {\n          emit({\n            type: 'READY',\n            challengeId: String(payload.challenge_id ?? challenge.challenge_id),\n            pinMode: String(payload.pin_mode ?? 'browser'),\n            expiresAt: Number(payload.expires_at ?? 0),\n            sessionId: sessionId ?? '',\n          });\n          break;\n        }\n        case 'CERTIFICATE_LIST': {\n          if (isAgentMode) {\n            settleReject(\n              new LoginFailedError(\n                'protocol_invalid_state',\n                'CERTIFICATE_LIST is not allowed for pin_mode=agent',\n                { challengeId: challenge.challenge_id },\n              ),\n            );\n            return;\n          }\n          const certificates = parseCertificateSummaries(payload);\n          emit({\n            type: 'CERTIFICATE_LIST',\n            certificates,\n            sessionId: sessionId ?? '',\n          });\n          try {\n            const certificateId = await selectCertificateId(certificates);\n            send('SELECT_CERTIFICATE', { certificate_id: certificateId });\n          } catch (error) {\n            settleReject(error instanceof Error ? error : new Error('certificate selection failed'));\n          }\n          break;\n        }\n        case 'CERTIFICATE_SELECTED': {\n          if (isAgentMode) {\n            break;\n          }\n          emit({\n            type: 'CERTIFICATE_SELECTED',\n            certificateId: String(payload.certificate_id ?? ''),\n            sessionId: sessionId ?? '',\n          });\n          if (!pinSubmitted) {\n            try {\n              const pin = await resolvePin();\n              pinSubmitted = true;\n              send('PIN_SUBMIT', { pin });\n            } catch (error) {\n              settleReject(error instanceof Error ? error : new Error('PIN request failed'));\n            }\n          }\n          break;\n        }\n        case 'PIN_ACCEPTED': {\n          emit({ type: 'PIN_ACCEPTED', sessionId: sessionId ?? '' });\n          break;\n        }\n        case 'QUEUE_WAIT': {\n          emit({\n            type: 'QUEUE_WAIT',\n            tokenId: payload.token_id == null ? undefined : String(payload.token_id),\n            position: Number(payload.position ?? 0),\n            sessionId: sessionId ?? '',\n          });\n          break;\n        }\n        case 'SIGNING': {\n          emit({\n            type: 'SIGNING',\n            phase: String(payload.phase ?? 'pkcs11'),\n            sessionId: sessionId ?? '',\n          });\n          break;\n        }\n        case 'PIN_RETRY': {\n          const reason = String(payload.reason ?? 'wrong_pin');\n          emit({ type: 'PIN_RETRY', reason, sessionId: sessionId ?? '' });\n          if (isAgentMode) {\n            // Status-only — native Agent UI remains authoritative; do not call onPinRetry.\n            break;\n          }\n          pinSubmitted = false;\n          try {\n            const pin = await resolvePin(reason);\n            pinSubmitted = true;\n            send('PIN_SUBMIT', { pin });\n          } catch (error) {\n            settleReject(error instanceof Error ? error : new Error('PIN retry failed'));\n          }\n          break;\n        }\n        case 'LOGIN_SUCCESS': {\n          const challengeId = String(payload.challenge_id ?? challenge.challenge_id);\n          emit({\n            type: 'LOGIN_SUCCESS',\n            challengeId,\n            status: String(payload.status ?? 'success'),\n            sessionId: sessionId ?? '',\n          });\n          settleResolve({\n            success: true,\n            challengeId,\n            status: 'login_completed',\n          });\n          break;\n        }\n        case 'LOGIN_FAILED': {\n          const code = String(payload.code ?? 'login_failed');\n          const message = String(payload.message ?? 'login failed');\n          const challengeId =\n            payload.challenge_id == null ? undefined : String(payload.challenge_id);\n          const backendCode =\n            typeof payload.backend_code === 'number' ? payload.backend_code : undefined;\n          emit({\n            type: 'LOGIN_FAILED',\n            code,\n            message,\n            challengeId,\n            backendCode,\n            sessionId: sessionId ?? undefined,\n          });\n          settleReject(new LoginFailedError(code, message, { challengeId, backendCode }));\n          break;\n        }\n        case 'ERROR': {\n          const code = String(payload.code ?? 'error');\n          const message = String(payload.message ?? 'agent error');\n          emit({\n            type: 'ERROR',\n            code,\n            message,\n            sessionId: sessionId ?? undefined,\n          });\n          settleReject(new LoginFailedError(code, message, { challengeId: challenge.challenge_id }));\n          break;\n        }\n        case 'PONG':\n          break;\n        default:\n          // Ignore unknown non-terminal types for forward compatibility.\n          break;\n      }\n    };\n\n    try {\n      socket = createWebSocket ? createWebSocket(wsLoginUrl) : new WebSocketImpl(wsLoginUrl);\n    } catch (error) {\n      reject(error instanceof Error ? error : new Error('WebSocket construction failed'));\n      return;\n    }\n\n    attachSocketHandlers(socket as SocketEventTarget, {\n      open: () => {\n        send('LOGIN_START', {\n          agent_ticket: challenge.agent_ticket,\n          challenge_id: challenge.challenge_id,\n          nonce: challenge.nonce,\n          purpose: challenge.purpose || 'login',\n          payload_hash: challenge.payload_hash,\n          payload: options.payload ?? '',\n          pin_mode: pinMode,\n        });\n      },\n      message: (data) => {\n        void handleMessage(data);\n      },\n      error: () => {\n        settleReject(\n          new LoginFailedError('ws_error', 'WebSocket connection error', {\n            challengeId: challenge.challenge_id,\n          }),\n        );\n      },\n      close: (ev) => {\n        if (settled) {\n          return;\n        }\n        settleReject(\n          new LoginFailedError(\n            'ws_closed',\n            ev.reason || 'WebSocket closed before login completed',\n            { challengeId: challenge.challenge_id },\n          ),\n        );\n      },\n    });\n  });\n}\n","import { AgentDiscoveryError, mapBackendError } from './errors.js';\nimport type {\n  BackendEnvelope,\n  ChallengeData,\n  KSignConfig,\n  LoginOptions,\n  LoginResult,\n  WebSocketConstructor,\n} from './types.js';\nimport { discoverAgent, resolveOrigin, resolveWebSocketImpl } from './discovery.js';\nimport { resolveFetchImpl } from './fetch.js';\nimport { runLoginSession } from './login-session.js';\nimport { newMessageId } from './ws-envelope.js';\n\nfunction trimTrailingSlash(url: string): string {\n  return url.replace(/\\/+$/, '');\n}\n\nasync function parseEnvelope<T>(response: Response): Promise<T> {\n  let body: BackendEnvelope<T>;\n  try {\n    body = (await response.json()) as BackendEnvelope<T>;\n  } catch {\n    throw mapBackendError({\n      code: response.status || 1000,\n      message: `invalid backend response (HTTP ${response.status})`,\n    });\n  }\n  if (!body.success) {\n    throw mapBackendError(body);\n  }\n  return body.data;\n}\n\n/**\n * Official KSign browser helper — Mode A WebSocket login orchestration (v2.3).\n *\n * Does not return or store KSign JWT, signatures, or certificates.\n */\nexport class KSign {\n  private readonly publishableKey: string;\n  private readonly backendUrl: string;\n  private readonly origin: string;\n  private readonly agentPort: number;\n  private readonly fetchImpl: typeof fetch;\n  private readonly WebSocketImpl: WebSocketConstructor;\n  private readonly createWebSocket?: (url: string) => import('./types.js').WebSocketLike;\n\n  constructor(config: KSignConfig) {\n    if (!config.publishableKey?.trim()) {\n      throw new Error('publishableKey is required');\n    }\n    if (!config.backendUrl?.trim()) {\n      throw new Error('backendUrl is required');\n    }\n    this.publishableKey = config.publishableKey.trim();\n    this.backendUrl = trimTrailingSlash(config.backendUrl);\n    this.origin = resolveOrigin(config.origin);\n    this.agentPort = config.agentPort ?? 57601;\n    this.fetchImpl = resolveFetchImpl(config.fetch);\n    this.WebSocketImpl = resolveWebSocketImpl(config.WebSocketImpl);\n    this.createWebSocket = config.createWebSocket;\n  }\n\n  /**\n   * Full e-sign login:\n   * discoverAgent → POST challenge → WebSocket LOGIN_START… → LOGIN_SUCCESS\n   */\n  async login(options: LoginOptions): Promise<LoginResult> {\n    const pinMode = options.pinMode ?? 'browser';\n    if (pinMode !== 'browser' && pinMode !== 'agent') {\n      throw new Error('pinMode must be browser or agent');\n    }\n    if (pinMode === 'browser') {\n      const hasPin = typeof options.pin === 'string' && options.pin.length > 0;\n      if (!hasPin && !options.onRequestPin && !options.onPinRetry) {\n        throw new Error('pin is required, or provide onRequestPin / onPinRetry');\n      }\n    }\n\n    let discovery;\n    try {\n      discovery = await discoverAgent(this.agentPort, this.fetchImpl);\n    } catch (error) {\n      if (error instanceof AgentDiscoveryError) {\n        throw error;\n      }\n      throw new AgentDiscoveryError();\n    }\n\n    const challenge = await this.createChallenge({\n      payload: options.payload ?? '',\n      correlationId: options.correlationId ?? newMessageId(),\n    });\n\n    return runLoginSession({\n      wsLoginUrl: discovery.wsLoginUrl,\n      challenge,\n      origin: this.origin,\n      options,\n      WebSocketImpl: this.WebSocketImpl,\n      createWebSocket: this.createWebSocket,\n    });\n  }\n\n  private async createChallenge(input: {\n    payload: string;\n    correlationId: string;\n  }): Promise<ChallengeData> {\n    const response = await this.fetchImpl(`${this.backendUrl}/api/v1/auth/esign/challenge`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'X-KSign-Publishable-Key': this.publishableKey,\n        Origin: this.origin,\n        Accept: 'application/json',\n      },\n      body: JSON.stringify({\n        purpose: 'login',\n        payload: input.payload,\n        correlation_id: input.correlationId,\n      }),\n    });\n    const data = await parseEnvelope<ChallengeData>(response);\n    if (!data.agent_ticket || !data.challenge_id || !data.nonce || !data.payload_hash) {\n      throw mapBackendError({ code: 1000, message: 'incomplete challenge response' });\n    }\n    return data;\n  }\n}\n"],"mappings":"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","names":[]}