{"version":3,"sources":["../src/schemas/jwk.ts","../src/schemas/common.ts","../src/schemas/constraints.ts","../src/schemas/checkout-mandate.ts","../src/schemas/payment-mandate.ts","../src/schemas/receipts.ts","../src/crypto.ts","../src/checkout-jwt.ts","../src/sd-jwt.ts","../src/budget-tracker.ts","../src/constraints.ts","../src/issuer.ts","../src/verifier.ts","../src/receipts.ts","../src/chain.ts"],"names":["z","Base64UrlString","joseBase64url","generateKeyPair","exportJWK","importJWK","SignJWT","jwtVerify","resolveKey"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\n// JSON Web Key (JWK) — RFC 7517. We support EC (ECDSA P-256 / P-384 / P-512)\n// + RSA + OKP shapes that AP2's `cnf.jwk` may carry. ES256 (P-256) is the\n// reference impl's default and the recommended algorithm.\n//\n// **Critical AP2 rule:** the inner `checkout_jwt` MUST use a non-deterministic\n// signature scheme (ECDSA family). Ed25519 (OKP curve `Ed25519`) is FORBIDDEN\n// for `checkout_jwt` because the protocol relies on signature entropy to\n// defeat rainbow-table preimage attacks against `checkout_hash`. Ed25519 keys\n// MAY appear in `cnf.jwk` for KB-JWT signing where rainbow attacks don't apply.\n\nconst Base64UrlString = z\n  .string()\n  .regex(/^[A-Za-z0-9_-]*$/, \"must be base64url\");\n\nexport const JwkEc = z.object({\n  kty: z.literal(\"EC\"),\n  crv: z.enum([\"P-256\", \"P-384\", \"P-521\"]),\n  x: Base64UrlString,\n  y: Base64UrlString,\n  d: Base64UrlString.optional(), // private key component\n  alg: z.string().optional(),\n  kid: z.string().optional(),\n  use: z.enum([\"sig\", \"enc\"]).optional(),\n  key_ops: z.array(z.string()).optional(),\n});\nexport type JwkEc = z.infer<typeof JwkEc>;\n\nexport const JwkOkp = z.object({\n  kty: z.literal(\"OKP\"),\n  crv: z.enum([\"Ed25519\", \"Ed448\"]),\n  x: Base64UrlString,\n  d: Base64UrlString.optional(),\n  alg: z.string().optional(),\n  kid: z.string().optional(),\n  use: z.enum([\"sig\", \"enc\"]).optional(),\n  key_ops: z.array(z.string()).optional(),\n});\nexport type JwkOkp = z.infer<typeof JwkOkp>;\n\nexport const JwkRsa = z.object({\n  kty: z.literal(\"RSA\"),\n  n: Base64UrlString,\n  e: Base64UrlString,\n  d: Base64UrlString.optional(),\n  p: Base64UrlString.optional(),\n  q: Base64UrlString.optional(),\n  dp: Base64UrlString.optional(),\n  dq: Base64UrlString.optional(),\n  qi: Base64UrlString.optional(),\n  alg: z.string().optional(),\n  kid: z.string().optional(),\n  use: z.enum([\"sig\", \"enc\"]).optional(),\n  key_ops: z.array(z.string()).optional(),\n});\nexport type JwkRsa = z.infer<typeof JwkRsa>;\n\nexport const Jwk = z.discriminatedUnion(\"kty\", [JwkEc, JwkOkp, JwkRsa]);\nexport type Jwk = z.infer<typeof Jwk>;\n\n// RFC 7800 — `cnf` (confirmation) claim. AP2 carries `cnf.jwk` to bind the\n// next signer in a chain (Proof-of-Possession key).\nexport const Cnf = z.object({\n  jwk: Jwk,\n});\nexport type Cnf = z.infer<typeof Cnf>;\n","import { z } from \"zod\";\n\n// AP2 common types — shared by both mandate families and the constraint\n// evaluators. These mirror `code/sdk/schemas/ap2/types/*.json` from the\n// google-agentic-commerce/AP2 reference SDK.\n\n// ---------------------------------------------------------------------------\n// Amount — payment_amount on Payment Mandates and budget constraints.\n// Per spec: integer minor units (e.g. 19900 USD = $199.00). Currency is ISO\n// 4217 alpha-3, conventionally uppercase per AP2 example payloads (the AP2\n// spec is silent on case, but examples use \"USD\"/\"ARS\"). We accept both for\n// inter-op and uppercase on serialization.\n// ---------------------------------------------------------------------------\n\nexport const CurrencyCode = z\n  .string()\n  .regex(/^[A-Za-z]{3}$/, \"currency must be ISO 4217 (e.g. 'USD', 'ARS')\");\nexport type CurrencyCode = z.infer<typeof CurrencyCode>;\n\nexport const Amount = z.object({\n  /** Integer minor units. Use `0` for free items. */\n  amount: z.number().int().nonnegative(),\n  currency: CurrencyCode,\n});\nexport type Amount = z.infer<typeof Amount>;\n\n// Currencies with 0 minor units per ISO 4217 — when computing `amount` from\n// a major-units value, multiply by 1 instead of 100.\nexport const ZERO_DECIMAL_CURRENCIES = new Set([\n  \"CLP\",\n  \"PYG\",\n  \"JPY\",\n  \"KRW\",\n  \"VND\",\n  \"UGX\",\n  \"RWF\",\n  \"ISK\",\n  \"HUF\",\n] as const);\n\nexport function divisorFor(currency: string): number {\n  return ZERO_DECIMAL_CURRENCIES.has(\n    currency.toUpperCase() as \"CLP\" | \"PYG\" | \"JPY\" | \"KRW\" | \"VND\" | \"UGX\" | \"RWF\" | \"ISK\" | \"HUF\",\n  )\n    ? 1\n    : 100;\n}\n\n// ---------------------------------------------------------------------------\n// Merchant — payee on Payment Mandates and `checkout.allowed_merchants`.\n// Open-vocabulary: the spec carries `id`, `name`, `website` only. LATAM hosts\n// can stuff CUIT/CPF/RFC into `id` as a URN (e.g. `cuit:20-12345678-6`).\n// ---------------------------------------------------------------------------\n\nexport const Merchant = z.object({\n  id: z.string().min(1),\n  name: z.string().optional(),\n  website: z.string().url().optional(),\n});\nexport type Merchant = z.infer<typeof Merchant>;\n\n// ---------------------------------------------------------------------------\n// PaymentInstrument — abstract payment method. `type` is open-vocabulary\n// per spec (`code/sdk/schemas/ap2/types/payment_instrument.json`).\n// Recommended values for LATAM:\n//   \"card\", \"pix\", \"spei\", \"transferencias_3\", \"mercadopago\", \"x402\",\n//   \"dpc\" (Digital Payment Credential), \"UPI\", \"bank_account\"\n// ---------------------------------------------------------------------------\n\nexport const PaymentInstrument = z.object({\n  id: z.string().min(1),\n  type: z.string().min(1),\n  description: z.string().optional(),\n  /** Free-form per-type metadata (e.g. last4, network, brand). */\n  metadata: z.record(z.string(), z.unknown()).optional(),\n});\nexport type PaymentInstrument = z.infer<typeof PaymentInstrument>;\n\n// ---------------------------------------------------------------------------\n// Pisp — Payment Initiation Service Provider. EU-PSD2 flavor in the spec\n// (`legal_name`, `brand_name`, `domain_name as secured by [eIDAS] QWAC`).\n// LATAM equivalents (BCB Iniciador de Pagamentos, BCRA PSPCP) reuse the same\n// shape with `domain_name` as their regulator-issued certificate domain.\n// ---------------------------------------------------------------------------\n\nexport const Pisp = z.object({\n  id: z.string().min(1),\n  legal_name: z.string().optional(),\n  brand_name: z.string().optional(),\n  domain_name: z.string().optional(),\n});\nexport type Pisp = z.infer<typeof Pisp>;\n\n// ---------------------------------------------------------------------------\n// Item — minimal product reference for constraint evaluation. Used by\n// `checkout.line_items` constraints inside Open Checkout Mandates. Mirrors\n// the `Item` shape ACP also uses, but this is the AP2-side definition so\n// AP2 can be used independently of ACP.\n// ---------------------------------------------------------------------------\n\nexport const Item = z.object({\n  id: z.string().min(1),\n  name: z.string().optional(),\n  unit_amount: z.number().int().nonnegative().optional(),\n});\nexport type Item = z.infer<typeof Item>;\n\n// ---------------------------------------------------------------------------\n// Frequency — `payment.agent_recurrence` constraint values.\n// ---------------------------------------------------------------------------\n\nexport const Frequency = z.enum([\n  \"ON_DEMAND\",\n  \"DAILY\",\n  \"WEEKLY\",\n  \"BIWEEKLY\",\n  \"MONTHLY\",\n  \"QUARTERLY\",\n  \"ANNUALLY\",\n]);\nexport type Frequency = z.infer<typeof Frequency>;\n","import { z } from \"zod\";\nimport { Amount, Frequency, Item, Merchant, PaymentInstrument, Pisp } from \"./common\";\n\n// AP2 constraint types — appear in `Open*Mandate.constraints[]`. Verifiers\n// MUST evaluate every constraint when validating a closed mandate against\n// a chain, and per spec **unknown constraint types MUST FAIL evaluation**.\n//\n// Closed mandates MUST satisfy every constraint of every open mandate in\n// the chain. The catalog below covers all 8 types declared in the v0.2\n// schemas (`code/sdk/schemas/ap2/constraints/*.json`).\n\n// ---- Checkout-side constraints --------------------------------------------\n\n/** `checkout.allowed_merchants` — Open Checkout Mandate may restrict which\n *  merchants the closed checkout can name as `payee`. The `allowed` list is\n *  selectively-disclosable (the verifier sees only the revealed entries). */\nexport const ConstraintAllowedMerchants = z.object({\n  type: z.literal(\"checkout.allowed_merchants\"),\n  allowed: z.array(Merchant),\n});\nexport type ConstraintAllowedMerchants = z.infer<\n  typeof ConstraintAllowedMerchants\n>;\n\n/** `checkout.line_items` — bounds the closed checkout's line items. Each\n *  constraint item names `acceptable_items` (selectively-disclosable) and\n *  a `quantity` cap. The closed checkout must satisfy a max-flow match. */\nexport const LineItemConstraintEntry = z.object({\n  /** Constraint-side line id (NOT a checkout line id). */\n  id: z.string().min(1),\n  acceptable_items: z.array(Item),\n  /** Cap; closed checkout's matching items can sum up to this. */\n  quantity: z.number().positive(),\n});\nexport type LineItemConstraintEntry = z.infer<typeof LineItemConstraintEntry>;\n\nexport const ConstraintLineItems = z.object({\n  type: z.literal(\"checkout.line_items\"),\n  items: z.array(LineItemConstraintEntry),\n});\nexport type ConstraintLineItems = z.infer<typeof ConstraintLineItems>;\n\n// ---- Payment-side constraints ---------------------------------------------\n\n/** `payment.amount_range` — caps the closed payment's `payment_amount`.\n *  `min` is optional. Currency must match. */\nexport const ConstraintAmountRange = z.object({\n  type: z.literal(\"payment.amount_range\"),\n  currency: z.string().regex(/^[A-Za-z]{3}$/),\n  /** Maximum amount in minor units. */\n  max: z.number().int().nonnegative(),\n  /** Minimum amount in minor units. Default 0. */\n  min: z.number().int().nonnegative().optional(),\n});\nexport type ConstraintAmountRange = z.infer<typeof ConstraintAmountRange>;\n\n/** `payment.allowed_payees` — restricts which merchants can be paid. */\nexport const ConstraintAllowedPayees = z.object({\n  type: z.literal(\"payment.allowed_payees\"),\n  allowed: z.array(Merchant),\n});\nexport type ConstraintAllowedPayees = z.infer<typeof ConstraintAllowedPayees>;\n\n/** `payment.allowed_payment_instruments` — restricts which instruments. */\nexport const ConstraintAllowedPaymentInstruments = z.object({\n  type: z.literal(\"payment.allowed_payment_instruments\"),\n  allowed: z.array(PaymentInstrument),\n});\nexport type ConstraintAllowedPaymentInstruments = z.infer<\n  typeof ConstraintAllowedPaymentInstruments\n>;\n\n/** `payment.allowed_pisps` — restricts which Payment Initiation Service\n *  Providers can route the payment (EU PSD2 / LATAM Open Finance). */\nexport const ConstraintAllowedPisps = z.object({\n  type: z.literal(\"payment.allowed_pisps\"),\n  allowed: z.array(Pisp),\n});\nexport type ConstraintAllowedPisps = z.infer<typeof ConstraintAllowedPisps>;\n\n/** `payment.budget` — paired with `payment.agent_recurrence`. The verifier\n *  is responsible for tracking past presentations and rejecting if the\n *  running sum + this charge would exceed `max`. (Stateful evaluator;\n *  Phase 2.2 ships a tracker.) */\nexport const ConstraintBudget = z.object({\n  type: z.literal(\"payment.budget\"),\n  /** Major-units (per spec example) — host must convert via `divisorFor`. */\n  max: z.number().nonnegative(),\n  currency: z.string().regex(/^[A-Za-z]{3}$/),\n});\nexport type ConstraintBudget = z.infer<typeof ConstraintBudget>;\n\n/** `payment.agent_recurrence` — paired with `payment.budget`. Caps total\n *  occurrences and frequency window. */\nexport const ConstraintAgentRecurrence = z.object({\n  type: z.literal(\"payment.agent_recurrence\"),\n  frequency: Frequency,\n  max_occurrences: z.number().int().positive(),\n});\nexport type ConstraintAgentRecurrence = z.infer<\n  typeof ConstraintAgentRecurrence\n>;\n\n/** `payment.execution_date` — caps when the payment can execute. */\nexport const ConstraintExecutionDate = z.object({\n  type: z.literal(\"payment.execution_date\"),\n  not_before: z.string().optional(),\n  not_after: z.string().optional(),\n});\nexport type ConstraintExecutionDate = z.infer<typeof ConstraintExecutionDate>;\n\n/** `payment.reference` — REQUIRED on every Open Payment Mandate. Carries\n *  the digest of the linked Open Checkout Mandate (binds the payment to a\n *  checkout family). */\nexport const ConstraintPaymentReference = z.object({\n  type: z.literal(\"payment.reference\"),\n  /** Digest of the matching Open Checkout Mandate. */\n  conditional_transaction_id: z.string().min(1),\n});\nexport type ConstraintPaymentReference = z.infer<\n  typeof ConstraintPaymentReference\n>;\n\n// ---- Discriminated union --------------------------------------------------\n\nexport const Constraint = z.discriminatedUnion(\"type\", [\n  ConstraintAllowedMerchants,\n  ConstraintLineItems,\n  ConstraintAmountRange,\n  ConstraintAllowedPayees,\n  ConstraintAllowedPaymentInstruments,\n  ConstraintAllowedPisps,\n  ConstraintBudget,\n  ConstraintAgentRecurrence,\n  ConstraintExecutionDate,\n  ConstraintPaymentReference,\n]);\nexport type Constraint = z.infer<typeof Constraint>;\n\n// AP2-known constraint types (closed set per v0.2). Used by the verifier to\n// distinguish \"unknown constraint\" failures from \"known constraint failed\n// evaluation\".\nexport const KNOWN_CONSTRAINT_TYPES: ReadonlyArray<Constraint[\"type\"]> = [\n  \"checkout.allowed_merchants\",\n  \"checkout.line_items\",\n  \"payment.amount_range\",\n  \"payment.allowed_payees\",\n  \"payment.allowed_payment_instruments\",\n  \"payment.allowed_pisps\",\n  \"payment.budget\",\n  \"payment.agent_recurrence\",\n  \"payment.execution_date\",\n  \"payment.reference\",\n];\n","import { z } from \"zod\";\nimport { Cnf } from \"./jwk\";\nimport { Constraint } from \"./constraints\";\n\n// AP2 v0.2 — Checkout Mandate (open + closed).\n//\n// Spec reference: `code/sdk/schemas/ap2/checkout_mandate.json`,\n// `code/sdk/schemas/ap2/open_checkout_mandate.json` from\n// google-agentic-commerce/AP2.\n//\n// **CRITICAL versioning note:** the v0.2 spec collapsed Sept-2025's\n// `IntentMandate` and `CartMandate` into a single Checkout Mandate\n// (open + closed variants). The pre-v0.2 3-mandate model is dead;\n// implementations MUST match `vct` exactly including the `.1` suffix.\n\n// ---- Open Checkout Mandate (intent-style) --------------------------------\n\nexport const OpenCheckoutMandate = z.object({\n  /** Versioned credential type per RFC 9901 SD-JWT VC. Exact match required. */\n  vct: z.literal(\"mandate.checkout.open.1\"),\n  /**\n   * Constraint set the closed checkout MUST satisfy. Per spec, includes at\n   * least `checkout.line_items` (REQUIRED) and optionally\n   * `checkout.allowed_merchants`.\n   */\n  constraints: z.array(Constraint).min(1),\n  /**\n   * RFC 7800 Proof-of-Possession key. The closed Checkout Mandate's KB-JWT\n   * MUST be signed by the private key matching this `cnf.jwk`.\n   */\n  cnf: Cnf,\n  /** Issued-at (Unix seconds). */\n  iat: z.number().int().nonnegative().optional(),\n  /** Expiration (Unix seconds). RECOMMENDED for autonomous flows. */\n  exp: z.number().int().nonnegative().optional(),\n});\nexport type OpenCheckoutMandate = z.infer<typeof OpenCheckoutMandate>;\n\n// ---- Closed Checkout Mandate ----------------------------------------------\n//\n// The merchant-signed JWT containing the actual cart/order state is\n// `checkout_jwt` (an inner JWT, base64url-encoded compact JWS). Its hash\n// (`base64url(sha-256(checkout_jwt))`) is `checkout_hash`. The Payment\n// Mandate's `transaction_id` MUST equal this `checkout_hash`.\n//\n// Per spec: `checkout_jwt` is signed with a NON-DETERMINISTIC scheme\n// (ECDSA family). Ed25519 is forbidden.\n\nconst Base64UrlString = z\n  .string()\n  .regex(/^[A-Za-z0-9_-]+$/, \"must be base64url\");\n\nexport const ClosedCheckoutMandate = z.object({\n  vct: z.literal(\"mandate.checkout.1\"),\n  /** Compact JWS (signed checkout payload). Selectively-disclosable. */\n  checkout_jwt: z.string().min(1),\n  /** base64url(sha-256(checkout_jwt)). Anti-mismatch + binds Payment Mandate. */\n  checkout_hash: Base64UrlString,\n  iat: z.number().int().nonnegative().optional(),\n  exp: z.number().int().nonnegative().optional(),\n});\nexport type ClosedCheckoutMandate = z.infer<typeof ClosedCheckoutMandate>;\n\n// ---- Inner Checkout JWT payload ------------------------------------------\n//\n// The decoded payload of `checkout_jwt`. Open-shape — the spec keeps this\n// merchant-defined. We carry the canonical fields the AP2 reference impl\n// uses (`code/sdk/python/ap2/sdk/jwt_helper.py` examples).\n\nexport const CheckoutJwtPayload = z.object({\n  /** Merchant's canonical order id. */\n  order_id: z.string().min(1),\n  /** Merchant identity. */\n  merchant: z.object({\n    id: z.string(),\n    name: z.string().optional(),\n    website: z.string().url().optional(),\n  }),\n  /** Cart items at the time of signing. */\n  line_items: z.array(\n    z.object({\n      id: z.string(),\n      product: z.object({\n        id: z.string(),\n        title: z.string(),\n        price: z.number().nonnegative(),\n        currency: z.string(),\n      }),\n      quantity: z.number().positive(),\n    }),\n  ),\n  /** Total cart price as MAJOR units (per AP2 ref impl examples). */\n  total_price: z.number().nonnegative(),\n  currency: z.string().regex(/^[A-Za-z]{3}$/),\n  shipping_policy: z.string().optional(),\n  return_policy: z.string().optional(),\n  /** Free-form merchant metadata. */\n  metadata: z.record(z.string(), z.unknown()).optional(),\n});\nexport type CheckoutJwtPayload = z.infer<typeof CheckoutJwtPayload>;\n","import { z } from \"zod\";\nimport { Cnf } from \"./jwk\";\nimport { Amount, Merchant, PaymentInstrument, Pisp } from \"./common\";\nimport { Constraint } from \"./constraints\";\n\n// AP2 v0.2 — Payment Mandate (open + closed).\n//\n// Spec reference: `code/sdk/schemas/ap2/payment_mandate.json`,\n// `code/sdk/schemas/ap2/open_payment_mandate.json`.\n\n// ---- Closed Payment Mandate ----------------------------------------------\n\nexport const ClosedPaymentMandate = z.object({\n  vct: z.literal(\"mandate.payment.1\"),\n  /**\n   * MUST equal `checkout_hash` of the linked Closed Checkout Mandate. This\n   * is AP2's anti-mismatch / anti-replay primitive — the verifier\n   * recomputes hash(checkout_jwt) and asserts equality.\n   */\n  transaction_id: z.string().min(1),\n  payee: Merchant,\n  /** Optional Payment Initiation Service Provider routing. */\n  pisp: Pisp.optional(),\n  payment_amount: Amount,\n  payment_instrument: PaymentInstrument,\n  /** ISO 8601. Absent = immediate execution. */\n  execution_date: z.string().optional(),\n  /** Free-form risk metadata supplied by the issuer. */\n  risk_data: z.record(z.string(), z.unknown()).optional(),\n  iat: z.number().int().nonnegative().optional(),\n  exp: z.number().int().nonnegative().optional(),\n});\nexport type ClosedPaymentMandate = z.infer<typeof ClosedPaymentMandate>;\n\n// ---- Open Payment Mandate ------------------------------------------------\n\nexport const OpenPaymentMandate = z.object({\n  vct: z.literal(\"mandate.payment.open.1\"),\n  /**\n   * REQUIRED set of constraints. Must contain `payment.reference` (binds\n   * to an Open Checkout Mandate via its sd_hash). May contain any subset\n   * of the other 7 payment-side constraint types.\n   */\n  constraints: z.array(Constraint).min(1),\n  cnf: Cnf,\n  iat: z.number().int().nonnegative().optional(),\n  exp: z.number().int().nonnegative().optional(),\n});\nexport type OpenPaymentMandate = z.infer<typeof OpenPaymentMandate>;\n","import { z } from \"zod\";\n\n// AP2 v0.2 — Checkout Receipt + Payment Receipt.\n//\n// Spec reference: `code/sdk/schemas/ap2/checkout_receipt.json`,\n// `code/sdk/schemas/ap2/payment_receipt.json`.\n//\n// Receipts are PLAIN JWTs (NOT SD-JWTs) signed by their issuer:\n//   - Checkout Receipt → signed by Merchant\n//   - Payment Receipt  → signed by Merchant Payment Processor\n//\n// Both have `reference` = `sd_hash` of the closed mandate they receipt.\n// On error, `status: \"Error\"` + canonical error code.\n\n// ---- Receipt status -------------------------------------------------------\n\nexport const ReceiptStatus = z.enum([\"Success\", \"Error\"]);\nexport type ReceiptStatus = z.infer<typeof ReceiptStatus>;\n\n// ---- Canonical error codes (per spec §G) ---------------------------------\n\nexport const ReceiptErrorCode = z.enum([\n  /** Mandate failed signature or schema verification. Terminal. */\n  \"invalid_credential\",\n  /** Unknown constraint type / verifier can't evaluate one of the constraints.\n   *  Non-terminal — caller falls back to non-agentic flow. */\n  \"unresolved_constraint\",\n  /** Mandate is well-formed but does not authorize the requested action. Terminal. */\n  \"invalid_mandate\",\n  /** Verifier doesn't speak AP2 at all. Non-terminal — fall back. */\n  \"mandates_not_supported\",\n]);\nexport type ReceiptErrorCode = z.infer<typeof ReceiptErrorCode>;\n\n// ---- Checkout Receipt -----------------------------------------------------\n\nexport const CheckoutReceipt = z.object({\n  status: ReceiptStatus,\n  /** Issuer ID — equals merchant identity. */\n  iss: z.string().min(1),\n  /** Issued-at, Unix seconds. */\n  iat: z.number().int().nonnegative(),\n  /** sd_hash of the closed Checkout Mandate. */\n  reference: z.string().min(1),\n  /** Success branch: merchant-canonical order id. */\n  order_id: z.string().optional(),\n  /** Error branch: canonical code. */\n  error: z.union([ReceiptErrorCode, z.string()]).optional(),\n  error_description: z.string().optional(),\n});\nexport type CheckoutReceipt = z.infer<typeof CheckoutReceipt>;\n\n// ---- Payment Receipt ------------------------------------------------------\n\nexport const PaymentReceipt = z.object({\n  status: ReceiptStatus,\n  /** Issuer ID — equals MPP / network identity. */\n  iss: z.string().min(1),\n  iat: z.number().int().nonnegative(),\n  reference: z.string().min(1),\n  /** Always required (per spec) — provider-side payment id. */\n  payment_id: z.string().min(1),\n  /** Success branch — PSP-side confirmation id. */\n  psp_confirmation_id: z.string().optional(),\n  /** Success branch — payment-network-side confirmation id. */\n  network_confirmation_id: z.string().optional(),\n  /** Error branch. */\n  error: z.union([ReceiptErrorCode, z.string()]).optional(),\n  error_description: z.string().optional(),\n});\nexport type PaymentReceipt = z.infer<typeof PaymentReceipt>;\n","// Crypto layer for AP2.\n//\n// AP2 v0.2 reference impl uses ES256 (ECDSA P-256 / SHA-256) for every\n// signing role. The inner `checkout_jwt` MUST use a non-deterministic scheme\n// (per spec — Ed25519 is forbidden because it'd leak no entropy salt for\n// rainbow-table defense against `checkout_hash`).\n//\n// We rely on `jose` for JWS serialization and on WebCrypto under the hood\n// (which `jose` also wraps). Edge-Runtime-compatible.\n\nimport {\n  SignJWT,\n  jwtVerify,\n  importJWK,\n  exportJWK,\n  generateKeyPair,\n  base64url as joseBase64url,\n  type CryptoKey as JoseCryptoKey,\n  type JWK as JoseJWK,\n  type JWTPayload,\n  type JWTHeaderParameters,\n  type JWTVerifyResult,\n} from \"jose\";\n\nimport type { Jwk } from \"./schemas/jwk\";\n\n// ---------------------------------------------------------------------------\n// Typed error for SD-JWT / JWS handling failures.\n//\n// Defined here (the lowest-level module) so `decodeJwsUnverified` can raise it\n// without a circular import; `sd-jwt.ts` re-exports it, keeping the public\n// surface unchanged.\n// ---------------------------------------------------------------------------\n\nexport class SdJwtError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"SdJwtError\";\n  }\n}\n\n// ---------------------------------------------------------------------------\n// base64url\n// ---------------------------------------------------------------------------\n\nexport function base64urlEncode(input: Uint8Array | string): string {\n  return joseBase64url.encode(\n    typeof input === \"string\" ? new TextEncoder().encode(input) : input,\n  );\n}\n\nexport function base64urlDecode(input: string): Uint8Array {\n  return joseBase64url.decode(input);\n}\n\nexport function base64urlDecodeToString(input: string): string {\n  return new TextDecoder().decode(joseBase64url.decode(input));\n}\n\n// ---------------------------------------------------------------------------\n// SHA-256 → base64url. Used for `sd_hash` and `checkout_hash`.\n// ---------------------------------------------------------------------------\n\nexport async function sha256(input: string | Uint8Array): Promise<Uint8Array> {\n  const subtle = getSubtleCrypto();\n  const data =\n    typeof input === \"string\" ? new TextEncoder().encode(input) : input;\n  const digest = await subtle.digest(\"SHA-256\", data as BufferSource);\n  return new Uint8Array(digest);\n}\n\nexport async function sha256Base64url(\n  input: string | Uint8Array,\n): Promise<string> {\n  return base64urlEncode(await sha256(input));\n}\n\n// ---------------------------------------------------------------------------\n// Key generation + JWK conversion\n// ---------------------------------------------------------------------------\n\n/** AP2 algorithm choices. ES256 is the canonical reference. */\nexport const AP2_ALGS = [\"ES256\", \"ES384\", \"ES512\", \"RS256\", \"EdDSA\"] as const;\nexport type Ap2Alg = (typeof AP2_ALGS)[number];\n\n/** ES256 / ES384 / ES512 are the canonical \"non-deterministic\" schemes\n *  AP2 mandates for the inner `checkout_jwt`. EdDSA is forbidden there. */\nexport const NON_DETERMINISTIC_ALGS = [\"ES256\", \"ES384\", \"ES512\"] as const;\n\nexport interface Ap2KeyPair {\n  /** The signing private key (jose CryptoKey reference). */\n  privateKey: JoseCryptoKey;\n  /** The verification public key. */\n  publicKey: JoseCryptoKey;\n  /** Public JWK (suitable for `cnf.jwk`, JWKS, etc.). */\n  publicJwk: Jwk;\n  /** The algorithm bound to this key. */\n  alg: Ap2Alg;\n}\n\n/**\n * Generate a fresh keypair for AP2 signing. Defaults to ES256 (the canonical\n * spec algorithm). Returns CryptoKey handles + a public JWK ready to use as\n * `cnf.jwk`.\n */\nexport async function generateAp2KeyPair(\n  alg: Ap2Alg = \"ES256\",\n): Promise<Ap2KeyPair> {\n  const { privateKey, publicKey } = await generateKeyPair(alg, {\n    extractable: true,\n  });\n  const publicJwk = (await exportJWK(publicKey)) as Jwk;\n  return { privateKey, publicKey, publicJwk, alg };\n}\n\n/** Resolve a `cnf.jwk` to a verification key. */\nexport async function importPublicJwk(\n  jwk: Jwk,\n  alg: string,\n): Promise<JoseCryptoKey> {\n  return (await importJWK(jwk as unknown as JoseJWK, alg)) as JoseCryptoKey;\n}\n\n/** Resolve a private JWK (with `d`) to a signing key. */\nexport async function importPrivateJwk(\n  jwk: Jwk & { d: string },\n  alg: string,\n): Promise<JoseCryptoKey> {\n  return (await importJWK(jwk as unknown as JoseJWK, alg)) as JoseCryptoKey;\n}\n\n// ---------------------------------------------------------------------------\n// JWS sign / verify (compact serialization)\n// ---------------------------------------------------------------------------\n\nexport interface SignOptions {\n  alg: string;\n  /** Header `typ`. AP2 uses several values: `JWT` (inner checkout_jwt),\n   *  `dc+sd-jwt` (DC-API SD-JWT VC), `example+sd-jwt` (issuer SD-JWT),\n   *  `kb+sd-jwt` (terminal KB-JWT), `kb+sd-jwt+kb` (intermediate). */\n  typ?: string;\n  /** Optional key id reference. */\n  kid?: string;\n  /** Optional cert chain for `x5c` validation. */\n  x5c?: string[];\n}\n\n/**\n * Sign an arbitrary JSON payload using ES256 (or another configured alg) as a\n * compact JWS. Used for the inner `checkout_jwt`, KB-JWTs, and receipts.\n *\n * **Spec-critical:** if `payload` is a checkout payload destined for the\n * inner `checkout_jwt`, `options.alg` MUST be in `NON_DETERMINISTIC_ALGS`.\n * Use `signCheckoutJwt()` (in `checkout-jwt.ts`) for that path — it enforces\n * the rule at construction time.\n */\nexport async function signCompactJws(\n  payload: JWTPayload,\n  signingKey: JoseCryptoKey,\n  options: SignOptions,\n): Promise<string> {\n  const protectedHeader: JWTHeaderParameters = {\n    alg: options.alg,\n    ...(options.typ !== undefined ? { typ: options.typ } : {}),\n    ...(options.kid !== undefined ? { kid: options.kid } : {}),\n    ...(options.x5c !== undefined ? { x5c: options.x5c } : {}),\n  };\n  return new SignJWT(payload).setProtectedHeader(protectedHeader).sign(signingKey);\n}\n\nexport interface VerifyOptions {\n  /** Acceptable algorithms. Default: AP2_ALGS. */\n  algorithms?: string[];\n  /** Expected audience. Validated against `aud` claim if set. */\n  audience?: string;\n  /** Expected issuer. Validated against `iss` claim if set. */\n  issuer?: string;\n  /** Clock skew in seconds for iat/exp validation. Default 30. */\n  clockTolerance?: number;\n  /** Override \"now\" for deterministic tests. Unix seconds. */\n  currentDate?: Date;\n}\n\n/**\n * Verify a compact JWS, returning the parsed payload + protected header.\n * Throws on signature failure / time-claim violation / aud-iss mismatch.\n */\nexport async function verifyCompactJws(\n  jws: string,\n  verificationKey: JoseCryptoKey,\n  options: VerifyOptions = {},\n): Promise<JWTVerifyResult> {\n  const verifyOpts: Parameters<typeof jwtVerify>[2] = {\n    algorithms: options.algorithms ?? [...AP2_ALGS],\n    clockTolerance: options.clockTolerance ?? 30,\n    ...(options.audience !== undefined ? { audience: options.audience } : {}),\n    ...(options.issuer !== undefined ? { issuer: options.issuer } : {}),\n    ...(options.currentDate !== undefined\n      ? { currentDate: options.currentDate }\n      : {}),\n  };\n  return jwtVerify(jws, verificationKey, verifyOpts);\n}\n\n// ---------------------------------------------------------------------------\n// JWS parsing without verification — used by the SD-JWT layer to read the\n// header before resolving keys.\n// ---------------------------------------------------------------------------\n\nexport interface DecodedJws {\n  protectedHeader: JWTHeaderParameters;\n  payload: JWTPayload;\n  signature: string;\n}\n\nexport function decodeJwsUnverified(jws: string): DecodedJws {\n  const parts = jws.split(\".\");\n  if (parts.length !== 3) {\n    throw new Error(\n      `Compact JWS must have 3 parts (header.payload.signature), got ${parts.length}`,\n    );\n  }\n  const [headerB64, payloadB64, signature] = parts as [string, string, string];\n  // The header and payload are attacker-controlled input: a malformed\n  // base64url segment or non-JSON content must surface as the package's typed\n  // error, not a raw SyntaxError.\n  let protectedHeader: JWTHeaderParameters;\n  try {\n    protectedHeader = JSON.parse(\n      base64urlDecodeToString(headerB64),\n    ) as JWTHeaderParameters;\n  } catch {\n    throw new SdJwtError(\"malformed JWS: protected header is not valid base64url-encoded JSON\");\n  }\n  let payload: JWTPayload;\n  try {\n    payload = JSON.parse(base64urlDecodeToString(payloadB64)) as JWTPayload;\n  } catch {\n    throw new SdJwtError(\"malformed JWS: payload is not valid base64url-encoded JSON\");\n  }\n  return { protectedHeader, payload, signature };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction getSubtleCrypto(): SubtleCrypto {\n  const c = (globalThis as { crypto?: Crypto }).crypto;\n  if (!c?.subtle) {\n    throw new Error(\n      \"WebCrypto API is required (globalThis.crypto.subtle). \" +\n        \"Available in Node 20+, browsers, Vercel Edge, Cloudflare Workers, Deno, Bun.\",\n    );\n  }\n  return c.subtle;\n}\n\n// Re-export jose types consumers may need.\nexport type {\n  JWTPayload,\n  JWTHeaderParameters,\n  JWTVerifyResult,\n} from \"jose\";\nexport type { CryptoKey as JoseCryptoKey } from \"jose\";\n","// The inner Checkout JWT.\n//\n// AP2 v0.2 critical rule (spec §A.1, security_and_privacy_considerations.md):\n//\n//   The merchant Checkout JWT (the inner JWT whose hash is `checkout_hash`)\n//   MUST use a non-deterministic digital-signature scheme such as ECDSA.\n//   Deterministic schemes like Ed25519 are FORBIDDEN — the protocol relies\n//   on signature entropy to defeat rainbow-table preimage attacks against\n//   `checkout_hash`.\n//\n// This module enforces that rule at construction time + provides the\n// canonical hashing helper that produces `checkout_hash`.\n\nimport {\n  signCompactJws,\n  verifyCompactJws,\n  sha256Base64url,\n  decodeJwsUnverified,\n  type JoseCryptoKey,\n  type VerifyOptions,\n} from \"./crypto\";\nimport { CheckoutJwtPayload } from \"./schemas/checkout-mandate\";\n\nconst FORBIDDEN_INNER_CHECKOUT_ALGS = new Set([\n  \"EdDSA\",\n  \"Ed25519\",\n  \"Ed448\",\n  \"none\",\n]);\n\nconst DEFAULT_INNER_ALG = \"ES256\";\n\nexport class CheckoutJwtAlgError extends Error {\n  constructor(alg: string) {\n    super(\n      `checkout_jwt MUST use a non-deterministic algorithm (e.g. ES256). ` +\n        `Got '${alg}'. AP2 v0.2 forbids deterministic schemes for this layer ` +\n        `because they leak no entropy to defeat rainbow-table attacks against ` +\n        `checkout_hash.`,\n    );\n    this.name = \"CheckoutJwtAlgError\";\n  }\n}\n\nexport interface SignCheckoutJwtOptions {\n  /** Algorithm. Default `ES256`. MUST be non-deterministic ECDSA. */\n  alg?: \"ES256\" | \"ES384\" | \"ES512\" | \"RS256\";\n  /** Optional kid. */\n  kid?: string;\n  /** Optional issuance time (Unix seconds). Default `Math.floor(Date.now()/1000)`. */\n  iat?: number;\n  /** Optional expiration (Unix seconds). */\n  exp?: number;\n}\n\n/**\n * Sign a checkout payload as the inner `checkout_jwt`. Returns the compact\n * JWS string (suitable for stuffing into `ClosedCheckoutMandate.checkout_jwt`).\n *\n * Pairs with `computeCheckoutHash` — the closed mandate must carry both.\n */\nexport async function signCheckoutJwt(\n  payload: unknown,\n  signingKey: JoseCryptoKey,\n  options: SignCheckoutJwtOptions = {},\n): Promise<string> {\n  const alg = options.alg ?? DEFAULT_INNER_ALG;\n  if (FORBIDDEN_INNER_CHECKOUT_ALGS.has(alg)) {\n    throw new CheckoutJwtAlgError(alg);\n  }\n  const parsed = CheckoutJwtPayload.parse(payload);\n  const claims: Record<string, unknown> = { ...parsed };\n  const iat = options.iat ?? Math.floor(Date.now() / 1000);\n  claims[\"iat\"] = iat;\n  if (options.exp !== undefined) claims[\"exp\"] = options.exp;\n  return signCompactJws(claims, signingKey, {\n    alg,\n    typ: \"JWT\",\n    ...(options.kid !== undefined ? { kid: options.kid } : {}),\n  });\n}\n\n/**\n * Compute `checkout_hash` per spec: `base64url(sha-256(checkout_jwt))`.\n *\n * The closed Checkout Mandate's `checkout_hash` MUST equal this value, AND\n * the closed Payment Mandate's `transaction_id` MUST equal this value.\n */\nexport async function computeCheckoutHash(\n  checkoutJwt: string,\n): Promise<string> {\n  return sha256Base64url(checkoutJwt);\n}\n\n/**\n * Verify the inner `checkout_jwt` signature. Use this when receiving a\n * Closed Checkout Mandate — after extracting `checkout_jwt`, hash it to\n * confirm `checkout_hash` matches, then call this to verify the merchant\n * actually signed the cart payload.\n */\nexport async function verifyCheckoutJwt(\n  checkoutJwt: string,\n  verificationKey: JoseCryptoKey,\n  options: VerifyOptions = {},\n): Promise<{ payload: unknown; alg: string }> {\n  const result = await verifyCompactJws(checkoutJwt, verificationKey, {\n    ...options,\n    // Restrict to non-deterministic algs.\n    algorithms: options.algorithms ?? [\"ES256\", \"ES384\", \"ES512\", \"RS256\"],\n  });\n  const alg = result.protectedHeader.alg;\n  if (typeof alg !== \"string\" || FORBIDDEN_INNER_CHECKOUT_ALGS.has(alg)) {\n    throw new CheckoutJwtAlgError(String(alg));\n  }\n  return { payload: result.payload as unknown, alg };\n}\n\n/**\n * Decode the inner Checkout JWT WITHOUT signature verification. Useful when\n * the merchant is serving a hosted JWKS and a separate verifier needs to\n * resolve the header `kid` before verification.\n */\nexport function decodeCheckoutJwt(checkoutJwt: string): {\n  header: ReturnType<typeof decodeJwsUnverified>[\"protectedHeader\"];\n  payload: unknown;\n} {\n  const { protectedHeader, payload } = decodeJwsUnverified(checkoutJwt);\n  return { header: protectedHeader, payload };\n}\n","// SD-JWT VC primitives for AP2 v0.2.\n//\n// Implements RFC 9901 (Selective Disclosure for JWTs) at the level needed\n// for AP2's mandate transport. Single-hop only in this Phase 2.1 release —\n// multi-hop chains (`~~`-separated, dSD-JWT delegation) ship in Phase 2.2.\n//\n// Wire format (single-hop):\n//\n//     <issuer-SD-JWT>~<disclosure_1>~<disclosure_2>~...~<disclosure_n>~<KB-SD-JWT>\n//\n// where:\n//   - issuer-SD-JWT: a compact JWS whose payload contains `_sd` (array of\n//     base64url-encoded disclosure digests) plus `_sd_alg` (digest hash\n//     algorithm).\n//   - disclosures: each is base64url(JSON([salt, claim_name?, claim_value])).\n//     For object-property disclosure: 3-tuple [salt, name, value].\n//     For array-element disclosure: 2-tuple [salt, value].\n//   - KB-SD-JWT: a Key Binding JWT signed by the holder's `cnf.jwk`,\n//     containing `aud`, `nonce`, `iat`, `sd_hash` of the preceding tilde-\n//     separated chunk.\n//\n// The AP2 reference impl uses `_sd_alg: \"sha-256\"`. We support sha-256 by\n// default; sha-384 / sha-512 are accepted on parse.\n\nimport {\n  SdJwtError,\n  base64urlDecode,\n  base64urlDecodeToString,\n  base64urlEncode,\n  decodeJwsUnverified,\n  signCompactJws,\n  verifyCompactJws,\n  sha256Base64url,\n  type JoseCryptoKey,\n  type JWTHeaderParameters,\n  type JWTPayload,\n  type SignOptions,\n  type VerifyOptions,\n} from \"./crypto\";\n\n// ---------------------------------------------------------------------------\n// Disclosure encoding / decoding (RFC 9901 §4)\n// ---------------------------------------------------------------------------\n\nexport interface ObjectDisclosure {\n  /** base64url-encoded random salt (>= 16 bytes recommended). */\n  salt: string;\n  /** Property name being disclosed. */\n  name: string;\n  value: unknown;\n}\n\nexport interface ArrayDisclosure {\n  salt: string;\n  value: unknown;\n}\n\nexport type Disclosure = ObjectDisclosure | ArrayDisclosure;\n\n/**\n * Encode a disclosure to its compact base64url(JSON([...])) form.\n *  - Object-property: `[salt, name, value]`\n *  - Array-element: `[salt, value]`\n */\nexport function encodeDisclosure(disclosure: Disclosure): string {\n  if (\"name\" in disclosure) {\n    return base64urlEncode(\n      JSON.stringify([disclosure.salt, disclosure.name, disclosure.value]),\n    );\n  }\n  return base64urlEncode(\n    JSON.stringify([disclosure.salt, disclosure.value]),\n  );\n}\n\n/** Decode a disclosure string back into its tuple form. */\nexport function decodeDisclosure(encoded: string): Disclosure {\n  const json = base64urlDecodeToString(encoded);\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(json);\n  } catch (err) {\n    throw new SdJwtError(\n      `Failed to JSON-parse disclosure: ${(err as Error).message}`,\n    );\n  }\n  if (!Array.isArray(parsed)) {\n    throw new SdJwtError(\"Disclosure must be a JSON array\");\n  }\n  if (parsed.length === 3) {\n    const [salt, name, value] = parsed as [unknown, unknown, unknown];\n    if (typeof salt !== \"string\" || typeof name !== \"string\") {\n      throw new SdJwtError(\n        \"Object disclosure must be [salt:string, name:string, value]\",\n      );\n    }\n    return { salt, name, value };\n  }\n  if (parsed.length === 2) {\n    const [salt, value] = parsed as [unknown, unknown];\n    if (typeof salt !== \"string\") {\n      throw new SdJwtError(\"Array disclosure salt must be a string\");\n    }\n    return { salt, value };\n  }\n  throw new SdJwtError(\n    `Disclosure tuple must have 2 (array element) or 3 (object property) entries, got ${parsed.length}`,\n  );\n}\n\n/**\n * Generate a fresh salt — base64url-encoded 16 random bytes (RFC 9901 §11.3\n * recommendation).\n */\nexport function generateSalt(): string {\n  const c = (globalThis as { crypto?: Crypto }).crypto;\n  if (!c?.getRandomValues) {\n    throw new SdJwtError(\n      \"Random source required (globalThis.crypto.getRandomValues).\",\n    );\n  }\n  const bytes = new Uint8Array(16);\n  c.getRandomValues(bytes);\n  return base64urlEncode(bytes);\n}\n\n/**\n * Compute the digest of a disclosure — `base64url(sha-256(encoded))` per\n * RFC 9901 §4.1.1. The digest array `_sd` in the SD-JWT issuer payload\n * holds these.\n */\nexport async function digestOfDisclosure(\n  encoded: string,\n  alg: string = \"sha-256\",\n): Promise<string> {\n  if (alg !== \"sha-256\" && alg !== \"SHA-256\") {\n    throw new SdJwtError(\n      `Only sha-256 _sd_alg supported in Phase 2.1 (got '${alg}'). ` +\n        `Multi-alg support ships in Phase 2.2.`,\n    );\n  }\n  return sha256Base64url(encoded);\n}\n\n// ---------------------------------------------------------------------------\n// SD-JWT compact serialization parsing\n// ---------------------------------------------------------------------------\n\nexport interface ParsedSdJwt {\n  /** The issuer-side compact JWS (header.payload.signature). */\n  issuerJwt: string;\n  /** Encoded disclosure strings (in the order they appeared on the wire). */\n  disclosures: string[];\n  /** Optional terminal KB-JWT (compact JWS) signed by holder's cnf.jwk. */\n  kbJwt: string | undefined;\n}\n\n/**\n * Parse a single-hop SD-JWT compact serialization. Per RFC 9901 §3, the\n * format is `<jws>~<disclosure>~...~<disclosure>~[<kb-jwt>]` where the\n * trailing `~` is REQUIRED and the kb-jwt is OPTIONAL.\n */\nexport function parseSdJwt(input: string): ParsedSdJwt {\n  if (!input.includes(\"~\")) {\n    throw new SdJwtError(\n      \"SD-JWT compact serialization must contain at least one '~'\",\n    );\n  }\n  const segments = input.split(\"~\");\n  // segments[0] = issuer JWS\n  // segments[1..n-1] = disclosures (or KB-JWT in last position)\n  // segments[n] = \"\" (trailing ~) OR KB-JWT\n  if (segments.length < 2) {\n    throw new SdJwtError(\"SD-JWT must have an issuer JWS + at least '~'\");\n  }\n  const issuerJwt = segments[0];\n  if (!issuerJwt) {\n    throw new SdJwtError(\"SD-JWT issuer JWS is empty\");\n  }\n  // Last segment is either \"\" (trailing tilde, no KB-JWT) or the KB-JWT.\n  // KB-JWTs have 2 dots (header.payload.signature); disclosures don't.\n  const last = segments[segments.length - 1] ?? \"\";\n  let kbJwt: string | undefined;\n  let disclosureSlice: string[];\n  if (last !== \"\" && last.includes(\".\")) {\n    kbJwt = last;\n    disclosureSlice = segments.slice(1, -1);\n  } else {\n    disclosureSlice = segments.slice(1, -1);\n  }\n  const disclosures = disclosureSlice.filter((s) => s.length > 0);\n  return { issuerJwt, disclosures, kbJwt };\n}\n\n/**\n * Serialize an SD-JWT to its compact tilde-separated form.\n * Trailing tilde is included per RFC 9901.\n */\nexport function serializeSdJwt(parts: ParsedSdJwt): string {\n  const segments = [parts.issuerJwt, ...parts.disclosures];\n  if (parts.kbJwt !== undefined) {\n    segments.push(parts.kbJwt);\n  } else {\n    segments.push(\"\"); // trailing ~\n  }\n  return segments.join(\"~\");\n}\n\n// ---------------------------------------------------------------------------\n// `sd_hash` — used by the KB-JWT to bind to its parent SD-JWT.\n// `sd_hash = base64url(sha-256(issuerJwt + \"~\" + disclosure_1 + ... + \"~\"))`\n// per RFC 9901 §4.4.\n// ---------------------------------------------------------------------------\n\nexport async function computeSdHash(\n  parts: { issuerJwt: string; disclosures: string[] },\n  alg: string = \"sha-256\",\n): Promise<string> {\n  if (alg !== \"sha-256\" && alg !== \"SHA-256\") {\n    throw new SdJwtError(\n      `Only sha-256 supported for sd_hash in Phase 2.1 (got '${alg}').`,\n    );\n  }\n  // Reconstruct the SD-JWT presentation up to (and including) the trailing\n  // tilde before the KB-JWT.\n  const presentation = [parts.issuerJwt, ...parts.disclosures, \"\"].join(\"~\");\n  return sha256Base64url(presentation);\n}\n\n// ---------------------------------------------------------------------------\n// Disclosure resolution — given an issuer payload with `_sd` digests + a\n// list of disclosed values, materialize the unredacted payload for the\n// verifier.\n// ---------------------------------------------------------------------------\n\nexport interface ResolveOptions {\n  /** Required `_sd_alg` claim from issuer payload. Default sha-256. */\n  sdAlg?: string;\n}\n\n/**\n * Walk the issuer payload, replacing `_sd` digest arrays with their\n * disclosed values. Throws if a disclosure doesn't match any digest in the\n * payload (per RFC 9901 §6.1 — unmatched disclosures are an error).\n */\nexport async function resolveDisclosures(\n  issuerPayload: Record<string, unknown>,\n  encodedDisclosures: string[],\n  options: ResolveOptions = {},\n): Promise<Record<string, unknown>> {\n  const sdAlg =\n    (issuerPayload[\"_sd_alg\"] as string | undefined) ??\n    options.sdAlg ??\n    \"sha-256\";\n\n  // Build a digest → disclosure map.\n  const digestMap = new Map<string, Disclosure>();\n  for (const enc of encodedDisclosures) {\n    const digest = await digestOfDisclosure(enc, sdAlg);\n    digestMap.set(digest, decodeDisclosure(enc));\n  }\n\n  // Recursively walk the payload, substituting `_sd` digest arrays.\n  return walk(issuerPayload, digestMap) as Record<string, unknown>;\n}\n\nfunction walk(\n  node: unknown,\n  digestMap: Map<string, Disclosure>,\n): unknown {\n  if (Array.isArray(node)) {\n    const out: unknown[] = [];\n    for (const el of node) {\n      // Array elements may be `{ \"...\": <digest> }` placeholders.\n      if (\n        el &&\n        typeof el === \"object\" &&\n        !Array.isArray(el) &&\n        \"...\" in (el as object)\n      ) {\n        const digest = (el as { \"...\": unknown })[\"...\"];\n        if (typeof digest !== \"string\") continue;\n        const d = digestMap.get(digest);\n        if (!d) continue; // undisclosed — skip\n        out.push(walk((\"value\" in d ? d.value : undefined), digestMap));\n      } else {\n        out.push(walk(el, digestMap));\n      }\n    }\n    return out;\n  }\n  if (node && typeof node === \"object\") {\n    const obj = node as Record<string, unknown>;\n    const result: Record<string, unknown> = {};\n    for (const [k, v] of Object.entries(obj)) {\n      if (k === \"_sd\" || k === \"_sd_alg\") continue; // strip from output\n      result[k] = walk(v, digestMap);\n    }\n    // Promote any `_sd` digests that match disclosed object properties.\n    if (Array.isArray(obj[\"_sd\"])) {\n      for (const digest of obj[\"_sd\"] as unknown[]) {\n        if (typeof digest !== \"string\") continue;\n        const d = digestMap.get(digest);\n        if (!d) continue; // undisclosed — skip\n        if (\"name\" in d) {\n          result[d.name] = walk(d.value, digestMap);\n        }\n      }\n    }\n    return result;\n  }\n  return node;\n}\n\n// ---------------------------------------------------------------------------\n// Issuer-side helpers — build an SD-JWT given a payload + which fields to\n// selectively disclose.\n// ---------------------------------------------------------------------------\n\nexport interface IssueSdJwtOptions {\n  /** Fields to make selectively-disclosable (object-property level). */\n  disclosablePaths: string[];\n  /** The plaintext payload (full data). */\n  payload: Record<string, unknown>;\n  /** The `vct` claim (e.g. `mandate.checkout.open.1`). */\n  vct: string;\n  /** Optional iat/exp + custom claims. */\n  iat?: number;\n  exp?: number;\n  extraClaims?: Record<string, unknown>;\n  /** `_sd_alg`. Default sha-256. */\n  sdAlg?: string;\n}\n\n/**\n * Build the issuer payload for an SD-JWT VC by replacing each\n * `disclosablePaths` top-level key with a digest in `_sd`. Returns both the\n * payload to sign and the encoded disclosures the issuer must include\n * alongside.\n *\n * **Phase 2.1 limitation:** only top-level object-property disclosure is\n * supported. Nested-path / array-element disclosure ships in Phase 2.2.\n */\nexport async function buildIssuerPayload(\n  options: IssueSdJwtOptions,\n): Promise<{\n  issuerPayload: Record<string, unknown>;\n  encodedDisclosures: string[];\n}> {\n  const sdAlg = options.sdAlg ?? \"sha-256\";\n  const disclosures: string[] = [];\n  const sdDigests: string[] = [];\n  const remaining: Record<string, unknown> = { ...options.payload };\n\n  for (const path of options.disclosablePaths) {\n    if (!(path in remaining)) continue;\n    const salt = generateSalt();\n    const disclosure: ObjectDisclosure = {\n      salt,\n      name: path,\n      value: remaining[path],\n    };\n    const encoded = encodeDisclosure(disclosure);\n    const digest = await digestOfDisclosure(encoded, sdAlg);\n    disclosures.push(encoded);\n    sdDigests.push(digest);\n    delete remaining[path];\n  }\n\n  const issuerPayload: Record<string, unknown> = {\n    vct: options.vct,\n    ...remaining,\n    ...(sdDigests.length > 0 ? { _sd: sdDigests, _sd_alg: sdAlg } : {}),\n    ...(options.iat !== undefined ? { iat: options.iat } : {}),\n    ...(options.exp !== undefined ? { exp: options.exp } : {}),\n    ...(options.extraClaims ?? {}),\n  };\n  return { issuerPayload, encodedDisclosures: disclosures };\n}\n\n// ---------------------------------------------------------------------------\n// KB-JWT (Key Binding JWT, RFC 9901 §4.4)\n// ---------------------------------------------------------------------------\n\nexport interface BuildKbJwtOptions {\n  audience: string;\n  nonce: string;\n  iat?: number;\n  /** sd_hash of the SD-JWT presentation this KB-JWT binds to. */\n  sdHash: string;\n  /** Header `typ`. Per AP2: `kb+sd-jwt` (terminal) or `kb+sd-jwt+kb` (intermediate). */\n  typ?: \"kb+sd-jwt\" | \"kb+sd-jwt+kb\";\n  /** Algorithm for the KB-JWT signature. */\n  alg: string;\n  /** Optional kid. */\n  kid?: string;\n  /** Optional `cnf.jwk` for next-hop binding (intermediate hops only). */\n  cnfJwk?: object;\n}\n\nexport async function buildKbJwt(\n  signingKey: JoseCryptoKey,\n  options: BuildKbJwtOptions,\n): Promise<string> {\n  const claims: Record<string, unknown> = {\n    aud: options.audience,\n    nonce: options.nonce,\n    iat: options.iat ?? Math.floor(Date.now() / 1000),\n    sd_hash: options.sdHash,\n  };\n  if (options.cnfJwk !== undefined) {\n    claims[\"cnf\"] = { jwk: options.cnfJwk };\n  }\n  const sigOptions: SignOptions = {\n    alg: options.alg,\n    typ: options.typ ?? \"kb+sd-jwt\",\n    ...(options.kid !== undefined ? { kid: options.kid } : {}),\n  };\n  return signCompactJws(claims, signingKey, sigOptions);\n}\n\n// ---------------------------------------------------------------------------\n// Verification helpers\n// ---------------------------------------------------------------------------\n\nexport interface IssuerVerification {\n  protectedHeader: JWTHeaderParameters;\n  payload: JWTPayload;\n}\n\nexport async function verifyIssuerJwt(\n  issuerJwt: string,\n  verificationKey: JoseCryptoKey,\n  options: VerifyOptions = {},\n): Promise<IssuerVerification> {\n  const result = await verifyCompactJws(issuerJwt, verificationKey, options);\n  return { protectedHeader: result.protectedHeader, payload: result.payload };\n}\n\nexport interface KbJwtVerification {\n  protectedHeader: JWTHeaderParameters;\n  payload: { aud: string; nonce: string; iat: number; sd_hash: string };\n}\n\n/**\n * Verify a KB-JWT and check `aud`, `nonce`, and `sd_hash` match the\n * expected values.\n */\nexport async function verifyKbJwt(\n  kbJwt: string,\n  verificationKey: JoseCryptoKey,\n  expected: { audience: string; nonce: string; sdHash: string },\n  options: VerifyOptions = {},\n): Promise<KbJwtVerification> {\n  const result = await verifyCompactJws(kbJwt, verificationKey, {\n    ...options,\n    audience: expected.audience,\n  });\n  const payload = result.payload as Record<string, unknown>;\n  if (payload[\"nonce\"] !== expected.nonce) {\n    throw new SdJwtError(\"KB-JWT nonce mismatch\");\n  }\n  if (payload[\"sd_hash\"] !== expected.sdHash) {\n    throw new SdJwtError(\"KB-JWT sd_hash mismatch\");\n  }\n  if (typeof payload[\"iat\"] !== \"number\") {\n    throw new SdJwtError(\"KB-JWT iat is required\");\n  }\n  return {\n    protectedHeader: result.protectedHeader,\n    payload: {\n      aud: expected.audience,\n      nonce: expected.nonce,\n      iat: payload[\"iat\"],\n      sd_hash: expected.sdHash,\n    },\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\n// SdJwtError now lives in ./crypto (so decodeJwsUnverified can throw it\n// without a circular import); re-exported here to keep the public surface.\nexport { SdJwtError } from \"./crypto\";\n\n// Internal: silence unused-import warnings from the type-only helpers above.\nexport type { Disclosure as DisclosureType };\nexport { decodeJwsUnverified } from \"./crypto\";\n// Sanity: verify base64url helpers are reachable.\nexport { base64urlDecode, base64urlEncode } from \"./crypto\";\n","// Stateful evaluator support for `payment.budget` + `payment.agent_recurrence`.\n//\n// AP2 v0.2 §C requires the verifier to track running spend + occurrence\n// counts against an Open Payment Mandate. Phase 2.1 stubbed this with a\n// pass-through; Phase 2.2 ships a real in-memory implementation suitable\n// for single-process deployments. Distributed deployments should provide\n// their own `BudgetTracker` backed by Redis / Postgres / a queue.\n//\n// Tracker key: a stable digest of the Open Payment Mandate (the verifier's\n// `linkedOpenPaymentMandateDigest`). Each authorized presentation of a\n// closed payment mandate against that open mandate is recorded.\n\nimport type { Frequency } from \"./schemas/common\";\n\nexport interface BudgetTracker {\n  inspect(openMandateDigest: string): Promise<TrackerSnapshot>;\n  /**\n   * Record a successful presentation. Called by the verifier AFTER all\n   * non-stateful checks pass and the closed mandate is about to be\n   * authorized for execution. Implementations MUST be atomic.\n   */\n  recordPresentation(args: RecordPresentationArgs): Promise<void>;\n  /** Optional: clear all state for a digest (e.g. when the open mandate expires). */\n  clear?(openMandateDigest: string): Promise<void>;\n}\n\nexport interface TrackerSnapshot {\n  totalSpentMinor: number;\n  occurrences: number;\n  /** Last execution as Unix seconds. */\n  lastExecutedAt?: number;\n}\n\nexport interface RecordPresentationArgs {\n  openMandateDigest: string;\n  amountMinor: number;\n  /** ISO 4217 (uppercase). */\n  currency: string;\n  /** Optional execution time. Default Unix-now-seconds. */\n  executedAt?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Recurrence helpers — used by the constraint evaluator (Phase 2.2 hook).\n// ---------------------------------------------------------------------------\n\nconst SECONDS = {\n  DAILY: 24 * 3600,\n  WEEKLY: 7 * 24 * 3600,\n  BIWEEKLY: 14 * 24 * 3600,\n  MONTHLY: 30 * 24 * 3600, // approximation; AP2 spec doesn't pin exact weeks\n  QUARTERLY: 91 * 24 * 3600,\n  ANNUALLY: 365 * 24 * 3600,\n  ON_DEMAND: 0,\n} as const;\n\n/**\n * Returns true if the recurrence interval has elapsed since `lastExecutedAt`.\n * `ON_DEMAND` always passes.\n */\nexport function isWithinRecurrenceWindow(\n  frequency: Frequency,\n  lastExecutedAt: number | undefined,\n  nowSeconds: number,\n): boolean {\n  if (frequency === \"ON_DEMAND\") return true;\n  if (lastExecutedAt === undefined) return true;\n  const minIntervalSeconds = SECONDS[frequency];\n  return nowSeconds - lastExecutedAt >= minIntervalSeconds;\n}\n\n// ---------------------------------------------------------------------------\n// In-memory implementation\n// ---------------------------------------------------------------------------\n\n/**\n * In-memory BudgetTracker. Suitable for single-process tests, dev demos,\n * and small deployments. NOT durable — state is lost on process restart.\n *\n * Production implementations should back this with Redis / Postgres / a\n * queue. The interface is stable so swapping is a one-line change.\n */\nexport class InMemoryBudgetTracker implements BudgetTracker {\n  private state = new Map<string, TrackerSnapshot>();\n\n  async inspect(openMandateDigest: string): Promise<TrackerSnapshot> {\n    return this.state.get(openMandateDigest) ?? {\n      totalSpentMinor: 0,\n      occurrences: 0,\n    };\n  }\n\n  async recordPresentation(args: RecordPresentationArgs): Promise<void> {\n    const prev = this.state.get(args.openMandateDigest) ?? {\n      totalSpentMinor: 0,\n      occurrences: 0,\n    };\n    const next: TrackerSnapshot = {\n      totalSpentMinor: prev.totalSpentMinor + args.amountMinor,\n      occurrences: prev.occurrences + 1,\n      lastExecutedAt: args.executedAt ?? Math.floor(Date.now() / 1000),\n    };\n    this.state.set(args.openMandateDigest, next);\n  }\n\n  async clear(openMandateDigest: string): Promise<void> {\n    this.state.delete(openMandateDigest);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Stateful constraint evaluator — used by the verifier when an Open Payment\n// Mandate carries `payment.budget` + `payment.agent_recurrence`.\n// ---------------------------------------------------------------------------\n\nexport interface BudgetEvaluationInput {\n  tracker: BudgetTracker;\n  openMandateDigest: string;\n  /** Closed payment mandate's amount, in minor units. */\n  amountMinor: number;\n  /** Closed payment mandate's currency, uppercase ISO 4217. */\n  currency: string;\n  /** From the open mandate's `payment.budget` constraint. Major units. */\n  budget: { max: number; currency: string };\n  /** From the open mandate's `payment.agent_recurrence` constraint. */\n  recurrence?: { frequency: Frequency; max_occurrences: number };\n  /** Major-unit divisor for `currency`. Caller computes via `divisorFor`. */\n  divisor: number;\n  /** Override \"now\" for tests. */\n  nowSeconds?: number;\n}\n\nexport type BudgetEvaluationResult =\n  | { ok: true }\n  | {\n      ok: false;\n      code: \"invalid_mandate\";\n      reason: string;\n      details?: Record<string, unknown>;\n    };\n\n/**\n * Evaluate a budget + (optional) recurrence constraint against a tracker\n * snapshot. The verifier should call this BEFORE authorizing the payment;\n * if it returns `ok: true`, the verifier then calls\n * `tracker.recordPresentation(...)` to mark the spend.\n *\n * This function is pure — it doesn't mutate the tracker.\n */\nexport async function evaluateBudgetWithRecurrence(\n  input: BudgetEvaluationInput,\n): Promise<BudgetEvaluationResult> {\n  if (input.budget.currency.toUpperCase() !== input.currency.toUpperCase()) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `Budget currency '${input.budget.currency}' does not match payment currency '${input.currency}'`,\n    };\n  }\n\n  const snap = await input.tracker.inspect(input.openMandateDigest);\n  const projectedTotalMinor = snap.totalSpentMinor + input.amountMinor;\n  const budgetMaxMinor = Math.round(input.budget.max * input.divisor);\n  if (projectedTotalMinor > budgetMaxMinor) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `Budget exceeded: previous spend ${snap.totalSpentMinor} + this charge ${input.amountMinor} = ${projectedTotalMinor} > max ${budgetMaxMinor} (${input.currency})`,\n      details: {\n        previous_spent_minor: snap.totalSpentMinor,\n        this_charge_minor: input.amountMinor,\n        projected_total_minor: projectedTotalMinor,\n        max_minor: budgetMaxMinor,\n        currency: input.currency,\n      },\n    };\n  }\n\n  if (input.recurrence) {\n    if (snap.occurrences + 1 > input.recurrence.max_occurrences) {\n      return {\n        ok: false,\n        code: \"invalid_mandate\",\n        reason: `Recurrence exhausted: ${snap.occurrences + 1} > max_occurrences ${input.recurrence.max_occurrences}`,\n        details: {\n          occurrences: snap.occurrences,\n          max_occurrences: input.recurrence.max_occurrences,\n        },\n      };\n    }\n    const now = input.nowSeconds ?? Math.floor(Date.now() / 1000);\n    if (\n      !isWithinRecurrenceWindow(\n        input.recurrence.frequency,\n        snap.lastExecutedAt,\n        now,\n      )\n    ) {\n      return {\n        ok: false,\n        code: \"invalid_mandate\",\n        reason: `Recurrence window not yet elapsed (frequency=${input.recurrence.frequency}, last_executed_at=${snap.lastExecutedAt}, now=${now})`,\n        details: {\n          frequency: input.recurrence.frequency,\n          last_executed_at: snap.lastExecutedAt,\n          now,\n        },\n      };\n    }\n  }\n\n  return { ok: true };\n}\n","// Constraint evaluators for AP2 v0.2.\n//\n// Verifiers MUST evaluate every constraint of every open mandate in the\n// chain against the closed mandate. Per spec §C, **unknown constraint types\n// MUST FAIL evaluation** (returning `unresolved_constraint`).\n//\n// We implement evaluators for all 8 known constraint types:\n//   - checkout.allowed_merchants\n//   - checkout.line_items (max-flow)\n//   - payment.amount_range\n//   - payment.allowed_payees\n//   - payment.allowed_payment_instruments\n//   - payment.allowed_pisps\n//   - payment.budget (+ payment.agent_recurrence; stateful, requires tracker)\n//   - payment.execution_date\n//   - payment.reference\n\nimport type { Constraint } from \"./schemas/constraints\";\nimport { KNOWN_CONSTRAINT_TYPES } from \"./schemas/constraints\";\nimport type { ClosedCheckoutMandate, CheckoutJwtPayload } from \"./schemas/checkout-mandate\";\nimport type { ClosedPaymentMandate } from \"./schemas/payment-mandate\";\nimport type { Frequency } from \"./schemas/common\";\nimport { divisorFor } from \"./schemas/common\";\nimport {\n  evaluateBudgetWithRecurrence,\n  type BudgetTracker,\n} from \"./budget-tracker\";\n\n// ---------------------------------------------------------------------------\n// Result shapes\n// ---------------------------------------------------------------------------\n\nexport type EvaluationResult =\n  | { ok: true }\n  | { ok: false; reason: string; code: \"invalid_mandate\" | \"unresolved_constraint\" };\n\nexport interface CheckoutConstraintContext {\n  /** Inner checkout payload (already verified + parsed). */\n  checkoutPayload: CheckoutJwtPayload;\n  /** The closed mandate object. */\n  closedMandate: ClosedCheckoutMandate;\n}\n\nexport interface PaymentConstraintContext {\n  closedMandate: ClosedPaymentMandate;\n  /**\n   * sd_hash digest of the linked Open Checkout Mandate. Required when\n   * evaluating `payment.reference`. `undefined` if the verifier cannot\n   * resolve it (verifier MUST then fail with `unresolved_constraint`).\n   */\n  linkedCheckoutMandateDigest?: string;\n  /**\n   * Stateful tracker for budget + agent_recurrence constraints. When present,\n   * `payment.budget` (and its paired `payment.agent_recurrence`) are evaluated\n   * against the tracker snapshot via `evaluateBudgetWithRecurrence`. When\n   * absent, those constraints pass as a documented no-op (caller is\n   * responsible for supplying a tracker in production).\n   */\n  tracker?: BudgetTracker;\n  /**\n   * Stable digest keying tracker state for this Open Payment Mandate\n   * (typically its sd_hash). Required when `tracker` is supplied — without it\n   * budget/recurrence cannot be evaluated and fail with\n   * `unresolved_constraint`.\n   */\n  openMandateDigest?: string;\n  /**\n   * The paired `payment.agent_recurrence` bound from the same Open Payment\n   * Mandate, if any. `payment.budget` and `payment.agent_recurrence` are\n   * evaluated together (the recurrence cap is meaningless without the budget),\n   * so the caller resolves the recurrence constraint alongside the budget one.\n   */\n  budgetRecurrence?: { frequency: Frequency; max_occurrences: number };\n  /** Override \"now\" (Unix seconds) for deterministic recurrence tests. */\n  nowSeconds?: number;\n}\n\nexport type { BudgetTracker };\n\n// ---------------------------------------------------------------------------\n// Top-level dispatcher\n// ---------------------------------------------------------------------------\n\n/**\n * Evaluate a single constraint against a Closed Checkout Mandate context.\n * Throws `EvaluationError` on unknown constraint types per spec.\n */\nexport function evaluateCheckoutConstraint(\n  constraint: Constraint,\n  context: CheckoutConstraintContext,\n): EvaluationResult {\n  switch (constraint.type) {\n    case \"checkout.allowed_merchants\":\n      return evalAllowedMerchants(\n        constraint.allowed,\n        context.checkoutPayload.merchant.id,\n      );\n    case \"checkout.line_items\":\n      return evalLineItemsMaxFlow(constraint.items, context.checkoutPayload);\n    // Payment-side constraints are illegal in Open Checkout Mandates per spec.\n    default:\n      if (KNOWN_CONSTRAINT_TYPES.includes(constraint.type)) {\n        return {\n          ok: false,\n          code: \"invalid_mandate\",\n          reason: `Constraint type '${constraint.type}' belongs to the payment family and cannot appear in an Open Checkout Mandate.`,\n        };\n      }\n      return {\n        ok: false,\n        code: \"unresolved_constraint\",\n        reason: `Unknown constraint type '${(constraint as { type: string }).type}'`,\n      };\n  }\n}\n\n/**\n * Evaluate a single constraint against a Closed Payment Mandate context.\n * Returns `unresolved_constraint` for unknown types. For `payment.budget` +\n * `payment.agent_recurrence` requires `context.tracker` if present.\n */\nexport async function evaluatePaymentConstraint(\n  constraint: Constraint,\n  context: PaymentConstraintContext,\n): Promise<EvaluationResult> {\n  switch (constraint.type) {\n    case \"payment.amount_range\":\n      return evalAmountRange(\n        constraint,\n        context.closedMandate.payment_amount,\n      );\n    case \"payment.allowed_payees\":\n      return evalAllowedPayees(\n        constraint.allowed.map((m) => m.id),\n        context.closedMandate.payee.id,\n      );\n    case \"payment.allowed_payment_instruments\":\n      return evalAllowedInstruments(\n        constraint.allowed.map((p) => ({ id: p.id, type: p.type })),\n        context.closedMandate.payment_instrument,\n      );\n    case \"payment.allowed_pisps\": {\n      const pispId = context.closedMandate.pisp?.id;\n      return evalAllowedPisps(\n        constraint.allowed.map((p) => p.id),\n        pispId,\n      );\n    }\n    case \"payment.execution_date\":\n      return evalExecutionDate(constraint, context.closedMandate.execution_date);\n    case \"payment.reference\":\n      return evalReference(\n        constraint.conditional_transaction_id,\n        context.linkedCheckoutMandateDigest,\n      );\n    case \"payment.budget\":\n      return evalBudget(constraint, context);\n    case \"payment.agent_recurrence\":\n      // Recurrence is evaluated jointly with its paired `payment.budget`\n      // (see `evalBudget`, which reads `context.budgetRecurrence`). Evaluating\n      // it a second time here would double-count occurrences, so this arm is a\n      // no-op — the budget arm owns the stateful check. With no tracker wired,\n      // it is a documented pass (caller responsibility, matching budget).\n      return { ok: true };\n    // Checkout-side constraints are illegal in Open Payment Mandates.\n    default:\n      if (KNOWN_CONSTRAINT_TYPES.includes(constraint.type)) {\n        return {\n          ok: false,\n          code: \"invalid_mandate\",\n          reason: `Constraint type '${constraint.type}' belongs to the checkout family and cannot appear in an Open Payment Mandate.`,\n        };\n      }\n      return {\n        ok: false,\n        code: \"unresolved_constraint\",\n        reason: `Unknown constraint type '${(constraint as { type: string }).type}'`,\n      };\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Individual evaluators\n// ---------------------------------------------------------------------------\n\nfunction evalAllowedMerchants(\n  allowed: ReadonlyArray<{ id: string }>,\n  merchantId: string,\n): EvaluationResult {\n  if (allowed.some((m) => m.id === merchantId)) {\n    return { ok: true };\n  }\n  return {\n    ok: false,\n    code: \"invalid_mandate\",\n    reason: `Merchant '${merchantId}' not in allowed_merchants list (${allowed.map((m) => m.id).join(\", \") || \"<empty>\"})`,\n  };\n}\n\nfunction evalAllowedPayees(\n  allowedIds: readonly string[],\n  payeeId: string,\n): EvaluationResult {\n  if (allowedIds.includes(payeeId)) return { ok: true };\n  return {\n    ok: false,\n    code: \"invalid_mandate\",\n    reason: `Payee '${payeeId}' not in allowed_payees`,\n  };\n}\n\nfunction evalAllowedInstruments(\n  allowed: ReadonlyArray<{ id: string; type: string }>,\n  instrument: { id: string; type: string },\n): EvaluationResult {\n  // Match by id first, then fall back to type-only match.\n  if (\n    allowed.some(\n      (a) => a.id === instrument.id || (a.type === instrument.type && !a.id),\n    )\n  ) {\n    return { ok: true };\n  }\n  return {\n    ok: false,\n    code: \"invalid_mandate\",\n    reason: `PaymentInstrument id='${instrument.id}' type='${instrument.type}' not in allowed list`,\n  };\n}\n\nfunction evalAllowedPisps(\n  allowedIds: readonly string[],\n  pispId: string | undefined,\n): EvaluationResult {\n  if (!pispId) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: \"Closed Payment Mandate has no pisp but constraint requires one\",\n    };\n  }\n  if (allowedIds.includes(pispId)) return { ok: true };\n  return {\n    ok: false,\n    code: \"invalid_mandate\",\n    reason: `Pisp '${pispId}' not in allowed_pisps`,\n  };\n}\n\nfunction evalAmountRange(\n  constraint: { currency: string; max: number; min?: number | undefined },\n  amount: { amount: number; currency: string },\n): EvaluationResult {\n  if (constraint.currency.toUpperCase() !== amount.currency.toUpperCase()) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `Currency mismatch: constraint='${constraint.currency}', amount='${amount.currency}'`,\n    };\n  }\n  if (amount.amount > constraint.max) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `Amount ${amount.amount} exceeds max ${constraint.max} ${constraint.currency}`,\n    };\n  }\n  const min = constraint.min ?? 0;\n  if (amount.amount < min) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `Amount ${amount.amount} below min ${min} ${constraint.currency}`,\n    };\n  }\n  return { ok: true };\n}\n\nfunction evalExecutionDate(\n  constraint: { not_before?: string | undefined; not_after?: string | undefined },\n  executionDate: string | undefined,\n): EvaluationResult {\n  if (!executionDate) {\n    // Absent = immediate. We treat as \"now\" for window check.\n    const nowIso = new Date().toISOString();\n    return checkWindow(constraint, nowIso);\n  }\n  return checkWindow(constraint, executionDate);\n}\n\nfunction checkWindow(\n  constraint: { not_before?: string | undefined; not_after?: string | undefined },\n  iso: string,\n): EvaluationResult {\n  const t = Date.parse(iso);\n  if (Number.isNaN(t)) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `Invalid execution_date: ${iso}`,\n    };\n  }\n  if (constraint.not_before) {\n    const lo = Date.parse(constraint.not_before);\n    if (!Number.isNaN(lo) && t < lo) {\n      return {\n        ok: false,\n        code: \"invalid_mandate\",\n        reason: `execution_date ${iso} before not_before ${constraint.not_before}`,\n      };\n    }\n  }\n  if (constraint.not_after) {\n    const hi = Date.parse(constraint.not_after);\n    if (!Number.isNaN(hi) && t > hi) {\n      return {\n        ok: false,\n        code: \"invalid_mandate\",\n        reason: `execution_date ${iso} after not_after ${constraint.not_after}`,\n      };\n    }\n  }\n  return { ok: true };\n}\n\nasync function evalBudget(\n  constraint: { max: number; currency: string },\n  context: PaymentConstraintContext,\n): Promise<EvaluationResult> {\n  // No tracker: documented pass — the caller is responsible for supplying a\n  // stateful tracker in production. (Matches the pre-existing project posture\n  // for stateful constraints when the host opts out of tracking.)\n  if (!context.tracker) {\n    return { ok: true };\n  }\n  // Tracker present but we can't key it — fail closed rather than silently\n  // skipping the budget check.\n  if (!context.openMandateDigest) {\n    return {\n      ok: false,\n      code: \"unresolved_constraint\",\n      reason:\n        \"payment.budget requires an openMandateDigest to key tracker state; caller supplied a tracker without one.\",\n    };\n  }\n  const amount = context.closedMandate.payment_amount;\n  const result = await evaluateBudgetWithRecurrence({\n    tracker: context.tracker,\n    openMandateDigest: context.openMandateDigest,\n    amountMinor: amount.amount,\n    currency: amount.currency,\n    budget: { max: constraint.max, currency: constraint.currency },\n    divisor: divisorFor(amount.currency),\n    ...(context.budgetRecurrence !== undefined\n      ? { recurrence: context.budgetRecurrence }\n      : {}),\n    ...(context.nowSeconds !== undefined ? { nowSeconds: context.nowSeconds } : {}),\n  });\n  return result;\n}\n\nfunction evalReference(\n  expectedDigest: string,\n  resolvedDigest: string | undefined,\n): EvaluationResult {\n  if (!resolvedDigest) {\n    return {\n      ok: false,\n      code: \"unresolved_constraint\",\n      reason:\n        \"payment.reference requires the linked Open Checkout Mandate digest. Caller did not supply linkedCheckoutMandateDigest.\",\n    };\n  }\n  if (expectedDigest !== resolvedDigest) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `payment.reference mismatch: expected ${expectedDigest}, got ${resolvedDigest}`,\n    };\n  }\n  return { ok: true };\n}\n\n// ---------------------------------------------------------------------------\n// `checkout.line_items` — bipartite max-flow per spec.\n//\n// A constraint passes iff a feasible flow exists where:\n//   - source → constraint item (capacity = constraint.quantity)\n//   - constraint item → checkout item (infinite capacity, only edges where\n//                        checkout-item id ∈ constraint.acceptable_items[].id)\n//   - checkout item → sink (capacity = checkout.quantity)\n// and the maximum flow equals total constraint quantity (= the constraint\n// is satisfied entirely).\n//\n// We implement a standard Ford-Fulkerson with BFS (Edmonds-Karp). For the\n// tiny graphs AP2 cart constraints produce (max ~50 nodes), this is plenty.\n// ---------------------------------------------------------------------------\n\ninterface LineItemConstraintEntry {\n  id: string;\n  acceptable_items: ReadonlyArray<{ id: string }>;\n  quantity: number;\n}\n\nfunction evalLineItemsMaxFlow(\n  constraintItems: ReadonlyArray<LineItemConstraintEntry>,\n  checkoutPayload: CheckoutJwtPayload,\n): EvaluationResult {\n  const cartItems = checkoutPayload.line_items.map((li) => ({\n    id: li.product.id,\n    quantity: li.quantity,\n  }));\n\n  const totalRequired = constraintItems.reduce((s, ci) => s + ci.quantity, 0);\n  if (totalRequired === 0) return { ok: true };\n\n  // Node layout:\n  //   0 = source\n  //   1..C = constraint items (C = constraintItems.length)\n  //   C+1..C+K = cart items (K = cartItems.length)\n  //   C+K+1 = sink\n  const C = constraintItems.length;\n  const K = cartItems.length;\n  const N = 2 + C + K;\n  const SRC = 0;\n  const SINK = N - 1;\n  const CON = (i: number) => 1 + i;\n  const CART = (i: number) => 1 + C + i;\n\n  // Capacity matrix (numbers).\n  const cap = Array.from({ length: N }, () => new Array<number>(N).fill(0));\n\n  for (let i = 0; i < C; i++) {\n    cap[SRC]![CON(i)] = constraintItems[i]!.quantity;\n  }\n  for (let j = 0; j < K; j++) {\n    cap[CART(j)]![SINK] = cartItems[j]!.quantity;\n  }\n  for (let i = 0; i < C; i++) {\n    const acceptableIds = new Set(\n      constraintItems[i]!.acceptable_items.map((a) => a.id),\n    );\n    for (let j = 0; j < K; j++) {\n      if (acceptableIds.has(cartItems[j]!.id)) {\n        cap[CON(i)]![CART(j)] = Number.POSITIVE_INFINITY;\n      }\n    }\n  }\n\n  const flow = maxFlow(cap, SRC, SINK, N);\n  if (flow >= totalRequired) return { ok: true };\n  return {\n    ok: false,\n    code: \"invalid_mandate\",\n    reason: `checkout.line_items: only ${flow}/${totalRequired} required units satisfiable from cart`,\n  };\n}\n\nfunction maxFlow(cap: number[][], src: number, sink: number, N: number): number {\n  let total = 0;\n  while (true) {\n    const parent = bfs(cap, src, sink, N);\n    if (!parent) break;\n    let pathFlow = Number.POSITIVE_INFINITY;\n    for (let v = sink; v !== src; v = parent[v]!) {\n      const u = parent[v]!;\n      pathFlow = Math.min(pathFlow, cap[u]![v]!);\n    }\n    if (!Number.isFinite(pathFlow)) {\n      // Defensive: an infinite-capacity edge should never bottleneck the\n      // path because src and sink edges are finite.\n      break;\n    }\n    for (let v = sink; v !== src; v = parent[v]!) {\n      const u = parent[v]!;\n      cap[u]![v] = cap[u]![v]! - pathFlow;\n      cap[v]![u] = cap[v]![u]! + pathFlow;\n    }\n    total += pathFlow;\n  }\n  return total;\n}\n\nfunction bfs(\n  cap: number[][],\n  src: number,\n  sink: number,\n  N: number,\n): number[] | null {\n  const parent = new Array<number>(N).fill(-1);\n  parent[src] = src;\n  const queue: number[] = [src];\n  while (queue.length) {\n    const u = queue.shift()!;\n    for (let v = 0; v < N; v++) {\n      if (parent[v] === -1 && cap[u]![v]! > 0) {\n        parent[v] = u;\n        if (v === sink) return parent;\n        queue.push(v);\n      }\n    }\n  }\n  return null;\n}\n\n// Re-export divisorFor for downstream consumers.\nexport { divisorFor };\n","// Single-hop AP2 mandate issuer.\n//\n// Builds well-formed SD-JWT VC presentations for each of the four mandate\n// types in AP2 v0.2. Phase 2.1 ships single-hop only — multi-hop chains\n// (`~~`-separated, dSD-JWT delegation) are Phase 2.2.\n//\n// Caller flow (Direct / Trusted Surface model):\n//\n//   1. Generate or load a signing keypair (ES256 / RS256, NOT Ed25519 for\n//      checkout_jwt).\n//   2. Build the inner `checkout_jwt` (only for Closed Checkout Mandates) via\n//      `signCheckoutJwt`.\n//   3. Call `issueClosedCheckoutMandate` (or any of the 3 sibling builders).\n//   4. Receive a compact SD-JWT presentation string ready to send on the wire.\n\nimport {\n  signCompactJws,\n  type JoseCryptoKey,\n} from \"./crypto\";\nimport {\n  buildIssuerPayload,\n  buildKbJwt,\n  computeSdHash,\n  serializeSdJwt,\n  type ParsedSdJwt,\n} from \"./sd-jwt\";\nimport type {\n  ClosedCheckoutMandate,\n  OpenCheckoutMandate,\n} from \"./schemas/checkout-mandate\";\nimport type {\n  ClosedPaymentMandate,\n  OpenPaymentMandate,\n} from \"./schemas/payment-mandate\";\n\n// ---------------------------------------------------------------------------\n// Common shape for issuance\n// ---------------------------------------------------------------------------\n\nexport interface IssuerSigningCtx {\n  /** Issuer's signing key (JWS root). */\n  privateKey: JoseCryptoKey;\n  /** JWS algorithm (ES256 default). */\n  alg: string;\n  /** Header `kid` (optional). */\n  kid?: string;\n  /** Header `typ` for the issuer JWS. Default `example+sd-jwt`. */\n  typ?: string;\n}\n\nexport interface KeyBindingCtx {\n  /** Holder's signing key for the KB-JWT (matching `cnf.jwk`). */\n  privateKey: JoseCryptoKey;\n  /** Algorithm. ES256 default. */\n  alg: string;\n  /** Optional kid. */\n  kid?: string;\n  /** Audience the KB-JWT binds to (\"merchant\" / \"credential-provider\" / etc.). */\n  audience: string;\n  /** Verifier-supplied nonce. */\n  nonce: string;\n}\n\nexport interface IssueOpenCheckoutOptions {\n  mandate: OpenCheckoutMandate;\n  signingCtx: IssuerSigningCtx;\n  /** Optional Key Binding hop. If set, the SD-JWT terminates with a KB-JWT. */\n  keyBinding?: KeyBindingCtx;\n  /** Override sd_alg. Default sha-256. */\n  sdAlg?: string;\n}\n\nexport async function issueOpenCheckoutMandate(\n  options: IssueOpenCheckoutOptions,\n): Promise<string> {\n  const { issuerPayload, encodedDisclosures } = await buildIssuerPayload({\n    payload: { ...options.mandate },\n    disclosablePaths: [\"constraints\"],\n    vct: options.mandate.vct,\n    sdAlg: options.sdAlg ?? \"sha-256\",\n  });\n  const issuerJwt = await signCompactJws(issuerPayload, options.signingCtx.privateKey, {\n    alg: options.signingCtx.alg,\n    typ: options.signingCtx.typ ?? \"example+sd-jwt\",\n    ...(options.signingCtx.kid !== undefined ? { kid: options.signingCtx.kid } : {}),\n  });\n  return assemble({\n    issuerJwt,\n    disclosures: encodedDisclosures,\n    ...(options.keyBinding !== undefined ? { keyBinding: options.keyBinding } : {}),\n  });\n}\n\nexport interface IssueClosedCheckoutOptions {\n  mandate: ClosedCheckoutMandate;\n  signingCtx: IssuerSigningCtx;\n  keyBinding?: KeyBindingCtx;\n  sdAlg?: string;\n}\n\nexport async function issueClosedCheckoutMandate(\n  options: IssueClosedCheckoutOptions,\n): Promise<string> {\n  const { issuerPayload, encodedDisclosures } = await buildIssuerPayload({\n    payload: { ...options.mandate },\n    // checkout_jwt is the heaviest field; make it selectively-disclosable.\n    disclosablePaths: [\"checkout_jwt\"],\n    vct: options.mandate.vct,\n    sdAlg: options.sdAlg ?? \"sha-256\",\n  });\n  const issuerJwt = await signCompactJws(issuerPayload, options.signingCtx.privateKey, {\n    alg: options.signingCtx.alg,\n    typ: options.signingCtx.typ ?? \"example+sd-jwt\",\n    ...(options.signingCtx.kid !== undefined ? { kid: options.signingCtx.kid } : {}),\n  });\n  return assemble({\n    issuerJwt,\n    disclosures: encodedDisclosures,\n    ...(options.keyBinding !== undefined ? { keyBinding: options.keyBinding } : {}),\n  });\n}\n\nexport interface IssueOpenPaymentOptions {\n  mandate: OpenPaymentMandate;\n  signingCtx: IssuerSigningCtx;\n  keyBinding?: KeyBindingCtx;\n  sdAlg?: string;\n}\n\nexport async function issueOpenPaymentMandate(\n  options: IssueOpenPaymentOptions,\n): Promise<string> {\n  const { issuerPayload, encodedDisclosures } = await buildIssuerPayload({\n    payload: { ...options.mandate },\n    disclosablePaths: [\"constraints\"],\n    vct: options.mandate.vct,\n    sdAlg: options.sdAlg ?? \"sha-256\",\n  });\n  const issuerJwt = await signCompactJws(issuerPayload, options.signingCtx.privateKey, {\n    alg: options.signingCtx.alg,\n    typ: options.signingCtx.typ ?? \"example+sd-jwt\",\n    ...(options.signingCtx.kid !== undefined ? { kid: options.signingCtx.kid } : {}),\n  });\n  return assemble({\n    issuerJwt,\n    disclosures: encodedDisclosures,\n    ...(options.keyBinding !== undefined ? { keyBinding: options.keyBinding } : {}),\n  });\n}\n\nexport interface IssueClosedPaymentOptions {\n  mandate: ClosedPaymentMandate;\n  signingCtx: IssuerSigningCtx;\n  keyBinding?: KeyBindingCtx;\n  sdAlg?: string;\n}\n\nexport async function issueClosedPaymentMandate(\n  options: IssueClosedPaymentOptions,\n): Promise<string> {\n  const { issuerPayload, encodedDisclosures } = await buildIssuerPayload({\n    payload: { ...options.mandate },\n    disclosablePaths: [\"payment_amount\", \"payment_instrument\"],\n    vct: options.mandate.vct,\n    sdAlg: options.sdAlg ?? \"sha-256\",\n  });\n  const issuerJwt = await signCompactJws(issuerPayload, options.signingCtx.privateKey, {\n    alg: options.signingCtx.alg,\n    typ: options.signingCtx.typ ?? \"example+sd-jwt\",\n    ...(options.signingCtx.kid !== undefined ? { kid: options.signingCtx.kid } : {}),\n  });\n  return assemble({\n    issuerJwt,\n    disclosures: encodedDisclosures,\n    ...(options.keyBinding !== undefined ? { keyBinding: options.keyBinding } : {}),\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Internal: assemble issuer JWT + disclosures + optional KB-JWT into compact\n// SD-JWT serialization.\n// ---------------------------------------------------------------------------\n\nasync function assemble(args: {\n  issuerJwt: string;\n  disclosures: string[];\n  keyBinding?: KeyBindingCtx;\n}): Promise<string> {\n  const parts: ParsedSdJwt = {\n    issuerJwt: args.issuerJwt,\n    disclosures: args.disclosures,\n    kbJwt: undefined,\n  };\n\n  if (args.keyBinding) {\n    const sdHash = await computeSdHash(parts);\n    const kbJwt = await buildKbJwt(args.keyBinding.privateKey, {\n      audience: args.keyBinding.audience,\n      nonce: args.keyBinding.nonce,\n      sdHash,\n      alg: args.keyBinding.alg,\n      typ: \"kb+sd-jwt\",\n      ...(args.keyBinding.kid !== undefined ? { kid: args.keyBinding.kid } : {}),\n    });\n    parts.kbJwt = kbJwt;\n  }\n  return serializeSdJwt(parts);\n}\n","// Single-hop AP2 mandate verifier.\n//\n// Implements the canonical verification rules from AP2 v0.2 §C, restricted\n// to single-hop SD-JWT presentations. Multi-hop chain walking (with\n// hop-by-hop `cnf.jwk` PoP binding) ships in Phase 2.2.\n//\n// What's checked, in order:\n//   1. SD-JWT compact serialization parses cleanly.\n//   2. Issuer JWT signature is valid against caller-supplied issuer key.\n//   3. Disclosures resolve cleanly into the issuer payload.\n//   4. `vct` matches the expected mandate type.\n//   5. Time claims (`iat`, `exp`) within tolerance.\n//   6. (Closed Checkout) `checkout_hash` equals base64url(sha-256(checkout_jwt)).\n//   7. (Closed Payment) `transaction_id` equals the supplied\n//      `linkedClosedCheckoutMandateDigest`.\n//   8. KB-JWT (if present): signature matches the expected\n//      `cnf.jwk`-bound key, `aud`/`nonce`/`sd_hash` match.\n//   9. (Open mandates) Constraints are evaluated. Unknown types fail with\n//      `unresolved_constraint`.\n\nimport {\n  base64urlEncode,\n  importPublicJwk,\n  sha256,\n  sha256Base64url,\n  verifyCompactJws,\n  type JoseCryptoKey,\n  type VerifyOptions as CryptoVerifyOptions,\n} from \"./crypto\";\nimport {\n  computeSdHash,\n  parseSdJwt,\n  resolveDisclosures,\n  verifyKbJwt,\n  SdJwtError,\n} from \"./sd-jwt\";\nimport {\n  ClosedCheckoutMandate,\n  OpenCheckoutMandate,\n  CheckoutJwtPayload,\n  type ClosedCheckoutMandate as TClosedCheckoutMandate,\n  type OpenCheckoutMandate as TOpenCheckoutMandate,\n} from \"./schemas/checkout-mandate\";\nimport {\n  ClosedPaymentMandate,\n  OpenPaymentMandate,\n  type ClosedPaymentMandate as TClosedPaymentMandate,\n  type OpenPaymentMandate as TOpenPaymentMandate,\n} from \"./schemas/payment-mandate\";\nimport type { Jwk } from \"./schemas/jwk\";\nimport { computeCheckoutHash, verifyCheckoutJwt } from \"./checkout-jwt\";\nimport {\n  evaluateCheckoutConstraint,\n  evaluatePaymentConstraint,\n  type EvaluationResult,\n  type BudgetTracker,\n} from \"./constraints\";\nimport type { Constraint } from \"./schemas/constraints\";\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\nexport type VerificationOutcome<T> =\n  | {\n      ok: true;\n      mandate: T;\n      /** sd_hash of the verified presentation — useful for receipts. */\n      sdHash: string;\n    }\n  | {\n      ok: false;\n      code:\n        | \"invalid_credential\"\n        | \"invalid_mandate\"\n        | \"unresolved_constraint\"\n        | \"mandates_not_supported\";\n      reason: string;\n    };\n\n// ---------------------------------------------------------------------------\n// Common verification opts\n// ---------------------------------------------------------------------------\n\nexport interface CommonVerifyOptions {\n  /** Issuer public key, as JWK or already-imported CryptoKey. */\n  issuerKey: Jwk | JoseCryptoKey;\n  /** Algorithm declared by the issuer key. Default ES256. */\n  issuerAlg?: string;\n  /** Optional iss claim to validate. */\n  issuer?: string;\n  /** Clock tolerance for iat/exp (seconds). Default 30. */\n  clockTolerance?: number;\n  /** Override \"now\" for deterministic tests. */\n  currentDate?: Date;\n}\n\nexport interface KeyBindingVerifyOptions {\n  /** Verifier-issued audience. */\n  audience: string;\n  /** Verifier-issued nonce — must equal the KB-JWT's `nonce`. */\n  nonce: string;\n}\n\n// ---------------------------------------------------------------------------\n// CLOSED CHECKOUT MANDATE\n// ---------------------------------------------------------------------------\n\nexport interface VerifyClosedCheckoutOptions extends CommonVerifyOptions {\n  /** Merchant key that signed the inner `checkout_jwt`. */\n  checkoutJwtKey: Jwk | JoseCryptoKey;\n  /** Algorithm of the inner `checkout_jwt`. ES256 default. */\n  checkoutJwtAlg?: string;\n  /** Required when the SD-JWT terminates with a KB-JWT. */\n  keyBinding?: KeyBindingVerifyOptions;\n}\n\nexport interface VerifiedClosedCheckout {\n  closed: TClosedCheckoutMandate;\n  /** The verified inner checkout payload. */\n  checkout: CheckoutJwtPayload;\n  /** sd_hash of the SD-JWT presentation (used as receipt `reference`). */\n  sdHash: string;\n}\n\nexport async function verifyClosedCheckoutMandate(\n  presentation: string,\n  options: VerifyClosedCheckoutOptions,\n): Promise<VerificationOutcome<VerifiedClosedCheckout>> {\n  let parts;\n  try {\n    parts = parseSdJwt(presentation);\n  } catch (err) {\n    return invalidCredential(err);\n  }\n\n  // 1. Verify issuer JWT.\n  const issuerKey = await resolveKey(options.issuerKey, options.issuerAlg ?? \"ES256\");\n  let issuerResult;\n  try {\n    issuerResult = await verifyCompactJws(parts.issuerJwt, issuerKey, {\n      ...(options.issuer !== undefined ? { issuer: options.issuer } : {}),\n      ...(options.clockTolerance !== undefined ? { clockTolerance: options.clockTolerance } : {}),\n      ...(options.currentDate !== undefined ? { currentDate: options.currentDate } : {}),\n    });\n  } catch (err) {\n    return invalidCredential(err);\n  }\n  const rawIssuerPayload = issuerResult.payload as Record<string, unknown>;\n\n  // 2. Resolve disclosures.\n  let resolved: Record<string, unknown>;\n  try {\n    resolved = await resolveDisclosures(rawIssuerPayload, parts.disclosures);\n  } catch (err) {\n    return invalidCredential(err);\n  }\n\n  // 3. Validate Zod shape.\n  const parsedClosed = ClosedCheckoutMandate.safeParse(resolved);\n  if (!parsedClosed.success) {\n    return {\n      ok: false,\n      code: \"invalid_credential\",\n      reason: `Closed Checkout Mandate schema invalid: ${parsedClosed.error.issues[0]?.message ?? \"unknown\"}`,\n    };\n  }\n\n  // 4. Verify checkout_hash equals hash(checkout_jwt).\n  const expectedHash = await computeCheckoutHash(parsedClosed.data.checkout_jwt);\n  if (expectedHash !== parsedClosed.data.checkout_hash) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `checkout_hash mismatch: payload=${parsedClosed.data.checkout_hash}, computed=${expectedHash}`,\n    };\n  }\n\n  // 5. Verify the inner checkout_jwt + parse the cart payload.\n  const checkoutKey = await resolveKey(\n    options.checkoutJwtKey,\n    options.checkoutJwtAlg ?? \"ES256\",\n  );\n  let innerPayload;\n  try {\n    const inner = await verifyCheckoutJwt(parsedClosed.data.checkout_jwt, checkoutKey, {\n      ...(options.clockTolerance !== undefined ? { clockTolerance: options.clockTolerance } : {}),\n      ...(options.currentDate !== undefined ? { currentDate: options.currentDate } : {}),\n    });\n    const parsed = CheckoutJwtPayload.safeParse(inner.payload);\n    if (!parsed.success) {\n      return {\n        ok: false,\n        code: \"invalid_credential\",\n        reason: `Inner checkout_jwt payload invalid: ${parsed.error.issues[0]?.message ?? \"unknown\"}`,\n      };\n    }\n    innerPayload = parsed.data;\n  } catch (err) {\n    return invalidCredential(err);\n  }\n\n  // 6. Verify KB-JWT if present.\n  const sdHash = await computeSdHash({\n    issuerJwt: parts.issuerJwt,\n    disclosures: parts.disclosures,\n  });\n  if (parts.kbJwt) {\n    if (!options.keyBinding) {\n      return {\n        ok: false,\n        code: \"invalid_credential\",\n        reason: \"Presentation includes KB-JWT but no keyBinding options were supplied\",\n      };\n    }\n    // Key binding requires the verifier to know the holder's `cnf.jwk`. For\n    // a single-hop closed mandate, that is not carried in the closed payload\n    // — it would come from the linked Open Checkout Mandate's `cnf.jwk`. In\n    // single-hop direct-flow tests, both are signed by the same key.\n    // Phase 2.1: accept the KB-JWT against the issuer key (single-actor flow).\n    try {\n      await verifyKbJwt(parts.kbJwt, issuerKey, {\n        audience: options.keyBinding.audience,\n        nonce: options.keyBinding.nonce,\n        sdHash,\n      });\n    } catch (err) {\n      return invalidCredential(err);\n    }\n  }\n\n  return {\n    ok: true,\n    sdHash,\n    mandate: { closed: parsedClosed.data, checkout: innerPayload, sdHash } as VerifiedClosedCheckout,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// OPEN CHECKOUT MANDATE — verify + evaluate constraints against a closed\n// checkout payload.\n// ---------------------------------------------------------------------------\n\nexport interface VerifyOpenCheckoutOptions extends CommonVerifyOptions {\n  /** The closed mandate's verified inner checkout payload. */\n  closedCheckout: CheckoutJwtPayload;\n  closedMandate: TClosedCheckoutMandate;\n  keyBinding?: KeyBindingVerifyOptions;\n}\n\nexport async function verifyOpenCheckoutMandate(\n  presentation: string,\n  options: VerifyOpenCheckoutOptions,\n): Promise<VerificationOutcome<TOpenCheckoutMandate>> {\n  return verifyOpenMandate(presentation, options, OpenCheckoutMandate, (mandate) => {\n    for (const c of mandate.constraints) {\n      const result = evaluateCheckoutConstraint(c as Constraint, {\n        checkoutPayload: options.closedCheckout,\n        closedMandate: options.closedMandate,\n      });\n      if (!result.ok) return result;\n    }\n    return { ok: true } as EvaluationResult;\n  });\n}\n\n// ---------------------------------------------------------------------------\n// CLOSED PAYMENT MANDATE\n// ---------------------------------------------------------------------------\n\nexport interface VerifyClosedPaymentOptions extends CommonVerifyOptions {\n  /**\n   * `checkout_hash` of the linked Closed Checkout Mandate. Required —\n   * `transaction_id` MUST equal this value.\n   */\n  expectedTransactionId: string;\n  keyBinding?: KeyBindingVerifyOptions;\n}\n\nexport interface VerifiedClosedPayment {\n  closed: TClosedPaymentMandate;\n  sdHash: string;\n}\n\nexport async function verifyClosedPaymentMandate(\n  presentation: string,\n  options: VerifyClosedPaymentOptions,\n): Promise<VerificationOutcome<VerifiedClosedPayment>> {\n  let parts;\n  try {\n    parts = parseSdJwt(presentation);\n  } catch (err) {\n    return invalidCredential(err);\n  }\n\n  const issuerKey = await resolveKey(options.issuerKey, options.issuerAlg ?? \"ES256\");\n  let issuerResult;\n  try {\n    issuerResult = await verifyCompactJws(parts.issuerJwt, issuerKey, {\n      ...(options.issuer !== undefined ? { issuer: options.issuer } : {}),\n      ...(options.clockTolerance !== undefined ? { clockTolerance: options.clockTolerance } : {}),\n      ...(options.currentDate !== undefined ? { currentDate: options.currentDate } : {}),\n    });\n  } catch (err) {\n    return invalidCredential(err);\n  }\n\n  let resolved: Record<string, unknown>;\n  try {\n    resolved = await resolveDisclosures(\n      issuerResult.payload as Record<string, unknown>,\n      parts.disclosures,\n    );\n  } catch (err) {\n    return invalidCredential(err);\n  }\n  const parsedClosed = ClosedPaymentMandate.safeParse(resolved);\n  if (!parsedClosed.success) {\n    return {\n      ok: false,\n      code: \"invalid_credential\",\n      reason: `Closed Payment Mandate schema invalid: ${parsedClosed.error.issues[0]?.message ?? \"unknown\"}`,\n    };\n  }\n\n  if (parsedClosed.data.transaction_id !== options.expectedTransactionId) {\n    return {\n      ok: false,\n      code: \"invalid_mandate\",\n      reason: `Payment Mandate transaction_id '${parsedClosed.data.transaction_id}' does not match expected checkout_hash '${options.expectedTransactionId}'`,\n    };\n  }\n\n  const sdHash = await computeSdHash({\n    issuerJwt: parts.issuerJwt,\n    disclosures: parts.disclosures,\n  });\n  if (parts.kbJwt) {\n    if (!options.keyBinding) {\n      return {\n        ok: false,\n        code: \"invalid_credential\",\n        reason: \"Presentation includes KB-JWT but no keyBinding options were supplied\",\n      };\n    }\n    try {\n      await verifyKbJwt(parts.kbJwt, issuerKey, {\n        audience: options.keyBinding.audience,\n        nonce: options.keyBinding.nonce,\n        sdHash,\n      });\n    } catch (err) {\n      return invalidCredential(err);\n    }\n  }\n\n  return {\n    ok: true,\n    sdHash,\n    mandate: { closed: parsedClosed.data, sdHash },\n  };\n}\n\n// ---------------------------------------------------------------------------\n// OPEN PAYMENT MANDATE\n// ---------------------------------------------------------------------------\n\nexport interface VerifyOpenPaymentOptions extends CommonVerifyOptions {\n  closedMandate: TClosedPaymentMandate;\n  /** sd_hash of the linked Open Checkout Mandate (for `payment.reference`). */\n  linkedCheckoutMandateDigest?: string;\n  /** Optional stateful tracker for `payment.budget` / `payment.agent_recurrence`. */\n  tracker?: BudgetTracker;\n  keyBinding?: KeyBindingVerifyOptions;\n}\n\nexport async function verifyOpenPaymentMandate(\n  presentation: string,\n  options: VerifyOpenPaymentOptions,\n): Promise<VerificationOutcome<TOpenPaymentMandate>> {\n  return verifyOpenMandate(presentation, options, OpenPaymentMandate, async (mandate, sdHash) => {\n    // Resolve the paired `payment.agent_recurrence` (if any) so the budget\n    // evaluator can enforce both caps together.\n    const recurrence = mandate.constraints.find(\n      (c): c is Extract<Constraint, { type: \"payment.agent_recurrence\" }> =>\n        c.type === \"payment.agent_recurrence\",\n    );\n    for (const c of mandate.constraints) {\n      const result = await evaluatePaymentConstraint(c as Constraint, {\n        closedMandate: options.closedMandate,\n        openMandateDigest: sdHash,\n        ...(options.linkedCheckoutMandateDigest !== undefined\n          ? { linkedCheckoutMandateDigest: options.linkedCheckoutMandateDigest }\n          : {}),\n        ...(options.tracker !== undefined ? { tracker: options.tracker } : {}),\n        ...(recurrence !== undefined\n          ? {\n              budgetRecurrence: {\n                frequency: recurrence.frequency,\n                max_occurrences: recurrence.max_occurrences,\n              },\n            }\n          : {}),\n      });\n      if (!result.ok) return result;\n    }\n    return { ok: true } as EvaluationResult;\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Internal: shared open-mandate verification + constraint loop\n// ---------------------------------------------------------------------------\n\nasync function verifyOpenMandate<T>(\n  presentation: string,\n  options: CommonVerifyOptions & { keyBinding?: KeyBindingVerifyOptions },\n  schema: { safeParse: (input: unknown) => { success: true; data: T } | { success: false; error: { issues: Array<{ message?: string }> } } },\n  evaluate: (mandate: T, sdHash: string) => EvaluationResult | Promise<EvaluationResult>,\n): Promise<VerificationOutcome<T>> {\n  let parts;\n  try {\n    parts = parseSdJwt(presentation);\n  } catch (err) {\n    return invalidCredential(err);\n  }\n\n  const issuerKey = await resolveKey(options.issuerKey, options.issuerAlg ?? \"ES256\");\n  let issuerResult;\n  try {\n    issuerResult = await verifyCompactJws(parts.issuerJwt, issuerKey, {\n      ...(options.issuer !== undefined ? { issuer: options.issuer } : {}),\n      ...(options.clockTolerance !== undefined ? { clockTolerance: options.clockTolerance } : {}),\n      ...(options.currentDate !== undefined ? { currentDate: options.currentDate } : {}),\n    });\n  } catch (err) {\n    return invalidCredential(err);\n  }\n  let resolved: Record<string, unknown>;\n  try {\n    resolved = await resolveDisclosures(\n      issuerResult.payload as Record<string, unknown>,\n      parts.disclosures,\n    );\n  } catch (err) {\n    return invalidCredential(err);\n  }\n  const parsedOpen = schema.safeParse(resolved);\n  if (!parsedOpen.success) {\n    return {\n      ok: false,\n      code: \"invalid_credential\",\n      reason: `Open mandate schema invalid: ${parsedOpen.error.issues[0]?.message ?? \"unknown\"}`,\n    };\n  }\n  const sdHash = await computeSdHash({\n    issuerJwt: parts.issuerJwt,\n    disclosures: parts.disclosures,\n  });\n  if (parts.kbJwt) {\n    if (!options.keyBinding) {\n      return {\n        ok: false,\n        code: \"invalid_credential\",\n        reason: \"Presentation includes KB-JWT but no keyBinding options were supplied\",\n      };\n    }\n    try {\n      await verifyKbJwt(parts.kbJwt, issuerKey, {\n        audience: options.keyBinding.audience,\n        nonce: options.keyBinding.nonce,\n        sdHash,\n      });\n    } catch (err) {\n      return invalidCredential(err);\n    }\n  }\n\n  // Constraint evaluation.\n  const result = await evaluate(parsedOpen.data, sdHash);\n  if (!result.ok) {\n    return {\n      ok: false,\n      code: result.code,\n      reason: result.reason,\n    };\n  }\n\n  return { ok: true, sdHash, mandate: parsedOpen.data };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nasync function resolveKey(\n  keyOrJwk: Jwk | JoseCryptoKey,\n  alg: string,\n): Promise<JoseCryptoKey> {\n  // CryptoKey-likes (jose) have a `type` field of \"public\" | \"private\" |\n  // \"secret\"; JWKs have `kty`.\n  if (\"kty\" in keyOrJwk) {\n    return importPublicJwk(keyOrJwk, alg);\n  }\n  return keyOrJwk;\n}\n\nfunction invalidCredential(err: unknown): VerificationOutcome<never> {\n  return {\n    ok: false,\n    code: \"invalid_credential\",\n    reason: err instanceof Error ? err.message : String(err),\n  };\n}\n","// AP2 v0.2 receipts.\n//\n// Receipts are PLAIN JWTs (NOT SD-JWTs). They MUST be signed by the issuer\n// (Merchant for CheckoutReceipt, MPP for PaymentReceipt). The `reference`\n// claim binds the receipt to the closed mandate it confirms — equal to the\n// `sd_hash` of the closed mandate's SD-JWT presentation.\n\nimport {\n  signCompactJws,\n  verifyCompactJws,\n  type JoseCryptoKey,\n  type VerifyOptions,\n} from \"./crypto\";\nimport {\n  CheckoutReceipt,\n  PaymentReceipt,\n  type CheckoutReceipt as TCheckoutReceipt,\n  type PaymentReceipt as TPaymentReceipt,\n} from \"./schemas/receipts\";\n\n// ---------------------------------------------------------------------------\n// Build receipts (sign as compact JWT)\n// ---------------------------------------------------------------------------\n\nexport interface BuildCheckoutReceiptOptions {\n  receipt: TCheckoutReceipt;\n  signingKey: JoseCryptoKey;\n  alg?: string;\n  kid?: string;\n}\n\nexport async function buildCheckoutReceipt(\n  options: BuildCheckoutReceiptOptions,\n): Promise<string> {\n  const parsed = CheckoutReceipt.parse(options.receipt);\n  return signCompactJws(parsed as unknown as Record<string, unknown>, options.signingKey, {\n    alg: options.alg ?? \"ES256\",\n    typ: \"JWT\",\n    ...(options.kid !== undefined ? { kid: options.kid } : {}),\n  });\n}\n\nexport interface BuildPaymentReceiptOptions {\n  receipt: TPaymentReceipt;\n  signingKey: JoseCryptoKey;\n  alg?: string;\n  kid?: string;\n}\n\nexport async function buildPaymentReceipt(\n  options: BuildPaymentReceiptOptions,\n): Promise<string> {\n  const parsed = PaymentReceipt.parse(options.receipt);\n  return signCompactJws(parsed as unknown as Record<string, unknown>, options.signingKey, {\n    alg: options.alg ?? \"ES256\",\n    typ: \"JWT\",\n    ...(options.kid !== undefined ? { kid: options.kid } : {}),\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Verify receipts\n// ---------------------------------------------------------------------------\n\nexport interface VerifyReceiptOptions extends VerifyOptions {\n  /** Expected issuer (`iss` claim). */\n  expectedIssuer?: string;\n  /** Expected reference (sd_hash of the closed mandate). */\n  expectedReference?: string;\n}\n\nexport async function verifyCheckoutReceipt(\n  jws: string,\n  verificationKey: JoseCryptoKey,\n  options: VerifyReceiptOptions = {},\n): Promise<TCheckoutReceipt> {\n  const result = await verifyCompactJws(jws, verificationKey, options);\n  const parsed = CheckoutReceipt.safeParse(result.payload);\n  if (!parsed.success) {\n    throw new Error(\n      `CheckoutReceipt payload invalid: ${parsed.error.issues[0]?.message ?? \"unknown\"}`,\n    );\n  }\n  if (options.expectedIssuer && parsed.data.iss !== options.expectedIssuer) {\n    throw new Error(\n      `CheckoutReceipt iss mismatch: expected '${options.expectedIssuer}', got '${parsed.data.iss}'`,\n    );\n  }\n  if (\n    options.expectedReference &&\n    parsed.data.reference !== options.expectedReference\n  ) {\n    throw new Error(\n      `CheckoutReceipt reference mismatch: expected '${options.expectedReference}', got '${parsed.data.reference}'`,\n    );\n  }\n  return parsed.data;\n}\n\nexport async function verifyPaymentReceipt(\n  jws: string,\n  verificationKey: JoseCryptoKey,\n  options: VerifyReceiptOptions = {},\n): Promise<TPaymentReceipt> {\n  const result = await verifyCompactJws(jws, verificationKey, options);\n  const parsed = PaymentReceipt.safeParse(result.payload);\n  if (!parsed.success) {\n    throw new Error(\n      `PaymentReceipt payload invalid: ${parsed.error.issues[0]?.message ?? \"unknown\"}`,\n    );\n  }\n  if (options.expectedIssuer && parsed.data.iss !== options.expectedIssuer) {\n    throw new Error(\n      `PaymentReceipt iss mismatch: expected '${options.expectedIssuer}', got '${parsed.data.iss}'`,\n    );\n  }\n  if (\n    options.expectedReference &&\n    parsed.data.reference !== options.expectedReference\n  ) {\n    throw new Error(\n      `PaymentReceipt reference mismatch: expected '${options.expectedReference}', got '${parsed.data.reference}'`,\n    );\n  }\n  return parsed.data;\n}\n","// Multi-hop dSD-JWT chains for AP2 v0.2 delegated mandates.\n//\n// AP2 v0.2 §B.1 specifies a delegated SD-JWT (dSD-JWT) wire format where each\n// \"hop\" is a full SD-JWT presentation chunk (own `~`-separated disclosures\n// + own KB-JWT terminator), and chunks are joined with the canonical\n// chain separator `~~`:\n//\n//     <root chunk>~~<KB-SD-JWT hop 1>~~ ... ~~<terminal KB-SD-JWT hop>\n//\n// The root chunk is a normal SD-JWT signed by the original issuer (e.g. the\n// Trusted Agent Provider). Each subsequent hop is a Key Binding SD-JWT\n// signed by the previous hop's `cnf.jwk` (RFC 7800 PoP). The terminal hop\n// carries the closed mandate inside its `delegate_payload`.\n//\n// Verifier walk (per spec §C):\n//   1. Parse the chain.\n//   2. Verify hop[0] (root) with the trusted root issuer key.\n//   3. Resolve disclosures, extract `delegate_payload[0]` = open mandate\n//      (or chained `cnf.jwk` for delegate-only hops).\n//   4. Compute `sd_hash` of hop[0]'s presentation.\n//   5. For each subsequent hop[i]:\n//        - Verify signature with hop[i-1]'s `cnf.jwk` PoP key.\n//        - Validate `header.typ` ∈ `kb+sd-jwt` (terminal) or `kb+sd-jwt+kb`\n//          (intermediate).\n//        - Validate `sd_hash` claim equals the previous hop's `sd_hash`.\n//        - On terminal: validate `aud`, `nonce`.\n//        - Resolve disclosures, extract `delegate_payload[0]`.\n//   6. The terminal hop's `delegate_payload[0]` is the closed mandate.\n//      All non-terminal hops carry open mandates whose constraints MUST\n//      be evaluated against the closed mandate.\n//\n// We use the term \"chunk\" for the wire-level segment between `~~`s, and\n// \"hop\" for the parsed-and-verified result. They're 1:1.\n\nimport {\n  importPublicJwk,\n  verifyCompactJws,\n  type JoseCryptoKey,\n  type JWTPayload,\n  type JWTHeaderParameters,\n  type VerifyOptions as CryptoVerifyOptions,\n} from \"./crypto\";\nimport {\n  parseSdJwt,\n  serializeSdJwt,\n  computeSdHash,\n  resolveDisclosures,\n  SdJwtError,\n  type ParsedSdJwt,\n} from \"./sd-jwt\";\nimport {\n  ClosedCheckoutMandate,\n  OpenCheckoutMandate,\n  type ClosedCheckoutMandate as TClosedCheckoutMandate,\n  type OpenCheckoutMandate as TOpenCheckoutMandate,\n} from \"./schemas/checkout-mandate\";\nimport {\n  ClosedPaymentMandate,\n  OpenPaymentMandate,\n  type ClosedPaymentMandate as TClosedPaymentMandate,\n  type OpenPaymentMandate as TOpenPaymentMandate,\n} from \"./schemas/payment-mandate\";\nimport { Jwk, type Jwk as TJwk, type Cnf } from \"./schemas/jwk\";\nimport { evaluatePaymentConstraint, type BudgetTracker } from \"./constraints\";\nimport type { Constraint } from \"./schemas/constraints\";\n\n// ---------------------------------------------------------------------------\n// Constants + type aliases\n// ---------------------------------------------------------------------------\n\n/** Wire-level separator between hops. */\nexport const CHAIN_SEPARATOR = \"~~\";\n\nconst TERMINAL_TYP = [\"kb+sd-jwt\", \"kb-sd-jwt\"] as const;\nconst INTERMEDIATE_TYP = [\"kb+sd-jwt+kb\", \"kb-sd-jwt+kb\"] as const;\n\nexport type AnyOpenMandate = TOpenCheckoutMandate | TOpenPaymentMandate;\nexport type AnyClosedMandate = TClosedCheckoutMandate | TClosedPaymentMandate;\n\n// ---------------------------------------------------------------------------\n// Parsed chain shape\n// ---------------------------------------------------------------------------\n\nexport interface DsdJwtChain {\n  /** Original compact serialization. */\n  presentation: string;\n  /**\n   * Parsed hops in order — `hops[0]` is the root issuer SD-JWT, the last\n   * element is the terminal KB-SD-JWT carrying the closed mandate.\n   */\n  hops: ParsedSdJwt[];\n}\n\n/**\n * Parse a dSD-JWT chain into its constituent hops. Each hop's KB-JWT (if\n * present) ends up in `hops[i].kbJwt` per the underlying single-hop parser.\n *\n * NOTE: AP2 chains use `~~` between SD-JWTs, where each chunk independently\n * uses `~` for disclosures. We split on the literal `~~` substring; this\n * is unambiguous because a single hop's wire format ends in EITHER a\n * KB-JWT or a single trailing `~`, never two — and `<jws>~~<jws>` is\n * always a chain boundary.\n */\nexport function parseDsdJwtChain(presentation: string): DsdJwtChain {\n  if (!presentation.includes(CHAIN_SEPARATOR)) {\n    // Single-hop chain (degenerate case — equivalent to a regular SD-JWT).\n    return { presentation, hops: [parseSdJwt(presentation)] };\n  }\n  const rawChunks = presentation.split(CHAIN_SEPARATOR);\n  const hops: ParsedSdJwt[] = [];\n  for (let i = 0; i < rawChunks.length; i++) {\n    let chunk = rawChunks[i];\n    if (chunk === undefined || chunk.length === 0) {\n      throw new SdJwtError(\n        `dSD-JWT chain hop ${i} is empty (split on '${CHAIN_SEPARATOR}' produced an empty chunk)`,\n      );\n    }\n    // Each chunk on the wire is an SD-JWT presentation. RFC 9901 requires a\n    // trailing `~` on standalone SD-JWTs; when chunks are joined with the\n    // chain separator `~~`, that yields three tildes between hops. After\n    // splitting on `~~`, every non-first chunk starts with an extra `~`\n    // (the trailing tilde from the previous chunk's standalone form).\n    // Strip a single leading `~` to make `parseSdJwt` happy.\n    if (i > 0 && chunk.startsWith(\"~\")) {\n      chunk = chunk.slice(1);\n    }\n    // Ensure the chunk ends with the RFC 9901 trailing `~` UNLESS its last\n    // segment is a KB-JWT (3-part `header.payload.signature`). Chunks that\n    // were chain-joined typically lack the trailing tilde because it was\n    // consumed by the `~~` separator on the next chunk.\n    if (!chunk.endsWith(\"~\")) {\n      const segments = chunk.split(\"~\");\n      const last = segments[segments.length - 1] ?? \"\";\n      const lastIsJws = last.split(\".\").length === 3;\n      if (!lastIsJws) {\n        chunk = `${chunk}~`;\n      }\n    }\n    try {\n      hops.push(parseSdJwt(chunk));\n    } catch (err) {\n      throw new SdJwtError(\n        `Failed to parse hop ${i}: ${(err as Error).message}`,\n      );\n    }\n  }\n  return { presentation, hops };\n}\n\n/** Serialize a parsed chain back to compact form. */\nexport function serializeDsdJwtChain(chain: DsdJwtChain): string {\n  return chain.hops.map(serializeSdJwt).join(CHAIN_SEPARATOR);\n}\n\n// ---------------------------------------------------------------------------\n// Verifier\n// ---------------------------------------------------------------------------\n\nexport interface ChainVerifyOptions {\n  /** Trusted issuer key for the root hop (hop[0]). */\n  rootIssuerKey: TJwk | JoseCryptoKey;\n  /** Algorithm of root issuer key. Default ES256. */\n  rootIssuerAlg?: string;\n  /** Algorithms accepted on hop signatures. Default `[ES256, ES384, ES512, RS256, EdDSA]`. */\n  hopAlgs?: string[];\n  /** Audience the terminal hop binds to. */\n  expectedAudience: string;\n  /** Verifier-issued nonce — must equal terminal hop's `nonce`. */\n  expectedNonce: string;\n  /** Optional `iss` constraint on the root JWS. */\n  expectedRootIssuer?: string;\n  /** Clock tolerance for `iat` / `exp`. Default 30s. */\n  clockTolerance?: number;\n  /** Override \"now\" for tests. */\n  currentDate?: Date;\n  /**\n   * Optional stateful tracker for `payment.budget` / `payment.agent_recurrence`\n   * constraints carried by Open Payment Mandates in the chain. When omitted,\n   * those constraints pass as a documented no-op (caller responsibility).\n   */\n  tracker?: BudgetTracker;\n  /**\n   * sd_hash of the linked Open Checkout Mandate — required to evaluate a\n   * `payment.reference` constraint. When omitted, `payment.reference` fails\n   * with `unresolved_constraint`.\n   */\n  linkedCheckoutMandateDigest?: string;\n}\n\nexport interface ChainHopVerification {\n  /** Position in the chain (0 = root). */\n  index: number;\n  /** Decoded protected header. */\n  header: JWTHeaderParameters;\n  /** Decoded full JWS payload. */\n  payload: JWTPayload;\n  /**\n   * Resolved `delegate_payload` items — the things this hop is \"delegating\".\n   * For an open-mandate hop: a single open-mandate object.\n   * For an intermediate cnf-binding-only hop: a single object with `cnf.jwk`.\n   * For the terminal hop: the closed mandate.\n   */\n  delegatePayload: unknown[];\n  /** sd_hash of this hop's presentation. */\n  sdHash: string;\n  /** PoP key for the next hop, when this hop is not terminal. */\n  nextCnfJwk: TJwk | undefined;\n  /** True if this hop's typ is `kb+sd-jwt` (terminal-only hop). */\n  isTerminal: boolean;\n  /** True if this hop's typ is `kb+sd-jwt+kb` (intermediate hop). */\n  isIntermediate: boolean;\n}\n\nexport type ChainVerificationOutcome =\n  | {\n      ok: true;\n      hops: ChainHopVerification[];\n      /** Open mandates extracted from non-terminal hops. */\n      openMandates: AnyOpenMandate[];\n      /** Closed mandate from the terminal hop. */\n      closedMandate: AnyClosedMandate;\n      /** sd_hash of the terminal hop — receipt `reference`. */\n      terminalSdHash: string;\n    }\n  | {\n      ok: false;\n      hops: ChainHopVerification[];\n      code: \"invalid_credential\" | \"invalid_mandate\" | \"unresolved_constraint\";\n      reason: string;\n    };\n\nexport async function verifyDsdJwtChain(\n  presentation: string,\n  options: ChainVerifyOptions,\n): Promise<ChainVerificationOutcome> {\n  const hopAlgs = options.hopAlgs ?? [\"ES256\", \"ES384\", \"ES512\", \"RS256\", \"EdDSA\"];\n\n  let chain: DsdJwtChain;\n  try {\n    chain = parseDsdJwtChain(presentation);\n  } catch (err) {\n    return failure([], \"invalid_credential\", (err as Error).message);\n  }\n  if (chain.hops.length === 0) {\n    return failure([], \"invalid_credential\", \"Chain has no hops\");\n  }\n\n  const verifications: ChainHopVerification[] = [];\n  let currentVerifyKey = await resolveKey(\n    options.rootIssuerKey,\n    options.rootIssuerAlg ?? \"ES256\",\n  );\n  let prevSdHash: string | undefined;\n\n  for (let i = 0; i < chain.hops.length; i++) {\n    const hop = chain.hops[i]!;\n    const isLast = i === chain.hops.length - 1;\n    const isRoot = i === 0;\n\n    // 1. Verify issuer JWS signature.\n    const verifyOpts: CryptoVerifyOptions = {\n      algorithms: hopAlgs,\n      ...(options.clockTolerance !== undefined\n        ? { clockTolerance: options.clockTolerance }\n        : {}),\n      ...(options.currentDate !== undefined\n        ? { currentDate: options.currentDate }\n        : {}),\n      ...(isRoot && options.expectedRootIssuer !== undefined\n        ? { issuer: options.expectedRootIssuer }\n        : {}),\n    };\n    let issuerResult;\n    try {\n      issuerResult = await verifyCompactJws(hop.issuerJwt, currentVerifyKey, verifyOpts);\n    } catch (err) {\n      return failure(\n        verifications,\n        \"invalid_credential\",\n        `Hop ${i} signature verification failed: ${(err as Error).message}`,\n      );\n    }\n    const header = issuerResult.protectedHeader;\n    const payload = issuerResult.payload;\n\n    // 2. Validate hop typ for chained delegation:\n    //   - Root hop is normal SD-JWT (any typ; commonly `example+sd-jwt` or `dc+sd-jwt`)\n    //   - Intermediate hops MUST use `kb+sd-jwt+kb` (carry forward cnf)\n    //   - Terminal hop MUST use `kb+sd-jwt`\n    if (!isRoot) {\n      const typ = header.typ;\n      const expected: readonly string[] = isLast ? TERMINAL_TYP : INTERMEDIATE_TYP;\n      if (typeof typ !== \"string\" || !expected.includes(typ)) {\n        return failure(\n          verifications,\n          \"invalid_credential\",\n          `Hop ${i} has typ='${typ}', expected one of [${expected.join(\", \")}]`,\n        );\n      }\n    }\n\n    // 3. Validate sd_hash chain (each non-root hop's payload.sd_hash must\n    //    equal the previous hop's computed sd_hash).\n    if (!isRoot) {\n      const claimed = (payload as { sd_hash?: unknown }).sd_hash;\n      if (typeof claimed !== \"string\") {\n        return failure(\n          verifications,\n          \"invalid_credential\",\n          `Hop ${i} is missing sd_hash claim`,\n        );\n      }\n      if (claimed !== prevSdHash) {\n        return failure(\n          verifications,\n          \"invalid_credential\",\n          `Hop ${i} sd_hash mismatch: claimed='${claimed}', expected='${prevSdHash}'`,\n        );\n      }\n    }\n\n    // 4. On terminal hop, validate aud + nonce.\n    if (isLast && !isRoot) {\n      const aud = (payload as { aud?: unknown }).aud;\n      if (aud !== options.expectedAudience) {\n        return failure(\n          verifications,\n          \"invalid_credential\",\n          `Terminal hop aud mismatch: payload='${String(aud)}', expected='${options.expectedAudience}'`,\n        );\n      }\n      const nonce = (payload as { nonce?: unknown }).nonce;\n      if (nonce !== options.expectedNonce) {\n        return failure(\n          verifications,\n          \"invalid_credential\",\n          `Terminal hop nonce mismatch`,\n        );\n      }\n    }\n\n    // 5. Resolve disclosures into the issuer payload.\n    let resolved: Record<string, unknown>;\n    try {\n      resolved = await resolveDisclosures(\n        payload as Record<string, unknown>,\n        hop.disclosures,\n      );\n    } catch (err) {\n      return failure(\n        verifications,\n        \"invalid_credential\",\n        `Hop ${i} disclosure resolution failed: ${(err as Error).message}`,\n      );\n    }\n\n    // 6. Extract delegate_payload (canonical AP2 structure).\n    const delegatePayload = resolved[\"delegate_payload\"];\n    if (!Array.isArray(delegatePayload) || delegatePayload.length === 0) {\n      return failure(\n        verifications,\n        \"invalid_credential\",\n        `Hop ${i} has no delegate_payload (or it's not an array)`,\n      );\n    }\n\n    // 7. Compute this hop's sd_hash for the next iteration.\n    const sdHash = await computeSdHash({\n      issuerJwt: hop.issuerJwt,\n      disclosures: hop.disclosures,\n    });\n\n    // 8. Extract cnf.jwk for next hop, if not terminal.\n    let nextCnfJwk: TJwk | undefined;\n    if (!isLast) {\n      const item = delegatePayload[0] as { cnf?: Cnf } | null;\n      const cnfJwk = item?.cnf?.jwk;\n      if (!cnfJwk) {\n        return failure(\n          verifications,\n          \"invalid_credential\",\n          `Hop ${i} delegate_payload[0] has no cnf.jwk for next hop`,\n        );\n      }\n      // Validate the JWK shape.\n      const validated = Jwk.safeParse(cnfJwk);\n      if (!validated.success) {\n        return failure(\n          verifications,\n          \"invalid_credential\",\n          `Hop ${i} cnf.jwk is invalid: ${validated.error.issues[0]?.message ?? \"unknown\"}`,\n        );\n      }\n      nextCnfJwk = validated.data;\n      try {\n        currentVerifyKey = await importPublicJwk(validated.data, \"ES256\");\n      } catch (err) {\n        return failure(\n          verifications,\n          \"invalid_credential\",\n          `Failed to import hop ${i} cnf.jwk: ${(err as Error).message}`,\n        );\n      }\n    }\n\n    verifications.push({\n      index: i,\n      header,\n      payload,\n      delegatePayload,\n      sdHash,\n      nextCnfJwk,\n      isTerminal: isLast && !isRoot,\n      isIntermediate: !isRoot && !isLast,\n    });\n\n    prevSdHash = sdHash;\n  }\n\n  // Extract open mandates from non-terminal hops + closed mandate from terminal.\n  const openMandates: AnyOpenMandate[] = [];\n  // Open PAYMENT mandates paired with their hop sd_hash — used both to\n  // evaluate constraints and to key any stateful budget tracker.\n  const openPaymentMandates: Array<{\n    mandate: TOpenPaymentMandate;\n    digest: string;\n  }> = [];\n  let closedMandate: AnyClosedMandate | undefined;\n  for (let i = 0; i < verifications.length; i++) {\n    const v = verifications[i]!;\n    const item = v.delegatePayload[0];\n    if (i === verifications.length - 1) {\n      // Terminal: closed mandate.\n      const c1 = ClosedCheckoutMandate.safeParse(item);\n      if (c1.success) {\n        closedMandate = c1.data;\n        continue;\n      }\n      const c2 = ClosedPaymentMandate.safeParse(item);\n      if (c2.success) {\n        closedMandate = c2.data;\n        continue;\n      }\n      return failure(\n        verifications,\n        \"invalid_credential\",\n        `Terminal hop delegate_payload[0] is not a known closed mandate type`,\n      );\n    } else {\n      // Non-terminal: open mandate (or pure cnf-binding hop, which is also OK).\n      const o1 = OpenCheckoutMandate.safeParse(item);\n      if (o1.success) {\n        openMandates.push(o1.data);\n        continue;\n      }\n      const o2 = OpenPaymentMandate.safeParse(item);\n      if (o2.success) {\n        openMandates.push(o2.data);\n        openPaymentMandates.push({ mandate: o2.data, digest: v.sdHash });\n        continue;\n      }\n      // Pure cnf-binding hop — no mandate to extract, just key delegation.\n      // This is allowed in the spec for relay/forwarding hops.\n    }\n  }\n\n  if (!closedMandate) {\n    return failure(\n      verifications,\n      \"invalid_credential\",\n      \"No closed mandate extracted from terminal hop\",\n    );\n  }\n\n  // Evaluate every Open Payment Mandate's constraints against the terminal\n  // Closed Payment Mandate. Without this, a delegated payment that violates\n  // the delegating mandate's budget / allowed-payee / execution-date / etc.\n  // guardrails would pass verification. This mirrors the single-hop\n  // `verifyOpenPaymentMandate` wiring (see src/verifier.ts).\n  if (openPaymentMandates.length > 0) {\n    const closedPayment = ClosedPaymentMandate.safeParse(closedMandate);\n    if (!closedPayment.success) {\n      // Open Payment Mandates delegate a payment, so the terminal MUST be a\n      // Closed Payment Mandate. A mismatched family means the chain is\n      // internally inconsistent — fail rather than skip the guardrails.\n      return failure(\n        verifications,\n        \"invalid_mandate\",\n        \"Chain carries Open Payment Mandate constraints but the terminal closed mandate is not a Closed Payment Mandate.\",\n      );\n    }\n    for (const { mandate, digest } of openPaymentMandates) {\n      const recurrence = mandate.constraints.find(\n        (c): c is Extract<Constraint, { type: \"payment.agent_recurrence\" }> =>\n          c.type === \"payment.agent_recurrence\",\n      );\n      for (const c of mandate.constraints) {\n        const result = await evaluatePaymentConstraint(c as Constraint, {\n          closedMandate: closedPayment.data,\n          openMandateDigest: digest,\n          ...(options.tracker !== undefined ? { tracker: options.tracker } : {}),\n          ...(options.linkedCheckoutMandateDigest !== undefined\n            ? { linkedCheckoutMandateDigest: options.linkedCheckoutMandateDigest }\n            : {}),\n          ...(recurrence !== undefined\n            ? {\n                budgetRecurrence: {\n                  frequency: recurrence.frequency,\n                  max_occurrences: recurrence.max_occurrences,\n                },\n              }\n            : {}),\n        });\n        if (!result.ok) {\n          return failure(verifications, result.code, result.reason);\n        }\n      }\n    }\n  }\n\n  return {\n    ok: true,\n    hops: verifications,\n    openMandates,\n    closedMandate,\n    terminalSdHash: verifications[verifications.length - 1]!.sdHash,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nasync function resolveKey(\n  keyOrJwk: TJwk | JoseCryptoKey,\n  alg: string,\n): Promise<JoseCryptoKey> {\n  if (\"kty\" in keyOrJwk) return importPublicJwk(keyOrJwk, alg);\n  return keyOrJwk;\n}\n\nfunction failure(\n  hops: ChainHopVerification[],\n  code: \"invalid_credential\" | \"invalid_mandate\" | \"unresolved_constraint\",\n  reason: string,\n): ChainVerificationOutcome {\n  return { ok: false, hops, code, reason };\n}\n"]}