{"version":3,"file":"index.cjs","names":["CheckoutResponseSchema","UcpDiscoveryProfileSchema","CartSchema","CheckoutCreateRequestSchema","CheckoutUpdateRequestSchema","CheckoutCompleteRequestSchema","OrderSchema","config: HttpClientConfig","token: string","method: HttpMethod","path: string","body?: unknown","headers: Record<string, string>","data: unknown","schema: ZodType<Output, Def, Input>","res: Response","UCPError","statusCode: number","UCPIdempotencyConflictError","rawMessages: unknown[]","m: unknown","validTypes: readonly string[]","type: MessageType","http: HttpClient","extensions: CheckoutExtensions","payload: CreateCheckoutPayload","id: string","patch: UpdateCheckoutPayload","payload: CompleteCheckoutPayload","type: string","destinationId: string","optionId: string","destinationId?: string","codes: readonly string[]","payload: FulfillmentMethodCreatePayload","methodId: string","payload: FulfillmentMethodUpdatePayload","groupId: string","payload: FulfillmentGroupUpdatePayload","patch: FulfillmentDiscountPatch","data: unknown","UCPEscalationError","http: HttpClient","id: string","UCPSpecOrderSchema","payload: OrderUpdatePayload","OrderUpdateSchema","lineItemId: string","payload: LineItemUpdatePayload","http: HttpClient","extensions: CatalogExtensions","query: string","filters?: SearchFilters","pagination?: Pagination","payload: Record<string, unknown>","CatalogSearchSchema","productId: string","CatalogLookupSchema","http: HttpClient","payload: CartCreatePayload","id: string","payload: CartUpdatePayload","metadata: OAuthServerMetadata","params: AuthorizationParams","params: TokenExchangeParams","params: TokenRefreshParams","params: TokenRevokeParams","UCPOAuthError","clientId: string","clientSecret: string","body: URLSearchParams","raw: unknown","username: string","password: string","client: ConnectedClient","tools: AgentTool[]","config: UCPClientConfig","options?: { readonly onValidationWarning?: LogFn }","client: ConnectedClient","profile: UCPProfile","PaymentHandlerBaseSchema","keys: JWK[]","http: HttpClient","capabilityNames: Set<string>","extensions: CheckoutExtensions","extensions: CatalogExtensions","raw: unknown","checkout: CheckoutCapability | null","order: OrderCapability | null","catalog: CatalogCapability | null","cart: CartCapability | null","identityLinking: IdentityLinkingCapability | null","tools: ToolDescriptor[]","body: string","signature: string","signingKeys: readonly JWK[]","header: Record<string, unknown>","cryptoKey: CryptoKey","sigBytes: Uint8Array<ArrayBuffer>","gatewayUrl: string","options?: { readonly refetchCooldownMs?: number }","loadingPromise: Promise<void> | null","profile: unknown","b64url: string","body: string","raw: unknown","UCPError"],"sources":["../src/schemas.ts","../src/http.ts","../src/capabilities/checkout.ts","../src/capabilities/order.ts","../src/capabilities/catalog.ts","../src/capabilities/cart.ts","../src/capabilities/identity-linking.ts","../src/types/config.ts","../src/agent-tools.ts","../src/UCPClient.ts","../src/verify-signature.ts","../src/parse-webhook-event.ts"],"sourcesContent":["import { z } from 'zod';\n\n// Only import schemas needed for aliases or the WebhookEventSchema definition.\n// Everything else is re-exported directly via `export { ... } from` below.\nimport {\n  UcpDiscoveryProfileSchema,\n  CheckoutResponseSchema,\n  CheckoutCreateRequestSchema,\n  CheckoutUpdateRequestSchema,\n  CheckoutCompleteRequestSchema,\n  OrderSchema,\n  CartSchema,\n  UcpSigningKeySchema,\n} from '@omnixhq/ucp-js-sdk';\n\n// ─── Internal aliases ───────────────────────────────────────────────────────\n// Used by UCPClient and capabilities for validation.\n\nexport const CheckoutSessionSchema = CheckoutResponseSchema;\nexport const UCPProfileSchema = UcpDiscoveryProfileSchema;\nexport const CartResponseSchema = CartSchema;\n\nexport const CreateCheckoutRequestSchema = CheckoutCreateRequestSchema;\nexport const UpdateCheckoutRequestSchema = CheckoutUpdateRequestSchema;\nexport const CompleteCheckoutRequestSchema = CheckoutCompleteRequestSchema;\n\n// ─── Custom schemas ─────────────────────────────────────────────────────────\n// Not in the SDK — defined here.\n\nexport const WebhookEventSchema = z.object({\n  event_id: z.string(),\n  created_time: z.string(),\n  order: OrderSchema,\n});\n\nexport { UcpSigningKeySchema as JWKSchema };\n\n// ─── SDK re-exports ─────────────────────────────────────────────────────────\n// Direct re-export from the SDK. Each schema appears only once.\n\nexport {\n  // Enums / status\n  CheckoutResponseStatusSchema,\n  CheckoutStatusEnumSchema,\n\n  // Sub-entity schemas (checkout internals)\n  BuyerSchema,\n  TotalResponseSchema,\n  LineItemResponseSchema,\n  MessageSchema,\n  MessageErrorSchema,\n  PostalAddressSchema,\n  PaymentResponseSchema,\n  PaymentHandlerResponseSchema,\n  PaymentInstrumentSchema,\n  FulfillmentResponseSchema,\n  FulfillmentMethodResponseSchema,\n  ItemResponseSchema,\n\n  // Order (UCP spec order — different from gateway's UCPOrderSchema)\n  OrderSchema as UCPSpecOrderSchema,\n\n  // Checkout\n  CheckoutSchema,\n  CheckoutResponseSchema,\n  CheckoutCreateRequestSchema,\n  CheckoutUpdateRequestSchema,\n  CheckoutCompleteRequestSchema,\n\n  // AP2 Mandate\n  Ap2MandateAp2WithCheckoutMandateSchema,\n  Ap2MandateAp2WithMerchantAuthorizationSchema,\n  Ap2MandateCheckoutMandateSchema,\n  Ap2MandateErrorCodeSchema,\n  Ap2MandateMerchantAuthorizationSchema,\n\n  // Buyer Consent\n  BuyerConsentBuyerSchema,\n  BuyerConsentConsentSchema,\n\n  // Discount\n  DiscountAllocationSchema,\n  DiscountAppliedDiscountSchema,\n  DiscountAppliedDiscountMethodEnumSchema,\n  DiscountDiscountsObjectSchema,\n\n  // Fulfillment (core)\n  FulfillmentSchema,\n  FulfillmentOptionSchema,\n  FulfillmentGroupSchema,\n  FulfillmentMethodSchema,\n  FulfillmentAvailableMethodSchema,\n  FulfillmentAvailableMethodTypeEnumSchema,\n  FulfillmentDestinationSchema,\n  FulfillmentEventSchema,\n  FulfillmentMethodTypeEnumSchema,\n\n  // Fulfillment (extension)\n  FulfillmentExtensionFulfillmentSchema,\n  FulfillmentExtensionFulfillmentOptionSchema,\n  FulfillmentExtensionFulfillmentGroupSchema,\n  FulfillmentExtensionFulfillmentMethodSchema,\n  FulfillmentExtensionFulfillmentAvailableMethodSchema,\n\n  // Fulfillment (config)\n  BusinessFulfillmentConfigSchema,\n  MerchantFulfillmentConfigSchema,\n  PlatformFulfillmentConfigSchema,\n\n  // Fulfillment (requests)\n  FulfillmentMethodCreateRequestSchema,\n  FulfillmentMethodUpdateRequestSchema,\n  FulfillmentGroupUpdateRequestSchema,\n\n  // Payment\n  AmountSchema,\n  PaymentSchema,\n  PaymentCredentialSchema,\n  PaymentIdentitySchema,\n  PaymentInstrumentResponseSchema,\n  AvailablePaymentInstrumentSchema,\n  CardCredentialSchema,\n  CardCredentialCardNumberTypeEnumSchema,\n  CardPaymentInstrumentAvailableCardPaymentInstrumentSchema,\n  TokenCredentialSchema,\n  SignedAmountSchema,\n  TotalsSchema,\n\n  // Payment Handler (roles)\n  PaymentHandlerBaseSchema,\n  PaymentHandlerBusinessSchema,\n  PaymentHandlerPlatformSchema,\n\n  // Order (sub-entities)\n  OrderConfirmationSchema,\n  OrderLineItemSchema,\n  OrderLineItemStatusEnumSchema,\n  OrderUpdateSchema,\n\n  // Item / LineItem\n  ItemSchema,\n  LineItemSchema,\n  LineItemUpdateRequestSchema,\n\n  // Message\n  MessageInfoSchema,\n  MessageInfoContentTypeEnumSchema,\n  MessageWarningSchema,\n  MessageWarningContentTypeEnumSchema,\n  MessageErrorContentTypeEnumSchema,\n  MessageErrorSeverityEnumSchema,\n\n  // Error handling\n  ErrorResponseSchema,\n  ErrorCodeSchema,\n  InputCorrelationSchema,\n  UcpErrorSchema,\n  UcpSuccessSchema,\n\n  // Catalog\n  CatalogSearchSchema,\n  CatalogLookupSchema,\n  ProductSchema,\n  VariantSchema,\n  CategorySchema,\n  ProductOptionSchema,\n  OptionValueSchema,\n  DetailOptionValueSchema,\n  SelectedOptionSchema,\n  MediaSchema,\n  DescriptionSchema,\n  RatingSchema,\n  PriceSchema,\n  PriceRangeSchema,\n  PriceFilterSchema,\n  PaginationSchema,\n  SearchFiltersSchema,\n  SignalsSchema,\n\n  // Cart\n  CartSchema,\n  CartCreateRequestSchema,\n  CartUpdateRequestSchema,\n\n  // UCP protocol\n  UcpBaseSchema,\n  UcpBaseStatusEnumSchema,\n  UcpBusinessSchema,\n  UcpPlatformSchema,\n  UcpEntitySchema,\n  UcpRequiresSchema,\n  UcpResponseCartSchema,\n  UcpResponseCatalogSchema,\n  UcpResponseCheckoutSchema,\n  UcpResponseOrderSchema,\n  UcpVersionSchema,\n  UcpVersionConstraintSchema,\n  UcpSigningKeySchema,\n  UcpDiscoveryBusinessProfileSchema,\n  UcpDiscoveryPlatformProfileSchema,\n  ReverseDomainNameSchema,\n\n  // Capability / Service\n  CapabilityBaseSchema,\n  CapabilityBusinessSchema,\n  CapabilityPlatformSchema,\n  CapabilityResponseSchema,\n  ServiceBaseSchema,\n  ServiceBaseTransportEnumSchema,\n  ServiceBusinessSchema,\n  ServicePlatformSchema,\n  ServiceResponseSchema,\n\n  // Profile\n  ProfileSchemaBaseSchema,\n  ProfileSchemaBusinessProfileSchema,\n  ProfileSchemaPlatformProfileSchema,\n  ProfileSchemaSigningKeySchema,\n  ProfileSchemaSigningKeyUseEnumSchema,\n\n  // Misc\n  AccountInfoSchema,\n  AdjustmentSchema,\n  AdjustmentStatusEnumSchema,\n  BindingSchema,\n  ContextSchema,\n  EmbeddedConfigSchema,\n  ExpectationSchema,\n  ExpectationMethodTypeEnumSchema,\n  LinkSchema,\n  RetailLocationSchema,\n  ShippingDestinationSchema,\n  TotalSchema,\n} from '@omnixhq/ucp-js-sdk';\n","import { randomUUID } from 'node:crypto';\nimport type { ZodType } from 'zod';\nimport { UCPError, UCPIdempotencyConflictError } from './errors.js';\nimport type { UCPMessage, MessageType } from './errors.js';\nimport { MessageErrorSchema, MessageInfoSchema, MessageWarningSchema } from './schemas.js';\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\n\nexport type LogFn = (message: string, detail?: string) => void;\n\nexport interface HttpClientConfig {\n  readonly gatewayUrl: string;\n  readonly agentProfileUrl: string;\n  readonly ucpVersion: string;\n  readonly requestSignature?: string;\n  readonly accessToken?: string;\n  readonly onValidationWarning?: LogFn;\n}\n\nexport class HttpClient {\n  private readonly gatewayUrl: string;\n  private readonly agentProfileUrl: string;\n  private readonly ucpVersion: string;\n  private readonly requestSignature: string | undefined;\n  private readonly accessToken: string | undefined;\n  private readonly onValidationWarning: LogFn;\n\n  constructor(config: HttpClientConfig) {\n    this.gatewayUrl = config.gatewayUrl;\n    this.agentProfileUrl = config.agentProfileUrl;\n    this.ucpVersion = config.ucpVersion;\n    this.requestSignature = config.requestSignature;\n    this.accessToken = config.accessToken;\n    this.onValidationWarning = config.onValidationWarning ?? (() => undefined);\n  }\n\n  withAccessToken(token: string): HttpClient {\n    return new HttpClient({\n      gatewayUrl: this.gatewayUrl,\n      agentProfileUrl: this.agentProfileUrl,\n      ucpVersion: this.ucpVersion,\n      ...(this.requestSignature !== undefined ? { requestSignature: this.requestSignature } : {}),\n      accessToken: token,\n      onValidationWarning: this.onValidationWarning,\n    });\n  }\n\n  async request(method: HttpMethod, path: string, body?: unknown): Promise<unknown> {\n    const url = `${this.gatewayUrl}${path}`;\n    const requestId = randomUUID();\n\n    const headers: Record<string, string> = {\n      'UCP-Agent': `profile=\"${this.agentProfileUrl}\", version=\"${this.ucpVersion}\"`,\n      'request-id': requestId,\n    };\n\n    if (body !== undefined) {\n      headers['Content-Type'] = 'application/json';\n    }\n\n    if (this.requestSignature !== undefined) {\n      headers['request-signature'] = this.requestSignature;\n    }\n\n    if (this.accessToken !== undefined) {\n      headers['Authorization'] = `Bearer ${this.accessToken}`;\n    }\n\n    if (method === 'POST' || method === 'PUT') {\n      headers['idempotency-key'] = randomUUID();\n    }\n\n    const res = await fetch(url, {\n      method,\n      headers,\n      ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n    });\n\n    const data = await this.parseResponseBody(res);\n\n    if (!res.ok) {\n      this.throwFromResponse(data, res.status);\n    }\n\n    return data;\n  }\n\n  validate<Output, Def extends import('zod').ZodTypeDef, Input>(\n    data: unknown,\n    schema: ZodType<Output, Def, Input>,\n  ): Output {\n    const result = schema.safeParse(data);\n    if (!result.success) {\n      this.onValidationWarning('[UCPClient] Response validation failed:', result.error.message);\n      // Intentional forward-compat: return raw data so callers keep working when the server\n      // returns a newer schema version than the client's Zod schema knows about.\n      // Callers that need strict validation should provide onValidationWarning and handle it.\n      return data as Output;\n    }\n    return result.data;\n  }\n\n  private async parseResponseBody(res: Response): Promise<unknown> {\n    // Prefer .text() + JSON.parse() so the raw body is available for error\n    // messages when the response is not valid JSON (e.g. HTML from a gateway).\n    // Fall back to .json() for environments where .text() is not available\n    // (e.g. lightweight test mocks).\n    if (typeof res.text === 'function') {\n      const text = await res.text();\n      try {\n        return JSON.parse(text) as unknown;\n      } catch {\n        if (!res.ok) {\n          throw new UCPError(\n            'HTTP_ERROR',\n            `Gateway returned ${res.status} with non-JSON body: ${text.slice(0, 200)}`,\n            'error',\n            res.status,\n          );\n        }\n        return {};\n      }\n    }\n    return (await res.json().catch(() => ({}))) as unknown;\n  }\n\n  private throwFromResponse(data: unknown, statusCode: number): never {\n    if (\n      typeof data === 'object' &&\n      data !== null &&\n      Array.isArray((data as Record<string, unknown>)['messages'])\n    ) {\n      const rawMessages = (data as Record<string, unknown>)['messages'] as unknown[];\n      if (rawMessages.length > 0) {\n        const allMessages = parseMessages(rawMessages);\n        const first = allMessages[0]!;\n        const code = first.code ?? 'UNKNOWN';\n\n        throw new UCPError(code, first.content, first.type, statusCode, {\n          ...(first.path !== undefined ? { path: first.path } : {}),\n          ...(first.content_type !== undefined ? { contentType: first.content_type } : {}),\n          messages: allMessages,\n        });\n      }\n    }\n\n    if (statusCode === 409) throw new UCPIdempotencyConflictError();\n    throw new UCPError('HTTP_ERROR', `Gateway returned ${statusCode}`, 'error', statusCode);\n  }\n}\n\nfunction parseMessages(rawMessages: unknown[]): UCPMessage[] {\n  return rawMessages.map((m: unknown) => {\n    const record = m as Record<string, unknown>;\n    const rawType = String(record['type'] ?? 'error');\n\n    if (rawType === 'error') {\n      const parsed = MessageErrorSchema.safeParse(m);\n      if (parsed.success) {\n        return {\n          type: 'error' as const,\n          code: parsed.data.code,\n          content: parsed.data.content,\n          severity: parsed.data.severity,\n          ...(parsed.data.path !== undefined ? { path: parsed.data.path } : {}),\n          ...(parsed.data.content_type !== undefined\n            ? { content_type: parsed.data.content_type }\n            : {}),\n        };\n      }\n    }\n\n    if (rawType === 'warning') {\n      const parsed = MessageWarningSchema.safeParse(m);\n      if (parsed.success) {\n        return {\n          type: 'warning' as const,\n          code: parsed.data.code,\n          content: parsed.data.content,\n          ...(parsed.data.path !== undefined ? { path: parsed.data.path } : {}),\n          ...(parsed.data.content_type !== undefined\n            ? { content_type: parsed.data.content_type }\n            : {}),\n        };\n      }\n    }\n\n    if (rawType === 'info') {\n      const parsed = MessageInfoSchema.safeParse(m);\n      if (parsed.success) {\n        return {\n          type: 'info' as const,\n          content: parsed.data.content,\n          ...(parsed.data.code !== undefined ? { code: parsed.data.code } : {}),\n          ...(parsed.data.path !== undefined ? { path: parsed.data.path } : {}),\n          ...(parsed.data.content_type !== undefined\n            ? { content_type: parsed.data.content_type }\n            : {}),\n        };\n      }\n    }\n\n    const validTypes: readonly string[] = ['error', 'warning', 'info'];\n    const type: MessageType = validTypes.includes(rawType) ? (rawType as MessageType) : 'error';\n\n    return {\n      type,\n      content: String(record['content'] ?? record['text'] ?? record['message'] ?? 'Unknown error'),\n      ...(record['code'] !== undefined ? { code: String(record['code']) } : {}),\n    };\n  });\n}\n","import type { HttpClient } from '../http.js';\nimport { UCPEscalationError } from '../errors.js';\nimport { CheckoutSessionSchema } from '../schemas.js';\nimport type {\n  CheckoutSession,\n  CheckoutExtensions,\n  CreateCheckoutPayload,\n  UpdateCheckoutPayload,\n  CompleteCheckoutPayload,\n  FulfillmentMethodCreatePayload,\n  FulfillmentMethodUpdatePayload,\n  FulfillmentGroupUpdatePayload,\n} from '../types/checkout.js';\n\nconst DEFAULT_METHOD_ID = 'default';\nconst DEFAULT_GROUP_ID = 'default';\n\n/** Internal payload shape for PUT /checkout-sessions/:id with fulfillment/discount fields. */\ninterface FulfillmentDiscountPatch {\n  readonly fulfillment?: {\n    readonly methods?: ReadonlyArray<{\n      readonly id: string;\n      readonly type?: string;\n      readonly selected_destination_id?: string;\n      readonly groups?: ReadonlyArray<{\n        readonly id: string;\n        readonly selected_option_id?: string;\n      }>;\n    }>;\n  };\n  readonly discounts?: {\n    readonly codes?: readonly string[];\n  };\n}\n\n/**\n * Checkout session operations. Available when the server declares `dev.ucp.shopping.checkout`.\n * Check `extensions` to see which optional features (fulfillment, discount, etc.) are supported.\n */\nexport class CheckoutCapability {\n  /** Which checkout extensions the server supports. */\n  readonly extensions: CheckoutExtensions;\n\n  constructor(\n    private readonly http: HttpClient,\n    extensions: CheckoutExtensions,\n  ) {\n    this.extensions = extensions;\n  }\n\n  async create(payload: CreateCheckoutPayload): Promise<CheckoutSession> {\n    const data = await this.http.request('POST', '/checkout-sessions', payload);\n    return this.validateSession(data);\n  }\n\n  async get(id: string): Promise<CheckoutSession> {\n    const data = await this.http.request('GET', `/checkout-sessions/${encodeURIComponent(id)}`);\n    return this.validateSession(data);\n  }\n\n  async update(id: string, patch: UpdateCheckoutPayload): Promise<CheckoutSession> {\n    const data = await this.http.request(\n      'PUT',\n      `/checkout-sessions/${encodeURIComponent(id)}`,\n      patch,\n    );\n    return this.validateSession(data);\n  }\n\n  async complete(id: string, payload: CompleteCheckoutPayload): Promise<CheckoutSession> {\n    const data = await this.http.request(\n      'POST',\n      `/checkout-sessions/${encodeURIComponent(id)}/complete`,\n      payload,\n    );\n    return this.validateSession(data);\n  }\n\n  async cancel(id: string): Promise<CheckoutSession> {\n    const data = await this.http.request(\n      'POST',\n      `/checkout-sessions/${encodeURIComponent(id)}/cancel`,\n    );\n    return this.validateSession(data);\n  }\n\n  async setFulfillment(id: string, type: string): Promise<CheckoutSession> {\n    return this.patchFulfillmentDiscount(id, {\n      fulfillment: { methods: [{ id: DEFAULT_METHOD_ID, type }] },\n    });\n  }\n\n  async selectDestination(\n    id: string,\n    destinationId: string,\n    fulfillmentType = 'shipping',\n  ): Promise<CheckoutSession> {\n    return this.patchFulfillmentDiscount(id, {\n      fulfillment: {\n        methods: [\n          { id: DEFAULT_METHOD_ID, type: fulfillmentType, selected_destination_id: destinationId },\n        ],\n      },\n    });\n  }\n\n  async selectFulfillmentOption(\n    id: string,\n    optionId: string,\n    destinationId?: string,\n    fulfillmentType = 'shipping',\n  ): Promise<CheckoutSession> {\n    return this.patchFulfillmentDiscount(id, {\n      fulfillment: {\n        methods: [\n          {\n            id: DEFAULT_METHOD_ID,\n            type: fulfillmentType,\n            ...(destinationId !== undefined ? { selected_destination_id: destinationId } : {}),\n            groups: [{ id: DEFAULT_GROUP_ID, selected_option_id: optionId }],\n          },\n        ],\n      },\n    });\n  }\n\n  async applyDiscountCodes(id: string, codes: readonly string[]): Promise<CheckoutSession> {\n    return this.patchFulfillmentDiscount(id, { discounts: { codes: [...codes] } });\n  }\n\n  async createFulfillmentMethod(\n    id: string,\n    payload: FulfillmentMethodCreatePayload,\n  ): Promise<CheckoutSession> {\n    const data = await this.http.request(\n      'POST',\n      `/checkout-sessions/${encodeURIComponent(id)}/fulfillment/methods`,\n      payload,\n    );\n    return this.validateSession(data);\n  }\n\n  async updateFulfillmentMethod(\n    id: string,\n    methodId: string,\n    payload: FulfillmentMethodUpdatePayload,\n  ): Promise<CheckoutSession> {\n    const data = await this.http.request(\n      'PUT',\n      `/checkout-sessions/${encodeURIComponent(id)}/fulfillment/methods/${encodeURIComponent(methodId)}`,\n      payload,\n    );\n    return this.validateSession(data);\n  }\n\n  async updateFulfillmentGroup(\n    id: string,\n    methodId: string,\n    groupId: string,\n    payload: FulfillmentGroupUpdatePayload,\n  ): Promise<CheckoutSession> {\n    const data = await this.http.request(\n      'PUT',\n      `/checkout-sessions/${encodeURIComponent(id)}/fulfillment/methods/${encodeURIComponent(methodId)}/groups/${encodeURIComponent(groupId)}`,\n      payload,\n    );\n    return this.validateSession(data);\n  }\n\n  private async patchFulfillmentDiscount(\n    id: string,\n    patch: FulfillmentDiscountPatch,\n  ): Promise<CheckoutSession> {\n    const data = await this.http.request(\n      'PUT',\n      `/checkout-sessions/${encodeURIComponent(id)}`,\n      patch,\n    );\n    return this.validateSession(data);\n  }\n\n  private validateSession(data: unknown): CheckoutSession {\n    const session = this.http.validate(data, CheckoutSessionSchema);\n\n    if (session.status === 'requires_escalation' && session.continue_url) {\n      throw new UCPEscalationError(session.continue_url);\n    }\n\n    return session;\n  }\n}\n","import type { HttpClient } from '../http.js';\nimport { UCPSpecOrderSchema, OrderUpdateSchema } from '../schemas.js';\nimport type {\n  UCPSpecOrder,\n  OrderUpdate,\n  OrderUpdatePayload,\n  LineItemUpdatePayload,\n} from '../types/order.js';\n\n/** Order operations. Available when the server declares `dev.ucp.shopping.order`. */\nexport class OrderCapability {\n  constructor(private readonly http: HttpClient) {}\n\n  /** Retrieve an order by ID. Returns the UCP spec-compliant Order object. */\n  async get(id: string): Promise<UCPSpecOrder> {\n    const data = await this.http.request('GET', `/orders/${encodeURIComponent(id)}`);\n    return this.http.validate(data, UCPSpecOrderSchema);\n  }\n\n  /** Update an order with fulfillment events, adjustments, or status changes. */\n  async update(id: string, payload: OrderUpdatePayload): Promise<OrderUpdate> {\n    const data = await this.http.request('PUT', `/orders/${encodeURIComponent(id)}`, payload);\n    return this.http.validate(data, OrderUpdateSchema);\n  }\n\n  /** Update a single line item within an order (e.g. set parent for grouping). */\n  async updateLineItem(\n    id: string,\n    lineItemId: string,\n    payload: LineItemUpdatePayload,\n  ): Promise<OrderUpdate> {\n    const data = await this.http.request(\n      'PUT',\n      `/orders/${encodeURIComponent(id)}/line-items/${encodeURIComponent(lineItemId)}`,\n      payload,\n    );\n    return this.http.validate(data, OrderUpdateSchema);\n  }\n}\n","import type { HttpClient } from '../http.js';\nimport { CatalogSearchSchema, CatalogLookupSchema } from '../schemas.js';\nimport type {\n  CatalogSearchResponse,\n  CatalogLookupResponse,\n  SearchFilters,\n  Pagination,\n} from '../types/catalog.js';\n\nexport interface CatalogExtensions {\n  readonly search: boolean;\n  readonly lookup: boolean;\n}\n\n/**\n * Catalog operations. Available when the server declares\n * `dev.ucp.shopping.catalog.search` and/or `dev.ucp.shopping.catalog.lookup`.\n */\nexport class CatalogCapability {\n  readonly extensions: CatalogExtensions;\n\n  constructor(\n    private readonly http: HttpClient,\n    extensions: CatalogExtensions,\n  ) {\n    this.extensions = extensions;\n  }\n\n  async search(\n    query: string,\n    filters?: SearchFilters,\n    pagination?: Pagination,\n  ): Promise<CatalogSearchResponse> {\n    const payload: Record<string, unknown> = {\n      query,\n      ...(filters !== undefined ? { filters } : {}),\n      ...(pagination !== undefined ? { pagination } : {}),\n    };\n    const data = await this.http.request('POST', '/catalog/search', payload);\n    return this.http.validate(data, CatalogSearchSchema);\n  }\n\n  async getProduct(productId: string): Promise<CatalogLookupResponse> {\n    const data = await this.http.request('POST', '/catalog/product', {\n      id: productId,\n    });\n    return this.http.validate(data, CatalogLookupSchema);\n  }\n}\n","import type { HttpClient } from '../http.js';\nimport { CartResponseSchema } from '../schemas.js';\nimport type { Cart, CartCreatePayload, CartUpdatePayload } from '../types/cart.js';\n\n/** Cart operations. Available when the server declares `dev.ucp.shopping.cart`. */\nexport class CartCapability {\n  constructor(private readonly http: HttpClient) {}\n\n  async create(payload: CartCreatePayload): Promise<Cart> {\n    const data = await this.http.request('POST', '/carts', payload);\n    return this.http.validate(data, CartResponseSchema);\n  }\n\n  async get(id: string): Promise<Cart> {\n    const data = await this.http.request('GET', `/carts/${encodeURIComponent(id)}`);\n    return this.http.validate(data, CartResponseSchema);\n  }\n\n  async update(id: string, payload: CartUpdatePayload): Promise<Cart> {\n    const data = await this.http.request('PUT', `/carts/${encodeURIComponent(id)}`, payload);\n    return this.http.validate(data, CartResponseSchema);\n  }\n\n  async cancel(id: string): Promise<Cart> {\n    const data = await this.http.request('POST', `/carts/${encodeURIComponent(id)}/cancel`);\n    return this.http.validate(data, CartResponseSchema);\n  }\n}\n","import { z } from 'zod';\nimport { UCPOAuthError } from '../errors.js';\nimport type {\n  OAuthServerMetadata,\n  AuthorizationParams,\n  TokenResponse,\n  TokenExchangeParams,\n  TokenRefreshParams,\n  TokenRevokeParams,\n} from '../types/identity-linking.js';\n\nconst TokenResponseSchema = z\n  .object({\n    access_token: z.string(),\n    token_type: z.string(),\n    expires_in: z.number().optional(),\n    refresh_token: z.string().optional(),\n    scope: z.string().optional(),\n  })\n  .passthrough();\n\n/**\n * OAuth 2.0 identity linking for account linking between platforms and merchants.\n * Available when the server declares `dev.ucp.common.identity_linking`.\n */\nexport class IdentityLinkingCapability {\n  constructor(private readonly metadata: OAuthServerMetadata) {}\n\n  /** Build the OAuth authorization URL to redirect the buyer to. */\n  getAuthorizationUrl(params: AuthorizationParams): string {\n    const url = new URL(this.metadata.authorization_endpoint);\n    url.searchParams.set('response_type', 'code');\n    url.searchParams.set('client_id', params.client_id);\n    url.searchParams.set('redirect_uri', params.redirect_uri);\n    url.searchParams.set('scope', params.scope ?? 'ucp:scopes:checkout_session');\n    if (params.state !== undefined) {\n      url.searchParams.set('state', params.state);\n    }\n    return url.toString();\n  }\n\n  async exchangeCode(params: TokenExchangeParams): Promise<TokenResponse> {\n    const body = new URLSearchParams({\n      grant_type: 'authorization_code',\n      code: params.code,\n      redirect_uri: params.redirect_uri,\n    });\n\n    return this.tokenRequest(params.client_id, params.client_secret, body);\n  }\n\n  async refreshToken(params: TokenRefreshParams): Promise<TokenResponse> {\n    const body = new URLSearchParams({\n      grant_type: 'refresh_token',\n      refresh_token: params.refresh_token,\n    });\n\n    return this.tokenRequest(params.client_id, params.client_secret, body);\n  }\n\n  async revokeToken(params: TokenRevokeParams): Promise<void> {\n    const body = new URLSearchParams({ token: params.token });\n    if (params.token_type_hint !== undefined) {\n      body.set('token_type_hint', params.token_type_hint);\n    }\n\n    const res = await fetch(this.metadata.revocation_endpoint, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n        Authorization: encodeBasicAuth(params.client_id, params.client_secret),\n      },\n      body: body.toString(),\n    });\n\n    if (!res.ok) {\n      throw new UCPOAuthError(`Token revocation failed: ${res.status}`, res.status);\n    }\n  }\n\n  getMetadata(): Readonly<OAuthServerMetadata> {\n    return this.metadata;\n  }\n\n  private async tokenRequest(\n    clientId: string,\n    clientSecret: string,\n    body: URLSearchParams,\n  ): Promise<TokenResponse> {\n    const res = await fetch(this.metadata.token_endpoint, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n        Authorization: encodeBasicAuth(clientId, clientSecret),\n      },\n      body: body.toString(),\n    });\n\n    if (!res.ok) {\n      const errorBody = await res.text().catch(() => '');\n      throw new UCPOAuthError(\n        `Token exchange failed with status ${res.status}${errorBody ? `: ${errorBody.slice(0, 200)}` : ''}`,\n        res.status,\n      );\n    }\n\n    let raw: unknown;\n    try {\n      raw = await res.json();\n    } catch {\n      throw new UCPOAuthError('Token endpoint returned non-JSON response', res.status);\n    }\n\n    const parsed = TokenResponseSchema.safeParse(raw);\n    if (!parsed.success) {\n      throw new UCPOAuthError(`Invalid token response: ${parsed.error.message}`, res.status);\n    }\n\n    return parsed.data as TokenResponse;\n  }\n}\n\nfunction encodeBasicAuth(username: string, password: string): string {\n  return `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`;\n}\n","export interface UCPClientConfig {\n  readonly gatewayUrl: string;\n  readonly agentProfileUrl: string;\n  readonly ucpVersion?: string;\n  readonly requestSignature?: string;\n}\n\nexport const DEFAULT_UCP_VERSION = '2026-01-23';\n\nexport const UCP_CAPABILITIES = {\n  CHECKOUT: 'dev.ucp.shopping.checkout',\n  FULFILLMENT: 'dev.ucp.shopping.fulfillment',\n  DISCOUNT: 'dev.ucp.shopping.discount',\n  BUYER_CONSENT: 'dev.ucp.shopping.buyer_consent',\n  ORDER: 'dev.ucp.shopping.order',\n  CATALOG_SEARCH: 'dev.ucp.shopping.catalog.search',\n  CATALOG_LOOKUP: 'dev.ucp.shopping.catalog.lookup',\n  CART: 'dev.ucp.shopping.cart',\n  IDENTITY_LINKING: 'dev.ucp.common.identity_linking',\n  AP2_MANDATE: 'dev.ucp.shopping.ap2_mandate',\n} as const;\n","import type { ConnectedClient } from './UCPClient.js';\n\n/** JSON Schema type subset used for tool parameter definitions. */\nexport interface JsonSchema {\n  readonly type: string;\n  readonly properties?: Readonly<Record<string, JsonSchema>>;\n  readonly required?: readonly string[];\n  readonly items?: JsonSchema;\n  readonly enum?: readonly string[];\n  readonly description?: string;\n  readonly default?: unknown;\n}\n\n/**\n * A complete tool definition ready for any AI agent framework.\n * Contains everything an LLM needs: name, description, parameter schema, and executor.\n */\nexport interface AgentTool {\n  readonly name: string;\n  readonly description: string;\n  readonly parameters: JsonSchema;\n  readonly execute: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Returns ready-to-use tool definitions for agent registration.\n * Only tools supported by the connected server are included.\n *\n * Each tool has:\n * - `name` — unique tool identifier\n * - `description` — what the tool does (for the LLM)\n * - `parameters` — JSON Schema describing the expected input\n * - `execute(params)` — function that calls the right capability method\n *\n * @example\n * ```typescript\n * const client = await UCPClient.connect(config);\n * const tools = getAgentTools(client);\n *\n * // Register with Anthropic Claude API\n * const response = await anthropic.messages.create({\n *   tools: tools.map(t => ({\n *     name: t.name,\n *     description: t.description,\n *     input_schema: t.parameters,\n *   })),\n *   // ...\n * });\n *\n * // Execute tool calls\n * for (const block of response.content) {\n *   if (block.type === 'tool_use') {\n *     const tool = tools.find(t => t.name === block.name);\n *     const result = await tool.execute(block.input);\n *   }\n * }\n * ```\n */\nexport function getAgentTools(client: ConnectedClient): readonly AgentTool[] {\n  const tools: AgentTool[] = [];\n\n  if (client.checkout) {\n    tools.push(...checkoutTools(client));\n\n    if (client.checkout.extensions.fulfillment) {\n      tools.push(...fulfillmentTools(client));\n    }\n\n    if (client.checkout.extensions.discount) {\n      tools.push(...discountTools(client));\n    }\n  }\n\n  if (client.order) {\n    tools.push(...orderTools(client));\n  }\n\n  if (client.catalog) {\n    if (client.catalog.extensions.search) {\n      tools.push(...catalogSearchTools(client));\n    }\n    if (client.catalog.extensions.lookup) {\n      tools.push(...catalogLookupTools(client));\n    }\n  }\n\n  if (client.cart) {\n    tools.push(...cartTools(client));\n  }\n\n  if (client.identityLinking) {\n    tools.push(...identityLinkingTools(client));\n  }\n\n  return tools;\n}\n\nfunction checkoutTools(client: ConnectedClient): AgentTool[] {\n  return [\n    {\n      name: 'create_checkout',\n      description:\n        'Create a new checkout session with line items. Returns a session with an ID to use in subsequent calls.',\n      parameters: {\n        type: 'object',\n        properties: {\n          line_items: {\n            type: 'array',\n            description: 'Products to purchase',\n            items: {\n              type: 'object',\n              properties: {\n                item: {\n                  type: 'object',\n                  properties: { id: { type: 'string', description: 'Product ID' } },\n                  required: ['id'],\n                },\n                quantity: { type: 'number', description: 'Quantity to purchase' },\n              },\n              required: ['item', 'quantity'],\n            },\n          },\n          currency: { type: 'string', description: 'ISO 4217 currency code (e.g., \"USD\")' },\n        },\n        required: ['line_items'],\n      },\n      execute: async (params) =>\n        client.checkout!.create(\n          params as unknown as Parameters<NonNullable<typeof client.checkout>['create']>[0],\n        ),\n    },\n    {\n      name: 'get_checkout',\n      description:\n        'Get the current state of a checkout session, including status, totals, and available options.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n        },\n        required: ['id'],\n      },\n      execute: async (params) => client.checkout!.get(params['id'] as string),\n    },\n    {\n      name: 'update_checkout',\n      description:\n        'Update a checkout session with buyer information, shipping address, or payment details.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          buyer: {\n            type: 'object',\n            description: 'Buyer contact information',\n            properties: {\n              first_name: { type: 'string' },\n              last_name: { type: 'string' },\n              email: { type: 'string' },\n              phone_number: { type: 'string' },\n            },\n          },\n          context: {\n            type: 'object',\n            description: 'Localization context for pricing and availability',\n            properties: {\n              address_country: { type: 'string', description: 'ISO 3166-1 alpha-2 country code' },\n              address_region: { type: 'string', description: 'State or province' },\n              postal_code: { type: 'string' },\n            },\n          },\n        },\n        required: ['id'],\n      },\n      execute: async (params) => {\n        const { id, ...patch } = params as { id: string; [key: string]: unknown };\n        return client.checkout!.update(\n          id,\n          patch as Parameters<NonNullable<typeof client.checkout>['update']>[1],\n        );\n      },\n    },\n    {\n      name: 'complete_checkout',\n      description:\n        'Complete a checkout session with payment. Places the order. Returns the completed session with order ID.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          payment: {\n            type: 'object',\n            description: 'Payment information',\n            properties: {\n              instruments: {\n                type: 'array',\n                items: {\n                  type: 'object',\n                  properties: {\n                    id: { type: 'string', description: 'Instrument ID' },\n                    handler_id: {\n                      type: 'string',\n                      description: 'Payment handler ID from the server profile',\n                    },\n                    type: { type: 'string', description: 'Payment type (e.g., \"card\", \"offline\")' },\n                    credential: {\n                      type: 'object',\n                      properties: {\n                        type: { type: 'string', description: 'Credential type (e.g., \"token\")' },\n                        token: { type: 'string', description: 'Payment token' },\n                      },\n                      required: ['type'],\n                    },\n                  },\n                  required: ['id', 'handler_id', 'type'],\n                },\n              },\n            },\n            required: ['instruments'],\n          },\n        },\n        required: ['id', 'payment'],\n      },\n      execute: async (params) => {\n        const { id, ...payload } = params;\n        return client.checkout!.complete(\n          String(id),\n          payload as unknown as Parameters<NonNullable<typeof client.checkout>['complete']>[1],\n        );\n      },\n    },\n    {\n      name: 'cancel_checkout',\n      description: 'Cancel a checkout session. The session cannot be used after cancellation.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n        },\n        required: ['id'],\n      },\n      execute: async (params) => client.checkout!.cancel(params['id'] as string),\n    },\n  ];\n}\n\nfunction fulfillmentTools(client: ConnectedClient): AgentTool[] {\n  return [\n    {\n      name: 'set_fulfillment',\n      description: 'Set the fulfillment method for a checkout (e.g., \"shipping\" or \"pickup\").',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          type: { type: 'string', enum: ['shipping', 'pickup'], description: 'Fulfillment method' },\n        },\n        required: ['id', 'type'],\n      },\n      execute: async (params) =>\n        client.checkout!.setFulfillment(params['id'] as string, params['type'] as string),\n    },\n    {\n      name: 'select_destination',\n      description: 'Select a shipping destination for a checkout session.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          destination_id: { type: 'string', description: 'Destination ID to select' },\n          fulfillment_type: {\n            type: 'string',\n            default: 'shipping',\n            description: 'Fulfillment type',\n          },\n        },\n        required: ['id', 'destination_id'],\n      },\n      execute: async (params) =>\n        client.checkout!.selectDestination(\n          params['id'] as string,\n          params['destination_id'] as string,\n          (params['fulfillment_type'] as string) ?? 'shipping',\n        ),\n    },\n    {\n      name: 'select_fulfillment_option',\n      description:\n        'Select a fulfillment option (e.g., standard shipping, express shipping) for a checkout session.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          option_id: { type: 'string', description: 'Fulfillment option ID to select' },\n          destination_id: { type: 'string', description: 'Destination ID (if applicable)' },\n          fulfillment_type: {\n            type: 'string',\n            default: 'shipping',\n            description: 'Fulfillment type',\n          },\n        },\n        required: ['id', 'option_id'],\n      },\n      execute: async (params) =>\n        client.checkout!.selectFulfillmentOption(\n          params['id'] as string,\n          params['option_id'] as string,\n          params['destination_id'] as string | undefined,\n          (params['fulfillment_type'] as string) ?? 'shipping',\n        ),\n    },\n    {\n      name: 'create_fulfillment_method',\n      description: 'Add a new fulfillment method (shipping or pickup) to a checkout session.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          type: {\n            type: 'string',\n            enum: ['shipping', 'pickup'],\n            description: 'Fulfillment method type',\n          },\n          line_item_ids: {\n            type: 'array',\n            items: { type: 'string' },\n            description: 'Line item IDs to associate with this method (optional)',\n          },\n        },\n        required: ['id', 'type'],\n      },\n      execute: async (params) => {\n        const { id, ...payload } = params as { id: string; [key: string]: unknown };\n        return client.checkout!.createFulfillmentMethod(\n          id,\n          payload as Parameters<NonNullable<typeof client.checkout>['createFulfillmentMethod']>[1],\n        );\n      },\n    },\n    {\n      name: 'update_fulfillment_method',\n      description: 'Update an existing fulfillment method on a checkout session.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          method_id: { type: 'string', description: 'Fulfillment method ID to update' },\n          type: {\n            type: 'string',\n            enum: ['shipping', 'pickup'],\n            description: 'Updated fulfillment method type (optional)',\n          },\n          line_item_ids: {\n            type: 'array',\n            items: { type: 'string' },\n            description: 'Updated line item IDs to associate with this method',\n          },\n        },\n        required: ['id', 'method_id', 'line_item_ids'],\n      },\n      execute: async (params) => {\n        const { id, method_id, ...payload } = params as {\n          id: string;\n          method_id: string;\n          [key: string]: unknown;\n        };\n        return client.checkout!.updateFulfillmentMethod(\n          id,\n          method_id,\n          payload as Parameters<NonNullable<typeof client.checkout>['updateFulfillmentMethod']>[2],\n        );\n      },\n    },\n    {\n      name: 'update_fulfillment_group',\n      description: 'Update a fulfillment group within a fulfillment method on a checkout session.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          method_id: { type: 'string', description: 'Fulfillment method ID' },\n          group_id: { type: 'string', description: 'Fulfillment group ID to update' },\n        },\n        required: ['id', 'method_id', 'group_id'],\n      },\n      execute: async (params) =>\n        client.checkout!.updateFulfillmentGroup(\n          params['id'] as string,\n          params['method_id'] as string,\n          params['group_id'] as string,\n          { id: params['group_id'] as string },\n        ),\n    },\n  ];\n}\n\nfunction discountTools(client: ConnectedClient): AgentTool[] {\n  return [\n    {\n      name: 'apply_discount_codes',\n      description: 'Apply one or more discount codes to a checkout session.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Checkout session ID' },\n          codes: {\n            type: 'array',\n            items: { type: 'string' },\n            description: 'Discount codes to apply',\n          },\n        },\n        required: ['id', 'codes'],\n      },\n      execute: async (params) =>\n        client.checkout!.applyDiscountCodes(params['id'] as string, params['codes'] as string[]),\n    },\n  ];\n}\n\nfunction orderTools(client: ConnectedClient): AgentTool[] {\n  return [\n    {\n      name: 'get_order',\n      description:\n        'Get order details by ID, including line items, fulfillment status, and tracking information.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Order ID' },\n        },\n        required: ['id'],\n      },\n      execute: async (params) => client.order!.get(params['id'] as string),\n    },\n    {\n      name: 'update_order',\n      description: 'Update an order with fulfillment events, adjustments, or status changes.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Order ID' },\n          fulfillment: {\n            type: 'object',\n            description: 'Fulfillment update data (events, tracking)',\n          },\n          adjustments: {\n            type: 'array',\n            description: 'Order adjustments (refunds, returns)',\n            items: { type: 'object' },\n          },\n        },\n        required: ['id'],\n      },\n      execute: async (params) => {\n        const { id, ...payload } = params as { id: string; [key: string]: unknown };\n        return client.order!.update(id, payload);\n      },\n    },\n    {\n      name: 'update_order_line_item',\n      description:\n        'Update a line item within an order, such as setting a parent line item for grouping.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Order ID' },\n          line_item_id: { type: 'string', description: 'Line item ID to update' },\n          parent_id: {\n            type: 'string',\n            description: 'Parent line item ID for grouping (optional)',\n          },\n        },\n        required: ['id', 'line_item_id'],\n      },\n      execute: async (params) => {\n        const { id, line_item_id, ...payload } = params as {\n          id: string;\n          line_item_id: string;\n          [key: string]: unknown;\n        };\n        return client.order!.updateLineItem(id, line_item_id, payload);\n      },\n    },\n  ];\n}\n\nfunction catalogSearchTools(client: ConnectedClient): AgentTool[] {\n  return [\n    {\n      name: 'search_catalog',\n      description:\n        'Search the product catalog by query. Returns matching products with pagination.',\n      parameters: {\n        type: 'object',\n        properties: {\n          query: { type: 'string', description: 'Search query string' },\n          filters: {\n            type: 'object',\n            description: 'Optional search filters',\n            properties: {\n              categories: {\n                type: 'array',\n                items: {\n                  type: 'object',\n                  properties: {\n                    value: { type: 'string' },\n                    taxonomy: { type: 'string' },\n                  },\n                },\n                description: 'Category filters',\n              },\n              price: {\n                type: 'object',\n                description: 'Price range filter',\n                properties: {\n                  min: { type: 'number' },\n                  max: { type: 'number' },\n                },\n              },\n            },\n          },\n          pagination: {\n            type: 'object',\n            description: 'Pagination parameters',\n          },\n        },\n        required: ['query'],\n      },\n      execute: async (params) =>\n        client.catalog!.search(\n          params['query'] as string,\n          params['filters'] as Parameters<NonNullable<typeof client.catalog>['search']>[1],\n          params['pagination'] as Parameters<NonNullable<typeof client.catalog>['search']>[2],\n        ),\n    },\n  ];\n}\n\nfunction catalogLookupTools(client: ConnectedClient): AgentTool[] {\n  return [\n    {\n      name: 'get_product',\n      description: 'Get full product details by ID, including variants, pricing, and media.',\n      parameters: {\n        type: 'object',\n        properties: {\n          product_id: { type: 'string', description: 'Product ID' },\n        },\n        required: ['product_id'],\n      },\n      execute: async (params) => client.catalog!.getProduct(params['product_id'] as string),\n    },\n  ];\n}\n\nfunction cartTools(client: ConnectedClient): AgentTool[] {\n  return [\n    {\n      name: 'create_cart',\n      description:\n        'Create a new cart with line items. Returns the cart with an ID for subsequent operations.',\n      parameters: {\n        type: 'object',\n        properties: {\n          line_items: {\n            type: 'array',\n            description: 'Items to add to the cart',\n            items: {\n              type: 'object',\n              properties: {\n                item: {\n                  type: 'object',\n                  properties: {\n                    id: { type: 'string', description: 'Product or variant ID' },\n                  },\n                  required: ['id'],\n                },\n                quantity: { type: 'number', description: 'Quantity' },\n              },\n              required: ['item', 'quantity'],\n            },\n          },\n          context: { type: 'object', description: 'Localization context' },\n          buyer: { type: 'object', description: 'Buyer information' },\n        },\n        required: ['line_items'],\n      },\n      execute: async (params) =>\n        client.cart!.create(\n          params as unknown as Parameters<NonNullable<typeof client.cart>['create']>[0],\n        ),\n    },\n    {\n      name: 'get_cart',\n      description:\n        'Get the current state of a cart by ID, including line items, totals, and messages.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Cart ID' },\n        },\n        required: ['id'],\n      },\n      execute: async (params) => client.cart!.get(params['id'] as string),\n    },\n    {\n      name: 'update_cart',\n      description:\n        'Update an existing cart with changed line items, context, or buyer information.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Cart ID' },\n          line_items: {\n            type: 'array',\n            description: 'Updated line items',\n            items: {\n              type: 'object',\n              properties: {\n                item: {\n                  type: 'object',\n                  properties: { id: { type: 'string' } },\n                  required: ['id'],\n                },\n                quantity: { type: 'number' },\n              },\n              required: ['item', 'quantity'],\n            },\n          },\n          context: { type: 'object', description: 'Updated localization context' },\n          buyer: { type: 'object', description: 'Updated buyer information' },\n        },\n        required: ['id'],\n      },\n      execute: async (params) => {\n        const { id, ...payload } = params as { id: string; [key: string]: unknown };\n        return client.cart!.update(\n          id,\n          payload as unknown as Parameters<NonNullable<typeof client.cart>['update']>[1],\n        );\n      },\n    },\n    {\n      name: 'cancel_cart',\n      description: 'Cancel a cart by ID. Returns the final cart state before cleanup.',\n      parameters: {\n        type: 'object',\n        properties: {\n          id: { type: 'string', description: 'Cart ID' },\n        },\n        required: ['id'],\n      },\n      execute: async (params) => client.cart!.cancel(params['id'] as string),\n    },\n  ];\n}\n\nfunction identityLinkingTools(client: ConnectedClient): AgentTool[] {\n  return [\n    {\n      name: 'get_authorization_url',\n      description:\n        'Build the OAuth authorization URL to redirect the buyer to for account linking. Returns a URL string.',\n      parameters: {\n        type: 'object',\n        properties: {\n          client_id: { type: 'string', description: 'OAuth client ID' },\n          redirect_uri: { type: 'string', description: 'URI to redirect to after authorization' },\n          scope: {\n            type: 'string',\n            description: 'OAuth scope (default: ucp:scopes:checkout_session)',\n          },\n          state: { type: 'string', description: 'Opaque value for CSRF protection' },\n        },\n        required: ['client_id', 'redirect_uri'],\n      },\n      execute: (params) =>\n        Promise.resolve(\n          client.identityLinking!.getAuthorizationUrl(\n            params as unknown as Parameters<\n              NonNullable<typeof client.identityLinking>['getAuthorizationUrl']\n            >[0],\n          ),\n        ),\n    },\n    {\n      name: 'exchange_auth_code',\n      description: 'Exchange an OAuth authorization code for an access token and refresh token.',\n      parameters: {\n        type: 'object',\n        properties: {\n          client_id: { type: 'string', description: 'OAuth client ID' },\n          client_secret: { type: 'string', description: 'OAuth client secret' },\n          code: { type: 'string', description: 'Authorization code from the redirect' },\n          redirect_uri: {\n            type: 'string',\n            description: 'Must match the redirect_uri used in authorization',\n          },\n        },\n        required: ['client_id', 'client_secret', 'code', 'redirect_uri'],\n      },\n      execute: async (params) =>\n        client.identityLinking!.exchangeCode(\n          params as unknown as Parameters<\n            NonNullable<typeof client.identityLinking>['exchangeCode']\n          >[0],\n        ),\n    },\n    {\n      name: 'refresh_access_token',\n      description: 'Refresh an expired access token using a refresh token.',\n      parameters: {\n        type: 'object',\n        properties: {\n          client_id: { type: 'string', description: 'OAuth client ID' },\n          client_secret: { type: 'string', description: 'OAuth client secret' },\n          refresh_token: { type: 'string', description: 'Refresh token from a previous exchange' },\n        },\n        required: ['client_id', 'client_secret', 'refresh_token'],\n      },\n      execute: async (params) =>\n        client.identityLinking!.refreshToken(\n          params as unknown as Parameters<\n            NonNullable<typeof client.identityLinking>['refreshToken']\n          >[0],\n        ),\n    },\n    {\n      name: 'revoke_token',\n      description: 'Revoke an access or refresh token to invalidate an account link.',\n      parameters: {\n        type: 'object',\n        properties: {\n          client_id: { type: 'string', description: 'OAuth client ID' },\n          client_secret: { type: 'string', description: 'OAuth client secret' },\n          token: { type: 'string', description: 'Token to revoke' },\n          token_type_hint: {\n            type: 'string',\n            enum: ['access_token', 'refresh_token'],\n            description: 'Hint about the token type',\n          },\n        },\n        required: ['client_id', 'client_secret', 'token'],\n      },\n      execute: async (params) =>\n        client.identityLinking!.revokeToken(\n          params as unknown as Parameters<\n            NonNullable<typeof client.identityLinking>['revokeToken']\n          >[0],\n        ),\n    },\n  ];\n}\n","import { z } from 'zod';\nimport { HttpClient } from './http.js';\nimport type { LogFn } from './http.js';\nimport { UCPProfileSchema, JWKSchema, PaymentHandlerBaseSchema } from './schemas.js';\nimport type { JWK } from './types/common.js';\nimport { CheckoutCapability } from './capabilities/checkout.js';\nimport { OrderCapability } from './capabilities/order.js';\nimport { CatalogCapability } from './capabilities/catalog.js';\nimport type { CatalogExtensions } from './capabilities/catalog.js';\nimport { CartCapability } from './capabilities/cart.js';\nimport { IdentityLinkingCapability } from './capabilities/identity-linking.js';\nimport type { UCPClientConfig } from './types/config.js';\nimport { DEFAULT_UCP_VERSION, UCP_CAPABILITIES } from './types/config.js';\nimport type { CheckoutExtensions } from './types/checkout.js';\nimport type { OAuthServerMetadata } from './types/identity-linking.js';\nimport type { PaymentHandlerMap } from './types/payment.js';\nimport { getAgentTools } from './agent-tools.js';\nimport type { AgentTool } from './agent-tools.js';\n\n/** UCP discovery profile returned by `GET /.well-known/ucp`. */\nexport type UCPProfile = z.output<typeof UCPProfileSchema>;\n\n/** Describes a single tool the agent can use with the connected server. */\nexport interface ToolDescriptor {\n  readonly name: string;\n  readonly capability: string;\n  readonly description: string;\n}\n\n/**\n * A connected UCP client. Only capabilities the server declared are non-null.\n * Use `describeTools()` to get the list of available tools for agent registration.\n */\nexport interface ConnectedClient {\n  /** The server's UCP discovery profile. */\n  readonly profile: UCPProfile;\n  /** JWK signing keys from the discovery profile. Used for verifying incoming webhook signatures. */\n  readonly signingKeys: readonly JWK[];\n  /** Checkout operations. Null if server does not support `dev.ucp.shopping.checkout`. */\n  readonly checkout: CheckoutCapability | null;\n  /** Order operations. Null if server does not support `dev.ucp.shopping.order`. */\n  readonly order: OrderCapability | null;\n  /** Catalog operations. Null if server supports neither `dev.ucp.shopping.catalog.search` nor `dev.ucp.shopping.catalog.lookup`. */\n  readonly catalog: CatalogCapability | null;\n  /** Cart operations. Null if server does not support `dev.ucp.shopping.cart`. */\n  readonly cart: CartCapability | null;\n  /** OAuth 2.0 identity linking. Null if server does not support `dev.ucp.common.identity_linking`. */\n  readonly identityLinking: IdentityLinkingCapability | null;\n  /** Payment handlers declared by the server, keyed by namespace. */\n  readonly paymentHandlers: PaymentHandlerMap;\n  /** Returns only the tools this server supports (name + description only). */\n  describeTools(): readonly ToolDescriptor[];\n  /**\n   * Returns complete tool definitions with JSON Schema parameters and execute functions.\n   * Ready for direct use with any AI agent framework (Claude API, OpenAI, Vercel AI SDK, LangChain, MCP).\n   */\n  getAgentTools(): readonly AgentTool[];\n}\n\nexport async function connect(\n  config: UCPClientConfig,\n  options?: { readonly onValidationWarning?: LogFn },\n): Promise<ConnectedClient> {\n  validateConfig(config);\n\n  const http = new HttpClient({\n    gatewayUrl: config.gatewayUrl.replace(/\\/+$/, ''),\n    agentProfileUrl: config.agentProfileUrl,\n    ucpVersion: config.ucpVersion ?? DEFAULT_UCP_VERSION,\n    ...(config.requestSignature !== undefined ? { requestSignature: config.requestSignature } : {}),\n    ...(options?.onValidationWarning !== undefined\n      ? { onValidationWarning: options.onValidationWarning }\n      : {}),\n  });\n\n  const rawProfile = await http.request('GET', '/.well-known/ucp');\n  const profile = http.validate(rawProfile, UCPProfileSchema);\n  const capabilityNames = extractCapabilityNames(profile);\n\n  const checkout = buildCheckoutCapability(http, capabilityNames);\n  const order = capabilityNames.has(UCP_CAPABILITIES.ORDER) ? new OrderCapability(http) : null;\n  const catalog = buildCatalogCapability(http, capabilityNames);\n  const cart = capabilityNames.has(UCP_CAPABILITIES.CART) ? new CartCapability(http) : null;\n  const identityLinking = await buildIdentityLinking(config, capabilityNames);\n  const paymentHandlers = extractPaymentHandlers(profile);\n  const signingKeys = extractSigningKeys(profile);\n\n  const client: ConnectedClient = {\n    profile,\n    signingKeys,\n    checkout,\n    order,\n    catalog,\n    cart,\n    identityLinking,\n    paymentHandlers,\n    describeTools: () => buildToolDescriptors(checkout, order, catalog, cart, identityLinking),\n    getAgentTools: () => getAgentTools(client),\n  };\n\n  return Object.freeze(client);\n}\n\nexport class UCPClient {\n  private constructor() {\n    /* use UCPClient.connect() or the standalone connect() function */\n  }\n\n  static connect = connect;\n}\n\nfunction validateConfig(config: UCPClientConfig): void {\n  try {\n    new URL(config.gatewayUrl);\n  } catch {\n    throw new Error(`UCPClient: gatewayUrl is not a valid URL: \"${config.gatewayUrl}\"`);\n  }\n  if (config.agentProfileUrl.includes('\"') || config.agentProfileUrl.includes('\\n')) {\n    throw new Error('agentProfileUrl must not contain double quotes or newlines');\n  }\n  try {\n    new URL(config.agentProfileUrl);\n  } catch {\n    throw new Error(`UCPClient: agentProfileUrl is not a valid URL: \"${config.agentProfileUrl}\"`);\n  }\n}\n\nfunction extractCapabilityNames(profile: UCPProfile): Set<string> {\n  const capabilities = profile.ucp?.capabilities;\n  if (typeof capabilities !== 'object' || capabilities === null) return new Set();\n  return new Set(Object.keys(capabilities));\n}\n\nconst PaymentHandlerMapSchema = z.record(z.array(PaymentHandlerBaseSchema));\n\nfunction extractPaymentHandlers(profile: UCPProfile): PaymentHandlerMap {\n  const raw = (profile as Record<string, unknown>)['payment_handlers'];\n  if (typeof raw !== 'object' || raw === null) return {};\n  const result = PaymentHandlerMapSchema.safeParse(raw);\n  if (!result.success) return {};\n  return result.data as PaymentHandlerMap;\n}\n\nfunction extractSigningKeys(profile: UCPProfile): readonly JWK[] {\n  const raw = (profile as Record<string, unknown>)['signing_keys'];\n  if (!Array.isArray(raw)) return [];\n  const keys: JWK[] = [];\n  for (const item of raw) {\n    const result = JWKSchema.safeParse(item);\n    if (result.success) keys.push(result.data);\n  }\n  return keys;\n}\n\nfunction buildCheckoutCapability(\n  http: HttpClient,\n  capabilityNames: Set<string>,\n): CheckoutCapability | null {\n  if (!capabilityNames.has(UCP_CAPABILITIES.CHECKOUT)) return null;\n\n  const extensions: CheckoutExtensions = {\n    fulfillment: capabilityNames.has(UCP_CAPABILITIES.FULFILLMENT),\n    discount: capabilityNames.has(UCP_CAPABILITIES.DISCOUNT),\n    buyerConsent: capabilityNames.has(UCP_CAPABILITIES.BUYER_CONSENT),\n    ap2Mandate: capabilityNames.has(UCP_CAPABILITIES.AP2_MANDATE),\n  };\n\n  return new CheckoutCapability(http, extensions);\n}\n\nfunction buildCatalogCapability(\n  http: HttpClient,\n  capabilityNames: Set<string>,\n): CatalogCapability | null {\n  const extensions: CatalogExtensions = {\n    search: capabilityNames.has(UCP_CAPABILITIES.CATALOG_SEARCH),\n    lookup: capabilityNames.has(UCP_CAPABILITIES.CATALOG_LOOKUP),\n  };\n\n  if (!extensions.search && !extensions.lookup) return null;\n  return new CatalogCapability(http, extensions);\n}\n\nconst OAuthServerMetadataSchema = z\n  .object({\n    issuer: z.string(),\n    authorization_endpoint: z.string().url(),\n    token_endpoint: z.string().url(),\n    revocation_endpoint: z.string().url(),\n    scopes_supported: z.array(z.string()),\n    response_types_supported: z.array(z.string()),\n    grant_types_supported: z.array(z.string()),\n    token_endpoint_auth_methods_supported: z.array(z.string()),\n    service_documentation: z.string().url().optional(),\n  })\n  .passthrough();\n\nasync function buildIdentityLinking(\n  config: UCPClientConfig,\n  capabilityNames: Set<string>,\n): Promise<IdentityLinkingCapability | null> {\n  if (!capabilityNames.has(UCP_CAPABILITIES.IDENTITY_LINKING)) return null;\n\n  const gatewayUrl = config.gatewayUrl.replace(/\\/+$/, '');\n  const metadataUrl = `${gatewayUrl}/.well-known/oauth-authorization-server`;\n  const res = await fetch(metadataUrl);\n\n  if (!res.ok) {\n    throw new Error(\n      `Identity linking capability declared but OAuth metadata fetch failed: ${res.status} from ${metadataUrl}`,\n    );\n  }\n\n  let raw: unknown;\n  try {\n    raw = await res.json();\n  } catch {\n    throw new Error(\n      `Identity linking OAuth metadata endpoint returned non-JSON response from ${metadataUrl}`,\n    );\n  }\n\n  const parsed = OAuthServerMetadataSchema.safeParse(raw);\n  if (!parsed.success) {\n    throw new Error(`Identity linking OAuth metadata validation failed: ${parsed.error.message}`);\n  }\n\n  return new IdentityLinkingCapability(parsed.data as OAuthServerMetadata);\n}\n\nfunction buildToolDescriptors(\n  checkout: CheckoutCapability | null,\n  order: OrderCapability | null,\n  catalog: CatalogCapability | null,\n  cart: CartCapability | null,\n  identityLinking: IdentityLinkingCapability | null,\n): readonly ToolDescriptor[] {\n  const tools: ToolDescriptor[] = [];\n\n  if (checkout) {\n    tools.push(\n      { name: 'create_checkout', capability: 'checkout', description: 'Create a checkout session' },\n      { name: 'get_checkout', capability: 'checkout', description: 'Get checkout session by ID' },\n      { name: 'update_checkout', capability: 'checkout', description: 'Update a checkout session' },\n      {\n        name: 'complete_checkout',\n        capability: 'checkout',\n        description: 'Complete checkout with payment',\n      },\n      {\n        name: 'cancel_checkout',\n        capability: 'checkout',\n        description: 'Cancel a checkout session',\n      },\n    );\n\n    if (checkout.extensions.fulfillment) {\n      tools.push(\n        {\n          name: 'set_fulfillment',\n          capability: 'checkout.fulfillment',\n          description: 'Set fulfillment method (shipping/pickup)',\n        },\n        {\n          name: 'select_destination',\n          capability: 'checkout.fulfillment',\n          description: 'Select shipping destination',\n        },\n        {\n          name: 'select_fulfillment_option',\n          capability: 'checkout.fulfillment',\n          description: 'Select fulfillment option (e.g., express shipping)',\n        },\n        {\n          name: 'create_fulfillment_method',\n          capability: 'checkout.fulfillment',\n          description: 'Add a new fulfillment method to a checkout session',\n        },\n        {\n          name: 'update_fulfillment_method',\n          capability: 'checkout.fulfillment',\n          description: 'Update an existing fulfillment method on a checkout session',\n        },\n        {\n          name: 'update_fulfillment_group',\n          capability: 'checkout.fulfillment',\n          description: 'Update a fulfillment group within a fulfillment method',\n        },\n      );\n    }\n\n    if (checkout.extensions.discount) {\n      tools.push({\n        name: 'apply_discount_codes',\n        capability: 'checkout.discount',\n        description: 'Apply discount codes to checkout',\n      });\n    }\n  }\n\n  if (order) {\n    tools.push(\n      { name: 'get_order', capability: 'order', description: 'Get order by ID' },\n      { name: 'update_order', capability: 'order', description: 'Update an order' },\n      {\n        name: 'update_order_line_item',\n        capability: 'order',\n        description: 'Update a line item within an order',\n      },\n    );\n  }\n\n  if (catalog) {\n    if (catalog.extensions.search) {\n      tools.push({\n        name: 'search_catalog',\n        capability: 'catalog',\n        description: 'Search the product catalog',\n      });\n    }\n    if (catalog.extensions.lookup) {\n      tools.push({\n        name: 'get_product',\n        capability: 'catalog',\n        description: 'Get product details by ID',\n      });\n    }\n  }\n\n  if (cart) {\n    tools.push(\n      {\n        name: 'create_cart',\n        capability: 'cart',\n        description: 'Create a new cart',\n      },\n      {\n        name: 'get_cart',\n        capability: 'cart',\n        description: 'Get cart by ID',\n      },\n      {\n        name: 'update_cart',\n        capability: 'cart',\n        description: 'Update an existing cart',\n      },\n      {\n        name: 'cancel_cart',\n        capability: 'cart',\n        description: 'Cancel a cart',\n      },\n    );\n  }\n\n  if (identityLinking) {\n    tools.push(\n      {\n        name: 'get_authorization_url',\n        capability: 'identity_linking',\n        description: 'Get OAuth authorization URL for account linking',\n      },\n      {\n        name: 'exchange_auth_code',\n        capability: 'identity_linking',\n        description: 'Exchange authorization code for access token',\n      },\n      {\n        name: 'refresh_access_token',\n        capability: 'identity_linking',\n        description: 'Refresh an expired access token',\n      },\n      {\n        name: 'revoke_token',\n        capability: 'identity_linking',\n        description: 'Revoke an access or refresh token',\n      },\n    );\n  }\n\n  return tools;\n}\n","import { JWKSchema } from './schemas.js';\nimport type { JWK } from './types/common.js';\n\n/**\n * Verifies a `Request-Signature` header (detached JWS per RFC 7797) over a raw request body.\n *\n * Per UCP spec, the JWT header MUST include a `kid` claim identifying the signing key.\n * Returns `false` if `kid` is absent — do not fall back to guessing.\n *\n * @returns `true` if the signature is valid, `false` for any verification failure.\n */\nexport async function verifyRequestSignature(\n  body: string,\n  signature: string,\n  signingKeys: readonly JWK[],\n): Promise<boolean> {\n  const parts = signature.split('.');\n  // Detached JWS: exactly 3 parts, middle (payload) is empty\n  if (parts.length !== 3 || parts[1] !== '') return false;\n\n  const [headerB64, , sigB64] = parts as [string, string, string];\n\n  let header: Record<string, unknown>;\n  try {\n    header = JSON.parse(new TextDecoder().decode(base64urlDecode(headerB64))) as Record<\n      string,\n      unknown\n    >;\n  } catch {\n    return false;\n  }\n\n  if (typeof header['alg'] !== 'undefined' && header['alg'] !== 'ES256') return false;\n\n  // kid is required per UCP spec — reject if absent\n  if (typeof header['kid'] !== 'string') return false;\n  const kid = header['kid'];\n\n  const key = signingKeys.find((k) => k.kid === kid);\n  if (!key) return false;\n\n  let cryptoKey: CryptoKey;\n  try {\n    cryptoKey = await crypto.subtle.importKey(\n      'jwk',\n      key as JsonWebKey,\n      { name: 'ECDSA', namedCurve: 'P-256' },\n      false,\n      ['verify'],\n    );\n  } catch {\n    return false;\n  }\n\n  let sigBytes: Uint8Array<ArrayBuffer>;\n  try {\n    sigBytes = base64urlDecode(sigB64);\n  } catch {\n    return false;\n  }\n\n  // Signing input: base64url(header) + \".\" + base64url(body)\n  const signingInput = `${headerB64}.${Buffer.from(body).toString('base64url')}`;\n\n  try {\n    return await crypto.subtle.verify(\n      { name: 'ECDSA', hash: 'SHA-256' },\n      cryptoKey,\n      sigBytes,\n      new TextEncoder().encode(signingInput),\n    );\n  } catch {\n    return false;\n  }\n}\n\n// ─── WebhookVerifier ─────────────────────────────────────────────────────────\n\n/**\n * A stateful verifier that fetches signing keys from a business's UCP discovery\n * profile and caches them for subsequent verifications.\n *\n * Keys are re-fetched from `/.well-known/ucp` when an unknown `kid` is encountered,\n * supporting zero-downtime key rotation as defined by the UCP spec.\n */\nexport interface WebhookVerifier {\n  /**\n   * Verify a webhook `Request-Signature` header against the business's current\n   * signing keys. Automatically re-fetches the discovery profile on `kid` cache miss.\n   */\n  readonly verify: (body: string, signature: string) => Promise<boolean>;\n}\n\n/**\n * Creates a {@link WebhookVerifier} bound to a specific business's UCP gateway.\n *\n * Signing keys are lazily loaded from `<gatewayUrl>/.well-known/ucp` on the first call\n * and cached by `kid`. A cache miss triggers a re-fetch to support key rotation.\n *\n * @example\n * ```typescript\n * import { createWebhookVerifier } from '@omnixhq/ucp-client';\n *\n * const verifier = createWebhookVerifier('https://store.example.com');\n *\n * // In your webhook handler:\n * const valid = await verifier.verify(rawBody, req.headers['request-signature']);\n * if (!valid) return res.status(401).send('Invalid signature');\n * ```\n */\nexport function createWebhookVerifier(\n  gatewayUrl: string,\n  options?: { readonly refetchCooldownMs?: number },\n): WebhookVerifier {\n  const baseUrl = gatewayUrl.replace(/\\/+$/, '');\n  const refetchCooldownMs = options?.refetchCooldownMs ?? 60_000;\n  const keyCache = new Map<string, JWK>();\n  let fetched = false;\n  let lastRefetchTime = 0;\n  // Single in-flight promise prevents concurrent fetches from hammering the endpoint\n  // and avoids TOCTOU races that could leave the cache partially cleared.\n  let loadingPromise: Promise<void> | null = null;\n\n  async function loadKeys(): Promise<void> {\n    const res = await fetch(`${baseUrl}/.well-known/ucp`);\n    if (!res.ok) {\n      fetched = true;\n      return;\n    }\n    let profile: unknown;\n    try {\n      profile = await res.json();\n    } catch {\n      fetched = true;\n      return;\n    }\n    const rawKeys = (profile as Record<string, unknown>)['signing_keys'];\n    if (!Array.isArray(rawKeys)) {\n      fetched = true;\n      return;\n    }\n    keyCache.clear();\n    for (const item of rawKeys) {\n      const parsed = JWKSchema.safeParse(item);\n      if (parsed.success && typeof parsed.data.kid === 'string') {\n        keyCache.set(parsed.data.kid, parsed.data);\n      }\n    }\n    fetched = true;\n  }\n\n  function ensureKeys(): Promise<void> {\n    loadingPromise ??= loadKeys().finally(() => {\n      loadingPromise = null;\n    });\n    return loadingPromise;\n  }\n\n  return {\n    async verify(body: string, signature: string): Promise<boolean> {\n      const kid = extractKid(signature);\n      if (kid === null) return false;\n\n      if (!fetched) await ensureKeys();\n\n      // Re-fetch on kid miss to support key rotation, but rate-limit\n      // to prevent DoS via requests with unknown kid values.\n      if (!keyCache.has(kid)) {\n        const now = Date.now();\n        if (now - lastRefetchTime >= refetchCooldownMs) {\n          lastRefetchTime = now;\n          await ensureKeys();\n        }\n      }\n\n      const key = keyCache.get(kid);\n      if (!key) return false;\n\n      return verifyRequestSignature(body, signature, [key]);\n    },\n  };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Extracts the `kid` from a detached JWS header without full verification. */\nfunction extractKid(signature: string): string | null {\n  const parts = signature.split('.');\n  if (parts.length !== 3 || parts[1] !== '') return null;\n  try {\n    const header = JSON.parse(new TextDecoder().decode(base64urlDecode(parts[0]!))) as Record<\n      string,\n      unknown\n    >;\n    return typeof header['kid'] === 'string' ? header['kid'] : null;\n  } catch {\n    return null;\n  }\n}\n\nfunction base64urlDecode(b64url: string): Uint8Array<ArrayBuffer> {\n  const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/');\n  const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4);\n  const binaryStr = atob(padded);\n  const result = new Uint8Array(binaryStr.length);\n  for (let i = 0; i < binaryStr.length; i++) {\n    result[i] = binaryStr.charCodeAt(i);\n  }\n  return result;\n}\n","import { WebhookEventSchema } from './schemas.js';\nimport { UCPError } from './errors.js';\nimport type { WebhookEvent } from './types/order.js';\n\n/**\n * Parses and validates a raw webhook request body as a UCP order event.\n *\n * Call this after verifying the `Request-Signature` header with\n * {@link createWebhookVerifier} or {@link verifyRequestSignature}.\n *\n * Throws {@link UCPError} with code `INVALID_WEBHOOK_PAYLOAD` if the body is\n * not valid JSON or does not conform to the UCP webhook event schema.\n *\n * @example\n * ```typescript\n * import { createWebhookVerifier, parseWebhookEvent } from '@omnixhq/ucp-client';\n *\n * const verifier = createWebhookVerifier('https://store.example.com');\n *\n * // In your webhook handler:\n * const valid = await verifier.verify(rawBody, req.headers['request-signature']);\n * if (!valid) return res.status(401).send('Invalid signature');\n *\n * const event = parseWebhookEvent(rawBody);\n * console.log(event.event_id, event.order.id);\n * ```\n */\nexport function parseWebhookEvent(body: string): WebhookEvent {\n  let raw: unknown;\n  try {\n    raw = JSON.parse(body);\n  } catch {\n    throw new UCPError('INVALID_WEBHOOK_PAYLOAD', 'Webhook body is not valid JSON');\n  }\n\n  const result = WebhookEventSchema.safeParse(raw);\n  if (!result.success) {\n    throw new UCPError(\n      'INVALID_WEBHOOK_PAYLOAD',\n      `Webhook payload validation failed: ${result.error.message}`,\n    );\n  }\n\n  return result.data as WebhookEvent;\n}\n"],"mappings":"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"}