{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/receipts.ts","../src/service-cards.ts","../src/wallet-policies.ts","../src/contract-actions.ts","../src/discovery.ts","../src/token-service-cards.ts","../src/metered-escrow-contracts.ts"],"sourcesContent":["/**\n * satonomous — SDK for autonomous AI agents to earn and spend sats\n *\n * AI agents can't pay Lightning invoices — they don't have wallets.\n * This SDK bridges that gap: when an agent needs funds, it notifies\n * a human (via callback) and waits for payment.\n *\n * @example\n * ```ts\n * import { L402Agent } from 'satonomous';\n *\n * const agent = new L402Agent({\n *   apiKey: 'sk_...',\n *   // This is the key part: how the agent asks a human for money\n *   onPaymentNeeded: async (invoice) => {\n *     await sendSlackMessage(`⚡ Pay ${invoice.amount_sats} sats: ${invoice.invoice}`);\n *   },\n * });\n *\n * // Agent ensures it has funds before working\n * await agent.ensureBalance(500, 'Need funds for code-review contract');\n * ```\n *\n * @module\n */\n\nexport { L402Agent, L402Error } from './client.js';\nexport { createContractReceipt, verifyContractReceipt } from './receipts.js';\nexport { verifySatonomousDiscovery } from './discovery.js';\nexport type {\n  SatonomousDiscoveryCheck,\n  SatonomousDiscoveryCheckStatus,\n  SatonomousDiscoveryFetchEvidence,\n  SatonomousDiscoveryReport,\n  SatonomousDiscoveryScore,\n  VerifySatonomousDiscoveryOptions,\n} from './discovery.js';\nexport { createServiceCard, verifyServiceCard } from './service-cards.js';\nexport { createTokenServiceCard, verifyTokenServiceCard } from './token-service-cards.js';\nexport {\n  applyMeteredUsage,\n  closeMeteredEscrowContract,\n  createMeteredEscrowContract,\n  quoteMeteredUsage,\n  verifyMeteredEscrowContract,\n} from './metered-escrow-contracts.js';\nexport { createWalletPolicy, evaluateWalletPolicy, verifyWalletPolicy } from './wallet-policies.js';\nexport { getContractNextAction } from './contract-actions.js';\nexport type {\n  L402AgentOptions,\n  BalanceInfo,\n  Offer,\n  OfferSellerReputation,\n  ListOffersParams,\n  OfferSort,\n  CreateOfferParams,\n  Contract,\n  FundResult,\n  DepositInvoice,\n  DepositStatus,\n  LedgerEntry,\n  WithdrawResult,\n  AgentRegistration,\n  TenantInfo,\n  TenantReputation,\n  RoleReputation,\n  SellerReputationSummary,\n  BuyerReputationSummary,\n  ReputationLevel,\n  PaymentNeededCallback,\n  ContractReceipt,\n  ContractReceiptEvidenceRef,\n  ContractReceiptOutcome,\n  ContractReceiptVerificationCode,\n  ContractReceiptVerificationResult,\n  CreateContractReceiptOptions,\n  ServiceCard,\n  ServiceCardSellerReputation,\n  ServiceCardVerificationCode,\n  ServiceCardVerificationResult,\n  CreateServiceCardOptions,\n  TokenServiceProviderType,\n  TokenServiceProviderDisclosure,\n  TokenServiceAuthorizationBasis,\n  TokenServicePricingUnit,\n  TokenServiceMeteringMethod,\n  TokenServiceRetentionMode,\n  TokenServiceModel,\n  TokenServiceCard,\n  CreateTokenServiceCardOptions,\n  TokenServiceCardVerificationCode,\n  TokenServiceCardVerificationResult,\n  MeteredEscrowContractStatus,\n  MeteredUsageEvent,\n  MeteredEscrowContract,\n  CreateMeteredEscrowContractOptions,\n  MeteredUsageInput,\n  MeteredEscrowVerificationCode,\n  MeteredEscrowVerificationResult,\n  MeteredUsageQuote,\n  MeteredUsageApplyCode,\n  MeteredUsageApplyResult,\n  WalletPolicy,\n  CreateWalletPolicyOptions,\n  WalletPolicyVerificationCode,\n  WalletPolicyVerificationResult,\n  WalletPolicySpendRequest,\n  WalletPolicyContext,\n  WalletPolicyDecisionKind,\n  WalletPolicyDecisionCode,\n  WalletPolicyDecision,\n  FundContractPolicyOptions,\n  ContractRole,\n  ContractNextActionCode,\n  ContractNextAction,\n  ContractActionOptions,\n  WaitForContractActionOptions,\n} from './types.js';\n","import { createHmac } from 'node:crypto';\nimport type {\n  L402AgentOptions,\n  BalanceInfo,\n  Offer,\n  CreateOfferParams,\n  Contract,\n  FundResult,\n  DepositInvoice,\n  DepositStatus,\n  LedgerEntry,\n  WithdrawResult,\n  AgentRegistration,\n  PaymentNeededCallback,\n  ListOffersParams,\n  TenantInfo,\n  TenantReputation,\n  ContractReceipt,\n  ContractReceiptVerificationResult,\n  ServiceCard,\n  ServiceCardVerificationResult,\n  CreateServiceCardOptions,\n  WalletPolicy,\n  WalletPolicyContext,\n  WalletPolicyDecision,\n  WalletPolicySpendRequest,\n  FundContractPolicyOptions,\n  ContractActionOptions,\n  ContractNextAction,\n  ContractRole,\n  WaitForContractActionOptions,\n  ContractEvent,\n  DepositEvent,\n  WatchOptions,\n} from './types.js';\nimport { createContractReceipt, verifyContractReceipt } from './receipts.js';\nimport { createServiceCard, verifyServiceCard } from './service-cards.js';\nimport { evaluateWalletPolicy } from './wallet-policies.js';\nimport { getContractNextAction } from './contract-actions.js';\n\nexport class L402Error extends Error {\n  status: number;\n  code?: string;\n\n  constructor(message: string, status: number, code?: string) {\n    super(message);\n    this.name = 'L402Error';\n    this.status = status;\n    this.code = code;\n  }\n}\n\n// ---------- SSE helpers ----------\n\ninterface SseFrame {\n  event?: string;\n  data: string;\n  id?: string;\n}\n\nconst TERMINAL_CONTRACT_STATUSES = new Set([\n  'released',\n  'refunded',\n  'expired',\n  'settled',\n]);\n\nfunction isTerminalContractStatus(status: string | undefined | null): boolean {\n  return !!status && TERMINAL_CONTRACT_STATUSES.has(status);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n  return new Promise((resolve, reject) => {\n    if (signal?.aborted) {\n      reject(new DOMException('Aborted', 'AbortError'));\n      return;\n    }\n    const t = setTimeout(() => {\n      signal?.removeEventListener('abort', onAbort);\n      resolve();\n    }, ms);\n    const onAbort = () => {\n      clearTimeout(t);\n      signal?.removeEventListener('abort', onAbort);\n      reject(new DOMException('Aborted', 'AbortError'));\n    };\n    signal?.addEventListener('abort', onAbort, { once: true });\n  });\n}\n\n/**\n * Parse a `text/event-stream` ReadableStream into SseFrame objects.\n * Comment lines (starting with `:`) are surfaced as `keepalive` frames so\n * callers can update last-seen timestamps. AbortSignal cancels the stream.\n */\nasync function* parseSseFrames(\n  stream: ReadableStream<Uint8Array>,\n  signal?: AbortSignal\n): AsyncGenerator<SseFrame & { keepalive?: boolean }> {\n  const reader = stream.getReader();\n  const decoder = new TextDecoder();\n  let buffer = '';\n\n  const onAbort = () => {\n    reader.cancel().catch(() => {});\n  };\n  signal?.addEventListener('abort', onAbort, { once: true });\n\n  try {\n    while (true) {\n      if (signal?.aborted) return;\n      const { value, done } = await reader.read();\n      if (done) {\n        if (buffer.trim().length > 0) {\n          const frame = parseSseBlock(buffer);\n          if (frame) yield frame;\n        }\n        return;\n      }\n      buffer += decoder.decode(value, { stream: true });\n\n      // SSE frames are delimited by a blank line.\n      let idx: number;\n      while ((idx = indexOfDoubleNewline(buffer)) !== -1) {\n        const raw = buffer.slice(0, idx);\n        buffer = buffer.slice(idx + (buffer[idx] === '\\r' ? 4 : 2));\n        const frame = parseSseBlock(raw);\n        if (frame) yield frame;\n      }\n    }\n  } finally {\n    signal?.removeEventListener('abort', onAbort);\n    try { await reader.cancel(); } catch { /* noop */ }\n  }\n}\n\nfunction indexOfDoubleNewline(s: string): number {\n  const a = s.indexOf('\\n\\n');\n  const b = s.indexOf('\\r\\n\\r\\n');\n  if (a === -1) return b;\n  if (b === -1) return a;\n  return Math.min(a, b);\n}\n\nfunction parseSseBlock(block: string): (SseFrame & { keepalive?: boolean }) | null {\n  const lines = block.split(/\\r?\\n/);\n  let event: string | undefined;\n  let id: string | undefined;\n  const dataParts: string[] = [];\n  let sawComment = false;\n\n  for (const line of lines) {\n    if (line === '') continue;\n    if (line.startsWith(':')) {\n      sawComment = true;\n      continue;\n    }\n    const colon = line.indexOf(':');\n    const field = colon === -1 ? line : line.slice(0, colon);\n    let value = colon === -1 ? '' : line.slice(colon + 1);\n    if (value.startsWith(' ')) value = value.slice(1);\n\n    if (field === 'event') event = value;\n    else if (field === 'data') dataParts.push(value);\n    else if (field === 'id') id = value;\n    // ignore retry/unknown for now\n  }\n\n  if (dataParts.length === 0) {\n    if (sawComment) return { event: 'keepalive', data: '', keepalive: true };\n    return null;\n  }\n  return { event, data: dataParts.join('\\n'), id };\n}\n\nfunction frameToContractEvent(\n  frame: SseFrame & { keepalive?: boolean },\n  contractId: string\n): ContractEvent | null {\n  if (frame.keepalive) {\n    return {\n      type: 'keepalive',\n      contractId,\n      data: null,\n      timestamp: new Date().toISOString(),\n      source: 'sse',\n    };\n  }\n  let parsed: any = null;\n  if (frame.data) {\n    try { parsed = JSON.parse(frame.data); } catch { parsed = frame.data; }\n  }\n  const eventName = (frame.event || 'snapshot') as ContractEvent['type'];\n  const type: ContractEvent['type'] =\n    eventName === 'snapshot' || eventName === 'state_change' || eventName === 'action'\n      ? eventName\n      : 'state_change';\n  const data = parsed?.data ?? parsed;\n  const ev: ContractEvent = {\n    type,\n    contractId: parsed?.contractId ?? parsed?.data?.id ?? contractId,\n    data,\n    timestamp: parsed?.timestamp ?? new Date().toISOString(),\n    source: 'sse',\n    event_id: frame.id ?? (parsed?.event_id !== undefined ? String(parsed.event_id) : undefined),\n  };\n  // Lift optional state_change context fields out of `data` so callers can\n  // read them without reaching into the loosely-typed payload. The fields\n  // remain on `data` as well for backwards compatibility.\n  if (data && typeof data === 'object') {\n    if (typeof (data as any).previous_status === 'string') ev.previous_status = (data as any).previous_status;\n    if (typeof (data as any).via === 'string') ev.via = (data as any).via;\n    if (typeof (data as any).reason === 'string') ev.reason = (data as any).reason;\n  }\n  return ev;\n}\n\nfunction frameToDepositEvent(\n  frame: SseFrame & { keepalive?: boolean },\n  paymentHash: string\n): DepositEvent | null {\n  if (frame.keepalive) {\n    return {\n      type: 'keepalive',\n      paymentHash,\n      data: null,\n      timestamp: new Date().toISOString(),\n      source: 'sse',\n    };\n  }\n  let parsed: any = null;\n  if (frame.data) {\n    try { parsed = JSON.parse(frame.data); } catch { parsed = frame.data; }\n  }\n  const eventName = (frame.event || 'snapshot') as DepositEvent['type'];\n  const type: DepositEvent['type'] =\n    eventName === 'snapshot' || eventName === 'state_change' ? eventName : 'state_change';\n  const data = parsed?.data ?? parsed;\n  const ev: DepositEvent = {\n    type,\n    paymentHash: parsed?.paymentHash ?? paymentHash,\n    data,\n    timestamp: parsed?.timestamp ?? new Date().toISOString(),\n    source: 'sse',\n    event_id: frame.id ?? (parsed?.event_id !== undefined ? String(parsed.event_id) : undefined),\n  };\n  if (data && typeof data === 'object') {\n    if (typeof (data as any).previous_status === 'string') ev.previous_status = (data as any).previous_status;\n    if (typeof (data as any).via === 'string') ev.via = (data as any).via;\n    if (typeof (data as any).reason === 'string') ev.reason = (data as any).reason;\n  }\n  return ev;\n}\n\n/**\n * Sleep with exponential backoff + jitter for SSE reconnects.\n *\n * delay = min(maxDelay, base * 2^attempt) + jitter(0..500)\n */\nfunction computeBackoffMs(attempt: number, baseMs: number, maxMs: number): number {\n  const exp = Math.min(maxMs, baseMs * Math.pow(2, attempt));\n  const jitter = Math.floor(Math.random() * 500);\n  return exp + jitter;\n}\n\n// ---------- L402Agent ----------\n\nexport class L402Agent {\n  private apiKey: string;\n  private apiUrl: string;\n\n  private onPaymentNeeded?: PaymentNeededCallback;\n  private paymentTimeoutMs: number;\n  private paymentPollIntervalMs: number;\n  private walletPolicy?: WalletPolicy;\n  private onPolicyApprovalNeeded?: L402AgentOptions['onPolicyApprovalNeeded'];\n\n  constructor(options: L402AgentOptions) {\n    if (!options.apiKey) {\n      throw new Error('apiKey is required');\n    }\n    this.apiKey = options.apiKey;\n    this.apiUrl = options.apiUrl ?? 'https://l402gw.nosaltres2.info';\n    this.onPaymentNeeded = options.onPaymentNeeded;\n    this.paymentTimeoutMs = options.paymentTimeoutMs ?? 300_000;\n    this.paymentPollIntervalMs = options.paymentPollIntervalMs ?? 5_000;\n    this.walletPolicy = options.walletPolicy;\n    this.onPolicyApprovalNeeded = options.onPolicyApprovalNeeded;\n  }\n\n  private async request<T>(method: string, path: string, body?: any, auth = true): Promise<T> {\n    const url = `${this.apiUrl}${path}`;\n    const bodyString = body === undefined ? '' : JSON.stringify(body);\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n    };\n    if (auth) {\n      const timestamp = Date.now().toString();\n      const signingPayload = `${method}\\n${path}\\n${timestamp}\\n${bodyString}`;\n      headers['X-L402-Key'] = this.apiKey;\n      headers['X-L402-Timestamp'] = timestamp;\n      headers['X-L402-Signature'] = createHmac('sha256', this.apiKey).update(signingPayload).digest('hex');\n    }\n    const options: RequestInit = {\n      method,\n      headers,\n    };\n\n    if (body !== undefined) {\n      options.body = bodyString;\n    }\n\n    const res = await fetch(url, options);\n\n    if (!res.ok) {\n      let errorMsg = `HTTP ${res.status}`;\n      let errorCode: string | undefined;\n\n      try {\n        const data = await res.json() as { error?: string; code?: string };\n        errorMsg = data.error || errorMsg;\n        errorCode = data.code;\n      } catch {\n        // Use default error message\n      }\n\n      throw new L402Error(errorMsg, res.status, errorCode);\n    }\n\n    return res.json() as Promise<T>;\n  }\n\n  private buildQuery(params?: object): string {\n    const query = new URLSearchParams();\n    for (const [key, value] of Object.entries(params || {})) {\n      if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n        query.append(key, String(value));\n      }\n    }\n    const encoded = query.toString();\n    return encoded ? `?${encoded}` : '';\n  }\n\n  // Static: register a new agent (no auth needed)\n  static async register(options: {\n    name: string;\n    description?: string;\n    wallet_type?: 'custodial' | 'external';\n    lightning_address?: string;\n    apiUrl?: string;\n  }): Promise<AgentRegistration> {\n    const apiUrl = options.apiUrl ?? 'https://l402gw.nosaltres2.info';\n    const url = `${apiUrl}/api/v1/agents/register`;\n\n    const res = await fetch(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        name: options.name,\n        description: options.description,\n        wallet_type: options.wallet_type ?? 'custodial',\n        lightning_address: options.lightning_address,\n      }),\n    });\n\n    if (!res.ok) {\n      let errorMsg = `HTTP ${res.status}`;\n      try {\n        const data = await res.json() as { error?: string };\n        errorMsg = data.error || errorMsg;\n      } catch {\n        // Use default error message\n      }\n      throw new L402Error(errorMsg, res.status);\n    }\n\n    return res.json() as Promise<AgentRegistration>;\n  }\n\n  // Wallet\n  async getBalance(): Promise<BalanceInfo> {\n    return this.request('GET', '/api/v1/wallet/balance');\n  }\n\n  /**\n   * Low-level: create a deposit invoice. Returns the invoice for manual handling.\n   * Most agents should use `deposit()` instead, which notifies the human and waits.\n   */\n  async createDeposit(amount_sats: number): Promise<DepositInvoice> {\n    const result = await this.request<DepositInvoice>('POST', '/api/v1/wallet/deposit', { amount_sats });\n    // Add pay_url for easy wallet linking\n    return {\n      ...result,\n      pay_url: `lightning:${result.invoice}`,\n    };\n  }\n\n  /**\n   * Check if a deposit invoice has been paid.\n   */\n  async checkDeposit(paymentHash: string): Promise<DepositStatus> {\n    return this.request('GET', `/api/v1/wallet/deposit/${paymentHash}`);\n  }\n\n  /**\n   * High-level deposit: creates invoice, notifies human, waits for payment.\n   *\n   * WHY THIS EXISTS: AI agents don't have Lightning wallets. They can't pay\n   * invoices. When an agent needs sats, it must ask a human to pay.\n   *\n   * This method:\n   * 1. Creates a Lightning invoice for the requested amount\n   * 2. Calls `onPaymentNeeded` so you can notify the human (chat, email, UI)\n   * 3. Polls until the invoice is paid or times out\n   * 4. Returns the confirmed deposit status\n   *\n   * If `onPaymentNeeded` is not configured, throws with the invoice so the\n   * caller can handle notification manually.\n   *\n   * @param amount_sats - Amount to deposit\n   * @param reason - Human-readable reason (shown in the notification)\n   * @returns Confirmed deposit status\n   * @throws {L402Error} if payment times out or fails\n   *\n   * @example\n   * const agent = new L402Agent({\n   *   apiKey: 'sk_...',\n   *   onPaymentNeeded: async (invoice) => {\n   *     // Send to Slack, Discord, Signal, email, etc.\n   *     await notify(`Pay ${invoice.amount_sats} sats: ${invoice.invoice}`);\n   *   },\n   * });\n   *\n   * // Agent requests funding and waits\n   * const deposit = await agent.deposit(1000, 'Need funds to accept code-review offer');\n   * console.log(`Funded! Balance: ${deposit.amount_sats} sats`);\n   */\n  async deposit(amount_sats: number, reason?: string): Promise<DepositStatus> {\n    const invoice = await this.createDeposit(amount_sats);\n\n    // If no callback, throw with invoice details so caller can handle it\n    if (!this.onPaymentNeeded) {\n      throw new L402Error(\n        `Payment needed: ${amount_sats} sats. ` +\n        `Invoice: ${invoice.invoice}. ` +\n        `No onPaymentNeeded callback configured — pay this invoice manually ` +\n        `and call checkDeposit('${invoice.payment_hash}') to confirm.`,\n        402,\n        'PAYMENT_NEEDED'\n      );\n    }\n\n    // Notify the human with clear payment instructions\n    const enrichedInvoice: DepositInvoice = {\n      ...invoice,\n      message: [\n        reason\n          ? `⚡ Agent needs ${amount_sats} sats: ${reason}`\n          : `⚡ Agent needs ${amount_sats} sats deposited`,\n        '',\n        `📱 Tap to pay: ${invoice.pay_url}`,\n        '',\n        `Or paste this invoice into any Lightning wallet:`,\n        invoice.invoice,\n      ].join('\\n'),\n    };\n    await this.onPaymentNeeded(enrichedInvoice);\n\n    // Poll for payment\n    if (this.paymentTimeoutMs === 0) {\n      return { status: 'pending', amount_sats, paid_at: null };\n    }\n\n    // Backwards-compatible: internally we now consume watchDeposit, which\n    // uses SSE when the gateway supports it and falls back to polling when\n    // the endpoint 404s. Return shape is unchanged.\n    const ac = new AbortController();\n    const timer = setTimeout(() => ac.abort(), this.paymentTimeoutMs);\n    try {\n      for await (const event of this.watchDeposit(invoice.payment_hash, { signal: ac.signal })) {\n        if (event.type === 'keepalive') continue;\n        const data = event.data || {};\n        if (data.status === 'paid') {\n          return {\n            status: 'paid',\n            amount_sats: data.amount_sats ?? amount_sats,\n            paid_at: data.paid_at ?? new Date().toISOString(),\n          };\n        }\n        if (data.status === 'expired') {\n          throw new L402Error('Deposit invoice expired before payment', 408, 'PAYMENT_EXPIRED');\n        }\n      }\n    } catch (err) {\n      if ((err as any)?.name === 'AbortError') {\n        // fall through to timeout error below\n      } else {\n        throw err;\n      }\n    } finally {\n      clearTimeout(timer);\n    }\n\n    throw new L402Error(\n      `Payment not received within ${this.paymentTimeoutMs / 1000}s. ` +\n      `Invoice may still be valid — check with checkDeposit('${invoice.payment_hash}')`,\n      408,\n      'PAYMENT_TIMEOUT'\n    );\n  }\n\n  /**\n   * Ensure the agent has at least `minBalance` sats. If not, request a deposit.\n   * Convenience method that checks balance first, then deposits the difference.\n   *\n   * @example\n   * // Before accepting an offer, make sure you can pay\n   * await agent.ensureBalance(500, 'Need funds for code-review contract');\n   * await agent.fundContract(contractId);\n   */\n  async ensureBalance(minBalance: number, reason?: string): Promise<BalanceInfo> {\n    const current = await this.getBalance();\n    if (current.balance_sats >= minBalance) return current;\n\n    const needed = minBalance - current.balance_sats;\n    await this.deposit(needed, reason ?? `Need ${needed} more sats (have ${current.balance_sats}, need ${minBalance})`);\n    return this.getBalance();\n  }\n\n  async withdraw(amount_sats?: number): Promise<WithdrawResult> {\n    return this.request('POST', '/api/v1/wallet/withdraw', amount_sats ? { amount_sats } : {});\n  }\n\n  // Offers\n  async createOffer(params: CreateOfferParams): Promise<Offer> {\n    return this.request('POST', '/api/v1/offers', {\n      title: params.title,\n      description: params.description,\n      price_sats: params.price_sats,\n      service_type: params.service_type,\n      terms: {\n        sla_minutes: params.sla_minutes ?? 30,\n        dispute_window_minutes: params.dispute_window_minutes ?? 1440,\n      },\n    });\n  }\n\n  async getTenant(): Promise<TenantInfo> {\n    return this.request('GET', '/api/v1/tenants/me');\n  }\n\n  async getReputation(tenantId?: string): Promise<TenantReputation> {\n    const id = tenantId ?? (await this.getTenant()).tenant_id;\n    return this.request('GET', `/api/v1/reputation/${encodeURIComponent(id)}`);\n  }\n\n  async listOffers(filters?: ListOffersParams): Promise<Offer[]> {\n    const result = await this.request<{ offers: Offer[] }>('GET', `/api/v1/offers${this.buildQuery(filters)}`);\n    return result.offers || [];\n  }\n\n  async browseOffers(filters?: ListOffersParams): Promise<Offer[]> {\n    const result = await this.request<{ offers: Offer[] }>(\n      'GET',\n      `/api/v1/offers${this.buildQuery(filters)}`,\n      undefined,\n      false\n    );\n    return result.offers || [];\n  }\n\n  async getOffer(offerId: string): Promise<Offer> {\n    return this.request('GET', `/api/v1/offers/${offerId}`);\n  }\n\n  async getServiceCard(offerId: string, options?: CreateServiceCardOptions): Promise<ServiceCard> {\n    const offer = await this.getOffer(offerId);\n    let reputation: TenantReputation | null = null;\n    try {\n      reputation = await this.getReputation(offer.seller_tenant_id);\n    } catch {\n      reputation = null;\n    }\n    return createServiceCard(offer, reputation, {\n      links: {\n        quickstart: 'https://github.com/jordiagi/satonomous/blob/main/examples/first-contract.ts',\n        offer: `${this.apiUrl}/api/v1/offers/${encodeURIComponent(offer.id)}`,\n      },\n      ...options,\n    });\n  }\n\n  async browseServiceCards(filters?: ListOffersParams, options?: CreateServiceCardOptions): Promise<ServiceCard[]> {\n    const offers = await this.browseOffers(filters);\n    return offers.map((offer) => createServiceCard(offer, null, options));\n  }\n\n  verifyServiceCard(card: ServiceCard): ServiceCardVerificationResult {\n    return verifyServiceCard(card);\n  }\n\n  async updateOffer(offerId: string, active: boolean): Promise<Offer> {\n    return this.request('PATCH', `/api/v1/offers/${offerId}`, { active });\n  }\n\n  // Contracts\n  async acceptOffer(offerId: string): Promise<Contract> {\n    return this.request('POST', '/api/v1/contracts', { offer_id: offerId });\n  }\n\n  async fundContract(contractId: string, options: FundContractPolicyOptions = {}): Promise<FundResult> {\n    const policy = options.policy ?? this.walletPolicy;\n    if (policy) {\n      const decision = await this.evaluateContractFunding(contractId, { ...options, policy });\n      if (decision.decision === 'deny') {\n        throw new L402Error(\n          `WalletPolicy denied funding ${contractId}: ${decision.reasons.join('; ')}`,\n          403,\n          'WALLET_POLICY_DENIED'\n        );\n      }\n      if (decision.decision === 'ask_human' && !options.humanApproved) {\n        const approved = await this.onPolicyApprovalNeeded?.(decision);\n        if (approved !== true) {\n          throw new L402Error(\n            `WalletPolicy requires human approval for ${contractId}: ${decision.reasons.join('; ')}`,\n            402,\n            'WALLET_POLICY_APPROVAL_REQUIRED'\n          );\n        }\n      }\n    }\n    return this.request('POST', `/api/v1/contracts/${contractId}/fund`, {});\n  }\n\n  async listContracts(filters?: { role?: 'buyer' | 'seller'; status?: string }): Promise<Contract[]> {\n    let path = '/api/v1/contracts';\n    const params = new URLSearchParams();\n    if (filters?.role) params.append('role', filters.role);\n    if (filters?.status) params.append('status', filters.status);\n    if (params.toString()) path += '?' + params.toString();\n    const result = await this.request<{ contracts: Contract[] }>('GET', path);\n    return result.contracts || [];\n  }\n\n  async getContract(contractId: string): Promise<Contract> {\n    return this.request('GET', `/api/v1/contracts/${contractId}`);\n  }\n\n  /**\n   * Open an SSE connection (or fall back to polling) for a contract.\n   *\n   * Yields `ContractEvent`s including the initial snapshot and any subsequent\n   * server-pushed events. The generator terminates when the contract reaches\n   * a terminal state, when reconnect attempts are exhausted, or when the\n   * caller's AbortSignal fires.\n   *\n   * Resilience:\n   *   - If the gateway responds with anything other than a 2xx\n   *     `text/event-stream`, this falls back to repeated `getContract`\n   *     polls and synthesizes `snapshot`/`state_change` events.\n   *   - If the SSE stream closes mid-flight, this reconnects with\n   *     `Last-Event-ID` set to the last `id:` we observed so the gateway's\n   *     ring buffer can replay missed events. Backoff: 1s → 2s → ... → 30s\n   *     with up to 500ms jitter, capped at `maxReconnectAttempts` (default 10).\n   *     After exhaustion the generator yields an `error` event and ends.\n   */\n  async *watchContract(\n    contractId: string,\n    options: WatchOptions = {}\n  ): AsyncGenerator<ContractEvent> {\n    const path = `/api/v1/contracts/${contractId}/events`;\n    const maxAttempts = options.maxReconnectAttempts ?? 10;\n    const baseDelay = options.baseReconnectDelayMs ?? 1_000;\n    const maxDelay = options.maxReconnectDelayMs ?? 30_000;\n\n    let lastEventId: string | null = null;\n    let attempt = 0;\n\n    while (!options.signal?.aborted) {\n      const stream = await this.openSseStream(path, options.signal, lastEventId);\n\n      if (!stream) {\n        // Polling fallback. Yields a synthesized snapshot each tick until the\n        // contract reaches a terminal state or the signal aborts.\n        const intervalMs = options.pollIntervalMs ?? this.paymentPollIntervalMs;\n        let last: string | null = null;\n        while (!options.signal?.aborted) {\n          const contract = await this.getContract(contractId);\n          const fingerprint = `${contract.status}:${contract.completed_at ?? ''}:${contract.released_at ?? ''}:${contract.disputed_at ?? ''}`;\n          const isFirst = last === null;\n          if (isFirst || fingerprint !== last) {\n            last = fingerprint;\n            yield {\n              type: isFirst ? 'snapshot' : 'state_change',\n              contractId: contract.id,\n              data: contract,\n              timestamp: new Date().toISOString(),\n              source: 'poll',\n            };\n          }\n          if (isTerminalContractStatus(contract.status)) return;\n          await sleep(intervalMs, options.signal);\n        }\n        return;\n      }\n\n      let frameCount = 0;\n      let sawTerminal = false;\n      try {\n        for await (const frame of parseSseFrames(stream, options.signal)) {\n          frameCount++;\n          const event = frameToContractEvent(frame, contractId);\n          if (event) {\n            if (event.event_id) lastEventId = event.event_id;\n            yield event;\n            if (\n              (event.type === 'state_change' || event.type === 'snapshot') &&\n              event.data &&\n              isTerminalContractStatus(event.data.status)\n            ) {\n              sawTerminal = true;\n              return;\n            }\n          }\n        }\n      } finally {\n        if (sawTerminal) {\n          // already returned\n        }\n      }\n\n      // Stream ended without a terminal state. Either reconnect or give up.\n      if (options.signal?.aborted) return;\n      if (frameCount > 0) {\n        // Got useful frames, so reset attempt counter — this looked healthy.\n        attempt = 0;\n      }\n      attempt++;\n      if (maxAttempts === 0 || attempt > maxAttempts) {\n        yield {\n          type: 'error',\n          contractId,\n          data: { message: `SSE reconnect attempts exhausted (${attempt - 1}/${maxAttempts})` },\n          timestamp: new Date().toISOString(),\n          source: 'sse',\n        };\n        return;\n      }\n      const delay = computeBackoffMs(attempt - 1, baseDelay, maxDelay);\n      try {\n        await sleep(delay, options.signal);\n      } catch (err) {\n        if ((err as any)?.name === 'AbortError') return;\n        throw err;\n      }\n    }\n  }\n\n  /**\n   * Open an SSE connection (or fall back to polling) for a deposit invoice.\n   * Same reconnect-with-backoff semantics as `watchContract`.\n   */\n  async *watchDeposit(\n    paymentHash: string,\n    options: WatchOptions = {}\n  ): AsyncGenerator<DepositEvent> {\n    const path = `/api/v1/wallet/deposit/${paymentHash}/events`;\n    const maxAttempts = options.maxReconnectAttempts ?? 10;\n    const baseDelay = options.baseReconnectDelayMs ?? 1_000;\n    const maxDelay = options.maxReconnectDelayMs ?? 30_000;\n\n    let lastEventId: string | null = null;\n    let attempt = 0;\n\n    while (!options.signal?.aborted) {\n      const stream = await this.openSseStream(path, options.signal, lastEventId);\n\n      if (!stream) {\n        const intervalMs = options.pollIntervalMs ?? this.paymentPollIntervalMs;\n        let lastStatus: string | null = null;\n        while (!options.signal?.aborted) {\n          const status = await this.checkDeposit(paymentHash);\n          const isFirst = lastStatus === null;\n          if (isFirst || status.status !== lastStatus) {\n            lastStatus = status.status;\n            yield {\n              type: isFirst ? 'snapshot' : 'state_change',\n              paymentHash,\n              data: status,\n              timestamp: new Date().toISOString(),\n              source: 'poll',\n            };\n          }\n          if (status.status === 'paid' || status.status === 'expired') return;\n          await sleep(intervalMs, options.signal);\n        }\n        return;\n      }\n\n      let frameCount = 0;\n      let sawTerminal = false;\n      for await (const frame of parseSseFrames(stream, options.signal)) {\n        frameCount++;\n        const event = frameToDepositEvent(frame, paymentHash);\n        if (event) {\n          if (event.event_id) lastEventId = event.event_id;\n          yield event;\n          if (event.data && (event.data.status === 'paid' || event.data.status === 'expired')) {\n            sawTerminal = true;\n            return;\n          }\n        }\n      }\n      if (sawTerminal) return;\n\n      if (options.signal?.aborted) return;\n      if (frameCount > 0) attempt = 0;\n      attempt++;\n      if (maxAttempts === 0 || attempt > maxAttempts) {\n        yield {\n          type: 'error',\n          paymentHash,\n          data: { message: `SSE reconnect attempts exhausted (${attempt - 1}/${maxAttempts})` },\n          timestamp: new Date().toISOString(),\n          source: 'sse',\n        };\n        return;\n      }\n      const delay = computeBackoffMs(attempt - 1, baseDelay, maxDelay);\n      try {\n        await sleep(delay, options.signal);\n      } catch (err) {\n        if ((err as any)?.name === 'AbortError') return;\n        throw err;\n      }\n    }\n  }\n\n  /**\n   * Issue a signed GET that accepts `text/event-stream`. Returns the response\n   * body stream on success, or `null` if the gateway responded with anything\n   * else (signaling that the caller should fall back to polling).\n   *\n   * When `lastEventId` is provided we forward it as the standard SSE\n   * `Last-Event-ID` header so the gateway's per-contract DO can replay\n   * missed events from its ring buffer.\n   */\n  private async openSseStream(\n    path: string,\n    signal?: AbortSignal,\n    lastEventId?: string | null\n  ): Promise<ReadableStream<Uint8Array> | null> {\n    const url = `${this.apiUrl}${path}`;\n    const timestamp = Date.now().toString();\n    const signingPayload = `GET\\n${path}\\n${timestamp}\\n`;\n    const headers: Record<string, string> = {\n      'Accept': 'text/event-stream',\n      'X-L402-Key': this.apiKey,\n      'X-L402-Timestamp': timestamp,\n      'X-L402-Signature': createHmac('sha256', this.apiKey).update(signingPayload).digest('hex'),\n    };\n    if (lastEventId) {\n      headers['Last-Event-ID'] = lastEventId;\n    }\n\n    let res: Response;\n    try {\n      res = await fetch(url, { method: 'GET', headers, signal });\n    } catch (err) {\n      // AbortError propagates; other network errors trigger fallback.\n      if ((err as any)?.name === 'AbortError') throw err;\n      return null;\n    }\n\n    if (!res.ok) {\n      // Drain body so the connection can be released, then fall back.\n      try { await res.body?.cancel(); } catch { /* noop */ }\n      return null;\n    }\n    const ct = res.headers?.get?.('Content-Type') || '';\n    if (!ct.toLowerCase().includes('text/event-stream') || !res.body) {\n      try { await res.body?.cancel(); } catch { /* noop */ }\n      return null;\n    }\n    return res.body;\n  }\n\n  private async inferRole(contract: Contract): Promise<ContractRole> {\n    try {\n      const tenant = await this.getTenant();\n      if (tenant.tenant_id === contract.buyer_tenant_id) return 'buyer';\n      if (tenant.tenant_id === contract.seller_tenant_id) return 'seller';\n    } catch {\n      // Fall through to observer when tenant lookup is unavailable.\n    }\n    return 'observer';\n  }\n\n  async getContractNextAction(\n    contractId: string,\n    options: ContractActionOptions = {}\n  ): Promise<ContractNextAction> {\n    const contract = await this.getContract(contractId);\n    const role = options.role ?? (await this.inferRole(contract));\n    return getContractNextAction(contract, { ...options, role });\n  }\n\n  async listContractActions(\n    filters?: { role?: 'buyer' | 'seller'; status?: string },\n    options: ContractActionOptions = {}\n  ): Promise<ContractNextAction[]> {\n    const contracts = await this.listContracts(filters);\n    return Promise.all(\n      contracts.map(async (contract) => {\n        const role = options.role ?? (await this.inferRole(contract));\n        return getContractNextAction(contract, { ...options, role });\n      })\n    );\n  }\n\n  async waitForContractAction(\n    contractId: string,\n    options: WaitForContractActionOptions = {}\n  ): Promise<ContractNextAction> {\n    const timeoutMs = options.timeoutMs ?? 60_000;\n    const pollIntervalMs = options.pollIntervalMs ?? 5_000;\n\n    // Consume the watcher stream (SSE when supported, polling otherwise) and\n    // evaluate the next-action helper on each emitted contract snapshot.\n    // Return shape is unchanged for backwards compat.\n    const ac = new AbortController();\n    const timer = setTimeout(() => ac.abort(), timeoutMs);\n    try {\n      for await (const event of this.watchContract(contractId, {\n        signal: ac.signal,\n        pollIntervalMs,\n      })) {\n        if (event.type === 'keepalive' || !event.data) continue;\n        const contract = event.data as Contract;\n        const role = options.role ?? (await this.inferRole(contract));\n        const next = getContractNextAction(contract, { ...options, role });\n        if (\n          (!options.action || next.action === options.action) &&\n          (!options.status || next.status === options.status)\n        ) {\n          return next;\n        }\n        if (next.terminal && !options.action && !options.status) return next;\n      }\n    } catch (err) {\n      if ((err as any)?.name !== 'AbortError') throw err;\n    } finally {\n      clearTimeout(timer);\n    }\n\n    throw new L402Error(\n      `Timed out waiting for contract ${contractId}` +\n      `${options.action ? ` action ${options.action}` : ''}` +\n      `${options.status ? ` status ${options.status}` : ''}`,\n      408,\n      'CONTRACT_WATCH_TIMEOUT'\n    );\n  }\n\n  evaluateWalletPolicy(\n    policy: WalletPolicy,\n    request: WalletPolicySpendRequest,\n    context?: WalletPolicyContext\n  ): WalletPolicyDecision {\n    return evaluateWalletPolicy(policy, request, context);\n  }\n\n  async evaluateContractFunding(\n    contractId: string,\n    options: FundContractPolicyOptions = {}\n  ): Promise<WalletPolicyDecision> {\n    const policy = options.policy ?? this.walletPolicy;\n    if (!policy) {\n      throw new Error('No WalletPolicy configured. Pass options.policy or set walletPolicy in the constructor.');\n    }\n\n    const contract = await this.getContract(contractId);\n    const terms = contract.terms_snapshot && typeof contract.terms_snapshot === 'object'\n      ? contract.terms_snapshot\n      : {};\n    const amount = contract.price_sats + contract.fee_sats;\n    return evaluateWalletPolicy(\n      policy,\n      {\n        amount_sats: amount,\n        price_sats: contract.price_sats,\n        fee_sats: contract.fee_sats,\n        counterparty_tenant_id: contract.seller_tenant_id,\n        service_type: typeof terms.service_type === 'string' ? terms.service_type : null,\n        offer_id: contract.offer_id,\n        contract_id: contract.id,\n        description: typeof terms.title === 'string' ? terms.title : undefined,\n      },\n      options.context\n    );\n  }\n\n  // Delivery\n  async submitDelivery(contractId: string, proofUrl: string, proofData?: any): Promise<Contract> {\n    return this.request('POST', `/api/v1/contracts/${contractId}/deliver`, {\n      proof_url: proofUrl,\n      proof_data: proofData,\n    });\n  }\n\n  async confirmDelivery(contractId: string): Promise<Contract> {\n    return this.request('POST', `/api/v1/contracts/${contractId}/confirm`, {});\n  }\n\n  async disputeDelivery(contractId: string, reason: string, evidenceUrl?: string): Promise<Contract> {\n    return this.request('POST', `/api/v1/contracts/${contractId}/dispute`, {\n      reason,\n      evidence_url: evidenceUrl,\n    });\n  }\n\n  // Ledger\n  async getLedger(limit?: number, offset?: number): Promise<{ balance_sats: number; entries: LedgerEntry[] }> {\n    let path = '/api/v1/ledger';\n    const params = new URLSearchParams();\n    if (limit) params.append('limit', String(limit));\n    if (offset) params.append('offset', String(offset));\n    if (params.toString()) path += '?' + params.toString();\n    return this.request('GET', path);\n  }\n\n  async getContractReceipt(contractId: string): Promise<ContractReceipt> {\n    const contract = await this.getContract(contractId);\n    const { entries } = await this.getLedger(100);\n    return createContractReceipt(contract, entries, {\n      links: {\n        quickstart: 'https://github.com/jordiagi/satonomous/blob/main/examples/first-contract.ts',\n      },\n    });\n  }\n\n  verifyContractReceipt(receipt: ContractReceipt): ContractReceiptVerificationResult {\n    return verifyContractReceipt(receipt);\n  }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n  Contract,\n  ContractReceipt,\n  ContractReceiptEvidenceRef,\n  ContractReceiptOutcome,\n  ContractReceiptVerificationCode,\n  ContractReceiptVerificationResult,\n  CreateContractReceiptOptions,\n  LedgerEntry,\n} from './types.js';\n\nconst RECEIPT_SCHEMA = 'satonomous.contract-receipt/v0' as const;\nconst TERMINAL_STATUSES = new Set(['released', 'disputed', 'refunded']);\n\nfunction canonicalize(value: unknown): unknown {\n  if (Array.isArray(value)) return value.map(canonicalize);\n  if (!value || typeof value !== 'object') return value;\n\n  return Object.fromEntries(\n    Object.entries(value as Record<string, unknown>)\n      .filter(([, entry]) => entry !== undefined)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .map(([key, entry]) => [key, canonicalize(entry)])\n  );\n}\n\nfunction sha256(value: unknown): string {\n  const json = JSON.stringify(canonicalize(value));\n  return `sha256:${createHash('sha256').update(json).digest('hex')}`;\n}\n\nfunction receiptBody(receipt: ContractReceipt): Omit<ContractReceipt, 'receipt_id' | 'body_hash'> {\n  const { receipt_id: _receiptId, body_hash: _bodyHash, ...body } = receipt;\n  return body;\n}\n\nfunction completeReceipt(receipt: ContractReceipt): ContractReceipt {\n  const body_hash = sha256(receiptBody(receipt));\n  return {\n    ...receipt,\n    body_hash,\n    receipt_id: `cr_${body_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`,\n  };\n}\n\nfunction termsSnapshot(contract: Contract): Record<string, any> {\n  return contract.terms_snapshot && typeof contract.terms_snapshot === 'object'\n    ? contract.terms_snapshot\n    : {};\n}\n\nfunction deliveryProof(contract: Contract): Record<string, any> {\n  return contract.delivery_proof && typeof contract.delivery_proof === 'object'\n    ? contract.delivery_proof\n    : {};\n}\n\nfunction normalizeOutcome(status: string): ContractReceiptOutcome {\n  if (status === 'released' || status === 'disputed' || status === 'refunded') return status;\n  throw new Error(`ContractReceipt requires terminal contract status: released, disputed, or refunded. Got ${status}.`);\n}\n\nfunction defaultIssuedAt(contract: Contract, outcome: ContractReceiptOutcome): string {\n  if (outcome === 'released' && contract.released_at) return contract.released_at;\n  if (outcome === 'disputed' && contract.disputed_at) return contract.disputed_at;\n  return contract.completed_at ?? contract.funded_at ?? contract.accepted_at ?? contract.created_at;\n}\n\nfunction defaultLedgerRefs(contract: Contract, ledgerEntries: LedgerEntry[]): string[] {\n  return Array.from(\n    new Set(\n      ledgerEntries\n        .filter((entry) => entry.reference_id === contract.id)\n        .map((entry) => String(entry.reference_id))\n    )\n  );\n}\n\nfunction defaultEvidenceRefs(contract: Contract, proof: Record<string, any>): ContractReceiptEvidenceRef[] {\n  const refs: ContractReceiptEvidenceRef[] = [];\n  const uri = typeof proof.url === 'string' ? proof.url : typeof proof.proof_url === 'string' ? proof.proof_url : null;\n  const hash =\n    typeof proof.payload_hash === 'string'\n      ? proof.payload_hash\n      : typeof proof.hash === 'string'\n        ? proof.hash\n        : null;\n\n  if (uri || hash) {\n    refs.push({\n      kind: 'delivery',\n      uri: uri ?? undefined,\n      hash: hash ?? undefined,\n      submitted_by: contract.seller_tenant_id,\n      submitted_at: contract.completed_at ?? undefined,\n      redaction_status: 'none',\n    });\n  }\n\n  return refs;\n}\n\nexport function createContractReceipt(\n  contract: Contract,\n  ledgerEntries: LedgerEntry[] = [],\n  options: CreateContractReceiptOptions = {}\n): ContractReceipt {\n  const outcome = normalizeOutcome(contract.status);\n  const terms = termsSnapshot(contract);\n  const proof = deliveryProof(contract);\n  const proofUrl =\n    typeof proof.url === 'string' ? proof.url : typeof proof.proof_url === 'string' ? proof.proof_url : null;\n  const payloadHash =\n    typeof proof.payload_hash === 'string'\n      ? proof.payload_hash\n      : typeof proof.hash === 'string'\n        ? proof.hash\n        : null;\n  const evidenceRefs = options.evidenceRefs ?? defaultEvidenceRefs(contract, proof);\n\n  return completeReceipt({\n    schema: RECEIPT_SCHEMA,\n    receipt_id: '',\n    body_hash: '',\n    issued_at: options.issuedAt ?? defaultIssuedAt(contract, outcome),\n    contract: {\n      id: contract.id,\n      offer_id: contract.offer_id,\n      service_type: typeof terms.service_type === 'string' ? terms.service_type : null,\n      buyer_agent_id: contract.buyer_tenant_id,\n      seller_agent_id: contract.seller_tenant_id,\n      price_sats: contract.price_sats,\n      fee_sats: contract.fee_sats,\n      settlement_rail: 'lightning',\n      status: contract.status,\n    },\n    terms: {\n      title: typeof terms.title === 'string' ? terms.title : null,\n      description: typeof terms.description === 'string' ? terms.description : null,\n      sla_minutes: typeof terms.sla_minutes === 'number' ? terms.sla_minutes : null,\n      dispute_window_minutes:\n        typeof terms.dispute_window_minutes === 'number' ? terms.dispute_window_minutes : null,\n      ...terms,\n    },\n    delivery_proof: {\n      url: proofUrl,\n      payload_hash: payloadHash,\n      submitted_at: contract.completed_at,\n    },\n    evidence_refs: evidenceRefs,\n    settlement: {\n      outcome,\n      released_at: contract.released_at,\n      disputed_at: contract.disputed_at,\n      refunded_at: options.refundedAt ?? null,\n      ledger_reference_ids: defaultLedgerRefs(contract, ledgerEntries),\n    },\n    reputation_event: {\n      seller_effect:\n        outcome === 'released'\n          ? 'completed_contract'\n          : outcome === 'disputed'\n            ? 'disputed_contract'\n            : 'refunded_contract',\n      buyer_effect:\n        outcome === 'released'\n          ? 'released_contract'\n          : outcome === 'disputed'\n            ? 'disputed_contract'\n            : 'refunded_contract',\n      counts_toward_reputation: outcome === 'released',\n    },\n    links: options.links,\n  });\n}\n\nexport function verifyContractReceipt(receipt: ContractReceipt): ContractReceiptVerificationResult {\n  const codes: ContractReceiptVerificationCode[] = [];\n  const warnings: ContractReceiptVerificationCode[] = [];\n\n  if (receipt.schema !== RECEIPT_SCHEMA) codes.push('unsupported_schema');\n  if (!receipt.receipt_id) codes.push('missing_receipt_id');\n  if (!receipt.body_hash) codes.push('missing_body_hash');\n  if (!TERMINAL_STATUSES.has(receipt.contract?.status)) codes.push('non_terminal_contract_status');\n  if (!receipt.settlement?.outcome) codes.push('missing_settlement_outcome');\n\n  const expected_body_hash = sha256(receiptBody(receipt));\n  const expected_receipt_id = `cr_${expected_body_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`;\n\n  if (receipt.body_hash && receipt.body_hash !== expected_body_hash) codes.push('body_hash_mismatch');\n  if (receipt.receipt_id && receipt.receipt_id !== expected_receipt_id) codes.push('receipt_id_mismatch');\n\n  if (!receipt.delivery_proof?.url && !receipt.delivery_proof?.payload_hash) {\n    warnings.push('missing_delivery_proof');\n  }\n  if (!receipt.settlement?.ledger_reference_ids?.length) {\n    warnings.push('missing_ledger_reference');\n  }\n  for (const ref of receipt.evidence_refs ?? []) {\n    if (!ref.kind || (!ref.uri && !ref.hash)) warnings.push('invalid_evidence_ref');\n  }\n\n  return {\n    valid: codes.length === 0,\n    codes: codes.length ? codes : ['valid'],\n    warnings,\n    expected_receipt_id,\n    expected_body_hash,\n  };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n  CreateServiceCardOptions,\n  Offer,\n  ServiceCard,\n  ServiceCardSellerReputation,\n  ServiceCardVerificationCode,\n  ServiceCardVerificationResult,\n  TenantReputation,\n} from './types.js';\n\nconst SERVICE_CARD_SCHEMA = 'satonomous.service-card/v0' as const;\n\nfunction canonicalize(value: unknown): unknown {\n  if (Array.isArray(value)) return value.map(canonicalize);\n  if (!value || typeof value !== 'object') return value;\n\n  return Object.fromEntries(\n    Object.entries(value as Record<string, unknown>)\n      .filter(([, entry]) => entry !== undefined)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .map(([key, entry]) => [key, canonicalize(entry)])\n  );\n}\n\nfunction sha256(value: unknown): string {\n  const json = JSON.stringify(canonicalize(value));\n  return `sha256:${createHash('sha256').update(json).digest('hex')}`;\n}\n\nfunction serviceCardBody(card: ServiceCard): Omit<ServiceCard, 'card_id' | 'body_hash'> {\n  const { card_id: _cardId, body_hash: _bodyHash, ...body } = card;\n  return body;\n}\n\nfunction completeServiceCard(card: ServiceCard): ServiceCard {\n  const body_hash = sha256(serviceCardBody(card));\n  return {\n    ...card,\n    body_hash,\n    card_id: `sc_${body_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`,\n  };\n}\n\nfunction offerTerms(offer: Offer): Record<string, any> {\n  return offer.terms && typeof offer.terms === 'object' ? offer.terms : {};\n}\n\nfunction normalizeReputation(\n  offer: Offer,\n  reputation?: TenantReputation | null\n): ServiceCardSellerReputation | null {\n  if (reputation?.seller) {\n    return {\n      score: reputation.seller.score,\n      level: reputation.seller.level,\n      settled_contracts: reputation.seller.summary.settled_contracts,\n      dispute_rate: reputation.seller.summary.dispute_rate,\n      total_volume_sats: reputation.seller.summary.total_volume_sats,\n      unique_counterparties: reputation.seller.summary.unique_counterparties,\n    };\n  }\n\n  if (offer.seller_reputation) {\n    return {\n      score: offer.seller_reputation.score,\n      level: offer.seller_reputation.level,\n      settled_contracts: offer.seller_reputation.settled_contracts,\n      dispute_rate: offer.seller_reputation.dispute_rate,\n      total_volume_sats: offer.seller_reputation.total_volume_sats,\n      unique_counterparties: offer.seller_reputation.unique_counterparties,\n    };\n  }\n\n  return null;\n}\n\nfunction defaultProofRequirements(terms: Record<string, any>, options: CreateServiceCardOptions): string[] {\n  if (options.proofRequirements) return options.proofRequirements;\n  if (Array.isArray(terms.proof_requirements)) {\n    return terms.proof_requirements.map(String).filter(Boolean);\n  }\n  if (typeof terms.proof_requirement === 'string') return [terms.proof_requirement];\n  return ['delivery_proof_url_or_payload_hash'];\n}\n\nexport function createServiceCard(\n  offer: Offer,\n  reputation?: TenantReputation | null,\n  options: CreateServiceCardOptions = {}\n): ServiceCard {\n  const terms = offerTerms(offer);\n\n  return completeServiceCard({\n    schema: SERVICE_CARD_SCHEMA,\n    card_id: '',\n    body_hash: '',\n    issued_at: options.issuedAt ?? new Date().toISOString(),\n    seller: {\n      agent_id: offer.seller_tenant_id,\n      reputation: normalizeReputation(offer, reputation),\n    },\n    service: {\n      offer_id: offer.id,\n      service_type: offer.service_type,\n      title: offer.title,\n      description: offer.description,\n      price_sats: offer.price_sats,\n      currency: 'sats',\n      active: Boolean(offer.active),\n      created_at: offer.created_at,\n      expires_at: offer.expires_at,\n    },\n    terms: {\n      sla_minutes: typeof terms.sla_minutes === 'number' ? terms.sla_minutes : null,\n      dispute_window_minutes:\n        typeof terms.dispute_window_minutes === 'number' ? terms.dispute_window_minutes : null,\n      max_concurrent_contracts: offer.max_concurrent_contracts,\n      escrow_policy: 'lightning_escrow',\n      settlement_policy: 'release_dispute_refund',\n      proof_required: typeof terms.proof_required === 'boolean' ? terms.proof_required : true,\n      proof_requirements: defaultProofRequirements(terms, options),\n      ...terms,\n    },\n    accept: {\n      accept_url: options.acceptUrl ?? `satonomous://offers/${encodeURIComponent(offer.id)}/accept`,\n      contract_template_ref: options.contractTemplateRef ?? `satonomous:offer:${offer.id}`,\n    },\n    links: options.links,\n  });\n}\n\nexport function verifyServiceCard(card: ServiceCard): ServiceCardVerificationResult {\n  const codes: ServiceCardVerificationCode[] = [];\n  const warnings: ServiceCardVerificationCode[] = [];\n\n  if (card.schema !== SERVICE_CARD_SCHEMA) codes.push('unsupported_schema');\n  if (!card.card_id) codes.push('missing_card_id');\n  if (!card.body_hash) codes.push('missing_body_hash');\n  if (!card.service?.active) codes.push('inactive_offer');\n  if (!card.accept?.accept_url) codes.push('missing_accept_url');\n  if (!card.service?.price_sats || card.service.price_sats <= 0) codes.push('missing_price');\n\n  const expected_body_hash = sha256(serviceCardBody(card));\n  const expected_card_id = `sc_${expected_body_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`;\n\n  if (card.body_hash && card.body_hash !== expected_body_hash) codes.push('body_hash_mismatch');\n  if (card.card_id && card.card_id !== expected_card_id) codes.push('card_id_mismatch');\n\n  if (!card.terms?.sla_minutes) warnings.push('missing_sla');\n  const rep = card.seller?.reputation;\n  if (rep && (rep.score < 0 || rep.score > 100 || !rep.level)) warnings.push('invalid_reputation');\n\n  return {\n    valid: codes.length === 0,\n    codes: codes.length ? codes : ['valid'],\n    warnings,\n    expected_card_id,\n    expected_body_hash,\n  };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n  CreateWalletPolicyOptions,\n  WalletPolicy,\n  WalletPolicyContext,\n  WalletPolicyDecision,\n  WalletPolicyDecisionCode,\n  WalletPolicySpendRequest,\n  WalletPolicyVerificationCode,\n  WalletPolicyVerificationResult,\n} from './types.js';\n\nconst WALLET_POLICY_SCHEMA = 'satonomous.wallet-policy/v0' as const;\n\nfunction canonicalize(value: unknown): unknown {\n  if (Array.isArray(value)) return value.map(canonicalize);\n  if (!value || typeof value !== 'object') return value;\n\n  return Object.fromEntries(\n    Object.entries(value as Record<string, unknown>)\n      .filter(([, entry]) => entry !== undefined)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .map(([key, entry]) => [key, canonicalize(entry)])\n  );\n}\n\nfunction sha256(value: unknown): string {\n  const json = JSON.stringify(canonicalize(value));\n  return `sha256:${createHash('sha256').update(json).digest('hex')}`;\n}\n\nfunction policyBody(policy: WalletPolicy): Omit<WalletPolicy, 'policy_id' | 'body_hash'> {\n  const { policy_id: _policyId, body_hash: _bodyHash, ...body } = policy;\n  return body;\n}\n\nfunction completeWalletPolicy(policy: WalletPolicy): WalletPolicy {\n  const body_hash = sha256(policyBody(policy));\n  return {\n    ...policy,\n    body_hash,\n    policy_id: `wp_${body_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`,\n  };\n}\n\nfunction isNonNegativeNumber(value: unknown): boolean {\n  return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\n\nfunction pushReason(\n  codes: WalletPolicyDecisionCode[],\n  reasons: string[],\n  code: WalletPolicyDecisionCode,\n  reason: string\n): void {\n  codes.push(code);\n  reasons.push(reason);\n}\n\nfunction unique(values?: string[]): string[] | undefined {\n  const cleaned = Array.from(new Set((values ?? []).map(String).filter(Boolean)));\n  return cleaned.length ? cleaned : undefined;\n}\n\nexport function createWalletPolicy(options: CreateWalletPolicyOptions = {}): WalletPolicy {\n  return completeWalletPolicy({\n    schema: WALLET_POLICY_SCHEMA,\n    policy_id: '',\n    body_hash: '',\n    issued_at: options.issuedAt ?? new Date().toISOString(),\n    agent_id: options.agentId,\n    limits: options.limits ?? {},\n    approvals: options.approvals ?? {},\n    allowlists: {\n      service_types: unique(options.allowlists?.service_types),\n      counterparties: unique(options.allowlists?.counterparties),\n    },\n    denylists: {\n      service_types: unique(options.denylists?.service_types),\n      counterparties: unique(options.denylists?.counterparties),\n    },\n    expires_at: options.expiresAt ?? null,\n    notes: options.notes,\n  });\n}\n\nexport function verifyWalletPolicy(policy: WalletPolicy): WalletPolicyVerificationResult {\n  const codes: WalletPolicyVerificationCode[] = [];\n\n  if (policy.schema !== WALLET_POLICY_SCHEMA) codes.push('unsupported_schema');\n  if (!policy.policy_id) codes.push('missing_policy_id');\n  if (!policy.body_hash) codes.push('missing_body_hash');\n\n  const expected_body_hash = sha256(policyBody(policy));\n  const expected_policy_id = `wp_${expected_body_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`;\n\n  if (policy.body_hash && policy.body_hash !== expected_body_hash) codes.push('body_hash_mismatch');\n  if (policy.policy_id && policy.policy_id !== expected_policy_id) codes.push('policy_id_mismatch');\n\n  for (const value of [\n    policy.limits?.max_contract_price_sats,\n    policy.limits?.max_contract_total_sats,\n    policy.limits?.daily_spend_limit_sats,\n    policy.limits?.max_spend_per_counterparty_sats,\n    policy.approvals?.ask_human_above_sats,\n  ]) {\n    if (value !== undefined && !isNonNegativeNumber(value)) codes.push('invalid_limit');\n  }\n\n  const minRep = policy.limits?.min_seller_reputation;\n  if (minRep !== undefined && (!isNonNegativeNumber(minRep) || minRep > 100)) {\n    codes.push('invalid_reputation_threshold');\n  }\n\n  return {\n    valid: codes.length === 0,\n    codes: codes.length ? codes : ['valid'],\n    expected_policy_id,\n    expected_body_hash,\n  };\n}\n\nexport function evaluateWalletPolicy(\n  policy: WalletPolicy,\n  request: WalletPolicySpendRequest,\n  context: WalletPolicyContext = {}\n): WalletPolicyDecision {\n  const denies: WalletPolicyDecisionCode[] = [];\n  const asks: WalletPolicyDecisionCode[] = [];\n  const reasons: string[] = [];\n  const amount = request.amount_sats;\n  const price = request.price_sats ?? amount;\n  const total = (request.price_sats ?? amount) + (request.fee_sats ?? 0);\n  const verification = verifyWalletPolicy(policy);\n\n  if (!verification.valid) {\n    pushReason(denies, reasons, 'invalid_policy', `WalletPolicy failed verification: ${verification.codes.join(', ')}`);\n  }\n\n  if (policy.expires_at && Date.parse(policy.expires_at) <= Date.parse(context.now ?? new Date().toISOString())) {\n    pushReason(denies, reasons, 'deny_policy_expired', `WalletPolicy expired at ${policy.expires_at}`);\n  }\n\n  const limits = policy.limits ?? {};\n  if (limits.max_contract_price_sats !== undefined && price > limits.max_contract_price_sats) {\n    pushReason(\n      denies,\n      reasons,\n      'deny_amount_exceeds_contract_price_limit',\n      `${price} sats price exceeds max_contract_price_sats ${limits.max_contract_price_sats}`\n    );\n  }\n\n  if (limits.max_contract_total_sats !== undefined && total > limits.max_contract_total_sats) {\n    pushReason(\n      denies,\n      reasons,\n      'deny_amount_exceeds_contract_total_limit',\n      `${total} sats total exceeds max_contract_total_sats ${limits.max_contract_total_sats}`\n    );\n  }\n\n  if (\n    limits.daily_spend_limit_sats !== undefined &&\n    (context.daily_spent_sats ?? 0) + amount > limits.daily_spend_limit_sats\n  ) {\n    pushReason(\n      denies,\n      reasons,\n      'deny_daily_spend_limit',\n      `${(context.daily_spent_sats ?? 0) + amount} sats would exceed daily_spend_limit_sats ${limits.daily_spend_limit_sats}`\n    );\n  }\n\n  if (\n    limits.max_spend_per_counterparty_sats !== undefined &&\n    (context.counterparty_spent_sats ?? 0) + amount > limits.max_spend_per_counterparty_sats\n  ) {\n    pushReason(\n      denies,\n      reasons,\n      'deny_counterparty_spend_limit',\n      `${(context.counterparty_spent_sats ?? 0) + amount} sats would exceed max_spend_per_counterparty_sats ${limits.max_spend_per_counterparty_sats}`\n    );\n  }\n\n  const counterparty = request.counterparty_tenant_id;\n  const deniedCounterparties = policy.denylists?.counterparties ?? [];\n  const allowedCounterparties = policy.allowlists?.counterparties ?? [];\n  if (counterparty && deniedCounterparties.includes(counterparty)) {\n    pushReason(denies, reasons, 'deny_counterparty_denied', `${counterparty} is in the counterparty denylist`);\n  }\n  if (counterparty && allowedCounterparties.length > 0 && !allowedCounterparties.includes(counterparty)) {\n    pushReason(denies, reasons, 'deny_counterparty_not_allowed', `${counterparty} is not in the counterparty allowlist`);\n  }\n\n  const serviceType = request.service_type ?? undefined;\n  const deniedServices = policy.denylists?.service_types ?? [];\n  const allowedServices = policy.allowlists?.service_types ?? [];\n  if (serviceType && deniedServices.includes(serviceType)) {\n    pushReason(denies, reasons, 'deny_service_type_denied', `${serviceType} is in the service type denylist`);\n  }\n  if (serviceType && allowedServices.length > 0 && !allowedServices.includes(serviceType)) {\n    pushReason(denies, reasons, 'deny_service_type_not_allowed', `${serviceType} is not in the service type allowlist`);\n  }\n\n  if (\n    limits.min_seller_reputation !== undefined &&\n    context.seller_reputation_score !== undefined &&\n    context.seller_reputation_score !== null &&\n    context.seller_reputation_score < limits.min_seller_reputation\n  ) {\n    pushReason(\n      denies,\n      reasons,\n      'deny_min_seller_reputation',\n      `${context.seller_reputation_score} seller reputation is below minimum ${limits.min_seller_reputation}`\n    );\n  }\n\n  const approvals = policy.approvals ?? {};\n  if (approvals.ask_human_above_sats !== undefined && amount > approvals.ask_human_above_sats) {\n    pushReason(\n      asks,\n      reasons,\n      'ask_human_amount_above_threshold',\n      `${amount} sats exceeds ask_human_above_sats ${approvals.ask_human_above_sats}`\n    );\n  }\n\n  if (\n    approvals.ask_human_for_unrated_counterparty &&\n    (context.seller_reputation_score === undefined || context.seller_reputation_score === null)\n  ) {\n    pushReason(asks, reasons, 'ask_human_unrated_counterparty', 'seller reputation is unavailable');\n  }\n\n  if (denies.length > 0) {\n    return {\n      decision: 'deny',\n      codes: denies,\n      reasons,\n      amount_sats: amount,\n      policy_id: policy.policy_id,\n    };\n  }\n\n  if (asks.length > 0) {\n    return {\n      decision: 'ask_human',\n      codes: asks,\n      reasons,\n      amount_sats: amount,\n      policy_id: policy.policy_id,\n    };\n  }\n\n  return {\n    decision: 'allow',\n    codes: ['allowed'],\n    reasons: ['WalletPolicy allows this spend'],\n    amount_sats: amount,\n    policy_id: policy.policy_id,\n  };\n}\n","import type {\n  Contract,\n  ContractActionOptions,\n  ContractNextAction,\n  ContractNextActionCode,\n  ContractRole,\n} from './types.js';\n\nconst TERMINAL_STATUSES = new Set(['released', 'refunded', 'expired']);\n\nfunction termsSnapshot(contract: Contract): Record<string, any> {\n  return contract.terms_snapshot && typeof contract.terms_snapshot === 'object'\n    ? contract.terms_snapshot\n    : {};\n}\n\nfunction addMinutes(iso: string | null, minutes: number | null): string | null {\n  if (!iso || minutes === null) return null;\n  const time = Date.parse(iso);\n  if (!Number.isFinite(time)) return null;\n  return new Date(time + minutes * 60_000).toISOString();\n}\n\nfunction isOverdue(dueAt: string | null, now: string): boolean {\n  if (!dueAt) return false;\n  const due = Date.parse(dueAt);\n  const current = Date.parse(now);\n  return Number.isFinite(due) && Number.isFinite(current) && current > due;\n}\n\nfunction requiredFor(role: ContractRole, actor: ContractRole | 'none'): boolean {\n  return actor !== 'none' && role === actor;\n}\n\nfunction buildAction(params: {\n  contract: Contract;\n  role: ContractRole;\n  actor: ContractRole | 'none';\n  action: ContractNextActionCode;\n  terminal?: boolean;\n  reason: string;\n  dueAt?: string | null;\n  now: string;\n}): ContractNextAction {\n  const terms = termsSnapshot(params.contract);\n  return {\n    contract_id: params.contract.id,\n    offer_id: params.contract.offer_id,\n    status: params.contract.status,\n    role: params.role,\n    actor: params.actor,\n    action: params.action,\n    required: requiredFor(params.role, params.actor),\n    terminal: params.terminal ?? false,\n    reason: params.reason,\n    price_sats: params.contract.price_sats,\n    fee_sats: params.contract.fee_sats,\n    service_type: typeof terms.service_type === 'string' ? terms.service_type : null,\n    due_at: params.dueAt ?? null,\n    overdue: isOverdue(params.dueAt ?? null, params.now),\n    contract: params.contract,\n  };\n}\n\nexport function getContractNextAction(\n  contract: Contract,\n  options: ContractActionOptions = {}\n): ContractNextAction {\n  const role = options.role ?? 'observer';\n  const now = options.now ?? new Date().toISOString();\n  const terms = termsSnapshot(contract);\n  const slaMinutes = typeof terms.sla_minutes === 'number' ? terms.sla_minutes : null;\n  const disputeWindowMinutes =\n    typeof terms.dispute_window_minutes === 'number' ? terms.dispute_window_minutes : null;\n\n  if (contract.status === 'accepted') {\n    const actor = contract.funded_at ? 'seller' : 'buyer';\n    return buildAction({\n      contract,\n      role,\n      actor,\n      action: actor === 'buyer' ? 'fund_contract' : 'submit_delivery',\n      reason: actor === 'buyer'\n        ? 'Contract is accepted and needs buyer escrow funding.'\n        : 'Contract appears funded and needs seller delivery.',\n      now,\n    });\n  }\n\n  if (contract.status === 'funded') {\n    const dueAt = addMinutes(contract.funded_at, slaMinutes);\n    return buildAction({\n      contract,\n      role,\n      actor: 'seller',\n      action: role === 'buyer' ? 'wait_for_delivery' : 'submit_delivery',\n      reason: 'Escrow is funded and seller delivery is required.',\n      dueAt,\n      now,\n    });\n  }\n\n  if (contract.status === 'completed') {\n    const dueAt = addMinutes(contract.completed_at, disputeWindowMinutes);\n    return buildAction({\n      contract,\n      role,\n      actor: 'buyer',\n      action: role === 'seller' ? 'wait_for_buyer_review' : 'confirm_or_dispute_delivery',\n      reason: 'Seller delivered proof; buyer should confirm release or open a dispute.',\n      dueAt,\n      now,\n    });\n  }\n\n  if (contract.status === 'disputed') {\n    return buildAction({\n      contract,\n      role,\n      actor: 'none',\n      action: 'review_dispute',\n      reason: 'Contract is disputed and awaiting gateway/operator resolution.',\n      now,\n    });\n  }\n\n  if (TERMINAL_STATUSES.has(contract.status)) {\n    return buildAction({\n      contract,\n      role,\n      actor: 'none',\n      action: 'terminal_receipt_available',\n      terminal: true,\n      reason: 'Contract is terminal; generate a ContractReceipt for reputation evidence.',\n      now,\n    });\n  }\n\n  return buildAction({\n    contract,\n    role,\n    actor: 'none',\n    action: 'unknown_status',\n    reason: `No event-loop rule is defined for contract status \"${contract.status}\".`,\n    now,\n  });\n}\n","export type SatonomousDiscoveryScore = 'ready' | 'partial' | 'blocked';\nexport type SatonomousDiscoveryCheckStatus = 'pass' | 'warn' | 'fail';\n\nexport interface SatonomousDiscoveryFetchEvidence {\n  url: string;\n  status?: number;\n  content_type?: string | null;\n  user_agent: string;\n  body_sample?: string;\n}\n\nexport interface SatonomousDiscoveryCheck {\n  code: string;\n  status: SatonomousDiscoveryCheckStatus;\n  message: string;\n  url?: string;\n  evidence?: unknown;\n}\n\nexport interface SatonomousDiscoveryReport {\n  valid: boolean;\n  score: SatonomousDiscoveryScore;\n  manifest_url: string;\n  checked_at: string;\n  checks: SatonomousDiscoveryCheck[];\n  warnings: string[];\n  errors: string[];\n}\n\nexport interface VerifySatonomousDiscoveryOptions {\n  /** User-Agent sent by the verifier. Defaults to an explicit SDK verifier UA. */\n  userAgent?: string;\n  /** Optional fetch override for tests, workers, or custom runtimes. */\n  fetch?: typeof fetch;\n  /** AbortSignal forwarded to verifier fetches. */\n  signal?: AbortSignal;\n  /** Skip OpenAPI fetch/content checks and only validate the discovery manifest. */\n  skipOpenApi?: boolean;\n  /** Timestamp override for deterministic tests. */\n  checkedAt?: string;\n}\n\nconst DEFAULT_VERIFIER_UA = 'satonomous-discovery-verifier/0.1 (+https://github.com/jordiagi/satonomous)';\n\nfunction normalizeManifestUrl(input: string): string {\n  const url = new URL(input);\n  if (url.pathname.endsWith('/.well-known/satonomous.json')) return url.toString();\n  url.pathname = '/.well-known/satonomous.json';\n  url.search = '';\n  url.hash = '';\n  return url.toString();\n}\n\nfunction headerValue(headers: Headers, name: string): string | null {\n  try {\n    return headers.get(name);\n  } catch {\n    return null;\n  }\n}\n\nfunction bodySample(text: string): string {\n  return text.replace(/\\s+/g, ' ').trim().slice(0, 240);\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n  return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction add(\n  checks: SatonomousDiscoveryCheck[],\n  status: SatonomousDiscoveryCheckStatus,\n  code: string,\n  message: string,\n  url?: string,\n  evidence?: unknown\n): void {\n  checks.push({ code, status, message, url, evidence });\n}\n\nfunction statusFromChecks(checks: SatonomousDiscoveryCheck[]): SatonomousDiscoveryScore {\n  if (checks.some((check) => check.status === 'fail')) return 'blocked';\n  if (checks.some((check) => check.status === 'warn')) return 'partial';\n  return 'ready';\n}\n\nasync function readText(response: Response): Promise<string> {\n  try {\n    return await response.text();\n  } catch {\n    return '';\n  }\n}\n\nasync function fetchText(\n  fetchImpl: typeof fetch,\n  url: string,\n  userAgent: string,\n  signal?: AbortSignal\n): Promise<{ ok: true; text: string; evidence: SatonomousDiscoveryFetchEvidence } | { ok: false; code: string; evidence: SatonomousDiscoveryFetchEvidence }> {\n  let response: Response;\n  try {\n    response = await fetchImpl(url, {\n      signal,\n      headers: {\n        'Accept': 'application/json, text/plain;q=0.8, */*;q=0.1',\n        'User-Agent': userAgent,\n      },\n    });\n  } catch (err: any) {\n    return {\n      ok: false,\n      code: 'manifest_unreachable',\n      evidence: {\n        url,\n        user_agent: userAgent,\n        body_sample: err?.message ? String(err.message).slice(0, 240) : String(err).slice(0, 240),\n      },\n    };\n  }\n\n  const text = await readText(response);\n  const evidence: SatonomousDiscoveryFetchEvidence = {\n    url,\n    status: response.status,\n    content_type: headerValue(response.headers, 'content-type'),\n    user_agent: userAgent,\n    body_sample: bodySample(text),\n  };\n\n  if (!response.ok) {\n    const sample = evidence.body_sample?.toLowerCase() ?? '';\n    const code = response.status === 403 && sample.includes('1010')\n      ? 'edge_bot_rule_blocked'\n      : 'manifest_unreachable';\n    return { ok: false, code, evidence };\n  }\n\n  return { ok: true, text, evidence };\n}\n\nfunction findOpenApiUrl(manifest: Record<string, any>): string | undefined {\n  const candidates = [\n    manifest.openapi,\n    manifest.openapi_url,\n    manifest.gateway?.openapi,\n    manifest.gateway?.openapi_url,\n    manifest.developer?.gateway?.openapi,\n    manifest.developer?.gateway?.openapi_url,\n    manifest.links?.openapi,\n  ];\n  return candidates.find((value) => typeof value === 'string' && /^https?:\\/\\//.test(value));\n}\n\nfunction assertManifestShape(manifest: Record<string, any>, checks: SatonomousDiscoveryCheck[], manifestUrl: string): void {\n  const primitives = isRecord(manifest.primitives) ? manifest.primitives : {};\n  const feedback = isRecord(manifest.feedback) ? manifest.feedback : {};\n\n  for (const primitive of ['service_cards', 'work_orders', 'contract_receipts']) {\n    add(\n      checks,\n      primitives[primitive] ? 'pass' : 'fail',\n      primitives[primitive] ? `${primitive}_present` : 'required_primitive_missing',\n      primitives[primitive] ? `Discovery advertises ${primitive}.` : `Discovery is missing required primitive ${primitive}.`,\n      manifestUrl\n    );\n  }\n\n  const hasWatcherPrimitive = Boolean(primitives.watchers || primitives.contract_event_loop);\n  add(\n    checks,\n    hasWatcherPrimitive ? 'pass' : 'warn',\n    hasWatcherPrimitive ? 'watcher_primitive_present' : 'watcher_primitive_missing',\n    hasWatcherPrimitive\n      ? 'Discovery advertises watcher/event-loop readiness.'\n      : 'Discovery does not advertise watcher/event-loop readiness.',\n    manifestUrl\n  );\n\n  const hasSecurity = isRecord(manifest.security) && Object.keys(manifest.security).length > 0;\n  add(\n    checks,\n    hasSecurity ? 'pass' : 'warn',\n    hasSecurity ? 'security_metadata_present' : 'security_metadata_missing',\n    hasSecurity ? 'Security metadata is present.' : 'Security metadata is missing or empty.',\n    manifestUrl\n  );\n\n  const hasFeedback = Boolean(feedback.issues || feedback.contract_primitives || feedback.integration_friction);\n  add(\n    checks,\n    hasFeedback ? 'pass' : 'warn',\n    hasFeedback ? 'feedback_path_present' : 'feedback_path_missing',\n    hasFeedback ? 'Discovery exposes at least one feedback route.' : 'Discovery does not expose a usable feedback path.',\n    manifestUrl,\n    feedback\n  );\n}\n\nasync function assertOpenApi(\n  manifest: Record<string, any>,\n  checks: SatonomousDiscoveryCheck[],\n  fetchImpl: typeof fetch,\n  userAgent: string,\n  signal?: AbortSignal\n): Promise<void> {\n  const openApiUrl = findOpenApiUrl(manifest);\n  if (!openApiUrl) {\n    add(checks, 'warn', 'openapi_url_missing', 'Discovery does not expose a gateway OpenAPI URL.');\n    return;\n  }\n\n  const fetched = await fetchText(fetchImpl, openApiUrl, userAgent, signal);\n  if (!fetched.ok) {\n    add(checks, fetched.code === 'edge_bot_rule_blocked' ? 'fail' : 'warn', fetched.code === 'edge_bot_rule_blocked' ? 'programmatic_fetch_blocked' : 'openapi_unreachable', 'OpenAPI fetch failed during programmatic verifier preflight.', openApiUrl, fetched.evidence);\n    return;\n  }\n\n  let openapi: any;\n  try {\n    openapi = JSON.parse(fetched.text);\n  } catch {\n    add(checks, 'warn', 'openapi_not_json', 'OpenAPI URL resolved but did not parse as JSON.', openApiUrl, fetched.evidence);\n    return;\n  }\n\n  add(checks, 'pass', 'openapi_json_ok', 'OpenAPI resolves and parses as JSON.', openApiUrl, {\n    ...fetched.evidence,\n    openapi: openapi.openapi,\n  });\n\n  const paths = isRecord(openapi.paths) ? openapi.paths : {};\n  const hasContractEvents = Boolean(paths['/api/v1/contracts/{contract_id}/events']);\n  const hasDepositEvents = Boolean(paths['/api/v1/wallet/deposit/{payment_hash}/events']);\n  add(\n    checks,\n    hasContractEvents && hasDepositEvents ? 'pass' : 'warn',\n    hasContractEvents && hasDepositEvents ? 'openapi_event_paths_present' : 'openapi_event_paths_missing',\n    hasContractEvents && hasDepositEvents\n      ? 'OpenAPI advertises contract and deposit event paths.'\n      : 'OpenAPI is missing one or more event/watch paths.',\n    openApiUrl,\n    { hasContractEvents, hasDepositEvents }\n  );\n}\n\nexport async function verifySatonomousDiscovery(\n  inputUrl: string,\n  options: VerifySatonomousDiscoveryOptions = {}\n): Promise<SatonomousDiscoveryReport> {\n  const manifest_url = normalizeManifestUrl(inputUrl);\n  const checked_at = options.checkedAt ?? new Date().toISOString();\n  const checks: SatonomousDiscoveryCheck[] = [];\n  const fetchImpl = options.fetch ?? globalThis.fetch;\n  const userAgent = options.userAgent ?? DEFAULT_VERIFIER_UA;\n\n  if (!fetchImpl) {\n    add(checks, 'fail', 'fetch_unavailable', 'No fetch implementation is available in this runtime.', manifest_url);\n    const score = statusFromChecks(checks);\n    return { valid: false, score, manifest_url, checked_at, checks, warnings: [], errors: ['fetch_unavailable'] };\n  }\n\n  const fetched = await fetchText(fetchImpl, manifest_url, userAgent, options.signal);\n  if (!fetched.ok) {\n    add(checks, fetched.code === 'edge_bot_rule_blocked' ? 'fail' : 'fail', fetched.code === 'edge_bot_rule_blocked' ? 'programmatic_fetch_blocked' : fetched.code, 'Discovery manifest fetch failed during programmatic verifier preflight.', manifest_url, fetched.evidence);\n    const score = statusFromChecks(checks);\n    return {\n      valid: false,\n      score,\n      manifest_url,\n      checked_at,\n      checks,\n      warnings: checks.filter((check) => check.status === 'warn').map((check) => check.code),\n      errors: checks.filter((check) => check.status === 'fail').map((check) => check.code),\n    };\n  }\n\n  let manifest: any;\n  try {\n    manifest = JSON.parse(fetched.text);\n  } catch {\n    add(checks, 'fail', 'manifest_not_json', 'Discovery manifest resolved but did not parse as JSON.', manifest_url, fetched.evidence);\n    const score = statusFromChecks(checks);\n    return { valid: false, score, manifest_url, checked_at, checks, warnings: [], errors: ['manifest_not_json'] };\n  }\n\n  if (!isRecord(manifest)) {\n    add(checks, 'fail', 'manifest_shape_invalid', 'Discovery manifest parsed but was not a JSON object.', manifest_url, fetched.evidence);\n  } else {\n    add(checks, 'pass', 'manifest_json_ok', 'Discovery manifest resolves and parses as JSON.', manifest_url, fetched.evidence);\n    assertManifestShape(manifest, checks, manifest_url);\n    if (!options.skipOpenApi) await assertOpenApi(manifest, checks, fetchImpl, userAgent, options.signal);\n  }\n\n  const score = statusFromChecks(checks);\n  return {\n    valid: score !== 'blocked',\n    score,\n    manifest_url,\n    checked_at,\n    checks,\n    warnings: checks.filter((check) => check.status === 'warn').map((check) => check.code),\n    errors: checks.filter((check) => check.status === 'fail').map((check) => check.code),\n  };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n  CreateTokenServiceCardOptions,\n  TokenServiceCard,\n  TokenServiceCardVerificationCode,\n  TokenServiceCardVerificationResult,\n} from './types.js';\n\nconst TOKEN_SERVICE_CARD_SCHEMA = 'satonomous.token-service-card/v0' as const;\n\nfunction canonicalize(value: unknown): unknown {\n  if (Array.isArray(value)) return value.map(canonicalize);\n  if (!value || typeof value !== 'object') return value;\n\n  return Object.fromEntries(\n    Object.entries(value as Record<string, unknown>)\n      .filter(([, entry]) => entry !== undefined)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .map(([key, entry]) => [key, canonicalize(entry)])\n  );\n}\n\nfunction sha256(value: unknown): string {\n  const json = JSON.stringify(canonicalize(value));\n  return `sha256:${createHash('sha256').update(json).digest('hex')}`;\n}\n\nfunction tokenServiceCardBody(card: TokenServiceCard): Omit<TokenServiceCard, 'card_id' | 'body_hash'> {\n  const { card_id: _cardId, body_hash: _bodyHash, ...body } = card;\n  return body;\n}\n\nfunction completeTokenServiceCard(card: TokenServiceCard): TokenServiceCard {\n  const body_hash = sha256(tokenServiceCardBody(card));\n  return {\n    ...card,\n    body_hash,\n    card_id: `tsc_${body_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`,\n  };\n}\n\nfunction positive(value: unknown): value is number {\n  return typeof value === 'number' && Number.isFinite(value) && value > 0;\n}\n\nfunction nonNegative(value: unknown): value is number {\n  return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\n\nexport function createTokenServiceCard(options: CreateTokenServiceCardOptions): TokenServiceCard {\n  return completeTokenServiceCard({\n    schema: TOKEN_SERVICE_CARD_SCHEMA,\n    card_id: '',\n    body_hash: '',\n    issued_at: options.issuedAt ?? new Date().toISOString(),\n    seller: options.seller,\n    service: options.service,\n    inference: options.inference,\n    pricing: options.pricing,\n    limits: options.limits,\n    metering: {\n      usage_receipt_schema: 'satonomous.token-usage-receipt/v0',\n      idempotency: 'request_id',\n      ...options.metering,\n    },\n    privacy: options.privacy,\n    settlement: {\n      escrow_policy: 'prepaid_metered_escrow',\n      settlement_policy: 'usage_release_unused_refund',\n      ...options.settlement,\n    },\n    accept: options.accept,\n    links: options.links,\n  });\n}\n\nexport function verifyTokenServiceCard(card: TokenServiceCard): TokenServiceCardVerificationResult {\n  const codes: TokenServiceCardVerificationCode[] = [];\n  const warnings: TokenServiceCardVerificationCode[] = [];\n\n  if (card.schema !== TOKEN_SERVICE_CARD_SCHEMA) codes.push('unsupported_schema');\n  if (!card.card_id) codes.push('missing_card_id');\n  if (!card.body_hash) codes.push('missing_body_hash');\n  if (!card.service?.active) codes.push('inactive_service');\n  if (!card.accept?.accept_url) codes.push('missing_accept_url');\n\n  const expected_body_hash = sha256(tokenServiceCardBody(card));\n  const expected_card_id = `tsc_${expected_body_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`;\n\n  if (card.body_hash && card.body_hash !== expected_body_hash) codes.push('body_hash_mismatch');\n  if (card.card_id && card.card_id !== expected_card_id) codes.push('card_id_mismatch');\n\n  if (!Array.isArray(card.inference?.models) || card.inference.models.length === 0) {\n    codes.push('missing_model');\n  }\n\n  if (!card.pricing) {\n    codes.push('missing_pricing');\n  } else {\n    if (!nonNegative(card.pricing.input_sats) || !nonNegative(card.pricing.output_sats)) {\n      codes.push('invalid_price');\n    }\n    if ((card.pricing.input_sats ?? 0) === 0 && (card.pricing.output_sats ?? 0) === 0) {\n      codes.push('invalid_price');\n    }\n    if (card.pricing.cached_input_sats !== undefined && !nonNegative(card.pricing.cached_input_sats)) {\n      codes.push('invalid_price');\n    }\n    if (!positive(card.pricing.max_contract_sats)) codes.push('missing_budget_cap');\n  }\n\n  if (!positive(card.limits?.max_context_tokens) || !positive(card.limits?.max_output_tokens)) {\n    codes.push('invalid_limit');\n  }\n\n  if (!card.metering?.method || !card.metering?.token_counter) {\n    codes.push('missing_metering');\n  }\n\n  const provider = card.inference?.provider;\n  if (!provider?.seller_attests_authorized || !provider.attestation) {\n    codes.push('missing_authorization_attestation');\n  }\n  if (provider?.authorization_basis === 'prohibited_risk') {\n    codes.push('prohibited_resale_risk');\n  }\n\n  const policyFlags = card.seller?.trust?.policy_flags ?? [];\n  if (policyFlags.includes('raw_api_key_resale')) codes.push('raw_credential_resale');\n\n  if (provider?.disclosure === 'undisclosed') warnings.push('undisclosed_provider');\n  if (provider?.authorization_basis === 'unknown') warnings.push('unknown_resale_rights');\n  if (!card.settlement?.dispute_window_minutes) warnings.push('missing_sla');\n  if (!card.seller?.reputation) warnings.push('missing_reputation');\n  if (card.metering && !card.metering.dry_run_quote) warnings.push('no_dry_run_quote');\n  if (card.privacy?.log_prompts) warnings.push('prompt_logging_enabled');\n  if (card.privacy?.log_completions) warnings.push('completion_logging_enabled');\n  if (card.privacy?.training_use) warnings.push('training_use_enabled');\n\n  return {\n    valid: codes.length === 0,\n    codes: codes.length ? codes : ['valid'],\n    warnings,\n    expected_card_id,\n    expected_body_hash,\n  };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n  CreateMeteredEscrowContractOptions,\n  MeteredEscrowContract,\n  MeteredEscrowContractStatus,\n  MeteredEscrowVerificationCode,\n  MeteredEscrowVerificationResult,\n  MeteredUsageApplyResult,\n  MeteredUsageEvent,\n  MeteredUsageInput,\n  MeteredUsageQuote,\n  TokenServiceCard,\n} from './types.js';\n\nconst METERED_ESCROW_SCHEMA = 'satonomous.metered-escrow-contract/v0' as const;\nconst USAGE_EVENT_SCHEMA = 'satonomous.token-usage-event/v0' as const;\nconst SPENDABLE_STATUSES = new Set<MeteredEscrowContractStatus>(['funded', 'active']);\nconst TERMINAL_STATUSES = new Set<MeteredEscrowContractStatus>(['exhausted', 'completed', 'refunded', 'resolved', 'expired']);\n\nfunction canonicalize(value: unknown): unknown {\n  if (Array.isArray(value)) return value.map(canonicalize);\n  if (!value || typeof value !== 'object') return value;\n\n  return Object.fromEntries(\n    Object.entries(value as Record<string, unknown>)\n      .filter(([, entry]) => entry !== undefined)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .map(([key, entry]) => [key, canonicalize(entry)])\n  );\n}\n\nfunction sha256(value: unknown): string {\n  const json = JSON.stringify(canonicalize(value));\n  return `sha256:${createHash('sha256').update(json).digest('hex')}`;\n}\n\nfunction positiveInteger(value: unknown): value is number {\n  return Number.isInteger(value) && typeof value === 'number' && value > 0;\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n  return Number.isInteger(value) && typeof value === 'number' && value >= 0;\n}\n\nfunction ceilingDiv(numerator: number, denominator: number): number {\n  return numerator === 0 ? 0 : Math.ceil(numerator / denominator);\n}\n\nfunction pricingDenominator(unit: TokenServiceCard['pricing']['unit']): number {\n  return unit === 'per_1m_tokens' ? 1_000_000 : 1_000;\n}\n\nfunction contractTermsBody(contract: MeteredEscrowContract): unknown {\n  return {\n    schema: contract.schema,\n    issued_at: contract.issued_at,\n    token_service_card_id: contract.token_service_card_id,\n    token_service_card_hash: contract.token_service_card_hash,\n    buyer_agent_id: contract.buyer_agent_id,\n    seller_agent_id: contract.seller_agent_id,\n    pricing: contract.pricing,\n    limits: contract.limits,\n    metering: contract.metering,\n    settlement: contract.settlement,\n    escrowed_sats: contract.escrow.escrowed_sats,\n    links: contract.links,\n  };\n}\n\nfunction contractBody(contract: MeteredEscrowContract): Omit<MeteredEscrowContract, 'contract_id' | 'terms_hash' | 'body_hash'> {\n  const { contract_id: _contractId, terms_hash: _termsHash, body_hash: _bodyHash, ...body } = contract;\n  return body;\n}\n\nfunction usageEventBody(event: MeteredUsageEvent): Omit<MeteredUsageEvent, 'event_id'> {\n  const { event_id: _eventId, ...body } = event;\n  return body;\n}\n\nfunction completeUsageEvent(event: MeteredUsageEvent): MeteredUsageEvent {\n  const eventHash = sha256(usageEventBody(event));\n  return {\n    ...event,\n    event_id: `tue_${eventHash.slice('sha256:'.length, 'sha256:'.length + 32)}`,\n  };\n}\n\nfunction completeContract(contract: MeteredEscrowContract): MeteredEscrowContract {\n  const terms_hash = sha256(contractTermsBody(contract));\n  const contract_id = `mec_${terms_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`;\n  const withIdentity = { ...contract, terms_hash, contract_id };\n  return {\n    ...withIdentity,\n    body_hash: sha256(contractBody(withIdentity)),\n  };\n}\n\nfunction recomputeEscrow(contract: MeteredEscrowContract): MeteredEscrowContract['escrow'] {\n  const spent_sats = contract.usage_events.reduce((sum, event) => sum + event.sats_charged, 0);\n  const disputed_sats = contract.status === 'disputed' ? spent_sats : contract.escrow.disputed_sats;\n  const settled_sats = TERMINAL_STATUSES.has(contract.status) && contract.status !== 'refunded' ? spent_sats : contract.escrow.settled_sats;\n  return {\n    escrowed_sats: contract.escrow.escrowed_sats,\n    spent_sats,\n    refundable_sats: Math.max(0, contract.escrow.escrowed_sats - spent_sats - disputed_sats),\n    settled_sats,\n    disputed_sats,\n  };\n}\n\nfunction withEscrow(contract: MeteredEscrowContract): MeteredEscrowContract {\n  return completeContract({\n    ...contract,\n    escrow: recomputeEscrow(contract),\n  });\n}\n\nexport function createMeteredEscrowContract(options: CreateMeteredEscrowContractOptions): MeteredEscrowContract {\n  const card = options.tokenServiceCard;\n  const issuedAt = options.issuedAt ?? new Date().toISOString();\n  const expiresAt =\n    options.expiresAt === undefined && card.limits.expires_after_minutes\n      ? new Date(new Date(issuedAt).getTime() + card.limits.expires_after_minutes * 60_000).toISOString()\n      : options.expiresAt ?? card.service.expires_at;\n\n  const contract = completeContract({\n    schema: METERED_ESCROW_SCHEMA,\n    contract_id: '',\n    terms_hash: '',\n    body_hash: '',\n    issued_at: issuedAt,\n    updated_at: options.updatedAt ?? issuedAt,\n    token_service_card_id: card.card_id,\n    token_service_card_hash: card.body_hash,\n    buyer_agent_id: options.buyerAgentId,\n    seller_agent_id: card.seller.agent_id,\n    status: options.status ?? 'funded',\n    pricing: {\n      currency: card.pricing.currency,\n      unit: card.pricing.unit,\n      input_sats: card.pricing.input_sats,\n      output_sats: card.pricing.output_sats,\n      cached_input_sats: card.pricing.cached_input_sats,\n      request_minimum_sats: card.pricing.request_minimum_sats,\n      max_contract_sats: card.pricing.max_contract_sats,\n    },\n    limits: {\n      max_context_tokens: card.limits.max_context_tokens,\n      max_output_tokens: card.limits.max_output_tokens,\n      max_requests_per_contract: card.limits.max_requests_per_contract,\n      expires_after_minutes: card.limits.expires_after_minutes,\n      expires_at: expiresAt,\n    },\n    metering: {\n      method: card.metering.method,\n      token_counter: card.metering.token_counter,\n      idempotency: card.metering.idempotency,\n    },\n    escrow: {\n      escrowed_sats: options.escrowedSats,\n      spent_sats: 0,\n      refundable_sats: options.escrowedSats,\n      settled_sats: 0,\n      disputed_sats: 0,\n    },\n    settlement: {\n      dispute_window_minutes: card.settlement.dispute_window_minutes,\n      refund_unused_sats: card.settlement.refund_unused_sats,\n      partial_settlement: card.settlement.partial_settlement,\n    },\n    usage_events: [],\n    links: options.links,\n  });\n\n  const verification = verifyMeteredEscrowContract(contract);\n  if (!verification.valid) {\n    throw new Error(`Invalid metered escrow contract: ${verification.codes.join(', ')}`);\n  }\n\n  return contract;\n}\n\nexport function quoteMeteredUsage(contract: MeteredEscrowContract, usage: MeteredUsageInput): MeteredUsageQuote {\n  const denominator = pricingDenominator(contract.pricing.unit);\n  const input_sats = ceilingDiv(usage.inputTokens * contract.pricing.input_sats, denominator);\n  const output_sats = ceilingDiv(usage.outputTokens * contract.pricing.output_sats, denominator);\n  const cached_input_sats = ceilingDiv(\n    (usage.cachedInputTokens ?? 0) * (contract.pricing.cached_input_sats ?? contract.pricing.input_sats),\n    denominator\n  );\n  const rawTotal = input_sats + output_sats + cached_input_sats;\n  const minimum = contract.pricing.request_minimum_sats ?? 0;\n  const minimum_applied_sats = rawTotal > 0 && rawTotal < minimum ? minimum - rawTotal : 0;\n  const total_sats = rawTotal + minimum_applied_sats;\n  const remaining_before_sats = Math.max(0, contract.escrow.escrowed_sats - contract.escrow.spent_sats - contract.escrow.disputed_sats);\n\n  return {\n    input_sats,\n    output_sats,\n    cached_input_sats,\n    minimum_applied_sats,\n    total_sats,\n    remaining_before_sats,\n    remaining_after_sats: remaining_before_sats - total_sats,\n  };\n}\n\nexport function applyMeteredUsage(contract: MeteredEscrowContract, usage: MeteredUsageInput): MeteredUsageApplyResult {\n  const codes: MeteredUsageApplyResult['codes'] = [];\n  const reasons: string[] = [];\n\n  if (!SPENDABLE_STATUSES.has(contract.status)) {\n    codes.push('contract_not_spendable');\n    reasons.push(`Contract status ${contract.status} cannot accept metered usage.`);\n  }\n\n  if (\n    !usage.requestId ||\n    !usage.modelId ||\n    !nonNegativeInteger(usage.inputTokens) ||\n    !nonNegativeInteger(usage.outputTokens) ||\n    (usage.cachedInputTokens !== undefined && !nonNegativeInteger(usage.cachedInputTokens)) ||\n    usage.inputTokens + usage.outputTokens + (usage.cachedInputTokens ?? 0) <= 0\n  ) {\n    codes.push('invalid_usage');\n    reasons.push('Usage must include request/model ids and non-negative token counts with at least one token.');\n  }\n\n  if (usage.inputTokens + (usage.cachedInputTokens ?? 0) > contract.limits.max_context_tokens) {\n    codes.push('usage_exceeds_limits');\n    reasons.push('Input token usage exceeds contract context limit.');\n  }\n  if (usage.outputTokens > contract.limits.max_output_tokens) {\n    codes.push('usage_exceeds_limits');\n    reasons.push('Output token usage exceeds contract output limit.');\n  }\n  if (\n    contract.limits.max_requests_per_contract !== undefined &&\n    contract.usage_events.length >= contract.limits.max_requests_per_contract\n  ) {\n    codes.push('request_limit_exceeded');\n    reasons.push('Contract request limit has already been reached.');\n  }\n  if (contract.usage_events.some((event) => event.request_id === usage.requestId)) {\n    codes.push('duplicate_request_id');\n    reasons.push('Request id has already been charged on this contract.');\n  }\n\n  const quote = quoteMeteredUsage(contract, usage);\n  if (quote.total_sats <= 0) {\n    codes.push('invalid_usage');\n    reasons.push('Usage quote must produce a positive sats charge.');\n  }\n  if (quote.remaining_after_sats < 0) {\n    codes.push('insufficient_escrow');\n    reasons.push('Usage charge would exceed remaining prepaid escrow.');\n  }\n\n  if (codes.length > 0) {\n    return { applied: false, codes, reasons, quote, contract };\n  }\n\n  const event = completeUsageEvent({\n    schema: USAGE_EVENT_SCHEMA,\n    event_id: '',\n    request_id: usage.requestId,\n    contract_id: contract.contract_id,\n    created_at: usage.createdAt ?? new Date().toISOString(),\n    model_id: usage.modelId,\n    input_tokens: usage.inputTokens,\n    output_tokens: usage.outputTokens,\n    cached_input_tokens: usage.cachedInputTokens,\n    sats_charged: quote.total_sats,\n    metering_source: usage.meteringSource ?? contract.metering.method,\n    seller_signature: usage.sellerSignature,\n    buyer_acknowledged: usage.buyerAcknowledged,\n    prompt_hash: usage.promptHash,\n    completion_hash: usage.completionHash,\n    metadata_hash: usage.metadataHash,\n  });\n\n  const nextStatus = quote.remaining_after_sats === 0 ? 'exhausted' : 'active';\n  const nextContract = withEscrow({\n    ...contract,\n    status: nextStatus,\n    updated_at: event.created_at,\n    usage_events: [...contract.usage_events, event],\n  });\n\n  return {\n    applied: true,\n    codes: ['applied'],\n    reasons: [],\n    quote,\n    event,\n    contract: nextContract,\n  };\n}\n\nexport function closeMeteredEscrowContract(\n  contract: MeteredEscrowContract,\n  status: Extract<MeteredEscrowContractStatus, 'completed' | 'refunded' | 'disputed' | 'expired'> = 'completed',\n  closedAt = new Date().toISOString()\n): MeteredEscrowContract {\n  return withEscrow({\n    ...contract,\n    status,\n    updated_at: closedAt,\n  });\n}\n\nexport function verifyMeteredEscrowContract(contract: MeteredEscrowContract): MeteredEscrowVerificationResult {\n  const codes: MeteredEscrowVerificationCode[] = [];\n\n  if (contract.schema !== METERED_ESCROW_SCHEMA) codes.push('unsupported_schema');\n  if (!contract.contract_id) codes.push('missing_contract_id');\n  if (!contract.terms_hash) codes.push('missing_terms_hash');\n  if (!contract.body_hash) codes.push('missing_body_hash');\n  if (!contract.token_service_card_id || !contract.token_service_card_hash) codes.push('missing_token_service_card_ref');\n\n  const expected_terms_hash = sha256(contractTermsBody(contract));\n  const expected_contract_id = `mec_${expected_terms_hash.slice('sha256:'.length, 'sha256:'.length + 32)}`;\n  const expected_body_hash = sha256(contractBody({ ...contract, terms_hash: expected_terms_hash, contract_id: expected_contract_id }));\n\n  if (contract.terms_hash && contract.terms_hash !== expected_terms_hash) codes.push('terms_hash_mismatch');\n  if (contract.contract_id && contract.contract_id !== expected_contract_id) codes.push('contract_id_mismatch');\n  if (contract.body_hash && contract.body_hash !== expected_body_hash) codes.push('body_hash_mismatch');\n\n  const statuses: MeteredEscrowContractStatus[] = [\n    'accepted',\n    'funded',\n    'active',\n    'exhausted',\n    'completed',\n    'refunded',\n    'disputed',\n    'resolved',\n    'expired',\n  ];\n  if (!statuses.includes(contract.status)) codes.push('invalid_status');\n\n  if (\n    contract.pricing.currency !== 'sats' ||\n    !Number.isFinite(contract.pricing.input_sats) ||\n    !Number.isFinite(contract.pricing.output_sats) ||\n    contract.pricing.input_sats < 0 ||\n    contract.pricing.output_sats < 0 ||\n    contract.pricing.input_sats + contract.pricing.output_sats <= 0 ||\n    !positiveInteger(contract.pricing.max_contract_sats)\n  ) {\n    codes.push('invalid_price');\n  }\n\n  if (\n    !positiveInteger(contract.escrow.escrowed_sats) ||\n    contract.escrow.escrowed_sats > contract.pricing.max_contract_sats ||\n    !nonNegativeInteger(contract.escrow.spent_sats) ||\n    !nonNegativeInteger(contract.escrow.refundable_sats) ||\n    !nonNegativeInteger(contract.escrow.settled_sats) ||\n    !nonNegativeInteger(contract.escrow.disputed_sats)\n  ) {\n    codes.push('invalid_escrow_amount');\n  }\n\n  const seenRequestIds = new Set<string>();\n  let usageSum = 0;\n  for (const event of contract.usage_events) {\n    if (\n      event.schema !== USAGE_EVENT_SCHEMA ||\n      !event.event_id ||\n      !event.request_id ||\n      event.contract_id !== contract.contract_id ||\n      !event.model_id ||\n      !nonNegativeInteger(event.input_tokens) ||\n      !nonNegativeInteger(event.output_tokens) ||\n      (event.cached_input_tokens !== undefined && !nonNegativeInteger(event.cached_input_tokens)) ||\n      event.input_tokens + event.output_tokens + (event.cached_input_tokens ?? 0) <= 0 ||\n      !positiveInteger(event.sats_charged)\n    ) {\n      codes.push('invalid_usage_event');\n    }\n    if (seenRequestIds.has(event.request_id)) codes.push('duplicate_request_id');\n    seenRequestIds.add(event.request_id);\n    usageSum += event.sats_charged;\n  }\n\n  if (usageSum !== contract.escrow.spent_sats) codes.push('usage_sum_mismatch');\n  if (usageSum > contract.escrow.escrowed_sats) codes.push('spend_exceeds_escrow');\n\n  const expectedRefundable = Math.max(\n    0,\n    contract.escrow.escrowed_sats - contract.escrow.spent_sats - contract.escrow.disputed_sats\n  );\n  if (contract.escrow.refundable_sats !== expectedRefundable) codes.push('refund_math_mismatch');\n\n  if (contract.limits.expires_at && Number.isNaN(Date.parse(contract.limits.expires_at))) codes.push('invalid_expiry');\n\n  return {\n    valid: codes.length === 0,\n    codes: codes.length ? Array.from(new Set(codes)) : ['valid'],\n    expected_contract_id,\n    expected_terms_hash,\n    expected_body_hash,\n  };\n}\n"],"mappings":"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","names":["import_node_crypto","import_node_crypto","canonicalize","sha256","import_node_crypto","canonicalize","sha256","TERMINAL_STATUSES","termsSnapshot","score","import_node_crypto","canonicalize","sha256","import_node_crypto","TERMINAL_STATUSES","canonicalize","sha256","event"]}