@omnixhq/ucp-client 0.2.0 → 1.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.
Files changed (62) hide show
  1. package/README.md +35 -2
  2. package/dist/adapters/anthropic.cjs +9 -5
  3. package/dist/adapters/anthropic.cjs.map +1 -1
  4. package/dist/adapters/anthropic.d.cts +3 -3
  5. package/dist/adapters/anthropic.d.cts.map +1 -1
  6. package/dist/adapters/anthropic.d.ts +3 -3
  7. package/dist/adapters/anthropic.d.ts.map +1 -1
  8. package/dist/adapters/anthropic.js +10 -5
  9. package/dist/adapters/anthropic.js.map +1 -1
  10. package/dist/adapters/langchain.cjs +4 -2
  11. package/dist/adapters/langchain.cjs.map +1 -1
  12. package/dist/adapters/langchain.d.cts +2 -2
  13. package/dist/adapters/langchain.d.cts.map +1 -1
  14. package/dist/adapters/langchain.d.ts +2 -2
  15. package/dist/adapters/langchain.d.ts.map +1 -1
  16. package/dist/adapters/langchain.js +5 -2
  17. package/dist/adapters/langchain.js.map +1 -1
  18. package/dist/adapters/mcp.cjs +9 -5
  19. package/dist/adapters/mcp.cjs.map +1 -1
  20. package/dist/adapters/mcp.d.cts +3 -3
  21. package/dist/adapters/mcp.d.cts.map +1 -1
  22. package/dist/adapters/mcp.d.ts +3 -3
  23. package/dist/adapters/mcp.d.ts.map +1 -1
  24. package/dist/adapters/mcp.js +10 -5
  25. package/dist/adapters/mcp.js.map +1 -1
  26. package/dist/adapters/openai.cjs +9 -5
  27. package/dist/adapters/openai.cjs.map +1 -1
  28. package/dist/adapters/openai.d.cts +3 -3
  29. package/dist/adapters/openai.d.cts.map +1 -1
  30. package/dist/adapters/openai.d.ts +3 -3
  31. package/dist/adapters/openai.d.ts.map +1 -1
  32. package/dist/adapters/openai.js +10 -5
  33. package/dist/adapters/openai.js.map +1 -1
  34. package/dist/adapters/vercel-ai.cjs +5 -3
  35. package/dist/adapters/vercel-ai.cjs.map +1 -1
  36. package/dist/adapters/vercel-ai.d.cts +3 -3
  37. package/dist/adapters/vercel-ai.d.cts.map +1 -1
  38. package/dist/adapters/vercel-ai.d.ts +3 -3
  39. package/dist/adapters/vercel-ai.d.ts.map +1 -1
  40. package/dist/adapters/vercel-ai.js +6 -3
  41. package/dist/adapters/vercel-ai.js.map +1 -1
  42. package/dist/catch-errors-BZP237w4.cjs +31 -0
  43. package/dist/catch-errors-BZP237w4.cjs.map +1 -0
  44. package/dist/{agent-tools-o2PEyGqh.d.cts → catch-errors-CbIHeFvF.d.cts} +13 -2
  45. package/dist/catch-errors-CbIHeFvF.d.cts.map +1 -0
  46. package/dist/catch-errors-Cpn2vHir.js +25 -0
  47. package/dist/catch-errors-Cpn2vHir.js.map +1 -0
  48. package/dist/{agent-tools-DBOuuSEd.d.ts → catch-errors-H8gObrht.d.ts} +13 -2
  49. package/dist/catch-errors-H8gObrht.d.ts.map +1 -0
  50. package/dist/errors-C1XqxNmZ.cjs +77 -0
  51. package/dist/errors-C1XqxNmZ.cjs.map +1 -0
  52. package/dist/errors-DX7yw6Gl.js +52 -0
  53. package/dist/errors-DX7yw6Gl.js.map +1 -0
  54. package/dist/index.cjs +137 -63
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/index.d.cts +2 -2
  57. package/dist/index.d.ts +2 -2
  58. package/dist/index.js +124 -50
  59. package/dist/index.js.map +1 -1
  60. package/package.json +27 -4
  61. package/dist/agent-tools-DBOuuSEd.d.ts.map +0 -1
  62. package/dist/agent-tools-o2PEyGqh.d.cts.map +0 -1
package/dist/index.cjs CHANGED
@@ -22,60 +22,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  }) : target, mod));
23
23
 
24
24
  //#endregion
25
+ const require_errors = require('./errors-C1XqxNmZ.cjs');
25
26
  const zod = __toESM(require("zod"));
26
27
  const node_crypto = __toESM(require("node:crypto"));
27
28
  const __ucp_js_sdk = __toESM(require("@ucp-js/sdk"));
28
29
 
29
- //#region src/errors.ts
30
- /** Thrown when the gateway returns an error response with `messages[]`. */
31
- var UCPError = class extends Error {
32
- code;
33
- type;
34
- statusCode;
35
- /** JSONPath to the field that caused the error, from the first message. */
36
- path;
37
- contentType;
38
- /** All messages from the gateway response. */
39
- messages;
40
- constructor(code, message, type = "error", statusCode = 400, options = {}) {
41
- super(message);
42
- this.name = "UCPError";
43
- this.code = code;
44
- this.type = type;
45
- this.statusCode = statusCode;
46
- this.path = options.path;
47
- this.contentType = options.contentType;
48
- this.messages = options.messages ?? [];
49
- }
50
- };
51
- /** Thrown on HTTP 409 when no `messages[]` body is present (idempotency key collision). */
52
- var UCPIdempotencyConflictError = class extends UCPError {
53
- constructor(message = "Idempotency key reused with different request body") {
54
- super("IDEMPOTENCY_CONFLICT", message, "error", 409);
55
- this.name = "UCPIdempotencyConflictError";
56
- }
57
- };
58
- /** Thrown when a checkout response has `status: 'requires_escalation'` with a `continue_url`. */
59
- var UCPEscalationError = class extends Error {
60
- /** The URL to redirect the buyer to for merchant-hosted checkout UI. */
61
- continue_url;
62
- constructor(continue_url, message = "Payment requires escalation") {
63
- super(message);
64
- this.name = "UCPEscalationError";
65
- this.continue_url = continue_url;
66
- }
67
- };
68
- /** Thrown when an OAuth token exchange, refresh, or revocation fails. */
69
- var UCPOAuthError = class extends Error {
70
- statusCode;
71
- constructor(message, statusCode) {
72
- super(message);
73
- this.name = "UCPOAuthError";
74
- this.statusCode = statusCode;
75
- }
76
- };
77
-
78
- //#endregion
79
30
  //#region src/http.ts
80
31
  var HttpClient = class HttpClient {
81
32
  gatewayUrl;
@@ -132,8 +83,8 @@ var HttpClient = class HttpClient {
132
83
  }
133
84
  throwFromResponse(data, statusCode) {
134
85
  if (typeof data !== "object" || data === null) {
135
- if (statusCode === 409) throw new UCPIdempotencyConflictError();
136
- throw new UCPError("HTTP_ERROR", `Gateway returned ${statusCode}`, "error", statusCode);
86
+ if (statusCode === 409) throw new require_errors.UCPIdempotencyConflictError();
87
+ throw new require_errors.UCPError("HTTP_ERROR", `Gateway returned ${statusCode}`, "error", statusCode);
137
88
  }
138
89
  const body = data;
139
90
  const rawMessages = body["messages"];
@@ -141,14 +92,14 @@ var HttpClient = class HttpClient {
141
92
  const allMessages = parseMessages(rawMessages);
142
93
  const first = allMessages[0];
143
94
  const code = first.code ?? "UNKNOWN";
144
- throw new UCPError(code, first.content, first.type, statusCode, {
95
+ throw new require_errors.UCPError(code, first.content, first.type, statusCode, {
145
96
  ...first.path !== void 0 ? { path: first.path } : {},
146
97
  ...first.content_type !== void 0 ? { contentType: first.content_type } : {},
147
98
  messages: allMessages
148
99
  });
149
100
  }
150
- if (statusCode === 409) throw new UCPIdempotencyConflictError();
151
- throw new UCPError("HTTP_ERROR", `Gateway returned ${statusCode}`, "error", statusCode);
101
+ if (statusCode === 409) throw new require_errors.UCPIdempotencyConflictError();
102
+ throw new require_errors.UCPError("HTTP_ERROR", `Gateway returned ${statusCode}`, "error", statusCode);
152
103
  }
153
104
  };
154
105
  function parseMessages(rawMessages) {
@@ -296,7 +247,7 @@ var CheckoutCapability = class {
296
247
  }
297
248
  validateSession(data) {
298
249
  const session = this.http.validate(data, CheckoutSessionSchema);
299
- if (session.status === "requires_escalation" && session.continue_url) throw new UCPEscalationError(session.continue_url);
250
+ if (session.status === "requires_escalation" && session.continue_url) throw new require_errors.UCPEscalationError(session.continue_url);
300
251
  return session;
301
252
  }
302
253
  };
@@ -368,7 +319,7 @@ var IdentityLinkingCapability = class {
368
319
  },
369
320
  body: body.toString()
370
321
  });
371
- if (!res.ok) throw new UCPOAuthError(`Token revocation failed: ${res.status}`, res.status);
322
+ if (!res.ok) throw new require_errors.UCPOAuthError(`Token revocation failed: ${res.status}`, res.status);
372
323
  }
373
324
  getMetadata() {
374
325
  return this.metadata;
@@ -382,10 +333,10 @@ var IdentityLinkingCapability = class {
382
333
  },
383
334
  body: body.toString()
384
335
  });
385
- if (!res.ok) throw new UCPOAuthError(`Token exchange failed with status ${res.status}`, res.status);
336
+ if (!res.ok) throw new require_errors.UCPOAuthError(`Token exchange failed with status ${res.status}`, res.status);
386
337
  const raw = await res.json();
387
338
  const parsed = TokenResponseSchema.safeParse(raw);
388
- if (!parsed.success) throw new UCPOAuthError(`Invalid token response: ${parsed.error.message}`, res.status);
339
+ if (!parsed.success) throw new require_errors.UCPOAuthError(`Invalid token response: ${parsed.error.message}`, res.status);
389
340
  return parsed.data;
390
341
  }
391
342
  };
@@ -480,6 +431,7 @@ function getAgentTools(client) {
480
431
  if (client.checkout.extensions.discount) tools.push(...discountTools(client));
481
432
  }
482
433
  if (client.order) tools.push(...orderTools(client));
434
+ if (client.identityLinking) tools.push(...identityLinkingTools(client));
483
435
  return tools;
484
436
  }
485
437
  function productTools(client) {
@@ -819,6 +771,128 @@ function orderTools(client) {
819
771
  execute: async (params) => client.order.get(params["id"])
820
772
  }];
821
773
  }
774
+ function identityLinkingTools(client) {
775
+ return [
776
+ {
777
+ name: "get_authorization_url",
778
+ description: "Build the OAuth authorization URL to redirect the buyer to for account linking. Returns a URL string.",
779
+ parameters: {
780
+ type: "object",
781
+ properties: {
782
+ client_id: {
783
+ type: "string",
784
+ description: "OAuth client ID"
785
+ },
786
+ redirect_uri: {
787
+ type: "string",
788
+ description: "URI to redirect to after authorization"
789
+ },
790
+ scope: {
791
+ type: "string",
792
+ description: "OAuth scope (default: ucp:scopes:checkout_session)"
793
+ },
794
+ state: {
795
+ type: "string",
796
+ description: "Opaque value for CSRF protection"
797
+ }
798
+ },
799
+ required: ["client_id", "redirect_uri"]
800
+ },
801
+ execute: (params) => Promise.resolve(client.identityLinking.getAuthorizationUrl(params))
802
+ },
803
+ {
804
+ name: "exchange_auth_code",
805
+ description: "Exchange an OAuth authorization code for an access token and refresh token.",
806
+ parameters: {
807
+ type: "object",
808
+ properties: {
809
+ client_id: {
810
+ type: "string",
811
+ description: "OAuth client ID"
812
+ },
813
+ client_secret: {
814
+ type: "string",
815
+ description: "OAuth client secret"
816
+ },
817
+ code: {
818
+ type: "string",
819
+ description: "Authorization code from the redirect"
820
+ },
821
+ redirect_uri: {
822
+ type: "string",
823
+ description: "Must match the redirect_uri used in authorization"
824
+ }
825
+ },
826
+ required: [
827
+ "client_id",
828
+ "client_secret",
829
+ "code",
830
+ "redirect_uri"
831
+ ]
832
+ },
833
+ execute: async (params) => client.identityLinking.exchangeCode(params)
834
+ },
835
+ {
836
+ name: "refresh_access_token",
837
+ description: "Refresh an expired access token using a refresh token.",
838
+ parameters: {
839
+ type: "object",
840
+ properties: {
841
+ client_id: {
842
+ type: "string",
843
+ description: "OAuth client ID"
844
+ },
845
+ client_secret: {
846
+ type: "string",
847
+ description: "OAuth client secret"
848
+ },
849
+ refresh_token: {
850
+ type: "string",
851
+ description: "Refresh token from a previous exchange"
852
+ }
853
+ },
854
+ required: [
855
+ "client_id",
856
+ "client_secret",
857
+ "refresh_token"
858
+ ]
859
+ },
860
+ execute: async (params) => client.identityLinking.refreshToken(params)
861
+ },
862
+ {
863
+ name: "revoke_token",
864
+ description: "Revoke an access or refresh token to invalidate an account link.",
865
+ parameters: {
866
+ type: "object",
867
+ properties: {
868
+ client_id: {
869
+ type: "string",
870
+ description: "OAuth client ID"
871
+ },
872
+ client_secret: {
873
+ type: "string",
874
+ description: "OAuth client secret"
875
+ },
876
+ token: {
877
+ type: "string",
878
+ description: "Token to revoke"
879
+ },
880
+ token_type_hint: {
881
+ type: "string",
882
+ enum: ["access_token", "refresh_token"],
883
+ description: "Hint about the token type"
884
+ }
885
+ },
886
+ required: [
887
+ "client_id",
888
+ "client_secret",
889
+ "token"
890
+ ]
891
+ },
892
+ execute: async (params) => client.identityLinking.revokeToken(params)
893
+ }
894
+ ];
895
+ }
822
896
 
823
897
  //#endregion
824
898
  //#region src/UCPClient.ts
@@ -1038,10 +1112,10 @@ exports.PostalAddressSchema = __ucp_js_sdk.PostalAddressSchema
1038
1112
  exports.ProductsCapability = ProductsCapability
1039
1113
  exports.TotalResponseSchema = __ucp_js_sdk.TotalResponseSchema
1040
1114
  exports.UCPClient = UCPClient
1041
- exports.UCPError = UCPError
1042
- exports.UCPEscalationError = UCPEscalationError
1043
- exports.UCPIdempotencyConflictError = UCPIdempotencyConflictError
1044
- exports.UCPOAuthError = UCPOAuthError
1115
+ exports.UCPError = require_errors.UCPError
1116
+ exports.UCPEscalationError = require_errors.UCPEscalationError
1117
+ exports.UCPIdempotencyConflictError = require_errors.UCPIdempotencyConflictError
1118
+ exports.UCPOAuthError = require_errors.UCPOAuthError
1045
1119
  exports.UCPOrderSchema = UCPOrderSchema
1046
1120
  exports.UCPProductSchema = UCPProductSchema
1047
1121
  exports.UCPProfileSchema = UCPProfileSchema
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["code: string","message: string","type: MessageType","options: {\n readonly path?: string;\n readonly contentType?: ContentType;\n readonly messages?: readonly UCPMessage[];\n }","continue_url: string","statusCode: number","config: HttpClientConfig","token: string","method: HttpMethod","path: string","body?: unknown","headers: Record<string, string>","data: unknown","schema: ZodType<T>","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","patch?: FulfillmentPatch","destinationId: string","optionId: string","destinationId?: string","codes: readonly string[]","data: unknown","http: HttpClient","id: string","UCPSpecOrderSchema","metadata: OAuthServerMetadata","params: AuthorizationParams","params: TokenExchangeParams","params: TokenRefreshParams","params: TokenRevokeParams","clientId: string","clientSecret: string","body: URLSearchParams","raw: unknown","username: string","password: string","http: HttpClient","query: string","filters: SearchFilters","filterEntries: ReadonlyArray<[string, unknown]>","id: string","client: ConnectedClient","tools: AgentTool[]","config: UCPClientConfig","options?: { readonly onValidationWarning?: LogFn }","client: ConnectedClient","profile: UCPProfile","c: { name?: string }","http: HttpClient","capabilityNames: Set<string>","extensions: CheckoutExtensions","raw: unknown","checkout: CheckoutCapability | null","order: OrderCapability | null","identityLinking: IdentityLinkingCapability | null","tools: ToolDescriptor[]"],"sources":["../src/errors.ts","../src/http.ts","../src/schemas.ts","../src/capabilities/checkout.ts","../src/capabilities/order.ts","../src/capabilities/identity-linking.ts","../src/capabilities/products.ts","../src/types/config.ts","../src/agent-tools.ts","../src/UCPClient.ts"],"sourcesContent":["export type MessageType = 'error' | 'warning' | 'info';\nexport type MessageSeverity = 'recoverable' | 'requires_buyer_input' | 'requires_buyer_review';\nexport type ContentType = 'plain' | 'markdown';\n\n/** A single message from the gateway's `messages[]` array. */\nexport interface UCPMessage {\n readonly type: MessageType;\n readonly code?: string;\n readonly content: string;\n readonly severity?: MessageSeverity;\n /** JSONPath to the field that caused the error (e.g., `$.buyer.email`). */\n readonly path?: string;\n readonly content_type?: ContentType;\n}\n\n/** Thrown when the gateway returns an error response with `messages[]`. */\nexport class UCPError extends Error {\n readonly code: string;\n readonly type: MessageType;\n readonly statusCode: number;\n /** JSONPath to the field that caused the error, from the first message. */\n readonly path: string | undefined;\n readonly contentType: ContentType | undefined;\n /** All messages from the gateway response. */\n readonly messages: readonly UCPMessage[];\n\n constructor(\n code: string,\n message: string,\n type: MessageType = 'error',\n statusCode = 400,\n options: {\n readonly path?: string;\n readonly contentType?: ContentType;\n readonly messages?: readonly UCPMessage[];\n } = {},\n ) {\n super(message);\n this.name = 'UCPError';\n this.code = code;\n this.type = type;\n this.statusCode = statusCode;\n this.path = options.path;\n this.contentType = options.contentType;\n this.messages = options.messages ?? [];\n }\n}\n\n/** Thrown on HTTP 409 when no `messages[]` body is present (idempotency key collision). */\nexport class UCPIdempotencyConflictError extends UCPError {\n constructor(message = 'Idempotency key reused with different request body') {\n super('IDEMPOTENCY_CONFLICT', message, 'error', 409);\n this.name = 'UCPIdempotencyConflictError';\n }\n}\n\n/** Thrown when a checkout response has `status: 'requires_escalation'` with a `continue_url`. */\nexport class UCPEscalationError extends Error {\n /** The URL to redirect the buyer to for merchant-hosted checkout UI. */\n readonly continue_url: string;\n\n constructor(continue_url: string, message = 'Payment requires escalation') {\n super(message);\n this.name = 'UCPEscalationError';\n this.continue_url = continue_url;\n }\n}\n\n/** Thrown when an OAuth token exchange, refresh, or revocation fails. */\nexport class UCPOAuthError extends Error {\n readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = 'UCPOAuthError';\n this.statusCode = statusCode;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { ZodType } from 'zod';\nimport { UCPError, UCPIdempotencyConflictError } from './errors.js';\nimport type { UCPMessage, MessageType, MessageSeverity, ContentType } from './errors.js';\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\n\nexport type LogFn = (message: string, detail?: string) => void;\n\nexport interface HttpClientConfig {\n readonly gatewayUrl: string;\n readonly agentProfileUrl: string;\n readonly ucpVersion: string;\n readonly requestSignature?: string;\n readonly accessToken?: string;\n readonly onValidationWarning?: LogFn;\n}\n\nexport class HttpClient {\n private readonly gatewayUrl: string;\n private readonly agentProfileUrl: string;\n private readonly ucpVersion: string;\n private readonly requestSignature: string | undefined;\n private readonly accessToken: string | undefined;\n private readonly onValidationWarning: LogFn;\n\n constructor(config: HttpClientConfig) {\n this.gatewayUrl = config.gatewayUrl;\n this.agentProfileUrl = config.agentProfileUrl;\n this.ucpVersion = config.ucpVersion;\n this.requestSignature = config.requestSignature;\n this.accessToken = config.accessToken;\n this.onValidationWarning =\n config.onValidationWarning ?? // eslint-disable-next-line no-console\n ((msg, detail) => console.warn(msg, detail));\n }\n\n withAccessToken(token: string): HttpClient {\n return new HttpClient({\n gatewayUrl: this.gatewayUrl,\n agentProfileUrl: this.agentProfileUrl,\n ucpVersion: this.ucpVersion,\n ...(this.requestSignature !== undefined ? { requestSignature: this.requestSignature } : {}),\n accessToken: token,\n onValidationWarning: this.onValidationWarning,\n });\n }\n\n async request(method: HttpMethod, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.gatewayUrl}${path}`;\n const requestId = randomUUID();\n\n const headers: Record<string, string> = {\n 'UCP-Agent': `profile=\"${this.agentProfileUrl}\", version=\"${this.ucpVersion}\"`,\n 'request-id': requestId,\n };\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (this.requestSignature !== undefined) {\n headers['request-signature'] = this.requestSignature;\n }\n\n if (this.accessToken !== undefined) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n if (method === 'POST' || method === 'PUT') {\n headers['idempotency-key'] = randomUUID();\n }\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n const data: unknown = await res.json().catch(() => ({}));\n\n if (!res.ok) {\n this.throwFromResponse(data, res.status);\n }\n\n return data;\n }\n\n validate<T>(data: unknown, schema: ZodType<T>): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n this.onValidationWarning('[UCPClient] Response validation failed:', result.error.message);\n return data as T;\n }\n return result.data;\n }\n\n private throwFromResponse(data: unknown, statusCode: number): never {\n if (typeof data !== 'object' || data === null) {\n if (statusCode === 409) throw new UCPIdempotencyConflictError();\n throw new UCPError('HTTP_ERROR', `Gateway returned ${statusCode}`, 'error', statusCode);\n }\n\n const body = data as Record<string, unknown>;\n const rawMessages = body['messages'];\n\n if (Array.isArray(rawMessages) && rawMessages.length > 0) {\n const allMessages = parseMessages(rawMessages);\n const first = allMessages[0]!;\n const code = first.code ?? 'UNKNOWN';\n\n throw new UCPError(code, first.content, first.type, statusCode, {\n ...(first.path !== undefined ? { path: first.path } : {}),\n ...(first.content_type !== undefined ? { contentType: first.content_type } : {}),\n messages: allMessages,\n });\n }\n\n if (statusCode === 409) throw new UCPIdempotencyConflictError();\n throw new UCPError('HTTP_ERROR', `Gateway returned ${statusCode}`, 'error', statusCode);\n }\n}\n\nfunction parseMessages(rawMessages: unknown[]): UCPMessage[] {\n return rawMessages.map((m: unknown) => {\n const record = m as Record<string, unknown>;\n const rawType = String(record['type'] ?? 'error');\n const validTypes: readonly string[] = ['error', 'warning', 'info'];\n const type: MessageType = validTypes.includes(rawType) ? (rawType as MessageType) : 'error';\n\n return {\n type,\n content: String(record['content'] ?? 'Unknown error'),\n ...(record['code'] !== undefined ? { code: String(record['code']) } : {}),\n ...(record['severity'] !== undefined\n ? { severity: String(record['severity']) as MessageSeverity }\n : {}),\n ...(record['path'] !== undefined ? { path: String(record['path']) } : {}),\n ...(record['content_type'] !== undefined\n ? { content_type: String(record['content_type']) as ContentType }\n : {}),\n };\n });\n}\n","import { z } from 'zod';\nimport {\n // Response schemas\n ExtendedCheckoutResponseSchema,\n UcpDiscoveryProfileSchema,\n CheckoutResponseStatusSchema,\n\n // Sub-entity schemas (checkout internals)\n BuyerSchema,\n TotalResponseSchema,\n LineItemResponseSchema,\n MessageSchema,\n MessageErrorSchema,\n PostalAddressSchema,\n PaymentResponseSchema,\n PaymentHandlerResponseSchema,\n PaymentInstrumentSchema,\n FulfillmentResponseSchema,\n FulfillmentMethodResponseSchema,\n ItemResponseSchema,\n\n // Request schemas\n ExtendedCheckoutCreateRequestSchema,\n ExtendedCheckoutUpdateRequestSchema,\n\n // Order\n OrderSchema,\n} from '@ucp-js/sdk';\n\n// ─── Response validation ────────────────────────────────────────────────────\n// Used internally by UCPClient to validate gateway responses.\n// `.passthrough()` allows extra fields the gateway may add beyond the spec.\n\nexport const CheckoutSessionSchema = ExtendedCheckoutResponseSchema.passthrough();\nexport const UCPProfileSchema = UcpDiscoveryProfileSchema.passthrough();\n\n// ─── Gateway-specific response schemas ──────────────────────────────────────\n// These types extend beyond the SDK spec (gateway adds fields like price_cents,\n// stock_quantity, variants for products; status, total_cents for orders).\n\nexport const UCPProductSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n description: z.string().nullable(),\n price_cents: z.number().int(),\n currency: z.string().min(3).max(3),\n in_stock: z.boolean(),\n stock_quantity: z.number().int().min(0),\n images: z.array(z.string().url()),\n variants: z.array(\n z\n .object({\n id: z.string(),\n title: z.string(),\n price_cents: z.number().int(),\n in_stock: z.boolean(),\n attributes: z.record(z.string()),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n\nexport const UCPOrderSchema = z\n .object({\n id: z.string(),\n status: z.enum(['pending', 'processing', 'shipped', 'delivered', 'canceled']),\n total_cents: z.number().int(),\n currency: z.string().min(3).max(3),\n created_at_iso: z.string().datetime({ offset: true }),\n })\n .passthrough();\n\n// ─── Request validation ─────────────────────────────────────────────────────\n// Used to validate outgoing payloads before sending to gateway.\n// `.passthrough()` allows extra fields the caller may include.\n\nexport const CreateCheckoutRequestSchema = ExtendedCheckoutCreateRequestSchema.passthrough();\nexport const UpdateCheckoutRequestSchema = ExtendedCheckoutUpdateRequestSchema.passthrough();\n\nexport const CompleteCheckoutRequestSchema = z.object({\n payment: z.object({\n instruments: z.array(\n z\n .object({\n id: z.string(),\n handler_id: z.string(),\n type: z.string(),\n selected: z.boolean().optional(),\n credential: z\n .object({\n type: z.string(),\n token: z.string().optional(),\n })\n .optional(),\n billing_address: z.unknown().optional(),\n })\n .passthrough(),\n ),\n }),\n});\n\n// ─── SDK re-exports ─────────────────────────────────────────────────────────\n// Re-export SDK schemas so consumers (AI Brain) can use them for tool\n// definitions, Zod-to-JSON-Schema conversion, etc.\n\nexport {\n // Enums\n CheckoutResponseStatusSchema,\n\n // Sub-entity schemas\n BuyerSchema,\n TotalResponseSchema,\n LineItemResponseSchema,\n MessageSchema,\n MessageErrorSchema,\n PostalAddressSchema,\n\n // Payment\n PaymentResponseSchema,\n PaymentHandlerResponseSchema,\n PaymentInstrumentSchema,\n\n // Fulfillment\n FulfillmentResponseSchema,\n FulfillmentMethodResponseSchema,\n\n // Items\n ItemResponseSchema,\n\n // Order (UCP spec order — different from gateway's UCPOrderSchema)\n OrderSchema as UCPSpecOrderSchema,\n};\n","import type { HttpClient } from '../http.js';\nimport { UCPEscalationError } from '../errors.js';\nimport { CheckoutSessionSchema } from '../schemas.js';\nimport type {\n CheckoutSession,\n CheckoutExtensions,\n CreateCheckoutPayload,\n UpdateCheckoutPayload,\n CompleteCheckoutPayload,\n} from '../types/checkout.js';\n\nconst DEFAULT_METHOD_ID = 'default';\nconst DEFAULT_GROUP_ID = 'default';\n\ntype FulfillmentPatch = Omit<UpdateCheckoutPayload, 'fulfillment' | 'discounts'>;\n\n/**\n * Checkout session operations. Available when the server declares `dev.ucp.shopping.checkout`.\n * Check `extensions` to see which optional features (fulfillment, discount, etc.) are supported.\n */\nexport class CheckoutCapability {\n /** Which checkout extensions the server supports. */\n readonly extensions: CheckoutExtensions;\n\n constructor(\n private readonly http: HttpClient,\n extensions: CheckoutExtensions,\n ) {\n this.extensions = extensions;\n }\n\n async create(payload: CreateCheckoutPayload): Promise<CheckoutSession> {\n const data = await this.http.request('POST', '/checkout-sessions', payload);\n return this.validateSession(data);\n }\n\n async get(id: string): Promise<CheckoutSession> {\n const data = await this.http.request('GET', `/checkout-sessions/${encodeURIComponent(id)}`);\n return this.validateSession(data);\n }\n\n async update(id: string, patch: UpdateCheckoutPayload): Promise<CheckoutSession> {\n const data = await this.http.request(\n 'PUT',\n `/checkout-sessions/${encodeURIComponent(id)}`,\n patch,\n );\n return this.validateSession(data);\n }\n\n async complete(id: string, payload: CompleteCheckoutPayload): Promise<CheckoutSession> {\n const data = await this.http.request(\n 'POST',\n `/checkout-sessions/${encodeURIComponent(id)}/complete`,\n payload,\n );\n return this.validateSession(data);\n }\n\n async cancel(id: string): Promise<CheckoutSession> {\n const data = await this.http.request(\n 'POST',\n `/checkout-sessions/${encodeURIComponent(id)}/cancel`,\n );\n return this.validateSession(data);\n }\n\n async setFulfillment(\n id: string,\n type: string,\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: { methods: [{ id: DEFAULT_METHOD_ID, type }] },\n });\n }\n\n async selectDestination(\n id: string,\n destinationId: string,\n fulfillmentType = 'shipping',\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: {\n methods: [\n {\n id: DEFAULT_METHOD_ID,\n type: fulfillmentType,\n selected_destination_id: destinationId,\n },\n ],\n },\n });\n }\n\n async selectFulfillmentOption(\n id: string,\n optionId: string,\n destinationId?: string,\n fulfillmentType = 'shipping',\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: {\n methods: [\n {\n id: DEFAULT_METHOD_ID,\n type: fulfillmentType,\n ...(destinationId !== undefined ? { selected_destination_id: destinationId } : {}),\n groups: [{ id: DEFAULT_GROUP_ID, selected_option_id: optionId }],\n },\n ],\n },\n });\n }\n\n async applyDiscountCodes(\n id: string,\n codes: readonly string[],\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n discounts: { codes: [...codes] },\n });\n }\n\n private validateSession(data: unknown): CheckoutSession {\n const session = this.http.validate(data, CheckoutSessionSchema);\n\n if (session.status === 'requires_escalation' && session.continue_url) {\n throw new UCPEscalationError(session.continue_url);\n }\n\n return session;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { UCPSpecOrderSchema } from '../schemas.js';\nimport type { UCPSpecOrder } from '../types/order.js';\n\n/** Order operations. Available when the server declares `dev.ucp.shopping.order`. */\nexport class OrderCapability {\n constructor(private readonly http: HttpClient) {}\n\n /** Retrieve an order by ID. Returns the UCP spec-compliant Order object. */\n async get(id: string): Promise<UCPSpecOrder> {\n const data = await this.http.request('GET', `/orders/${encodeURIComponent(id)}`);\n return this.http.validate(data, UCPSpecOrderSchema);\n }\n}\n","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","import type { HttpClient } from '../http.js';\nimport { UCPProductSchema } from '../schemas.js';\nimport type { UCPProduct } from '../types/product.js';\nimport type { SearchFilters } from '../types/common.js';\n\n/** Product catalog search and retrieval. Always available (gateway-specific, not part of UCP spec). */\nexport class ProductsCapability {\n constructor(private readonly http: HttpClient) {}\n\n /** Search products by query string with optional filters. */\n async search(query: string, filters: SearchFilters = {}): Promise<readonly UCPProduct[]> {\n const params = new URLSearchParams({ q: query });\n\n const filterEntries: ReadonlyArray<[string, unknown]> = [\n ['max_price_cents', filters.max_price_cents],\n ['min_price_cents', filters.min_price_cents],\n ['in_stock', filters.in_stock],\n ['category', filters.category],\n ['limit', filters.limit],\n ['page', filters.page],\n ];\n\n for (const [key, value] of filterEntries) {\n if (value != null) {\n params.set(key, String(value));\n }\n }\n\n const res = await this.http.request('GET', `/ucp/products?${params.toString()}`);\n const data = res as { products?: UCPProduct[] } | UCPProduct[];\n const products = Array.isArray(data) ? data : (data.products ?? []);\n return products.map((p) => this.http.validate(p, UCPProductSchema));\n }\n\n async get(id: string): Promise<UCPProduct> {\n const data = await this.http.request('GET', `/ucp/products/${encodeURIComponent(id)}`);\n return this.http.validate(data, UCPProductSchema);\n }\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[] = [...productTools(client)];\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 return tools;\n}\n\nfunction productTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'search_products',\n description:\n 'Search the product catalog by query string. Returns matching products with prices, availability, and images.',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query (e.g., \"running shoes\")' },\n max_price_cents: { type: 'number', description: 'Maximum price in cents' },\n min_price_cents: { type: 'number', description: 'Minimum price in cents' },\n in_stock: { type: 'boolean', description: 'Filter to in-stock items only' },\n category: { type: 'string', description: 'Product category' },\n limit: { type: 'number', description: 'Max results to return' },\n },\n required: ['query'],\n },\n execute: async (params) => {\n const { query, ...filters } = params as { query: string; [key: string]: unknown };\n return client.products.search(query, filters);\n },\n },\n {\n name: 'get_product',\n description: 'Get detailed product information by ID, including variants, images, and stock.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Product ID' },\n },\n required: ['id'],\n },\n execute: async (params) => client.products.get(params['id'] as string),\n },\n ];\n}\n\nfunction checkoutTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'create_checkout',\n description:\n 'Create a new checkout session with line items. Returns a session with an ID to use in subsequent calls.',\n parameters: {\n type: 'object',\n properties: {\n line_items: {\n type: 'array',\n description: 'Products to purchase',\n items: {\n type: 'object',\n properties: {\n item: {\n type: 'object',\n properties: { id: { type: 'string', description: 'Product ID' } },\n required: ['id'],\n },\n quantity: { type: 'number', description: 'Quantity to purchase' },\n },\n required: ['item', 'quantity'],\n },\n },\n currency: { type: 'string', description: 'ISO 4217 currency code (e.g., \"USD\")' },\n },\n required: ['line_items'],\n },\n execute: async (params) =>\n client.checkout!.create(\n params as unknown as Parameters<NonNullable<typeof client.checkout>['create']>[0],\n ),\n },\n {\n name: 'get_checkout',\n description:\n 'Get the current state of a checkout session, including status, totals, and available options.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n },\n required: ['id'],\n },\n execute: async (params) => client.checkout!.get(params['id'] as string),\n },\n {\n name: 'update_checkout',\n description:\n 'Update a checkout session with buyer information, shipping address, or payment details.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n buyer: {\n type: 'object',\n description: 'Buyer contact information',\n properties: {\n first_name: { type: 'string' },\n last_name: { type: 'string' },\n email: { type: 'string' },\n phone_number: { type: 'string' },\n },\n },\n context: {\n type: 'object',\n description: 'Localization context for pricing and availability',\n properties: {\n address_country: { type: 'string', description: 'ISO 3166-1 alpha-2 country code' },\n address_region: { type: 'string', description: 'State or province' },\n postal_code: { type: 'string' },\n },\n },\n },\n required: ['id'],\n },\n execute: async (params) => {\n const { id, ...patch } = params as { id: string; [key: string]: unknown };\n return client.checkout!.update(id, patch);\n },\n },\n {\n name: 'complete_checkout',\n description:\n 'Complete a checkout session with payment. Places the order. Returns the completed session with order ID.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n payment: {\n type: 'object',\n description: 'Payment information',\n properties: {\n instruments: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Instrument ID' },\n handler_id: {\n type: 'string',\n description: 'Payment handler ID from the server profile',\n },\n type: { type: 'string', description: 'Payment type (e.g., \"card\", \"offline\")' },\n credential: {\n type: 'object',\n properties: {\n type: { type: 'string', description: 'Credential type (e.g., \"token\")' },\n token: { type: 'string', description: 'Payment token' },\n },\n required: ['type'],\n },\n },\n required: ['id', 'handler_id', 'type'],\n },\n },\n },\n required: ['instruments'],\n },\n },\n required: ['id', 'payment'],\n },\n execute: async (params) => {\n const { id, ...payload } = params;\n return client.checkout!.complete(\n String(id),\n payload as unknown as Parameters<NonNullable<typeof client.checkout>['complete']>[1],\n );\n },\n },\n {\n name: 'cancel_checkout',\n description: 'Cancel a checkout session. The session cannot be used after cancellation.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n },\n required: ['id'],\n },\n execute: async (params) => client.checkout!.cancel(params['id'] as string),\n },\n ];\n}\n\nfunction fulfillmentTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'set_fulfillment',\n description: 'Set the fulfillment method for a checkout (e.g., \"shipping\" or \"pickup\").',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n type: { type: 'string', enum: ['shipping', 'pickup'], description: 'Fulfillment method' },\n },\n required: ['id', 'type'],\n },\n execute: async (params) =>\n client.checkout!.setFulfillment(params['id'] as string, params['type'] as string),\n },\n {\n name: 'select_destination',\n description: 'Select a shipping destination for a checkout session.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n destination_id: { type: 'string', description: 'Destination ID to select' },\n fulfillment_type: {\n type: 'string',\n default: 'shipping',\n description: 'Fulfillment type',\n },\n },\n required: ['id', 'destination_id'],\n },\n execute: async (params) =>\n client.checkout!.selectDestination(\n params['id'] as string,\n params['destination_id'] as string,\n (params['fulfillment_type'] as string) ?? 'shipping',\n ),\n },\n {\n name: 'select_fulfillment_option',\n description:\n 'Select a fulfillment option (e.g., standard shipping, express shipping) for a checkout session.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n option_id: { type: 'string', description: 'Fulfillment option ID to select' },\n destination_id: { type: 'string', description: 'Destination ID (if applicable)' },\n fulfillment_type: {\n type: 'string',\n default: 'shipping',\n description: 'Fulfillment type',\n },\n },\n required: ['id', 'option_id'],\n },\n execute: async (params) =>\n client.checkout!.selectFulfillmentOption(\n params['id'] as string,\n params['option_id'] as string,\n params['destination_id'] as string | undefined,\n (params['fulfillment_type'] as string) ?? 'shipping',\n ),\n },\n ];\n}\n\nfunction discountTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'apply_discount_codes',\n description: 'Apply one or more discount codes to a checkout session.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n codes: {\n type: 'array',\n items: { type: 'string' },\n description: 'Discount codes to apply',\n },\n },\n required: ['id', 'codes'],\n },\n execute: async (params) =>\n client.checkout!.applyDiscountCodes(params['id'] as string, params['codes'] as string[]),\n },\n ];\n}\n\nfunction orderTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'get_order',\n description:\n 'Get order details by ID, including line items, fulfillment status, and tracking information.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Order ID' },\n },\n required: ['id'],\n },\n execute: async (params) => client.order!.get(params['id'] as string),\n },\n ];\n}\n","import { z } from 'zod';\nimport type { UcpDiscoveryProfile } from '@ucp-js/sdk';\nimport { HttpClient } from './http.js';\nimport type { LogFn } from './http.js';\nimport { UCPProfileSchema } from './schemas.js';\nimport { CheckoutCapability } from './capabilities/checkout.js';\nimport { OrderCapability } from './capabilities/order.js';\nimport { IdentityLinkingCapability } from './capabilities/identity-linking.js';\nimport { ProductsCapability } from './capabilities/products.js';\nimport type { UCPClientConfig } from './types/config.js';\nimport { DEFAULT_UCP_VERSION, UCP_CAPABILITIES } from './types/config.js';\nimport type { CheckoutExtensions } from './types/checkout.js';\nimport type { OAuthServerMetadata } from './types/identity-linking.js';\nimport type { PaymentHandlerMap } from './types/payment.js';\nimport { getAgentTools } from './agent-tools.js';\nimport type { AgentTool } from './agent-tools.js';\n\n/** UCP discovery profile returned by `GET /.well-known/ucp`. */\nexport type UCPProfile = UcpDiscoveryProfile;\n\n/** Describes a single tool the agent can use with the connected server. */\nexport interface ToolDescriptor {\n readonly name: string;\n readonly capability: string;\n readonly description: string;\n}\n\n/**\n * A connected UCP client. Only capabilities the server declared are non-null.\n * Use `describeTools()` to get the list of available tools for agent registration.\n */\nexport interface ConnectedClient {\n /** The server's UCP discovery profile. */\n readonly profile: UCPProfile;\n /** 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 /** Product search and retrieval. Always available (gateway-specific). */\n readonly products: ProductsCapability;\n /** Payment handlers declared by the server, keyed by namespace. */\n readonly paymentHandlers: PaymentHandlerMap;\n /** Returns only the tools this server supports (name + description only). */\n describeTools(): readonly ToolDescriptor[];\n /**\n * Returns complete tool definitions with JSON Schema parameters and execute functions.\n * Ready for direct use with any AI agent framework (Claude API, OpenAI, Vercel AI SDK, LangChain, MCP).\n */\n getAgentTools(): readonly AgentTool[];\n}\n\n/**\n * Connect to a UCP server, discover its capabilities, and return a {@link ConnectedClient}.\n *\n * @example\n * ```typescript\n * const client = await connect({\n * gatewayUrl: 'https://store.example.com/ucp',\n * agentProfileUrl: 'https://platform.example.com/.well-known/ucp',\n * });\n *\n * if (client.checkout) {\n * const session = await client.checkout.create({ line_items: [...] });\n * }\n * ```\n */\nexport async function connect(\n config: UCPClientConfig,\n options?: { readonly onValidationWarning?: LogFn },\n): Promise<ConnectedClient> {\n validateConfig(config);\n\n const http = new HttpClient({\n gatewayUrl: config.gatewayUrl.replace(/\\/+$/, ''),\n agentProfileUrl: config.agentProfileUrl,\n ucpVersion: config.ucpVersion ?? DEFAULT_UCP_VERSION,\n ...(config.requestSignature !== undefined ? { requestSignature: config.requestSignature } : {}),\n ...(options?.onValidationWarning !== undefined\n ? { onValidationWarning: options.onValidationWarning }\n : {}),\n });\n\n const rawProfile = await http.request('GET', '/.well-known/ucp');\n const profile = http.validate(rawProfile, UCPProfileSchema);\n const capabilityNames = extractCapabilityNames(profile);\n\n const checkout = buildCheckoutCapability(http, capabilityNames);\n const order = capabilityNames.has(UCP_CAPABILITIES.ORDER) ? new OrderCapability(http) : null;\n const identityLinking = await buildIdentityLinking(config, capabilityNames);\n const products = new ProductsCapability(http);\n const paymentHandlers = extractPaymentHandlers(profile);\n\n const client: ConnectedClient = {\n profile,\n checkout,\n order,\n identityLinking,\n products,\n paymentHandlers,\n describeTools: () => buildToolDescriptors(checkout, order, identityLinking),\n getAgentTools: () => getAgentTools(client),\n };\n\n return Object.freeze(client);\n}\n\n/**\n * UCP client entry point. Use `UCPClient.connect()` to discover server capabilities\n * and get a {@link ConnectedClient}.\n *\n * @example\n * ```typescript\n * const client = await UCPClient.connect({\n * gatewayUrl: 'https://store.example.com/ucp',\n * agentProfileUrl: 'https://platform.example.com/.well-known/ucp',\n * });\n * ```\n */\nexport class UCPClient {\n private constructor() {\n /* use UCPClient.connect() or the standalone connect() function */\n }\n\n static connect = connect;\n}\n\nfunction validateConfig(config: UCPClientConfig): void {\n new URL(config.gatewayUrl);\n if (config.agentProfileUrl.includes('\"') || config.agentProfileUrl.includes('\\n')) {\n throw new Error('agentProfileUrl must not contain double quotes or newlines');\n }\n new URL(config.agentProfileUrl);\n}\n\nfunction extractCapabilityNames(profile: UCPProfile): Set<string> {\n const capabilities = profile.ucp?.capabilities;\n if (!Array.isArray(capabilities)) return new Set();\n return new Set(\n capabilities.map((c: { name?: string }) => c.name).filter((n): n is string => n !== undefined),\n );\n}\n\nconst PaymentHandlerInstanceSchema = z\n .object({\n id: z.string(),\n version: z.string(),\n spec: z.string(),\n schema: z.string(),\n config: z.record(z.unknown()).optional(),\n })\n .passthrough();\n\nconst PaymentHandlerMapSchema = z.record(z.array(PaymentHandlerInstanceSchema));\n\nfunction extractPaymentHandlers(profile: UCPProfile): PaymentHandlerMap {\n const raw = (profile as Record<string, unknown>)['payment_handlers'];\n if (typeof raw !== 'object' || raw === null) return {};\n const result = PaymentHandlerMapSchema.safeParse(raw);\n if (!result.success) return {};\n return result.data as PaymentHandlerMap;\n}\n\nfunction 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 { name: 'search_products', capability: 'products', description: 'Search product catalog' },\n { name: 'get_product', capability: 'products', description: 'Get product by ID' },\n ];\n\n if (checkout) {\n tools.push(\n {\n name: 'create_checkout',\n capability: 'checkout',\n description: 'Create a checkout session',\n },\n {\n name: 'get_checkout',\n capability: 'checkout',\n description: 'Get checkout session by ID',\n },\n {\n name: 'update_checkout',\n capability: 'checkout',\n description: 'Update a checkout session',\n },\n {\n name: 'complete_checkout',\n capability: 'checkout',\n description: 'Complete checkout with payment',\n },\n {\n name: 'cancel_checkout',\n capability: 'checkout',\n description: 'Cancel a checkout session',\n },\n );\n\n if (checkout.extensions.fulfillment) {\n tools.push(\n {\n name: 'set_fulfillment',\n capability: 'checkout.fulfillment',\n description: 'Set fulfillment method (shipping/pickup)',\n },\n {\n name: 'select_destination',\n capability: 'checkout.fulfillment',\n description: 'Select shipping destination',\n },\n {\n name: 'select_fulfillment_option',\n capability: 'checkout.fulfillment',\n description: 'Select fulfillment option (e.g., express shipping)',\n },\n );\n }\n\n if (checkout.extensions.discount) {\n tools.push({\n name: 'apply_discount_codes',\n capability: 'checkout.discount',\n description: 'Apply discount codes to checkout',\n });\n }\n }\n\n if (order) {\n tools.push({\n name: 'get_order',\n capability: 'order',\n description: 'Get order by ID',\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["config: HttpClientConfig","token: string","method: HttpMethod","path: string","body?: unknown","headers: Record<string, string>","data: unknown","schema: ZodType<T>","statusCode: number","UCPIdempotencyConflictError","UCPError","rawMessages: unknown[]","m: unknown","validTypes: readonly string[]","type: MessageType","http: HttpClient","extensions: CheckoutExtensions","payload: CreateCheckoutPayload","id: string","patch: UpdateCheckoutPayload","payload: CompleteCheckoutPayload","type: string","patch?: FulfillmentPatch","destinationId: string","optionId: string","destinationId?: string","codes: readonly string[]","data: unknown","UCPEscalationError","http: HttpClient","id: string","UCPSpecOrderSchema","metadata: OAuthServerMetadata","params: AuthorizationParams","params: TokenExchangeParams","params: TokenRefreshParams","params: TokenRevokeParams","UCPOAuthError","clientId: string","clientSecret: string","body: URLSearchParams","raw: unknown","username: string","password: string","http: HttpClient","query: string","filters: SearchFilters","filterEntries: ReadonlyArray<[string, unknown]>","id: string","client: ConnectedClient","tools: AgentTool[]","config: UCPClientConfig","options?: { readonly onValidationWarning?: LogFn }","client: ConnectedClient","profile: UCPProfile","c: { name?: string }","http: HttpClient","capabilityNames: Set<string>","extensions: CheckoutExtensions","raw: unknown","checkout: CheckoutCapability | null","order: OrderCapability | null","identityLinking: IdentityLinkingCapability | null","tools: ToolDescriptor[]"],"sources":["../src/http.ts","../src/schemas.ts","../src/capabilities/checkout.ts","../src/capabilities/order.ts","../src/capabilities/identity-linking.ts","../src/capabilities/products.ts","../src/types/config.ts","../src/agent-tools.ts","../src/UCPClient.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { ZodType } from 'zod';\nimport { UCPError, UCPIdempotencyConflictError } from './errors.js';\nimport type { UCPMessage, MessageType, MessageSeverity, ContentType } from './errors.js';\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\n\nexport type LogFn = (message: string, detail?: string) => void;\n\nexport interface HttpClientConfig {\n readonly gatewayUrl: string;\n readonly agentProfileUrl: string;\n readonly ucpVersion: string;\n readonly requestSignature?: string;\n readonly accessToken?: string;\n readonly onValidationWarning?: LogFn;\n}\n\nexport class HttpClient {\n private readonly gatewayUrl: string;\n private readonly agentProfileUrl: string;\n private readonly ucpVersion: string;\n private readonly requestSignature: string | undefined;\n private readonly accessToken: string | undefined;\n private readonly onValidationWarning: LogFn;\n\n constructor(config: HttpClientConfig) {\n this.gatewayUrl = config.gatewayUrl;\n this.agentProfileUrl = config.agentProfileUrl;\n this.ucpVersion = config.ucpVersion;\n this.requestSignature = config.requestSignature;\n this.accessToken = config.accessToken;\n this.onValidationWarning =\n config.onValidationWarning ?? // eslint-disable-next-line no-console\n ((msg, detail) => console.warn(msg, detail));\n }\n\n withAccessToken(token: string): HttpClient {\n return new HttpClient({\n gatewayUrl: this.gatewayUrl,\n agentProfileUrl: this.agentProfileUrl,\n ucpVersion: this.ucpVersion,\n ...(this.requestSignature !== undefined ? { requestSignature: this.requestSignature } : {}),\n accessToken: token,\n onValidationWarning: this.onValidationWarning,\n });\n }\n\n async request(method: HttpMethod, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.gatewayUrl}${path}`;\n const requestId = randomUUID();\n\n const headers: Record<string, string> = {\n 'UCP-Agent': `profile=\"${this.agentProfileUrl}\", version=\"${this.ucpVersion}\"`,\n 'request-id': requestId,\n };\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (this.requestSignature !== undefined) {\n headers['request-signature'] = this.requestSignature;\n }\n\n if (this.accessToken !== undefined) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n if (method === 'POST' || method === 'PUT') {\n headers['idempotency-key'] = randomUUID();\n }\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n const data: unknown = await res.json().catch(() => ({}));\n\n if (!res.ok) {\n this.throwFromResponse(data, res.status);\n }\n\n return data;\n }\n\n validate<T>(data: unknown, schema: ZodType<T>): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n this.onValidationWarning('[UCPClient] Response validation failed:', result.error.message);\n return data as T;\n }\n return result.data;\n }\n\n private throwFromResponse(data: unknown, statusCode: number): never {\n if (typeof data !== 'object' || data === null) {\n if (statusCode === 409) throw new UCPIdempotencyConflictError();\n throw new UCPError('HTTP_ERROR', `Gateway returned ${statusCode}`, 'error', statusCode);\n }\n\n const body = data as Record<string, unknown>;\n const rawMessages = body['messages'];\n\n if (Array.isArray(rawMessages) && rawMessages.length > 0) {\n const allMessages = parseMessages(rawMessages);\n const first = allMessages[0]!;\n const code = first.code ?? 'UNKNOWN';\n\n throw new UCPError(code, first.content, first.type, statusCode, {\n ...(first.path !== undefined ? { path: first.path } : {}),\n ...(first.content_type !== undefined ? { contentType: first.content_type } : {}),\n messages: allMessages,\n });\n }\n\n if (statusCode === 409) throw new UCPIdempotencyConflictError();\n throw new UCPError('HTTP_ERROR', `Gateway returned ${statusCode}`, 'error', statusCode);\n }\n}\n\nfunction parseMessages(rawMessages: unknown[]): UCPMessage[] {\n return rawMessages.map((m: unknown) => {\n const record = m as Record<string, unknown>;\n const rawType = String(record['type'] ?? 'error');\n const validTypes: readonly string[] = ['error', 'warning', 'info'];\n const type: MessageType = validTypes.includes(rawType) ? (rawType as MessageType) : 'error';\n\n return {\n type,\n content: String(record['content'] ?? 'Unknown error'),\n ...(record['code'] !== undefined ? { code: String(record['code']) } : {}),\n ...(record['severity'] !== undefined\n ? { severity: String(record['severity']) as MessageSeverity }\n : {}),\n ...(record['path'] !== undefined ? { path: String(record['path']) } : {}),\n ...(record['content_type'] !== undefined\n ? { content_type: String(record['content_type']) as ContentType }\n : {}),\n };\n });\n}\n","import { z } from 'zod';\nimport {\n // Response schemas\n ExtendedCheckoutResponseSchema,\n UcpDiscoveryProfileSchema,\n CheckoutResponseStatusSchema,\n\n // Sub-entity schemas (checkout internals)\n BuyerSchema,\n TotalResponseSchema,\n LineItemResponseSchema,\n MessageSchema,\n MessageErrorSchema,\n PostalAddressSchema,\n PaymentResponseSchema,\n PaymentHandlerResponseSchema,\n PaymentInstrumentSchema,\n FulfillmentResponseSchema,\n FulfillmentMethodResponseSchema,\n ItemResponseSchema,\n\n // Request schemas\n ExtendedCheckoutCreateRequestSchema,\n ExtendedCheckoutUpdateRequestSchema,\n\n // Order\n OrderSchema,\n} from '@ucp-js/sdk';\n\n// ─── Response validation ────────────────────────────────────────────────────\n// Used internally by UCPClient to validate gateway responses.\n// `.passthrough()` allows extra fields the gateway may add beyond the spec.\n\nexport const CheckoutSessionSchema = ExtendedCheckoutResponseSchema.passthrough();\nexport const UCPProfileSchema = UcpDiscoveryProfileSchema.passthrough();\n\n// ─── Gateway-specific response schemas ──────────────────────────────────────\n// These types extend beyond the SDK spec (gateway adds fields like price_cents,\n// stock_quantity, variants for products; status, total_cents for orders).\n\nexport const UCPProductSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n description: z.string().nullable(),\n price_cents: z.number().int(),\n currency: z.string().min(3).max(3),\n in_stock: z.boolean(),\n stock_quantity: z.number().int().min(0),\n images: z.array(z.string().url()),\n variants: z.array(\n z\n .object({\n id: z.string(),\n title: z.string(),\n price_cents: z.number().int(),\n in_stock: z.boolean(),\n attributes: z.record(z.string()),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n\nexport const UCPOrderSchema = z\n .object({\n id: z.string(),\n status: z.enum(['pending', 'processing', 'shipped', 'delivered', 'canceled']),\n total_cents: z.number().int(),\n currency: z.string().min(3).max(3),\n created_at_iso: z.string().datetime({ offset: true }),\n })\n .passthrough();\n\n// ─── Request validation ─────────────────────────────────────────────────────\n// Used to validate outgoing payloads before sending to gateway.\n// `.passthrough()` allows extra fields the caller may include.\n\nexport const CreateCheckoutRequestSchema = ExtendedCheckoutCreateRequestSchema.passthrough();\nexport const UpdateCheckoutRequestSchema = ExtendedCheckoutUpdateRequestSchema.passthrough();\n\nexport const CompleteCheckoutRequestSchema = z.object({\n payment: z.object({\n instruments: z.array(\n z\n .object({\n id: z.string(),\n handler_id: z.string(),\n type: z.string(),\n selected: z.boolean().optional(),\n credential: z\n .object({\n type: z.string(),\n token: z.string().optional(),\n })\n .optional(),\n billing_address: z.unknown().optional(),\n })\n .passthrough(),\n ),\n }),\n});\n\n// ─── SDK re-exports ─────────────────────────────────────────────────────────\n// Re-export SDK schemas so consumers (AI Brain) can use them for tool\n// definitions, Zod-to-JSON-Schema conversion, etc.\n\nexport {\n // Enums\n CheckoutResponseStatusSchema,\n\n // Sub-entity schemas\n BuyerSchema,\n TotalResponseSchema,\n LineItemResponseSchema,\n MessageSchema,\n MessageErrorSchema,\n PostalAddressSchema,\n\n // Payment\n PaymentResponseSchema,\n PaymentHandlerResponseSchema,\n PaymentInstrumentSchema,\n\n // Fulfillment\n FulfillmentResponseSchema,\n FulfillmentMethodResponseSchema,\n\n // Items\n ItemResponseSchema,\n\n // Order (UCP spec order — different from gateway's UCPOrderSchema)\n OrderSchema as UCPSpecOrderSchema,\n};\n","import type { HttpClient } from '../http.js';\nimport { UCPEscalationError } from '../errors.js';\nimport { CheckoutSessionSchema } from '../schemas.js';\nimport type {\n CheckoutSession,\n CheckoutExtensions,\n CreateCheckoutPayload,\n UpdateCheckoutPayload,\n CompleteCheckoutPayload,\n} from '../types/checkout.js';\n\nconst DEFAULT_METHOD_ID = 'default';\nconst DEFAULT_GROUP_ID = 'default';\n\ntype FulfillmentPatch = Omit<UpdateCheckoutPayload, 'fulfillment' | 'discounts'>;\n\n/**\n * Checkout session operations. Available when the server declares `dev.ucp.shopping.checkout`.\n * Check `extensions` to see which optional features (fulfillment, discount, etc.) are supported.\n */\nexport class CheckoutCapability {\n /** Which checkout extensions the server supports. */\n readonly extensions: CheckoutExtensions;\n\n constructor(\n private readonly http: HttpClient,\n extensions: CheckoutExtensions,\n ) {\n this.extensions = extensions;\n }\n\n async create(payload: CreateCheckoutPayload): Promise<CheckoutSession> {\n const data = await this.http.request('POST', '/checkout-sessions', payload);\n return this.validateSession(data);\n }\n\n async get(id: string): Promise<CheckoutSession> {\n const data = await this.http.request('GET', `/checkout-sessions/${encodeURIComponent(id)}`);\n return this.validateSession(data);\n }\n\n async update(id: string, patch: UpdateCheckoutPayload): Promise<CheckoutSession> {\n const data = await this.http.request(\n 'PUT',\n `/checkout-sessions/${encodeURIComponent(id)}`,\n patch,\n );\n return this.validateSession(data);\n }\n\n async complete(id: string, payload: CompleteCheckoutPayload): Promise<CheckoutSession> {\n const data = await this.http.request(\n 'POST',\n `/checkout-sessions/${encodeURIComponent(id)}/complete`,\n payload,\n );\n return this.validateSession(data);\n }\n\n async cancel(id: string): Promise<CheckoutSession> {\n const data = await this.http.request(\n 'POST',\n `/checkout-sessions/${encodeURIComponent(id)}/cancel`,\n );\n return this.validateSession(data);\n }\n\n async setFulfillment(\n id: string,\n type: string,\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: { methods: [{ id: DEFAULT_METHOD_ID, type }] },\n });\n }\n\n async selectDestination(\n id: string,\n destinationId: string,\n fulfillmentType = 'shipping',\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: {\n methods: [\n {\n id: DEFAULT_METHOD_ID,\n type: fulfillmentType,\n selected_destination_id: destinationId,\n },\n ],\n },\n });\n }\n\n async selectFulfillmentOption(\n id: string,\n optionId: string,\n destinationId?: string,\n fulfillmentType = 'shipping',\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n fulfillment: {\n methods: [\n {\n id: DEFAULT_METHOD_ID,\n type: fulfillmentType,\n ...(destinationId !== undefined ? { selected_destination_id: destinationId } : {}),\n groups: [{ id: DEFAULT_GROUP_ID, selected_option_id: optionId }],\n },\n ],\n },\n });\n }\n\n async applyDiscountCodes(\n id: string,\n codes: readonly string[],\n patch?: FulfillmentPatch,\n ): Promise<CheckoutSession> {\n return this.update(id, {\n ...patch,\n discounts: { codes: [...codes] },\n });\n }\n\n private validateSession(data: unknown): CheckoutSession {\n const session = this.http.validate(data, CheckoutSessionSchema);\n\n if (session.status === 'requires_escalation' && session.continue_url) {\n throw new UCPEscalationError(session.continue_url);\n }\n\n return session;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { UCPSpecOrderSchema } from '../schemas.js';\nimport type { UCPSpecOrder } from '../types/order.js';\n\n/** Order operations. Available when the server declares `dev.ucp.shopping.order`. */\nexport class OrderCapability {\n constructor(private readonly http: HttpClient) {}\n\n /** Retrieve an order by ID. Returns the UCP spec-compliant Order object. */\n async get(id: string): Promise<UCPSpecOrder> {\n const data = await this.http.request('GET', `/orders/${encodeURIComponent(id)}`);\n return this.http.validate(data, UCPSpecOrderSchema);\n }\n}\n","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","import type { HttpClient } from '../http.js';\nimport { UCPProductSchema } from '../schemas.js';\nimport type { UCPProduct } from '../types/product.js';\nimport type { SearchFilters } from '../types/common.js';\n\n/** Product catalog search and retrieval. Always available (gateway-specific, not part of UCP spec). */\nexport class ProductsCapability {\n constructor(private readonly http: HttpClient) {}\n\n /** Search products by query string with optional filters. */\n async search(query: string, filters: SearchFilters = {}): Promise<readonly UCPProduct[]> {\n const params = new URLSearchParams({ q: query });\n\n const filterEntries: ReadonlyArray<[string, unknown]> = [\n ['max_price_cents', filters.max_price_cents],\n ['min_price_cents', filters.min_price_cents],\n ['in_stock', filters.in_stock],\n ['category', filters.category],\n ['limit', filters.limit],\n ['page', filters.page],\n ];\n\n for (const [key, value] of filterEntries) {\n if (value != null) {\n params.set(key, String(value));\n }\n }\n\n const res = await this.http.request('GET', `/ucp/products?${params.toString()}`);\n const data = res as { products?: UCPProduct[] } | UCPProduct[];\n const products = Array.isArray(data) ? data : (data.products ?? []);\n return products.map((p) => this.http.validate(p, UCPProductSchema));\n }\n\n async get(id: string): Promise<UCPProduct> {\n const data = await this.http.request('GET', `/ucp/products/${encodeURIComponent(id)}`);\n return this.http.validate(data, UCPProductSchema);\n }\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[] = [...productTools(client)];\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 productTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'search_products',\n description:\n 'Search the product catalog by query string. Returns matching products with prices, availability, and images.',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query (e.g., \"running shoes\")' },\n max_price_cents: { type: 'number', description: 'Maximum price in cents' },\n min_price_cents: { type: 'number', description: 'Minimum price in cents' },\n in_stock: { type: 'boolean', description: 'Filter to in-stock items only' },\n category: { type: 'string', description: 'Product category' },\n limit: { type: 'number', description: 'Max results to return' },\n },\n required: ['query'],\n },\n execute: async (params) => {\n const { query, ...filters } = params as { query: string; [key: string]: unknown };\n return client.products.search(query, filters);\n },\n },\n {\n name: 'get_product',\n description: 'Get detailed product information by ID, including variants, images, and stock.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Product ID' },\n },\n required: ['id'],\n },\n execute: async (params) => client.products.get(params['id'] as string),\n },\n ];\n}\n\nfunction checkoutTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'create_checkout',\n description:\n 'Create a new checkout session with line items. Returns a session with an ID to use in subsequent calls.',\n parameters: {\n type: 'object',\n properties: {\n line_items: {\n type: 'array',\n description: 'Products to purchase',\n items: {\n type: 'object',\n properties: {\n item: {\n type: 'object',\n properties: { id: { type: 'string', description: 'Product ID' } },\n required: ['id'],\n },\n quantity: { type: 'number', description: 'Quantity to purchase' },\n },\n required: ['item', 'quantity'],\n },\n },\n currency: { type: 'string', description: 'ISO 4217 currency code (e.g., \"USD\")' },\n },\n required: ['line_items'],\n },\n execute: async (params) =>\n client.checkout!.create(\n params as unknown as Parameters<NonNullable<typeof client.checkout>['create']>[0],\n ),\n },\n {\n name: 'get_checkout',\n description:\n 'Get the current state of a checkout session, including status, totals, and available options.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n },\n required: ['id'],\n },\n execute: async (params) => client.checkout!.get(params['id'] as string),\n },\n {\n name: 'update_checkout',\n description:\n 'Update a checkout session with buyer information, shipping address, or payment details.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n buyer: {\n type: 'object',\n description: 'Buyer contact information',\n properties: {\n first_name: { type: 'string' },\n last_name: { type: 'string' },\n email: { type: 'string' },\n phone_number: { type: 'string' },\n },\n },\n context: {\n type: 'object',\n description: 'Localization context for pricing and availability',\n properties: {\n address_country: { type: 'string', description: 'ISO 3166-1 alpha-2 country code' },\n address_region: { type: 'string', description: 'State or province' },\n postal_code: { type: 'string' },\n },\n },\n },\n required: ['id'],\n },\n execute: async (params) => {\n const { id, ...patch } = params as { id: string; [key: string]: unknown };\n return client.checkout!.update(id, patch);\n },\n },\n {\n name: 'complete_checkout',\n description:\n 'Complete a checkout session with payment. Places the order. Returns the completed session with order ID.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n payment: {\n type: 'object',\n description: 'Payment information',\n properties: {\n instruments: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Instrument ID' },\n handler_id: {\n type: 'string',\n description: 'Payment handler ID from the server profile',\n },\n type: { type: 'string', description: 'Payment type (e.g., \"card\", \"offline\")' },\n credential: {\n type: 'object',\n properties: {\n type: { type: 'string', description: 'Credential type (e.g., \"token\")' },\n token: { type: 'string', description: 'Payment token' },\n },\n required: ['type'],\n },\n },\n required: ['id', 'handler_id', 'type'],\n },\n },\n },\n required: ['instruments'],\n },\n },\n required: ['id', 'payment'],\n },\n execute: async (params) => {\n const { id, ...payload } = params;\n return client.checkout!.complete(\n String(id),\n payload as unknown as Parameters<NonNullable<typeof client.checkout>['complete']>[1],\n );\n },\n },\n {\n name: 'cancel_checkout',\n description: 'Cancel a checkout session. The session cannot be used after cancellation.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n },\n required: ['id'],\n },\n execute: async (params) => client.checkout!.cancel(params['id'] as string),\n },\n ];\n}\n\nfunction fulfillmentTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'set_fulfillment',\n description: 'Set the fulfillment method for a checkout (e.g., \"shipping\" or \"pickup\").',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n type: { type: 'string', enum: ['shipping', 'pickup'], description: 'Fulfillment method' },\n },\n required: ['id', 'type'],\n },\n execute: async (params) =>\n client.checkout!.setFulfillment(params['id'] as string, params['type'] as string),\n },\n {\n name: 'select_destination',\n description: 'Select a shipping destination for a checkout session.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n destination_id: { type: 'string', description: 'Destination ID to select' },\n fulfillment_type: {\n type: 'string',\n default: 'shipping',\n description: 'Fulfillment type',\n },\n },\n required: ['id', 'destination_id'],\n },\n execute: async (params) =>\n client.checkout!.selectDestination(\n params['id'] as string,\n params['destination_id'] as string,\n (params['fulfillment_type'] as string) ?? 'shipping',\n ),\n },\n {\n name: 'select_fulfillment_option',\n description:\n 'Select a fulfillment option (e.g., standard shipping, express shipping) for a checkout session.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n option_id: { type: 'string', description: 'Fulfillment option ID to select' },\n destination_id: { type: 'string', description: 'Destination ID (if applicable)' },\n fulfillment_type: {\n type: 'string',\n default: 'shipping',\n description: 'Fulfillment type',\n },\n },\n required: ['id', 'option_id'],\n },\n execute: async (params) =>\n client.checkout!.selectFulfillmentOption(\n params['id'] as string,\n params['option_id'] as string,\n params['destination_id'] as string | undefined,\n (params['fulfillment_type'] as string) ?? 'shipping',\n ),\n },\n ];\n}\n\nfunction discountTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'apply_discount_codes',\n description: 'Apply one or more discount codes to a checkout session.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Checkout session ID' },\n codes: {\n type: 'array',\n items: { type: 'string' },\n description: 'Discount codes to apply',\n },\n },\n required: ['id', 'codes'],\n },\n execute: async (params) =>\n client.checkout!.applyDiscountCodes(params['id'] as string, params['codes'] as string[]),\n },\n ];\n}\n\nfunction orderTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'get_order',\n description:\n 'Get order details by ID, including line items, fulfillment status, and tracking information.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Order ID' },\n },\n required: ['id'],\n },\n execute: async (params) => client.order!.get(params['id'] as string),\n },\n ];\n}\n\nfunction identityLinkingTools(client: ConnectedClient): AgentTool[] {\n return [\n {\n name: 'get_authorization_url',\n description:\n 'Build the OAuth authorization URL to redirect the buyer to for account linking. Returns a URL string.',\n parameters: {\n type: 'object',\n properties: {\n client_id: { type: 'string', description: 'OAuth client ID' },\n redirect_uri: { type: 'string', description: 'URI to redirect to after authorization' },\n scope: {\n type: 'string',\n description: 'OAuth scope (default: ucp:scopes:checkout_session)',\n },\n state: { type: 'string', description: 'Opaque value for CSRF protection' },\n },\n required: ['client_id', 'redirect_uri'],\n },\n execute: (params) =>\n Promise.resolve(\n client.identityLinking!.getAuthorizationUrl(\n params as unknown as Parameters<\n NonNullable<typeof client.identityLinking>['getAuthorizationUrl']\n >[0],\n ),\n ),\n },\n {\n name: 'exchange_auth_code',\n description: 'Exchange an OAuth authorization code for an access token and refresh token.',\n parameters: {\n type: 'object',\n properties: {\n client_id: { type: 'string', description: 'OAuth client ID' },\n client_secret: { type: 'string', description: 'OAuth client secret' },\n code: { type: 'string', description: 'Authorization code from the redirect' },\n redirect_uri: {\n type: 'string',\n description: 'Must match the redirect_uri used in authorization',\n },\n },\n required: ['client_id', 'client_secret', 'code', 'redirect_uri'],\n },\n execute: async (params) =>\n client.identityLinking!.exchangeCode(\n params as unknown as Parameters<\n NonNullable<typeof client.identityLinking>['exchangeCode']\n >[0],\n ),\n },\n {\n name: 'refresh_access_token',\n description: 'Refresh an expired access token using a refresh token.',\n parameters: {\n type: 'object',\n properties: {\n client_id: { type: 'string', description: 'OAuth client ID' },\n client_secret: { type: 'string', description: 'OAuth client secret' },\n refresh_token: { type: 'string', description: 'Refresh token from a previous exchange' },\n },\n required: ['client_id', 'client_secret', 'refresh_token'],\n },\n execute: async (params) =>\n client.identityLinking!.refreshToken(\n params as unknown as Parameters<\n NonNullable<typeof client.identityLinking>['refreshToken']\n >[0],\n ),\n },\n {\n name: 'revoke_token',\n description: 'Revoke an access or refresh token to invalidate an account link.',\n parameters: {\n type: 'object',\n properties: {\n client_id: { type: 'string', description: 'OAuth client ID' },\n client_secret: { type: 'string', description: 'OAuth client secret' },\n token: { type: 'string', description: 'Token to revoke' },\n token_type_hint: {\n type: 'string',\n enum: ['access_token', 'refresh_token'],\n description: 'Hint about the token type',\n },\n },\n required: ['client_id', 'client_secret', 'token'],\n },\n execute: async (params) =>\n client.identityLinking!.revokeToken(\n params as unknown as Parameters<\n NonNullable<typeof client.identityLinking>['revokeToken']\n >[0],\n ),\n },\n ];\n}\n","import { z } from 'zod';\nimport type { UcpDiscoveryProfile } from '@ucp-js/sdk';\nimport { HttpClient } from './http.js';\nimport type { LogFn } from './http.js';\nimport { UCPProfileSchema } from './schemas.js';\nimport { CheckoutCapability } from './capabilities/checkout.js';\nimport { OrderCapability } from './capabilities/order.js';\nimport { IdentityLinkingCapability } from './capabilities/identity-linking.js';\nimport { ProductsCapability } from './capabilities/products.js';\nimport type { UCPClientConfig } from './types/config.js';\nimport { DEFAULT_UCP_VERSION, UCP_CAPABILITIES } from './types/config.js';\nimport type { CheckoutExtensions } from './types/checkout.js';\nimport type { OAuthServerMetadata } from './types/identity-linking.js';\nimport type { PaymentHandlerMap } from './types/payment.js';\nimport { getAgentTools } from './agent-tools.js';\nimport type { AgentTool } from './agent-tools.js';\n\n/** UCP discovery profile returned by `GET /.well-known/ucp`. */\nexport type UCPProfile = UcpDiscoveryProfile;\n\n/** Describes a single tool the agent can use with the connected server. */\nexport interface ToolDescriptor {\n readonly name: string;\n readonly capability: string;\n readonly description: string;\n}\n\n/**\n * A connected UCP client. Only capabilities the server declared are non-null.\n * Use `describeTools()` to get the list of available tools for agent registration.\n */\nexport interface ConnectedClient {\n /** The server's UCP discovery profile. */\n readonly profile: UCPProfile;\n /** 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 /** Product search and retrieval. Always available (gateway-specific). */\n readonly products: ProductsCapability;\n /** Payment handlers declared by the server, keyed by namespace. */\n readonly paymentHandlers: PaymentHandlerMap;\n /** Returns only the tools this server supports (name + description only). */\n describeTools(): readonly ToolDescriptor[];\n /**\n * Returns complete tool definitions with JSON Schema parameters and execute functions.\n * Ready for direct use with any AI agent framework (Claude API, OpenAI, Vercel AI SDK, LangChain, MCP).\n */\n getAgentTools(): readonly AgentTool[];\n}\n\n/**\n * Connect to a UCP server, discover its capabilities, and return a {@link ConnectedClient}.\n *\n * @example\n * ```typescript\n * const client = await connect({\n * gatewayUrl: 'https://store.example.com/ucp',\n * agentProfileUrl: 'https://platform.example.com/.well-known/ucp',\n * });\n *\n * if (client.checkout) {\n * const session = await client.checkout.create({ line_items: [...] });\n * }\n * ```\n */\nexport async function connect(\n config: UCPClientConfig,\n options?: { readonly onValidationWarning?: LogFn },\n): Promise<ConnectedClient> {\n validateConfig(config);\n\n const http = new HttpClient({\n gatewayUrl: config.gatewayUrl.replace(/\\/+$/, ''),\n agentProfileUrl: config.agentProfileUrl,\n ucpVersion: config.ucpVersion ?? DEFAULT_UCP_VERSION,\n ...(config.requestSignature !== undefined ? { requestSignature: config.requestSignature } : {}),\n ...(options?.onValidationWarning !== undefined\n ? { onValidationWarning: options.onValidationWarning }\n : {}),\n });\n\n const rawProfile = await http.request('GET', '/.well-known/ucp');\n const profile = http.validate(rawProfile, UCPProfileSchema);\n const capabilityNames = extractCapabilityNames(profile);\n\n const checkout = buildCheckoutCapability(http, capabilityNames);\n const order = capabilityNames.has(UCP_CAPABILITIES.ORDER) ? new OrderCapability(http) : null;\n const identityLinking = await buildIdentityLinking(config, capabilityNames);\n const products = new ProductsCapability(http);\n const paymentHandlers = extractPaymentHandlers(profile);\n\n const client: ConnectedClient = {\n profile,\n checkout,\n order,\n identityLinking,\n products,\n paymentHandlers,\n describeTools: () => buildToolDescriptors(checkout, order, identityLinking),\n getAgentTools: () => getAgentTools(client),\n };\n\n return Object.freeze(client);\n}\n\n/**\n * UCP client entry point. Use `UCPClient.connect()` to discover server capabilities\n * and get a {@link ConnectedClient}.\n *\n * @example\n * ```typescript\n * const client = await UCPClient.connect({\n * gatewayUrl: 'https://store.example.com/ucp',\n * agentProfileUrl: 'https://platform.example.com/.well-known/ucp',\n * });\n * ```\n */\nexport class UCPClient {\n private constructor() {\n /* use UCPClient.connect() or the standalone connect() function */\n }\n\n static connect = connect;\n}\n\nfunction validateConfig(config: UCPClientConfig): void {\n new URL(config.gatewayUrl);\n if (config.agentProfileUrl.includes('\"') || config.agentProfileUrl.includes('\\n')) {\n throw new Error('agentProfileUrl must not contain double quotes or newlines');\n }\n new URL(config.agentProfileUrl);\n}\n\nfunction extractCapabilityNames(profile: UCPProfile): Set<string> {\n const capabilities = profile.ucp?.capabilities;\n if (!Array.isArray(capabilities)) return new Set();\n return new Set(\n capabilities.map((c: { name?: string }) => c.name).filter((n): n is string => n !== undefined),\n );\n}\n\nconst PaymentHandlerInstanceSchema = z\n .object({\n id: z.string(),\n version: z.string(),\n spec: z.string(),\n schema: z.string(),\n config: z.record(z.unknown()).optional(),\n })\n .passthrough();\n\nconst PaymentHandlerMapSchema = z.record(z.array(PaymentHandlerInstanceSchema));\n\nfunction extractPaymentHandlers(profile: UCPProfile): PaymentHandlerMap {\n const raw = (profile as Record<string, unknown>)['payment_handlers'];\n if (typeof raw !== 'object' || raw === null) return {};\n const result = PaymentHandlerMapSchema.safeParse(raw);\n if (!result.success) return {};\n return result.data as PaymentHandlerMap;\n}\n\nfunction 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 { name: 'search_products', capability: 'products', description: 'Search product catalog' },\n { name: 'get_product', capability: 'products', description: 'Get product by ID' },\n ];\n\n if (checkout) {\n tools.push(\n {\n name: 'create_checkout',\n capability: 'checkout',\n description: 'Create a checkout session',\n },\n {\n name: 'get_checkout',\n capability: 'checkout',\n description: 'Get checkout session by ID',\n },\n {\n name: 'update_checkout',\n capability: 'checkout',\n description: 'Update a checkout session',\n },\n {\n name: 'complete_checkout',\n capability: 'checkout',\n description: 'Complete checkout with payment',\n },\n {\n name: 'cancel_checkout',\n capability: 'checkout',\n description: 'Cancel a checkout session',\n },\n );\n\n if (checkout.extensions.fulfillment) {\n tools.push(\n {\n name: 'set_fulfillment',\n capability: 'checkout.fulfillment',\n description: 'Set fulfillment method (shipping/pickup)',\n },\n {\n name: 'select_destination',\n capability: 'checkout.fulfillment',\n description: 'Select shipping destination',\n },\n {\n name: 'select_fulfillment_option',\n capability: 'checkout.fulfillment',\n description: 'Select fulfillment option (e.g., express shipping)',\n },\n );\n }\n\n if (checkout.extensions.discount) {\n tools.push({\n name: 'apply_discount_codes',\n capability: 'checkout.discount',\n description: 'Apply discount codes to checkout',\n });\n }\n }\n\n if (order) {\n tools.push({\n name: 'get_order',\n capability: 'order',\n description: 'Get order by ID',\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"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { AgentTool, AuthorizationParams, BuyerConsent, CardCredential, CheckoutCapability, CheckoutExtensions, CheckoutSession, CheckoutSessionStatus, CompleteCheckoutPayload, ConnectedClient, CreateCheckoutPayload, DEFAULT_UCP_VERSION, IdentityLinkingCapability, JsonSchema, LocalizationContext, OAuthServerMetadata, OrderCapability, PaymentCredential, PaymentHandlerInstance, PaymentHandlerMap, PaymentInstrument, PostalAddress, ProductsCapability, SearchFilters, TokenCredential, TokenExchangeParams, TokenRefreshParams, TokenResponse, TokenRevokeParams, ToolDescriptor, UCPClient, UCPClientConfig, UCPOrder, UCPProduct, UCPProfile, UCPSpecOrder, UCP_CAPABILITIES, UpdateCheckoutPayload, WebhookEvent, connect, getAgentTools } from "./agent-tools-o2PEyGqh.cjs";
1
+ import { AdapterOptions, AgentTool, AuthorizationParams, BuyerConsent, CardCredential, CheckoutCapability, CheckoutExtensions, CheckoutSession, CheckoutSessionStatus, CompleteCheckoutPayload, ConnectedClient, CreateCheckoutPayload, DEFAULT_UCP_VERSION, IdentityLinkingCapability, JsonSchema, LocalizationContext, OAuthServerMetadata, OrderCapability, PaymentCredential, PaymentHandlerInstance, PaymentHandlerMap, PaymentInstrument, PostalAddress, ProductsCapability, SearchFilters, TokenCredential, TokenExchangeParams, TokenRefreshParams, TokenResponse, TokenRevokeParams, ToolDescriptor, ToolErrorResult, UCPClient, UCPClientConfig, UCPOrder, UCPProduct, UCPProfile, UCPSpecOrder, UCP_CAPABILITIES, UpdateCheckoutPayload, WebhookEvent, connect, getAgentTools } from "./catch-errors-CbIHeFvF.cjs";
2
2
  import { BuyerSchema, CheckoutResponseStatusSchema, FulfillmentMethodResponseSchema, FulfillmentResponseSchema, ItemResponseSchema, LineItemResponseSchema, MessageErrorSchema, MessageSchema, OrderSchema, PaymentHandlerResponseSchema, PaymentInstrumentSchema, PaymentResponseSchema, PostalAddressSchema, TotalResponseSchema } from "@ucp-js/sdk";
3
3
  import { z } from "zod";
4
4
 
@@ -7580,5 +7580,5 @@ declare const CompleteCheckoutRequestSchema: z.ZodObject<{
7580
7580
  }, z.ZodTypeAny, "passthrough">[];
7581
7581
  };
7582
7582
  }>; //#endregion
7583
- export { AgentTool, AuthorizationParams, BuyerConsent, BuyerSchema, CardCredential, CheckoutCapability, CheckoutExtensions, CheckoutResponseStatusSchema, CheckoutSession, CheckoutSessionSchema, CheckoutSessionStatus, CompleteCheckoutPayload, CompleteCheckoutRequestSchema, ConnectedClient, ContentType, CreateCheckoutPayload, CreateCheckoutRequestSchema, DEFAULT_UCP_VERSION, FulfillmentMethodResponseSchema, FulfillmentResponseSchema, IdentityLinkingCapability, ItemResponseSchema, JsonSchema, LineItemResponseSchema, LocalizationContext, MessageErrorSchema, MessageSchema, MessageSeverity, MessageType, OAuthServerMetadata, OrderCapability, PaymentCredential, PaymentHandlerInstance, PaymentHandlerMap, PaymentHandlerResponseSchema, PaymentInstrument, PaymentInstrumentSchema, PaymentResponseSchema, PostalAddress, PostalAddressSchema, ProductsCapability, SearchFilters, TokenCredential, TokenExchangeParams, TokenRefreshParams, TokenResponse, TokenRevokeParams, ToolDescriptor, TotalResponseSchema, UCPClient, UCPClientConfig, UCPError, UCPEscalationError, UCPIdempotencyConflictError, UCPMessage, UCPOAuthError, UCPOrder, UCPOrderSchema, UCPProduct, UCPProductSchema, UCPProfile, UCPProfileSchema, UCPSpecOrder, OrderSchema as UCPSpecOrderSchema, UCP_CAPABILITIES, UpdateCheckoutPayload, UpdateCheckoutRequestSchema, WebhookEvent, connect, getAgentTools };
7583
+ export { AdapterOptions, AgentTool, AuthorizationParams, BuyerConsent, BuyerSchema, CardCredential, CheckoutCapability, CheckoutExtensions, CheckoutResponseStatusSchema, CheckoutSession, CheckoutSessionSchema, CheckoutSessionStatus, CompleteCheckoutPayload, CompleteCheckoutRequestSchema, ConnectedClient, ContentType, CreateCheckoutPayload, CreateCheckoutRequestSchema, DEFAULT_UCP_VERSION, FulfillmentMethodResponseSchema, FulfillmentResponseSchema, IdentityLinkingCapability, ItemResponseSchema, JsonSchema, LineItemResponseSchema, LocalizationContext, MessageErrorSchema, MessageSchema, MessageSeverity, MessageType, OAuthServerMetadata, OrderCapability, PaymentCredential, PaymentHandlerInstance, PaymentHandlerMap, PaymentHandlerResponseSchema, PaymentInstrument, PaymentInstrumentSchema, PaymentResponseSchema, PostalAddress, PostalAddressSchema, ProductsCapability, SearchFilters, TokenCredential, TokenExchangeParams, TokenRefreshParams, TokenResponse, TokenRevokeParams, ToolDescriptor, ToolErrorResult, TotalResponseSchema, UCPClient, UCPClientConfig, UCPError, UCPEscalationError, UCPIdempotencyConflictError, UCPMessage, UCPOAuthError, UCPOrder, UCPOrderSchema, UCPProduct, UCPProductSchema, UCPProfile, UCPProfileSchema, UCPSpecOrder, OrderSchema as UCPSpecOrderSchema, UCP_CAPABILITIES, UpdateCheckoutPayload, UpdateCheckoutRequestSchema, WebhookEvent, connect, getAgentTools };
7584
7584
  //# sourceMappingURL=index.d.cts.map