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