@omnixhq/ucp-client 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["config: HttpClientConfig","token: string","method: HttpMethod","path: string","body?: unknown","headers: Record<string, string>","data: unknown","schema: ZodType<T>","statusCode: number","UCPIdempotencyConflictError","UCPError","rawMessages: unknown[]","m: unknown","validTypes: readonly string[]","type: MessageType","http: HttpClient","extensions: CheckoutExtensions","payload: CreateCheckoutPayload","id: string","patch: UpdateCheckoutPayload","payload: CompleteCheckoutPayload","type: string","patch?: FulfillmentPatch","destinationId: string","optionId: string","destinationId?: string","codes: readonly string[]","data: unknown","UCPEscalationError","http: HttpClient","id: string","UCPSpecOrderSchema","payload: Record<string, unknown>","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","keys: JWK[]","http: HttpClient","capabilityNames: Set<string>","extensions: CheckoutExtensions","raw: unknown","checkout: CheckoutCapability | null","order: OrderCapability | null","identityLinking: IdentityLinkingCapability | null","tools: ToolDescriptor[]","body: string","signature: string","signingKeys: readonly JWK[]","header: Record<string, unknown>","cryptoKey: CryptoKey","sigBytes: Uint8Array<ArrayBuffer>","gatewayUrl: string","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/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';\nimport {\n // ─── Response schemas ───────────────────────────────────────────────────────\n ExtendedCheckoutResponseSchema,\n UcpDiscoveryProfileSchema,\n CheckoutResponseStatusSchema,\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 // ─── Request schemas ────────────────────────────────────────────────────────\n ExtendedCheckoutCreateRequestSchema,\n ExtendedCheckoutUpdateRequestSchema,\n\n // ─── Order ──────────────────────────────────────────────────────────────────\n OrderSchema,\n\n // ─── Checkout (base) ────────────────────────────────────────────────────────\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 DiscountDiscountsObjectSchema,\n\n // ─── Fulfillment (core) ─────────────────────────────────────────────────────\n FulfillmentSchema,\n FulfillmentOptionSchema,\n FulfillmentGroupSchema,\n FulfillmentMethodSchema,\n FulfillmentAvailableMethodSchema,\n FulfillmentDestinationSchema,\n FulfillmentEventSchema,\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 PaymentSchema,\n PaymentCredentialSchema,\n ExtendedPaymentCredentialSchema,\n PaymentIdentitySchema,\n PaymentInstrumentResponseSchema,\n CardCredentialSchema,\n CardPaymentInstrumentSchema,\n TokenCredentialSchema,\n\n // ─── Payment Handler (roles) ────────────────────────────────────────────────\n PaymentHandlerBaseSchema,\n PaymentHandlerBusinessSchema,\n PaymentHandlerPlatformSchema,\n\n // ─── Order (sub-entities) ───────────────────────────────────────────────────\n OrderConfirmationSchema,\n OrderLineItemSchema,\n OrderUpdateSchema,\n\n // ─── Item / LineItem ────────────────────────────────────────────────────────\n ItemSchema,\n LineItemSchema,\n LineItemUpdateRequestSchema,\n\n // ─── Message ────────────────────────────────────────────────────────────────\n MessageInfoSchema,\n MessageWarningSchema,\n\n // ─── UCP protocol ───────────────────────────────────────────────────────────\n UcpBaseSchema,\n UcpBusinessSchema,\n UcpPlatformSchema,\n UcpEntitySchema,\n UcpResponseCheckoutSchema,\n UcpResponseOrderSchema,\n UcpVersionSchema,\n UcpReverseDomainNameSchema,\n\n // ─── Capability / Service ───────────────────────────────────────────────────\n CapabilityBaseSchema,\n CapabilityBusinessSchema,\n CapabilityPlatformSchema,\n CapabilityResponseSchema,\n ServiceBaseSchema,\n ServiceBusinessSchema,\n ServicePlatformSchema,\n ServiceResponseSchema,\n\n // ─── Misc ───────────────────────────────────────────────────────────────────\n AccountInfoSchema,\n AdjustmentSchema,\n BindingSchema,\n ContextSchema,\n EmbeddedConfigSchema,\n ExpectationSchema,\n LinkSchema,\n PlatformConfigSchema,\n RetailLocationSchema,\n ShippingDestinationSchema,\n TotalSchema,\n} from '@omnixhq/ucp-js-sdk';\n\n// ─── Response validation ────────────────────────────────────────────────────\n// Used internally by UCPClient to validate gateway responses.\n// `.passthrough()` allows extra fields the gateway may add beyond the spec.\n\nexport const CheckoutSessionSchema = ExtendedCheckoutResponseSchema.passthrough();\nexport const UCPProfileSchema = UcpDiscoveryProfileSchema.passthrough();\n\n// ─── Request validation ─────────────────────────────────────────────────────\n// Used to validate outgoing payloads before sending to gateway.\n// `.passthrough()` allows extra fields the caller may include.\n\nexport const CreateCheckoutRequestSchema = ExtendedCheckoutCreateRequestSchema.passthrough();\nexport const UpdateCheckoutRequestSchema = ExtendedCheckoutUpdateRequestSchema.passthrough();\nexport const CompleteCheckoutRequestSchema = CheckoutCompleteRequestSchema.passthrough();\n\n// ─── SDK re-exports ─────────────────────────────────────────────────────────\n// Re-export all SDK schemas so consumers can use them for tool definitions,\n// Zod-to-JSON-Schema conversion, validation, etc.\n\nexport {\n // Enums / status\n CheckoutResponseStatusSchema,\n\n // Sub-entity schemas (checkout internals)\n BuyerSchema,\n TotalResponseSchema,\n LineItemResponseSchema,\n MessageSchema,\n MessageErrorSchema,\n PostalAddressSchema,\n\n // Payment (response)\n PaymentResponseSchema,\n PaymentHandlerResponseSchema,\n PaymentInstrumentSchema,\n\n // Fulfillment (response)\n FulfillmentResponseSchema,\n FulfillmentMethodResponseSchema,\n\n // Items (response)\n ItemResponseSchema,\n\n // Order (UCP spec order — different from gateway's UCPOrderSchema)\n OrderSchema as UCPSpecOrderSchema,\n\n // ─── Checkout (base) ────────────────────────────────────────────────────────\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 DiscountDiscountsObjectSchema,\n\n // ─── Fulfillment (core) ─────────────────────────────────────────────────────\n FulfillmentSchema,\n FulfillmentOptionSchema,\n FulfillmentGroupSchema,\n FulfillmentMethodSchema,\n FulfillmentAvailableMethodSchema,\n FulfillmentDestinationSchema,\n FulfillmentEventSchema,\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 PaymentSchema,\n PaymentCredentialSchema,\n ExtendedPaymentCredentialSchema,\n PaymentIdentitySchema,\n PaymentInstrumentResponseSchema,\n CardCredentialSchema,\n CardPaymentInstrumentSchema,\n TokenCredentialSchema,\n\n // ─── Payment Handler (roles) ────────────────────────────────────────────────\n PaymentHandlerBaseSchema,\n PaymentHandlerBusinessSchema,\n PaymentHandlerPlatformSchema,\n\n // ─── Order (sub-entities) ───────────────────────────────────────────────────\n OrderConfirmationSchema,\n OrderLineItemSchema,\n OrderUpdateSchema,\n\n // ─── Item / LineItem ────────────────────────────────────────────────────────\n ItemSchema,\n LineItemSchema,\n LineItemUpdateRequestSchema,\n\n // ─── Message ────────────────────────────────────────────────────────────────\n MessageInfoSchema,\n MessageWarningSchema,\n\n // ─── UCP protocol ───────────────────────────────────────────────────────────\n UcpBaseSchema,\n UcpBusinessSchema,\n UcpPlatformSchema,\n UcpEntitySchema,\n UcpResponseCheckoutSchema,\n UcpResponseOrderSchema,\n UcpVersionSchema,\n UcpReverseDomainNameSchema,\n\n // ─── Capability / Service ───────────────────────────────────────────────────\n CapabilityBaseSchema,\n CapabilityBusinessSchema,\n CapabilityPlatformSchema,\n CapabilityResponseSchema,\n ServiceBaseSchema,\n ServiceBusinessSchema,\n ServicePlatformSchema,\n ServiceResponseSchema,\n\n // ─── Misc ───────────────────────────────────────────────────────────────────\n AccountInfoSchema,\n AdjustmentSchema,\n BindingSchema,\n ContextSchema,\n EmbeddedConfigSchema,\n ExpectationSchema,\n LinkSchema,\n PlatformConfigSchema,\n RetailLocationSchema,\n ShippingDestinationSchema,\n TotalSchema,\n};\n\n// ─── Webhook event schema ────────────────────────────────────────────────────\n// Not in the SDK — wraps the Order entity with event metadata.\n\nexport const WebhookEventSchema = z\n .object({\n event_id: z.string(),\n created_time: z.string(),\n order: OrderSchema.passthrough(),\n })\n .passthrough();\n\n// ─── JWK schema ─────────────────────────────────────────────────────────────\n// Not yet in the SDK — defined here until the SDK adds signing_keys support.\n\nexport const JWKSchema = z\n .object({\n kty: z.string(),\n kid: z.string().optional(),\n use: z.string().optional(),\n alg: z.string().optional(),\n crv: z.string().optional(),\n x: z.string().optional(),\n y: z.string().optional(),\n })\n .passthrough();\n","import { randomUUID } from 'node:crypto';\nimport type { ZodType } from 'zod';\nimport { UCPError, UCPIdempotencyConflictError } from './errors.js';\nimport type { UCPMessage, MessageType, MessageSeverity, ContentType } 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 =\n config.onValidationWarning ?? // eslint-disable-next-line no-console\n ((msg, detail) => console.warn(msg, detail));\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: unknown = await res.json().catch(() => ({}));\n\n if (!res.ok) {\n this.throwFromResponse(data, res.status);\n }\n\n return data;\n }\n\n validate<T>(data: unknown, schema: ZodType<T>): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n this.onValidationWarning('[UCPClient] Response validation failed:', result.error.message);\n return data as T;\n }\n return result.data;\n }\n\n private throwFromResponse(data: unknown, statusCode: number): never {\n if (typeof data !== 'object' || data === null) {\n if (statusCode === 409) throw new UCPIdempotencyConflictError();\n throw new UCPError('HTTP_ERROR', `Gateway returned ${statusCode}`, 'error', statusCode);\n }\n\n const body = data as Record<string, unknown>;\n const rawMessages = body['messages'];\n\n if (Array.isArray(rawMessages) && 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 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'] ?? 'Unknown error'),\n ...(record['code'] !== undefined ? { code: String(record['code']) } : {}),\n ...(record['severity'] !== undefined\n ? { severity: String(record['severity']) as MessageSeverity }\n : {}),\n ...(record['path'] !== undefined ? { path: String(record['path']) } : {}),\n ...(record['content_type'] !== undefined\n ? { content_type: String(record['content_type']) as ContentType }\n : {}),\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} from '../types/checkout.js';\n\nconst DEFAULT_METHOD_ID = 'default';\nconst DEFAULT_GROUP_ID = 'default';\n\ntype FulfillmentPatch = Omit<UpdateCheckoutPayload, 'fulfillment' | 'discounts'>;\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(\n id: string,\n type: string,\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: { methods: [{ id: DEFAULT_METHOD_ID, type }] },\n });\n }\n\n async selectDestination(\n id: string,\n destinationId: string,\n fulfillmentType = 'shipping',\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: {\n methods: [\n {\n id: DEFAULT_METHOD_ID,\n type: fulfillmentType,\n selected_destination_id: destinationId,\n },\n ],\n },\n });\n }\n\n async selectFulfillmentOption(\n id: string,\n optionId: string,\n destinationId?: string,\n fulfillmentType = 'shipping',\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\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(\n id: string,\n codes: readonly string[],\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n discounts: { codes: [...codes] },\n });\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 } from '../schemas.js';\nimport type { UCPSpecOrder } 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: Record<string, unknown>): Promise<UCPSpecOrder> {\n const data = await this.http.request('PUT', `/orders/${encodeURIComponent(id)}`, payload);\n return this.http.validate(data, UCPSpecOrderSchema);\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 throw new UCPOAuthError(`Token exchange failed with status ${res.status}`, res.status);\n }\n\n const raw: unknown = await res.json();\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 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.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(id, patch);\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}\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}\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 type { UcpDiscoveryProfile } from '@omnixhq/ucp-js-sdk';\nimport { HttpClient } from './http.js';\nimport type { LogFn } from './http.js';\nimport { UCPProfileSchema, JWKSchema } from './schemas.js';\nimport type { JWK } from './types/common.js';\nimport { CheckoutCapability } from './capabilities/checkout.js';\nimport { OrderCapability } from './capabilities/order.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 = UcpDiscoveryProfile;\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 /** 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\n/**\n * Connect to a UCP server, discover its capabilities, and return a {@link ConnectedClient}.\n *\n * @example\n * ```typescript\n * const client = await connect({\n * gatewayUrl: 'https://store.example.com/ucp',\n * agentProfileUrl: 'https://platform.example.com/.well-known/ucp',\n * });\n *\n * if (client.checkout) {\n * const session = await client.checkout.create({ line_items: [...] });\n * }\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 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 identityLinking,\n paymentHandlers,\n describeTools: () => buildToolDescriptors(checkout, order, identityLinking),\n getAgentTools: () => getAgentTools(client),\n };\n\n return Object.freeze(client);\n}\n\n/**\n * UCP client entry point. Use `UCPClient.connect()` to discover server capabilities\n * and get a {@link ConnectedClient}.\n *\n * @example\n * ```typescript\n * const client = await UCPClient.connect({\n * gatewayUrl: 'https://store.example.com/ucp',\n * agentProfileUrl: 'https://platform.example.com/.well-known/ucp',\n * });\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 new URL(config.gatewayUrl);\n if (config.agentProfileUrl.includes('\"') || config.agentProfileUrl.includes('\\n')) {\n throw new Error('agentProfileUrl must not contain double quotes or newlines');\n }\n new URL(config.agentProfileUrl);\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 PaymentHandlerInstanceSchema = z\n .object({\n id: z.string(),\n version: z.string(),\n spec: z.string(),\n schema: z.string(),\n config: z.record(z.unknown()).optional(),\n })\n .passthrough();\n\nconst PaymentHandlerMapSchema = z.record(z.array(PaymentHandlerInstanceSchema));\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 as JWK);\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\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 const raw: unknown = await res.json();\n const parsed = OAuthServerMetadataSchema.safeParse(raw);\n\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 identityLinking: IdentityLinkingCapability | null,\n): readonly ToolDescriptor[] {\n const tools: ToolDescriptor[] = [];\n\n if (checkout) {\n tools.push(\n {\n name: 'create_checkout',\n capability: 'checkout',\n description: 'Create a checkout session',\n },\n {\n name: 'get_checkout',\n capability: 'checkout',\n description: 'Get checkout session by ID',\n },\n {\n name: 'update_checkout',\n capability: 'checkout',\n description: 'Update a checkout session',\n },\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 }\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 {\n name: 'get_order',\n capability: 'order',\n description: 'Get order by ID',\n },\n {\n name: 'update_order',\n capability: 'order',\n description: 'Update an order',\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,\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(gatewayUrl: string): WebhookVerifier {\n const baseUrl = gatewayUrl.replace(/\\/+$/, '');\n const keyCache = new Map<string, JWK>();\n let fetched = false;\n\n async function loadKeys(): Promise<void> {\n const res = await fetch(`${baseUrl}/.well-known/ucp`);\n if (!res.ok) return;\n const profile: unknown = await res.json();\n const rawKeys = (profile as Record<string, unknown>)['signing_keys'];\n if (!Array.isArray(rawKeys)) return;\n keyCache.clear();\n for (const item of rawKeys) {\n const parsed = JWKSchema.safeParse(item);\n if (parsed.success && typeof (parsed.data as JWK).kid === 'string') {\n keyCache.set((parsed.data as JWK).kid!, parsed.data as JWK);\n }\n }\n fetched = true;\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 loadKeys();\n\n // Re-fetch on kid miss to support key rotation (new key added to signing_keys)\n if (!keyCache.has(kid)) await loadKeys();\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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"}
1
+ {"version":3,"file":"index.cjs","names":["config: HttpClientConfig","token: string","method: HttpMethod","path: string","body?: unknown","headers: Record<string, string>","data: unknown","schema: ZodType<T>","statusCode: number","UCPIdempotencyConflictError","UCPError","rawMessages: unknown[]","m: unknown","validTypes: readonly string[]","type: MessageType","http: HttpClient","extensions: CheckoutExtensions","payload: CreateCheckoutPayload","id: string","patch: UpdateCheckoutPayload","payload: CompleteCheckoutPayload","type: string","patch?: FulfillmentPatch","destinationId: string","optionId: string","destinationId?: string","codes: readonly string[]","data: unknown","UCPEscalationError","http: HttpClient","id: string","UCPSpecOrderSchema","payload: Record<string, unknown>","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","keys: JWK[]","http: HttpClient","capabilityNames: Set<string>","extensions: CheckoutExtensions","raw: unknown","checkout: CheckoutCapability | null","order: OrderCapability | null","identityLinking: IdentityLinkingCapability | null","tools: ToolDescriptor[]","body: string","signature: string","signingKeys: readonly JWK[]","header: Record<string, unknown>","cryptoKey: CryptoKey","sigBytes: Uint8Array<ArrayBuffer>","gatewayUrl: string","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/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';\nimport {\n // ─── Response schemas ───────────────────────────────────────────────────────\n UcpDiscoveryProfileSchema,\n CheckoutResponseStatusSchema,\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 ──────────────────────────────────────────────────────────────────\n OrderSchema,\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 DiscountDiscountsObjectSchema,\n\n // ─── Fulfillment (core) ─────────────────────────────────────────────────────\n FulfillmentSchema,\n FulfillmentOptionSchema,\n FulfillmentGroupSchema,\n FulfillmentMethodSchema,\n FulfillmentAvailableMethodSchema,\n FulfillmentDestinationSchema,\n FulfillmentEventSchema,\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 PaymentSchema,\n PaymentCredentialSchema,\n PaymentIdentitySchema,\n PaymentInstrumentResponseSchema,\n CardCredentialSchema,\n CardPaymentInstrumentSchema,\n TokenCredentialSchema,\n\n // ─── Payment Handler (roles) ────────────────────────────────────────────────\n PaymentHandlerBaseSchema,\n PaymentHandlerBusinessSchema,\n PaymentHandlerPlatformSchema,\n\n // ─── Order (sub-entities) ───────────────────────────────────────────────────\n OrderConfirmationSchema,\n OrderLineItemSchema,\n OrderUpdateSchema,\n\n // ─── Item / LineItem ────────────────────────────────────────────────────────\n ItemSchema,\n LineItemSchema,\n LineItemUpdateRequestSchema,\n\n // ─── Message ────────────────────────────────────────────────────────────────\n MessageInfoSchema,\n MessageWarningSchema,\n\n // ─── UCP protocol ───────────────────────────────────────────────────────────\n UcpBaseSchema,\n UcpBusinessSchema,\n UcpPlatformSchema,\n UcpEntitySchema,\n UcpResponseCheckoutSchema,\n UcpResponseOrderSchema,\n UcpVersionSchema,\n UcpReverseDomainNameSchema,\n\n // ─── Capability / Service ───────────────────────────────────────────────────\n CapabilityBaseSchema,\n CapabilityBusinessSchema,\n CapabilityPlatformSchema,\n CapabilityResponseSchema,\n ServiceBaseSchema,\n ServiceBusinessSchema,\n ServicePlatformSchema,\n ServiceResponseSchema,\n\n // ─── Misc ───────────────────────────────────────────────────────────────────\n AccountInfoSchema,\n AdjustmentSchema,\n BindingSchema,\n ContextSchema,\n EmbeddedConfigSchema,\n ExpectationSchema,\n LinkSchema,\n RetailLocationSchema,\n ShippingDestinationSchema,\n TotalSchema,\n} from '@omnixhq/ucp-js-sdk';\n\n// ─── Response validation ────────────────────────────────────────────────────\n// Used internally by UCPClient to validate gateway responses.\n// `.passthrough()` allows extra fields the gateway may add beyond the spec.\n\nexport const CheckoutSessionSchema = CheckoutResponseSchema.passthrough();\nexport const UCPProfileSchema = UcpDiscoveryProfileSchema.passthrough();\n\n// ─── Request validation ─────────────────────────────────────────────────────\n// Used to validate outgoing payloads before sending to gateway.\n// `.passthrough()` allows extra fields the caller may include.\n\nexport const CreateCheckoutRequestSchema = CheckoutCreateRequestSchema.passthrough();\nexport const UpdateCheckoutRequestSchema = CheckoutUpdateRequestSchema.passthrough();\nexport const CompleteCheckoutRequestSchema = CheckoutCompleteRequestSchema.passthrough();\n\n// ─── Backward-compat schemas ────────────────────────────────────────────────\n// Removed from ucp-js-sdk 1.0.2 — kept here so downstream consumers don't break.\n\n/** @deprecated Removed from ucp-js-sdk 1.0.2. Use PaymentCredentialSchema instead. */\nexport const ExtendedPaymentCredentialSchema = z\n .object({\n type: z.string(),\n token: z.string().optional(),\n })\n .passthrough();\n\n/** @deprecated Removed from ucp-js-sdk 1.0.2. Will be removed in a future major version. */\nexport const PlatformConfigSchema = z\n .object({\n webhook_url: z.string().optional(),\n })\n .passthrough();\n\n// ─── SDK re-exports ─────────────────────────────────────────────────────────\n// Re-export all SDK schemas so consumers can use them for tool definitions,\n// Zod-to-JSON-Schema conversion, validation, etc.\n\nexport {\n // Enums / status\n CheckoutResponseStatusSchema,\n\n // Sub-entity schemas (checkout internals)\n BuyerSchema,\n TotalResponseSchema,\n LineItemResponseSchema,\n MessageSchema,\n MessageErrorSchema,\n PostalAddressSchema,\n\n // Payment (response)\n PaymentResponseSchema,\n PaymentHandlerResponseSchema,\n PaymentInstrumentSchema,\n\n // Fulfillment (response)\n FulfillmentResponseSchema,\n FulfillmentMethodResponseSchema,\n\n // Items (response)\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 DiscountDiscountsObjectSchema,\n\n // ─── Fulfillment (core) ─────────────────────────────────────────────────────\n FulfillmentSchema,\n FulfillmentOptionSchema,\n FulfillmentGroupSchema,\n FulfillmentMethodSchema,\n FulfillmentAvailableMethodSchema,\n FulfillmentDestinationSchema,\n FulfillmentEventSchema,\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 PaymentSchema,\n PaymentCredentialSchema,\n PaymentIdentitySchema,\n PaymentInstrumentResponseSchema,\n CardCredentialSchema,\n CardPaymentInstrumentSchema,\n TokenCredentialSchema,\n\n // ─── Payment Handler (roles) ────────────────────────────────────────────────\n PaymentHandlerBaseSchema,\n PaymentHandlerBusinessSchema,\n PaymentHandlerPlatformSchema,\n\n // ─── Order (sub-entities) ───────────────────────────────────────────────────\n OrderConfirmationSchema,\n OrderLineItemSchema,\n OrderUpdateSchema,\n\n // ─── Item / LineItem ────────────────────────────────────────────────────────\n ItemSchema,\n LineItemSchema,\n LineItemUpdateRequestSchema,\n\n // ─── Message ────────────────────────────────────────────────────────────────\n MessageInfoSchema,\n MessageWarningSchema,\n\n // ─── UCP protocol ───────────────────────────────────────────────────────────\n UcpBaseSchema,\n UcpBusinessSchema,\n UcpPlatformSchema,\n UcpEntitySchema,\n UcpResponseCheckoutSchema,\n UcpResponseOrderSchema,\n UcpVersionSchema,\n UcpReverseDomainNameSchema,\n\n // ─── Capability / Service ───────────────────────────────────────────────────\n CapabilityBaseSchema,\n CapabilityBusinessSchema,\n CapabilityPlatformSchema,\n CapabilityResponseSchema,\n ServiceBaseSchema,\n ServiceBusinessSchema,\n ServicePlatformSchema,\n ServiceResponseSchema,\n\n // ─── Misc ───────────────────────────────────────────────────────────────────\n AccountInfoSchema,\n AdjustmentSchema,\n BindingSchema,\n ContextSchema,\n EmbeddedConfigSchema,\n ExpectationSchema,\n LinkSchema,\n RetailLocationSchema,\n ShippingDestinationSchema,\n TotalSchema,\n};\n\n// ─── Webhook event schema ────────────────────────────────────────────────────\n// Not in the SDK — wraps the Order entity with event metadata.\n\nexport const WebhookEventSchema = z\n .object({\n event_id: z.string(),\n created_time: z.string(),\n order: OrderSchema.passthrough(),\n })\n .passthrough();\n\n// ─── JWK schema ─────────────────────────────────────────────────────────────\n// Not yet in the SDK — defined here until the SDK adds signing_keys support.\n\nexport const JWKSchema = z\n .object({\n kty: z.string(),\n kid: z.string().optional(),\n use: z.string().optional(),\n alg: z.string().optional(),\n crv: z.string().optional(),\n x: z.string().optional(),\n y: z.string().optional(),\n })\n .passthrough();\n","import { randomUUID } from 'node:crypto';\nimport type { ZodType } from 'zod';\nimport { UCPError, UCPIdempotencyConflictError } from './errors.js';\nimport type { UCPMessage, MessageType, MessageSeverity, ContentType } 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 =\n config.onValidationWarning ?? // eslint-disable-next-line no-console\n ((msg, detail) => console.warn(msg, detail));\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: unknown = await res.json().catch(() => ({}));\n\n if (!res.ok) {\n this.throwFromResponse(data, res.status);\n }\n\n return data;\n }\n\n validate<T>(data: unknown, schema: ZodType<T>): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n this.onValidationWarning('[UCPClient] Response validation failed:', result.error.message);\n return data as T;\n }\n return result.data;\n }\n\n private throwFromResponse(data: unknown, statusCode: number): never {\n if (typeof data !== 'object' || data === null) {\n if (statusCode === 409) throw new UCPIdempotencyConflictError();\n throw new UCPError('HTTP_ERROR', `Gateway returned ${statusCode}`, 'error', statusCode);\n }\n\n const body = data as Record<string, unknown>;\n const rawMessages = body['messages'];\n\n if (Array.isArray(rawMessages) && 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 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'] ?? 'Unknown error'),\n ...(record['code'] !== undefined ? { code: String(record['code']) } : {}),\n ...(record['severity'] !== undefined\n ? { severity: String(record['severity']) as MessageSeverity }\n : {}),\n ...(record['path'] !== undefined ? { path: String(record['path']) } : {}),\n ...(record['content_type'] !== undefined\n ? { content_type: String(record['content_type']) as ContentType }\n : {}),\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} from '../types/checkout.js';\n\nconst DEFAULT_METHOD_ID = 'default';\nconst DEFAULT_GROUP_ID = 'default';\n\ntype FulfillmentPatch = Omit<UpdateCheckoutPayload, 'fulfillment' | 'discounts'>;\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(\n id: string,\n type: string,\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: { methods: [{ id: DEFAULT_METHOD_ID, type }] },\n });\n }\n\n async selectDestination(\n id: string,\n destinationId: string,\n fulfillmentType = 'shipping',\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: {\n methods: [\n {\n id: DEFAULT_METHOD_ID,\n type: fulfillmentType,\n selected_destination_id: destinationId,\n },\n ],\n },\n });\n }\n\n async selectFulfillmentOption(\n id: string,\n optionId: string,\n destinationId?: string,\n fulfillmentType = 'shipping',\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\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(\n id: string,\n codes: readonly string[],\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n discounts: { codes: [...codes] },\n });\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 } from '../schemas.js';\nimport type { UCPSpecOrder } 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: Record<string, unknown>): Promise<UCPSpecOrder> {\n const data = await this.http.request('PUT', `/orders/${encodeURIComponent(id)}`, payload);\n return this.http.validate(data, UCPSpecOrderSchema);\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 throw new UCPOAuthError(`Token exchange failed with status ${res.status}`, res.status);\n }\n\n const raw: unknown = await res.json();\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 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.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(id, patch);\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}\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}\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 type { UcpDiscoveryProfile } from '@omnixhq/ucp-js-sdk';\nimport { HttpClient } from './http.js';\nimport type { LogFn } from './http.js';\nimport { UCPProfileSchema, JWKSchema } from './schemas.js';\nimport type { JWK } from './types/common.js';\nimport { CheckoutCapability } from './capabilities/checkout.js';\nimport { OrderCapability } from './capabilities/order.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 = UcpDiscoveryProfile;\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 /** 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\n/**\n * Connect to a UCP server, discover its capabilities, and return a {@link ConnectedClient}.\n *\n * @example\n * ```typescript\n * const client = await connect({\n * gatewayUrl: 'https://store.example.com/ucp',\n * agentProfileUrl: 'https://platform.example.com/.well-known/ucp',\n * });\n *\n * if (client.checkout) {\n * const session = await client.checkout.create({ line_items: [...] });\n * }\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 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 identityLinking,\n paymentHandlers,\n describeTools: () => buildToolDescriptors(checkout, order, identityLinking),\n getAgentTools: () => getAgentTools(client),\n };\n\n return Object.freeze(client);\n}\n\n/**\n * UCP client entry point. Use `UCPClient.connect()` to discover server capabilities\n * and get a {@link ConnectedClient}.\n *\n * @example\n * ```typescript\n * const client = await UCPClient.connect({\n * gatewayUrl: 'https://store.example.com/ucp',\n * agentProfileUrl: 'https://platform.example.com/.well-known/ucp',\n * });\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 new URL(config.gatewayUrl);\n if (config.agentProfileUrl.includes('\"') || config.agentProfileUrl.includes('\\n')) {\n throw new Error('agentProfileUrl must not contain double quotes or newlines');\n }\n new URL(config.agentProfileUrl);\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 PaymentHandlerInstanceSchema = z\n .object({\n id: z.string(),\n version: z.string(),\n spec: z.string(),\n schema: z.string(),\n config: z.record(z.unknown()).optional(),\n })\n .passthrough();\n\nconst PaymentHandlerMapSchema = z.record(z.array(PaymentHandlerInstanceSchema));\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 as JWK);\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\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 const raw: unknown = await res.json();\n const parsed = OAuthServerMetadataSchema.safeParse(raw);\n\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 identityLinking: IdentityLinkingCapability | null,\n): readonly ToolDescriptor[] {\n const tools: ToolDescriptor[] = [];\n\n if (checkout) {\n tools.push(\n {\n name: 'create_checkout',\n capability: 'checkout',\n description: 'Create a checkout session',\n },\n {\n name: 'get_checkout',\n capability: 'checkout',\n description: 'Get checkout session by ID',\n },\n {\n name: 'update_checkout',\n capability: 'checkout',\n description: 'Update a checkout session',\n },\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 }\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 {\n name: 'get_order',\n capability: 'order',\n description: 'Get order by ID',\n },\n {\n name: 'update_order',\n capability: 'order',\n description: 'Update an order',\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,\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(gatewayUrl: string): WebhookVerifier {\n const baseUrl = gatewayUrl.replace(/\\/+$/, '');\n const keyCache = new Map<string, JWK>();\n let fetched = false;\n\n async function loadKeys(): Promise<void> {\n const res = await fetch(`${baseUrl}/.well-known/ucp`);\n if (!res.ok) return;\n const profile: unknown = await res.json();\n const rawKeys = (profile as Record<string, unknown>)['signing_keys'];\n if (!Array.isArray(rawKeys)) return;\n keyCache.clear();\n for (const item of rawKeys) {\n const parsed = JWKSchema.safeParse(item);\n if (parsed.success && typeof (parsed.data as JWK).kid === 'string') {\n keyCache.set((parsed.data as JWK).kid!, parsed.data as JWK);\n }\n }\n fetched = true;\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 loadKeys();\n\n // Re-fetch on kid miss to support key rotation (new key added to signing_keys)\n if (!keyCache.has(kid)) await loadKeys();\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyIA,MAAa,wBAAwB,4CAAuB,aAAa;AACzE,MAAa,mBAAmB,+CAA0B,aAAa;AAMvE,MAAa,8BAA8B,iDAA4B,aAAa;AACpF,MAAa,8BAA8B,iDAA4B,aAAa;AACpF,MAAa,gCAAgC,mDAA8B,aAAa;;AAMxF,MAAa,kCAAkC,MAC5C,OAAO;CACN,MAAM,MAAE,QAAQ;CAChB,OAAO,MAAE,QAAQ,CAAC,UAAU;AAC7B,EAAC,CACD,aAAa;;AAGhB,MAAa,uBAAuB,MACjC,OAAO,EACN,aAAa,MAAE,QAAQ,CAAC,UAAU,CACnC,EAAC,CACD,aAAa;AAkJhB,MAAa,qBAAqB,MAC/B,OAAO;CACN,UAAU,MAAE,QAAQ;CACpB,cAAc,MAAE,QAAQ;CACxB,OAAO,iCAAY,aAAa;AACjC,EAAC,CACD,aAAa;AAKhB,MAAa,YAAY,MACtB,OAAO;CACN,KAAK,MAAE,QAAQ;CACf,KAAK,MAAE,QAAQ,CAAC,UAAU;CAC1B,KAAK,MAAE,QAAQ,CAAC,UAAU;CAC1B,KAAK,MAAE,QAAQ,CAAC,UAAU;CAC1B,KAAK,MAAE,QAAQ,CAAC,UAAU;CAC1B,GAAG,MAAE,QAAQ,CAAC,UAAU;CACxB,GAAG,MAAE,QAAQ,CAAC,UAAU;AACzB,EAAC,CACD,aAAa;;;;ACxThB,IAAa,aAAb,MAAa,WAAW;CACtB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAYA,QAA0B;AACpC,OAAK,aAAa,OAAO;AACzB,OAAK,kBAAkB,OAAO;AAC9B,OAAK,aAAa,OAAO;AACzB,OAAK,mBAAmB,OAAO;AAC/B,OAAK,cAAc,OAAO;AAC1B,OAAK,sBACH,OAAO,wBACN,CAAC,KAAK,WAAW,QAAQ,KAAK,KAAK,OAAO;CAC9C;CAED,gBAAgBC,OAA2B;AACzC,SAAO,IAAI,WAAW;GACpB,YAAY,KAAK;GACjB,iBAAiB,KAAK;GACtB,YAAY,KAAK;GACjB,GAAI,KAAK,8BAAiC,EAAE,kBAAkB,KAAK,iBAAkB,IAAG,CAAE;GAC1F,aAAa;GACb,qBAAqB,KAAK;EAC3B;CACF;CAED,MAAM,QAAQC,QAAoBC,MAAcC,MAAkC;EAChF,MAAM,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK;EACtC,MAAM,YAAY,6BAAY;EAE9B,MAAMC,UAAkC;GACtC,cAAc,WAAW,KAAK,gBAAgB,cAAc,KAAK,WAAW;GAC5E,cAAc;EACf;AAED,MAAI,gBACF,SAAQ,kBAAkB;AAG5B,MAAI,KAAK,4BACP,SAAQ,uBAAuB,KAAK;AAGtC,MAAI,KAAK,uBACP,SAAQ,oBAAoB,SAAS,KAAK,YAAY;AAGxD,MAAI,WAAW,UAAU,WAAW,MAClC,SAAQ,qBAAqB,6BAAY;EAG3C,MAAM,MAAM,MAAM,MAAM,KAAK;GAC3B;GACA;GACA,GAAI,kBAAqB,EAAE,MAAM,KAAK,UAAU,KAAK,CAAE,IAAG,CAAE;EAC7D,EAAC;EAEF,MAAMC,OAAgB,MAAM,IAAI,MAAM,CAAC,MAAM,OAAO,CAAE,GAAE;AAExD,OAAK,IAAI,GACP,MAAK,kBAAkB,MAAM,IAAI,OAAO;AAG1C,SAAO;CACR;CAED,SAAYA,MAAeC,QAAuB;EAChD,MAAM,SAAS,OAAO,UAAU,KAAK;AACrC,OAAK,OAAO,SAAS;AACnB,QAAK,oBAAoB,2CAA2C,OAAO,MAAM,QAAQ;AACzF,UAAO;EACR;AACD,SAAO,OAAO;CACf;CAED,AAAQ,kBAAkBD,MAAeE,YAA2B;AAClE,aAAW,SAAS,YAAY,SAAS,MAAM;AAC7C,OAAI,eAAe,IAAK,OAAM,IAAIC;AAClC,SAAM,IAAIC,wBAAS,eAAe,mBAAmB,WAAW,GAAG,SAAS;EAC7E;EAED,MAAM,OAAO;EACb,MAAM,cAAc,KAAK;AAEzB,MAAI,MAAM,QAAQ,YAAY,IAAI,YAAY,SAAS,GAAG;GACxD,MAAM,cAAc,cAAc,YAAY;GAC9C,MAAM,QAAQ,YAAY;GAC1B,MAAM,OAAO,MAAM,QAAQ;AAE3B,SAAM,IAAIA,wBAAS,MAAM,MAAM,SAAS,MAAM,MAAM,YAAY;IAC9D,GAAI,MAAM,kBAAqB,EAAE,MAAM,MAAM,KAAM,IAAG,CAAE;IACxD,GAAI,MAAM,0BAA6B,EAAE,aAAa,MAAM,aAAc,IAAG,CAAE;IAC/E,UAAU;GACX;EACF;AAED,MAAI,eAAe,IAAK,OAAM,IAAID;AAClC,QAAM,IAAIC,wBAAS,eAAe,mBAAmB,WAAW,GAAG,SAAS;CAC7E;AACF;AAED,SAAS,cAAcC,aAAsC;AAC3D,QAAO,YAAY,IAAI,CAACC,MAAe;EACrC,MAAM,SAAS;EACf,MAAM,UAAU,OAAO,OAAO,WAAW,QAAQ;AAEjD,MAAI,YAAY,SAAS;GACvB,MAAM,SAAS,wCAAmB,UAAU,EAAE;AAC9C,OAAI,OAAO,QACT,QAAO;IACL,MAAM;IACN,MAAM,OAAO,KAAK;IAClB,SAAS,OAAO,KAAK;IACrB,UAAU,OAAO,KAAK;IACtB,GAAI,OAAO,KAAK,kBAAqB,EAAE,MAAM,OAAO,KAAK,KAAM,IAAG,CAAE;IACpE,GAAI,OAAO,KAAK,0BACZ,EAAE,cAAc,OAAO,KAAK,aAAc,IAC1C,CAAE;GACP;EAEJ;AAED,MAAI,YAAY,WAAW;GACzB,MAAM,SAAS,0CAAqB,UAAU,EAAE;AAChD,OAAI,OAAO,QACT,QAAO;IACL,MAAM;IACN,MAAM,OAAO,KAAK;IAClB,SAAS,OAAO,KAAK;IACrB,GAAI,OAAO,KAAK,kBAAqB,EAAE,MAAM,OAAO,KAAK,KAAM,IAAG,CAAE;IACpE,GAAI,OAAO,KAAK,0BACZ,EAAE,cAAc,OAAO,KAAK,aAAc,IAC1C,CAAE;GACP;EAEJ;AAED,MAAI,YAAY,QAAQ;GACtB,MAAM,SAAS,uCAAkB,UAAU,EAAE;AAC7C,OAAI,OAAO,QACT,QAAO;IACL,MAAM;IACN,SAAS,OAAO,KAAK;IACrB,GAAI,OAAO,KAAK,kBAAqB,EAAE,MAAM,OAAO,KAAK,KAAM,IAAG,CAAE;IACpE,GAAI,OAAO,KAAK,kBAAqB,EAAE,MAAM,OAAO,KAAK,KAAM,IAAG,CAAE;IACpE,GAAI,OAAO,KAAK,0BACZ,EAAE,cAAc,OAAO,KAAK,aAAc,IAC1C,CAAE;GACP;EAEJ;EAED,MAAMC,aAAgC;GAAC;GAAS;GAAW;EAAO;EAClE,MAAMC,OAAoB,WAAW,SAAS,QAAQ,GAAI,UAA0B;AAEpF,SAAO;GACL;GACA,SAAS,OAAO,OAAO,cAAc,gBAAgB;GACrD,GAAI,OAAO,qBAAwB,EAAE,MAAM,OAAO,OAAO,QAAQ,CAAE,IAAG,CAAE;GACxE,GAAI,OAAO,yBACP,EAAE,UAAU,OAAO,OAAO,YAAY,CAAqB,IAC3D,CAAE;GACN,GAAI,OAAO,qBAAwB,EAAE,MAAM,OAAO,OAAO,QAAQ,CAAE,IAAG,CAAE;GACxE,GAAI,OAAO,6BACP,EAAE,cAAc,OAAO,OAAO,gBAAgB,CAAiB,IAC/D,CAAE;EACP;CACF,EAAC;AACH;;;;ACpLD,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;;;;;AAQzB,IAAa,qBAAb,MAAgC;;CAE9B,AAAS;CAET,YACmBC,MACjBC,YACA;EAkHH,KApHoB;AAGjB,OAAK,aAAa;CACnB;CAED,MAAM,OAAOC,SAA0D;EACrE,MAAM,OAAO,MAAM,KAAK,KAAK,QAAQ,QAAQ,sBAAsB,QAAQ;AAC3E,SAAO,KAAK,gBAAgB,KAAK;CAClC;CAED,MAAM,IAAIC,IAAsC;EAC9C,MAAM,OAAO,MAAM,KAAK,KAAK,QAAQ,QAAQ,qBAAqB,mBAAmB,GAAG,CAAC,EAAE;AAC3F,SAAO,KAAK,gBAAgB,KAAK;CAClC;CAED,MAAM,OAAOA,IAAYC,OAAwD;EAC/E,MAAM,OAAO,MAAM,KAAK,KAAK,QAC3B,QACC,qBAAqB,mBAAmB,GAAG,CAAC,GAC7C,MACD;AACD,SAAO,KAAK,gBAAgB,KAAK;CAClC;CAED,MAAM,SAASD,IAAYE,SAA4D;EACrF,MAAM,OAAO,MAAM,KAAK,KAAK,QAC3B,SACC,qBAAqB,mBAAmB,GAAG,CAAC,YAC7C,QACD;AACD,SAAO,KAAK,gBAAgB,KAAK;CAClC;CAED,MAAM,OAAOF,IAAsC;EACjD,MAAM,OAAO,MAAM,KAAK,KAAK,QAC3B,SACC,qBAAqB,mBAAmB,GAAG,CAAC,SAC9C;AACD,SAAO,KAAK,gBAAgB,KAAK;CAClC;CAED,MAAM,eACJA,IACAG,MACAC,OAC0B;AAC1B,SAAO,KAAK,OAAO,IAAI;GACrB,GAAG;GACH,aAAa,EAAE,SAAS,CAAC;IAAE,IAAI;IAAmB;GAAM,CAAC,EAAE;EAC5D,EAAC;CACH;CAED,MAAM,kBACJJ,IACAK,eACA,kBAAkB,YAClBD,OAC0B;AAC1B,SAAO,KAAK,OAAO,IAAI;GACrB,GAAG;GACH,aAAa,EACX,SAAS,CACP;IACE,IAAI;IACJ,MAAM;IACN,yBAAyB;GAC1B,CACF,EACF;EACF,EAAC;CACH;CAED,MAAM,wBACJJ,IACAM,UACAC,eACA,kBAAkB,YAClBH,OAC0B;AAC1B,SAAO,KAAK,OAAO,IAAI;GACrB,GAAG;GACH,aAAa,EACX,SAAS,CACP;IACE,IAAI;IACJ,MAAM;IACN,GAAI,2BAA8B,EAAE,yBAAyB,cAAe,IAAG,CAAE;IACjF,QAAQ,CAAC;KAAE,IAAI;KAAkB,oBAAoB;IAAU,CAAC;GACjE,CACF,EACF;EACF,EAAC;CACH;CAED,MAAM,mBACJJ,IACAQ,OACAJ,OAC0B;AAC1B,SAAO,KAAK,OAAO,IAAI;GACrB,GAAG;GACH,WAAW,EAAE,OAAO,CAAC,GAAG,KAAM,EAAE;EACjC,EAAC;CACH;CAED,AAAQ,gBAAgBK,MAAgC;EACtD,MAAM,UAAU,KAAK,KAAK,SAAS,MAAM,sBAAsB;AAE/D,MAAI,QAAQ,WAAW,yBAAyB,QAAQ,aACtD,OAAM,IAAIC,kCAAmB,QAAQ;AAGvC,SAAO;CACR;AACF;;;;;ACvID,IAAa,kBAAb,MAA6B;CAC3B,YAA6BC,MAAkB;EAchD,KAd8B;CAAoB;;CAGjD,MAAM,IAAIC,IAAmC;EAC3C,MAAM,OAAO,MAAM,KAAK,KAAK,QAAQ,QAAQ,UAAU,mBAAmB,GAAG,CAAC,EAAE;AAChF,SAAO,KAAK,KAAK,SAAS,MAAMC,iCAAmB;CACpD;;CAGD,MAAM,OAAOD,IAAYE,SAAyD;EAChF,MAAM,OAAO,MAAM,KAAK,KAAK,QAAQ,QAAQ,UAAU,mBAAmB,GAAG,CAAC,GAAG,QAAQ;AACzF,SAAO,KAAK,KAAK,SAAS,MAAMD,iCAAmB;CACpD;AACF;;;;ACRD,MAAM,sBAAsB,MACzB,OAAO;CACN,cAAc,MAAE,QAAQ;CACxB,YAAY,MAAE,QAAQ;CACtB,YAAY,MAAE,QAAQ,CAAC,UAAU;CACjC,eAAe,MAAE,QAAQ,CAAC,UAAU;CACpC,OAAO,MAAE,QAAQ,CAAC,UAAU;AAC7B,EAAC,CACD,aAAa;;;;;AAMhB,IAAa,4BAAb,MAAuC;CACrC,YAA6BE,UAA+B;EAyF7D,KAzF8B;CAAiC;;CAG9D,oBAAoBC,QAAqC;EACvD,MAAM,MAAM,IAAI,IAAI,KAAK,SAAS;AAClC,MAAI,aAAa,IAAI,iBAAiB,OAAO;AAC7C,MAAI,aAAa,IAAI,aAAa,OAAO,UAAU;AACnD,MAAI,aAAa,IAAI,gBAAgB,OAAO,aAAa;AACzD,MAAI,aAAa,IAAI,SAAS,OAAO,SAAS,8BAA8B;AAC5E,MAAI,OAAO,iBACT,KAAI,aAAa,IAAI,SAAS,OAAO,MAAM;AAE7C,SAAO,IAAI,UAAU;CACtB;CAED,MAAM,aAAaC,QAAqD;EACtE,MAAM,OAAO,IAAI,gBAAgB;GAC/B,YAAY;GACZ,MAAM,OAAO;GACb,cAAc,OAAO;EACtB;AAED,SAAO,KAAK,aAAa,OAAO,WAAW,OAAO,eAAe,KAAK;CACvE;CAED,MAAM,aAAaC,QAAoD;EACrE,MAAM,OAAO,IAAI,gBAAgB;GAC/B,YAAY;GACZ,eAAe,OAAO;EACvB;AAED,SAAO,KAAK,aAAa,OAAO,WAAW,OAAO,eAAe,KAAK;CACvE;CAED,MAAM,YAAYC,QAA0C;EAC1D,MAAM,OAAO,IAAI,gBAAgB,EAAE,OAAO,OAAO,MAAO;AACxD,MAAI,OAAO,2BACT,MAAK,IAAI,mBAAmB,OAAO,gBAAgB;EAGrD,MAAM,MAAM,MAAM,MAAM,KAAK,SAAS,qBAAqB;GACzD,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,eAAe,gBAAgB,OAAO,WAAW,OAAO,cAAc;GACvE;GACD,MAAM,KAAK,UAAU;EACtB,EAAC;AAEF,OAAK,IAAI,GACP,OAAM,IAAIC,8BAAe,2BAA2B,IAAI,OAAO,GAAG,IAAI;CAEzE;CAED,cAA6C;AAC3C,SAAO,KAAK;CACb;CAED,MAAc,aACZC,UACAC,cACAC,MACwB;EACxB,MAAM,MAAM,MAAM,MAAM,KAAK,SAAS,gBAAgB;GACpD,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,eAAe,gBAAgB,UAAU,aAAa;GACvD;GACD,MAAM,KAAK,UAAU;EACtB,EAAC;AAEF,OAAK,IAAI,GACP,OAAM,IAAIH,8BAAe,oCAAoC,IAAI,OAAO,GAAG,IAAI;EAGjF,MAAMI,MAAe,MAAM,IAAI,MAAM;EACrC,MAAM,SAAS,oBAAoB,UAAU,IAAI;AACjD,OAAK,OAAO,QACV,OAAM,IAAIJ,8BAAe,0BAA0B,OAAO,MAAM,QAAQ,GAAG,IAAI;AAGjF,SAAO,OAAO;CACf;AACF;AAED,SAAS,gBAAgBK,UAAkBC,UAA0B;AACnE,SAAQ,QAAQ,OAAO,MAAM,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC,SAAS,SAAS,CAAC;AAC3E;;;;AC3GD,MAAa,sBAAsB;AAEnC,MAAa,mBAAmB;CAC9B,UAAU;CACV,aAAa;CACb,UAAU;CACV,eAAe;CACf,OAAO;CACP,kBAAkB;CAClB,aAAa;AACd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACyCD,SAAgB,cAAcC,QAA+C;CAC3E,MAAMC,QAAqB,CAAE;AAE7B,KAAI,OAAO,UAAU;AACnB,QAAM,KAAK,GAAG,cAAc,OAAO,CAAC;AAEpC,MAAI,OAAO,SAAS,WAAW,YAC7B,OAAM,KAAK,GAAG,iBAAiB,OAAO,CAAC;AAGzC,MAAI,OAAO,SAAS,WAAW,SAC7B,OAAM,KAAK,GAAG,cAAc,OAAO,CAAC;CAEvC;AAED,KAAI,OAAO,MACT,OAAM,KAAK,GAAG,WAAW,OAAO,CAAC;AAGnC,KAAI,OAAO,gBACT,OAAM,KAAK,GAAG,qBAAqB,OAAO,CAAC;AAG7C,QAAO;AACR;AAED,SAAS,cAAcD,QAAsC;AAC3D,QAAO;EACL;GACE,MAAM;GACN,aACE;GACF,YAAY;IACV,MAAM;IACN,YAAY;KACV,YAAY;MACV,MAAM;MACN,aAAa;MACb,OAAO;OACL,MAAM;OACN,YAAY;QACV,MAAM;SACJ,MAAM;SACN,YAAY,EAAE,IAAI;UAAE,MAAM;UAAU,aAAa;SAAc,EAAE;SACjE,UAAU,CAAC,IAAK;QACjB;QACD,UAAU;SAAE,MAAM;SAAU,aAAa;QAAwB;OAClE;OACD,UAAU,CAAC,QAAQ,UAAW;MAC/B;KACF;KACD,UAAU;MAAE,MAAM;MAAU,aAAa;KAAwC;IAClF;IACD,UAAU,CAAC,YAAa;GACzB;GACD,SAAS,OAAO,WACd,OAAO,SAAU,OACf,OACD;EACJ;EACD;GACE,MAAM;GACN,aACE;GACF,YAAY;IACV,MAAM;IACN,YAAY,EACV,IAAI;KAAE,MAAM;KAAU,aAAa;IAAuB,EAC3D;IACD,UAAU,CAAC,IAAK;GACjB;GACD,SAAS,OAAO,WAAW,OAAO,SAAU,IAAI,OAAO,MAAgB;EACxE;EACD;GACE,MAAM;GACN,aACE;GACF,YAAY;IACV,MAAM;IACN,YAAY;KACV,IAAI;MAAE,MAAM;MAAU,aAAa;KAAuB;KAC1D,OAAO;MACL,MAAM;MACN,aAAa;MACb,YAAY;OACV,YAAY,EAAE,MAAM,SAAU;OAC9B,WAAW,EAAE,MAAM,SAAU;OAC7B,OAAO,EAAE,MAAM,SAAU;OACzB,cAAc,EAAE,MAAM,SAAU;MACjC;KACF;KACD,SAAS;MACP,MAAM;MACN,aAAa;MACb,YAAY;OACV,iBAAiB;QAAE,MAAM;QAAU,aAAa;OAAmC;OACnF,gBAAgB;QAAE,MAAM;QAAU,aAAa;OAAqB;OACpE,aAAa,EAAE,MAAM,SAAU;MAChC;KACF;IACF;IACD,UAAU,CAAC,IAAK;GACjB;GACD,SAAS,OAAO,WAAW;IACzB,MAAM,EAAE,GAAI,GAAG,OAAO,GAAG;AACzB,WAAO,OAAO,SAAU,OAAO,IAAI,MAAM;GAC1C;EACF;EACD;GACE,MAAM;GACN,aACE;GACF,YAAY;IACV,MAAM;IACN,YAAY;KACV,IAAI;MAAE,MAAM;MAAU,aAAa;KAAuB;KAC1D,SAAS;MACP,MAAM;MACN,aAAa;MACb,YAAY,EACV,aAAa;OACX,MAAM;OACN,OAAO;QACL,MAAM;QACN,YAAY;SACV,IAAI;UAAE,MAAM;UAAU,aAAa;SAAiB;SACpD,YAAY;UACV,MAAM;UACN,aAAa;SACd;SACD,MAAM;UAAE,MAAM;UAAU,aAAa;SAA0C;SAC/E,YAAY;UACV,MAAM;UACN,YAAY;WACV,MAAM;YAAE,MAAM;YAAU,aAAa;WAAmC;WACxE,OAAO;YAAE,MAAM;YAAU,aAAa;WAAiB;UACxD;UACD,UAAU,CAAC,MAAO;SACnB;QACF;QACD,UAAU;SAAC;SAAM;SAAc;QAAO;OACvC;MACF,EACF;MACD,UAAU,CAAC,aAAc;KAC1B;IACF;IACD,UAAU,CAAC,MAAM,SAAU;GAC5B;GACD,SAAS,OAAO,WAAW;IACzB,MAAM,EAAE,GAAI,GAAG,SAAS,GAAG;AAC3B,WAAO,OAAO,SAAU,SACtB,OAAO,GAAG,EACV,QACD;GACF;EACF;EACD;GACE,MAAM;GACN,aAAa;GACb,YAAY;IACV,MAAM;IACN,YAAY,EACV,IAAI;KAAE,MAAM;KAAU,aAAa;IAAuB,EAC3D;IACD,UAAU,CAAC,IAAK;GACjB;GACD,SAAS,OAAO,WAAW,OAAO,SAAU,OAAO,OAAO,MAAgB;EAC3E;CACF;AACF;AAED,SAAS,iBAAiBA,QAAsC;AAC9D,QAAO;EACL;GACE,MAAM;GACN,aAAa;GACb,YAAY;IACV,MAAM;IACN,YAAY;KACV,IAAI;MAAE,MAAM;MAAU,aAAa;KAAuB;KAC1D,MAAM;MAAE,MAAM;MAAU,MAAM,CAAC,YAAY,QAAS;MAAE,aAAa;KAAsB;IAC1F;IACD,UAAU,CAAC,MAAM,MAAO;GACzB;GACD,SAAS,OAAO,WACd,OAAO,SAAU,eAAe,OAAO,OAAiB,OAAO,QAAkB;EACpF;EACD;GACE,MAAM;GACN,aAAa;GACb,YAAY;IACV,MAAM;IACN,YAAY;KACV,IAAI;MAAE,MAAM;MAAU,aAAa;KAAuB;KAC1D,gBAAgB;MAAE,MAAM;MAAU,aAAa;KAA4B;KAC3E,kBAAkB;MAChB,MAAM;MACN,SAAS;MACT,aAAa;KACd;IACF;IACD,UAAU,CAAC,MAAM,gBAAiB;GACnC;GACD,SAAS,OAAO,WACd,OAAO,SAAU,kBACf,OAAO,OACP,OAAO,mBACN,OAAO,uBAAkC,WAC3C;EACJ;EACD;GACE,MAAM;GACN,aACE;GACF,YAAY;IACV,MAAM;IACN,YAAY;KACV,IAAI;MAAE,MAAM;MAAU,aAAa;KAAuB;KAC1D,WAAW;MAAE,MAAM;MAAU,aAAa;KAAmC;KAC7E,gBAAgB;MAAE,MAAM;MAAU,aAAa;KAAkC;KACjF,kBAAkB;MAChB,MAAM;MACN,SAAS;MACT,aAAa;KACd;IACF;IACD,UAAU,CAAC,MAAM,WAAY;GAC9B;GACD,SAAS,OAAO,WACd,OAAO,SAAU,wBACf,OAAO,OACP,OAAO,cACP,OAAO,mBACN,OAAO,uBAAkC,WAC3C;EACJ;CACF;AACF;AAED,SAAS,cAAcA,QAAsC;AAC3D,QAAO,CACL;EACE,MAAM;EACN,aAAa;EACb,YAAY;GACV,MAAM;GACN,YAAY;IACV,IAAI;KAAE,MAAM;KAAU,aAAa;IAAuB;IAC1D,OAAO;KACL,MAAM;KACN,OAAO,EAAE,MAAM,SAAU;KACzB,aAAa;IACd;GACF;GACD,UAAU,CAAC,MAAM,OAAQ;EAC1B;EACD,SAAS,OAAO,WACd,OAAO,SAAU,mBAAmB,OAAO,OAAiB,OAAO,SAAqB;CAC3F,CACF;AACF;AAED,SAAS,WAAWA,QAAsC;AACxD,QAAO,CACL;EACE,MAAM;EACN,aACE;EACF,YAAY;GACV,MAAM;GACN,YAAY,EACV,IAAI;IAAE,MAAM;IAAU,aAAa;GAAY,EAChD;GACD,UAAU,CAAC,IAAK;EACjB;EACD,SAAS,OAAO,WAAW,OAAO,MAAO,IAAI,OAAO,MAAgB;CACrE,GACD;EACE,MAAM;EACN,aAAa;EACb,YAAY;GACV,MAAM;GACN,YAAY;IACV,IAAI;KAAE,MAAM;KAAU,aAAa;IAAY;IAC/C,aAAa;KACX,MAAM;KACN,aAAa;IACd;IACD,aAAa;KACX,MAAM;KACN,aAAa;KACb,OAAO,EAAE,MAAM,SAAU;IAC1B;GACF;GACD,UAAU,CAAC,IAAK;EACjB;EACD,SAAS,OAAO,WAAW;GACzB,MAAM,EAAE,GAAI,GAAG,SAAS,GAAG;AAC3B,UAAO,OAAO,MAAO,OAAO,IAAI,QAAQ;EACzC;CACF,CACF;AACF;AAED,SAAS,qBAAqBA,QAAsC;AAClE,QAAO;EACL;GACE,MAAM;GACN,aACE;GACF,YAAY;IACV,MAAM;IACN,YAAY;KACV,WAAW;MAAE,MAAM;MAAU,aAAa;KAAmB;KAC7D,cAAc;MAAE,MAAM;MAAU,aAAa;KAA0C;KACvF,OAAO;MACL,MAAM;MACN,aAAa;KACd;KACD,OAAO;MAAE,MAAM;MAAU,aAAa;KAAoC;IAC3E;IACD,UAAU,CAAC,aAAa,cAAe;GACxC;GACD,SAAS,CAAC,WACR,QAAQ,QACN,OAAO,gBAAiB,oBACtB,OAGD,CACF;EACJ;EACD;GACE,MAAM;GACN,aAAa;GACb,YAAY;IACV,MAAM;IACN,YAAY;KACV,WAAW;MAAE,MAAM;MAAU,aAAa;KAAmB;KAC7D,eAAe;MAAE,MAAM;MAAU,aAAa;KAAuB;KACrE,MAAM;MAAE,MAAM;MAAU,aAAa;KAAwC;KAC7E,cAAc;MACZ,MAAM;MACN,aAAa;KACd;IACF;IACD,UAAU;KAAC;KAAa;KAAiB;KAAQ;IAAe;GACjE;GACD,SAAS,OAAO,WACd,OAAO,gBAAiB,aACtB,OAGD;EACJ;EACD;GACE,MAAM;GACN,aAAa;GACb,YAAY;IACV,MAAM;IACN,YAAY;KACV,WAAW;MAAE,MAAM;MAAU,aAAa;KAAmB;KAC7D,eAAe;MAAE,MAAM;MAAU,aAAa;KAAuB;KACrE,eAAe;MAAE,MAAM;MAAU,aAAa;KAA0C;IACzF;IACD,UAAU;KAAC;KAAa;KAAiB;IAAgB;GAC1D;GACD,SAAS,OAAO,WACd,OAAO,gBAAiB,aACtB,OAGD;EACJ;EACD;GACE,MAAM;GACN,aAAa;GACb,YAAY;IACV,MAAM;IACN,YAAY;KACV,WAAW;MAAE,MAAM;MAAU,aAAa;KAAmB;KAC7D,eAAe;MAAE,MAAM;MAAU,aAAa;KAAuB;KACrE,OAAO;MAAE,MAAM;MAAU,aAAa;KAAmB;KACzD,iBAAiB;MACf,MAAM;MACN,MAAM,CAAC,gBAAgB,eAAgB;MACvC,aAAa;KACd;IACF;IACD,UAAU;KAAC;KAAa;KAAiB;IAAQ;GAClD;GACD,SAAS,OAAO,WACd,OAAO,gBAAiB,YACtB,OAGD;EACJ;CACF;AACF;;;;;;;;;;;;;;;;;;;ACtYD,eAAsB,QACpBE,QACAC,SAC0B;AAC1B,gBAAe,OAAO;CAEtB,MAAM,OAAO,IAAI,WAAW;EAC1B,YAAY,OAAO,WAAW,QAAQ,QAAQ,GAAG;EACjD,iBAAiB,OAAO;EACxB,YAAY,OAAO,cAAc;EACjC,GAAI,OAAO,8BAAiC,EAAE,kBAAkB,OAAO,iBAAkB,IAAG,CAAE;EAC9F,GAAI,SAAS,iCACT,EAAE,qBAAqB,QAAQ,oBAAqB,IACpD,CAAE;CACP;CAED,MAAM,aAAa,MAAM,KAAK,QAAQ,OAAO,mBAAmB;CAChE,MAAM,UAAU,KAAK,SAAS,YAAY,iBAAiB;CAC3D,MAAM,kBAAkB,uBAAuB,QAAQ;CAEvD,MAAM,WAAW,wBAAwB,MAAM,gBAAgB;CAC/D,MAAM,QAAQ,gBAAgB,IAAI,iBAAiB,MAAM,GAAG,IAAI,gBAAgB,QAAQ;CACxF,MAAM,kBAAkB,MAAM,qBAAqB,QAAQ,gBAAgB;CAC3E,MAAM,kBAAkB,uBAAuB,QAAQ;CACvD,MAAM,cAAc,mBAAmB,QAAQ;CAE/C,MAAMC,SAA0B;EAC9B;EACA;EACA;EACA;EACA;EACA;EACA,eAAe,MAAM,qBAAqB,UAAU,OAAO,gBAAgB;EAC3E,eAAe,MAAM,cAAc,OAAO;CAC3C;AAED,QAAO,OAAO,OAAO,OAAO;AAC7B;;;;;;;;;;;;;AAcD,IAAa,YAAb,MAAuB;CACrB,AAAQ,cAAc,CAErB;CAED,OAAO,UAAU;AAClB;AAED,SAAS,eAAeF,QAA+B;AACrD,KAAI,IAAI,OAAO;AACf,KAAI,OAAO,gBAAgB,SAAS,KAAI,IAAI,OAAO,gBAAgB,SAAS,KAAK,CAC/E,OAAM,IAAI,MAAM;AAElB,KAAI,IAAI,OAAO;AAChB;AAED,SAAS,uBAAuBG,SAAkC;CAChE,MAAM,eAAe,QAAQ,KAAK;AAClC,YAAW,iBAAiB,YAAY,iBAAiB,KAAM,QAAO,IAAI;AAC1E,QAAO,IAAI,IAAI,OAAO,KAAK,aAAa;AACzC;AAED,MAAM,+BAA+B,MAClC,OAAO;CACN,IAAI,MAAE,QAAQ;CACd,SAAS,MAAE,QAAQ;CACnB,MAAM,MAAE,QAAQ;CAChB,QAAQ,MAAE,QAAQ;CAClB,QAAQ,MAAE,OAAO,MAAE,SAAS,CAAC,CAAC,UAAU;AACzC,EAAC,CACD,aAAa;AAEhB,MAAM,0BAA0B,MAAE,OAAO,MAAE,MAAM,6BAA6B,CAAC;AAE/E,SAAS,uBAAuBA,SAAwC;CACtE,MAAM,MAAO,QAAoC;AACjD,YAAW,QAAQ,YAAY,QAAQ,KAAM,QAAO,CAAE;CACtD,MAAM,SAAS,wBAAwB,UAAU,IAAI;AACrD,MAAK,OAAO,QAAS,QAAO,CAAE;AAC9B,QAAO,OAAO;AACf;AAED,SAAS,mBAAmBA,SAAqC;CAC/D,MAAM,MAAO,QAAoC;AACjD,MAAK,MAAM,QAAQ,IAAI,CAAE,QAAO,CAAE;CAClC,MAAMC,OAAc,CAAE;AACtB,MAAK,MAAM,QAAQ,KAAK;EACtB,MAAM,SAAS,UAAU,UAAU,KAAK;AACxC,MAAI,OAAO,QAAS,MAAK,KAAK,OAAO,KAAY;CAClD;AACD,QAAO;AACR;AAED,SAAS,wBACPC,MACAC,iBAC2B;AAC3B,MAAK,gBAAgB,IAAI,iBAAiB,SAAS,CAAE,QAAO;CAE5D,MAAMC,aAAiC;EACrC,aAAa,gBAAgB,IAAI,iBAAiB,YAAY;EAC9D,UAAU,gBAAgB,IAAI,iBAAiB,SAAS;EACxD,cAAc,gBAAgB,IAAI,iBAAiB,cAAc;EACjE,YAAY,gBAAgB,IAAI,iBAAiB,YAAY;CAC9D;AAED,QAAO,IAAI,mBAAmB,MAAM;AACrC;AAED,MAAM,4BAA4B,MAC/B,OAAO;CACN,QAAQ,MAAE,QAAQ;CAClB,wBAAwB,MAAE,QAAQ,CAAC,KAAK;CACxC,gBAAgB,MAAE,QAAQ,CAAC,KAAK;CAChC,qBAAqB,MAAE,QAAQ,CAAC,KAAK;CACrC,kBAAkB,MAAE,MAAM,MAAE,QAAQ,CAAC;CACrC,0BAA0B,MAAE,MAAM,MAAE,QAAQ,CAAC;CAC7C,uBAAuB,MAAE,MAAM,MAAE,QAAQ,CAAC;CAC1C,uCAAuC,MAAE,MAAM,MAAE,QAAQ,CAAC;CAC1D,uBAAuB,MAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;AACnD,EAAC,CACD,aAAa;AAEhB,eAAe,qBACbP,QACAM,iBAC2C;AAC3C,MAAK,gBAAgB,IAAI,iBAAiB,iBAAiB,CAAE,QAAO;CAEpE,MAAM,aAAa,OAAO,WAAW,QAAQ,QAAQ,GAAG;CACxD,MAAM,eAAe,EAAE,WAAW;CAClC,MAAM,MAAM,MAAM,MAAM,YAAY;AAEpC,MAAK,IAAI,GACP,OAAM,IAAI,OACP,wEAAwE,IAAI,OAAO,QAAQ,YAAY;CAI5G,MAAME,MAAe,MAAM,IAAI,MAAM;CACrC,MAAM,SAAS,0BAA0B,UAAU,IAAI;AAEvD,MAAK,OAAO,QACV,OAAM,IAAI,OAAO,qDAAqD,OAAO,MAAM,QAAQ;AAG7F,QAAO,IAAI,0BAA0B,OAAO;AAC7C;AAED,SAAS,qBACPC,UACAC,OACAC,iBAC2B;CAC3B,MAAMC,QAA0B,CAAE;AAElC,KAAI,UAAU;AACZ,QAAM,KACJ;GACE,MAAM;GACN,YAAY;GACZ,aAAa;EACd,GACD;GACE,MAAM;GACN,YAAY;GACZ,aAAa;EACd,GACD;GACE,MAAM;GACN,YAAY;GACZ,aAAa;EACd,GACD;GACE,MAAM;GACN,YAAY;GACZ,aAAa;EACd,GACD;GACE,MAAM;GACN,YAAY;GACZ,aAAa;EACd,EACF;AAED,MAAI,SAAS,WAAW,YACtB,OAAM,KACJ;GACE,MAAM;GACN,YAAY;GACZ,aAAa;EACd,GACD;GACE,MAAM;GACN,YAAY;GACZ,aAAa;EACd,GACD;GACE,MAAM;GACN,YAAY;GACZ,aAAa;EACd,EACF;AAGH,MAAI,SAAS,WAAW,SACtB,OAAM,KAAK;GACT,MAAM;GACN,YAAY;GACZ,aAAa;EACd,EAAC;CAEL;AAED,KAAI,MACF,OAAM,KACJ;EACE,MAAM;EACN,YAAY;EACZ,aAAa;CACd,GACD;EACE,MAAM;EACN,YAAY;EACZ,aAAa;CACd,EACF;AAGH,KAAI,gBACF,OAAM,KACJ;EACE,MAAM;EACN,YAAY;EACZ,aAAa;CACd,GACD;EACE,MAAM;EACN,YAAY;EACZ,aAAa;CACd,GACD;EACE,MAAM;EACN,YAAY;EACZ,aAAa;CACd,GACD;EACE,MAAM;EACN,YAAY;EACZ,aAAa;CACd,EACF;AAGH,QAAO;AACR;;;;;;;;;;;;ACpUD,eAAsB,uBACpBC,MACAC,WACAC,aACkB;CAClB,MAAM,QAAQ,UAAU,MAAM,IAAI;AAElC,KAAI,MAAM,WAAW,KAAK,MAAM,OAAO,GAAI,QAAO;CAElD,MAAM,CAAC,aAAa,OAAO,GAAG;CAE9B,IAAIC;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,IAAI,cAAc,OAAO,gBAAgB,UAAU,CAAC,CAAC;CAI1E,QAAO;AACN,SAAO;CACR;AAED,YAAW,OAAO,WAAW,eAAe,OAAO,WAAW,QAAS,QAAO;AAG9E,YAAW,OAAO,WAAW,SAAU,QAAO;CAC9C,MAAM,MAAM,OAAO;CAEnB,MAAM,MAAM,YAAY,KAAK,CAAC,MAAM,EAAE,QAAQ,IAAI;AAClD,MAAK,IAAK,QAAO;CAEjB,IAAIC;AACJ,KAAI;AACF,cAAY,MAAM,OAAO,OAAO,UAC9B,OACA,KACA;GAAE,MAAM;GAAS,YAAY;EAAS,GACtC,OACA,CAAC,QAAS,EACX;CACF,QAAO;AACN,SAAO;CACR;CAED,IAAIC;AACJ,KAAI;AACF,aAAW,gBAAgB,OAAO;CACnC,QAAO;AACN,SAAO;CACR;CAGD,MAAM,gBAAgB,EAAE,UAAU,GAAG,OAAO,KAAK,KAAK,CAAC,SAAS,YAAY,CAAC;AAE7E,KAAI;AACF,SAAO,MAAM,OAAO,OAAO,OACzB;GAAE,MAAM;GAAS,MAAM;EAAW,GAClC,WACA,UACA,IAAI,cAAc,OAAO,aAAa,CACvC;CACF,QAAO;AACN,SAAO;CACR;AACF;;;;;;;;;;;;;;;;;;AAoCD,SAAgB,sBAAsBC,YAAqC;CACzE,MAAM,UAAU,WAAW,QAAQ,QAAQ,GAAG;CAC9C,MAAM,WAAW,IAAI;CACrB,IAAI,UAAU;CAEd,eAAe,WAA0B;EACvC,MAAM,MAAM,MAAM,OAAO,EAAE,QAAQ,kBAAkB;AACrD,OAAK,IAAI,GAAI;EACb,MAAMC,UAAmB,MAAM,IAAI,MAAM;EACzC,MAAM,UAAW,QAAoC;AACrD,OAAK,MAAM,QAAQ,QAAQ,CAAE;AAC7B,WAAS,OAAO;AAChB,OAAK,MAAM,QAAQ,SAAS;GAC1B,MAAM,SAAS,UAAU,UAAU,KAAK;AACxC,OAAI,OAAO,kBAAmB,OAAO,KAAa,QAAQ,SACxD,UAAS,IAAK,OAAO,KAAa,KAAM,OAAO,KAAY;EAE9D;AACD,YAAU;CACX;AAED,QAAO,EACL,MAAM,OAAOP,MAAcC,WAAqC;EAC9D,MAAM,MAAM,WAAW,UAAU;AACjC,MAAI,QAAQ,KAAM,QAAO;AAEzB,OAAK,QAAS,OAAM,UAAU;AAG9B,OAAK,SAAS,IAAI,IAAI,CAAE,OAAM,UAAU;EAExC,MAAM,MAAM,SAAS,IAAI,IAAI;AAC7B,OAAK,IAAK,QAAO;AAEjB,SAAO,uBAAuB,MAAM,WAAW,CAAC,GAAI,EAAC;CACtD,EACF;AACF;;AAKD,SAAS,WAAWA,WAAkC;CACpD,MAAM,QAAQ,UAAU,MAAM,IAAI;AAClC,KAAI,MAAM,WAAW,KAAK,MAAM,OAAO,GAAI,QAAO;AAClD,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI,cAAc,OAAO,gBAAgB,MAAM,GAAI,CAAC,CAAC;AAI/E,gBAAc,OAAO,WAAW,WAAW,OAAO,SAAS;CAC5D,QAAO;AACN,SAAO;CACR;AACF;AAED,SAAS,gBAAgBO,QAAyC;CAChE,MAAM,MAAM,OAAO,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI;CACxD,MAAM,SAAS,MAAM,IAAI,QAAQ,IAAK,IAAI,SAAS,KAAM,EAAE;CAC3D,MAAM,YAAY,KAAK,OAAO;CAC9B,MAAM,SAAS,IAAI,WAAW,UAAU;AACxC,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,IACpC,QAAO,KAAK,UAAU,WAAW,EAAE;AAErC,QAAO;AACR;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpJD,SAAgB,kBAAkBC,MAA4B;CAC5D,IAAIC;AACJ,KAAI;AACF,QAAM,KAAK,MAAM,KAAK;CACvB,QAAO;AACN,QAAM,IAAIC,wBAAS,2BAA2B;CAC/C;CAED,MAAM,SAAS,mBAAmB,UAAU,IAAI;AAChD,MAAK,OAAO,QACV,OAAM,IAAIA,wBACR,4BACC,qCAAqC,OAAO,MAAM,QAAQ;AAI/D,QAAO,OAAO;AACf"}