@agent-score/commerce 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +26 -11
  2. package/dist/{_response-RpEB7-vl.d.ts → _response-C2yFQoIA.d.ts} +1 -1
  3. package/dist/{_response-DS-LR590.d.mts → _response-DpB-cm2c.d.mts} +1 -1
  4. package/dist/{agent_instructions-d3UWTdam.d.mts → agent_instructions-DiMSGkdm.d.mts} +10 -6
  5. package/dist/{agent_instructions-d3UWTdam.d.ts → agent_instructions-DiMSGkdm.d.ts} +10 -6
  6. package/dist/challenge/index.d.mts +18 -9
  7. package/dist/challenge/index.d.ts +18 -9
  8. package/dist/challenge/index.js +25 -24
  9. package/dist/challenge/index.js.map +1 -1
  10. package/dist/challenge/index.mjs +25 -24
  11. package/dist/challenge/index.mjs.map +1 -1
  12. package/dist/core.js +1 -1
  13. package/dist/core.js.map +1 -1
  14. package/dist/core.mjs +1 -1
  15. package/dist/core.mjs.map +1 -1
  16. package/dist/discovery/index.d.mts +130 -6
  17. package/dist/discovery/index.d.ts +130 -6
  18. package/dist/discovery/index.js +75 -59
  19. package/dist/discovery/index.js.map +1 -1
  20. package/dist/discovery/index.mjs +70 -58
  21. package/dist/discovery/index.mjs.map +1 -1
  22. package/dist/identity/express.d.mts +2 -2
  23. package/dist/identity/express.d.ts +2 -2
  24. package/dist/identity/express.js +48 -25
  25. package/dist/identity/express.js.map +1 -1
  26. package/dist/identity/express.mjs +48 -25
  27. package/dist/identity/express.mjs.map +1 -1
  28. package/dist/identity/fastify.d.mts +2 -2
  29. package/dist/identity/fastify.d.ts +2 -2
  30. package/dist/identity/fastify.js +48 -25
  31. package/dist/identity/fastify.js.map +1 -1
  32. package/dist/identity/fastify.mjs +48 -25
  33. package/dist/identity/fastify.mjs.map +1 -1
  34. package/dist/identity/hono.d.mts +2 -2
  35. package/dist/identity/hono.d.ts +2 -2
  36. package/dist/identity/hono.js +48 -25
  37. package/dist/identity/hono.js.map +1 -1
  38. package/dist/identity/hono.mjs +48 -25
  39. package/dist/identity/hono.mjs.map +1 -1
  40. package/dist/identity/nextjs.d.mts +2 -2
  41. package/dist/identity/nextjs.d.ts +2 -2
  42. package/dist/identity/nextjs.js +48 -25
  43. package/dist/identity/nextjs.js.map +1 -1
  44. package/dist/identity/nextjs.mjs +48 -25
  45. package/dist/identity/nextjs.mjs.map +1 -1
  46. package/dist/identity/web.d.mts +2 -2
  47. package/dist/identity/web.d.ts +2 -2
  48. package/dist/identity/web.js +48 -25
  49. package/dist/identity/web.js.map +1 -1
  50. package/dist/identity/web.mjs +48 -25
  51. package/dist/identity/web.mjs.map +1 -1
  52. package/dist/index.d.mts +12 -12
  53. package/dist/index.d.ts +12 -12
  54. package/dist/index.js +47 -24
  55. package/dist/index.js.map +1 -1
  56. package/dist/index.mjs +47 -24
  57. package/dist/index.mjs.map +1 -1
  58. package/dist/payment/index.d.mts +136 -49
  59. package/dist/payment/index.d.ts +136 -49
  60. package/dist/payment/index.js +161 -73
  61. package/dist/payment/index.js.map +1 -1
  62. package/dist/payment/index.mjs +160 -72
  63. package/dist/payment/index.mjs.map +1 -1
  64. package/dist/{signer-Cvdwn6Cs.d.mts → signer-kCAJUZwp.d.mts} +10 -12
  65. package/dist/{signer-Cvdwn6Cs.d.ts → signer-kCAJUZwp.d.ts} +10 -12
  66. package/dist/stripe-multichain/index.d.mts +2 -2
  67. package/dist/stripe-multichain/index.d.ts +2 -2
  68. package/dist/stripe-multichain/index.js.map +1 -1
  69. package/dist/stripe-multichain/index.mjs.map +1 -1
  70. package/package.json +13 -4
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AgentScoreData } from './core.mjs';
2
2
  export { AgentIdentity, AgentMemoryHint, AgentScoreCore, AgentScoreCoreOptions, CreateSessionOnMissing, DenialCode, DenialReason, EvaluateOutcome, VerifyWalletSignerMatchOptions, VerifyWalletSignerResult, buildAgentMemoryHint } from './core.mjs';
3
- export { P as PaymentSigner, S as SignerNetwork, a as extractPaymentSigner, e as extractPaymentSignerAddress, r as readX402PaymentHeader } from './signer-Cvdwn6Cs.mjs';
4
- export { F as FIXABLE_DENIAL_REASONS, b as buildContactSupportNextSteps, a as buildSignerMismatchBody, d as denialReasonStatus, c as denialReasonToBody, i as isFixableDenial, v as verificationAgentInstructions } from './_response-DS-LR590.mjs';
3
+ export { P as PaymentSigner, S as SignerNetwork, a as extractPaymentSigner, e as extractPaymentSignerAddress, r as readX402PaymentHeader } from './signer-kCAJUZwp.mjs';
4
+ export { F as FIXABLE_DENIAL_REASONS, b as buildContactSupportNextSteps, a as buildSignerMismatchBody, d as denialReasonStatus, c as denialReasonToBody, i as isFixableDenial, v as verificationAgentInstructions } from './_response-DpB-cm2c.mjs';
5
5
  export { EnforcementMode, GateResult, IdentityStatus, PolicyBlock, policyToGateOptions, runGateWithEnforcement, shippingCountryAllowed, shippingStateAllowed } from './identity/policy.mjs';
6
6
 
7
7
  /**
@@ -27,7 +27,7 @@ interface A2AAgentCardCapabilities {
27
27
  path?: string;
28
28
  method?: string;
29
29
  }[];
30
- /** Free-form skill tags — `["wine-purchase", "regulated-commerce", ...]`. */
30
+ /** Free-form skill tags — `["product-purchase", "regulated-commerce", ...]`. */
31
31
  skills?: string[];
32
32
  }
33
33
  interface A2AAgentCardIdentity {
@@ -67,7 +67,7 @@ interface A2AAgentCard {
67
67
  extras?: Record<string, unknown>;
68
68
  }
69
69
  interface BuildA2AAgentCardInput {
70
- /** Display name for the agent — `"Martin Estate Wine Concierge"`, etc. */
70
+ /** Display name for the agent — e.g. a merchant brand or service name. */
71
71
  name: string;
72
72
  /** Optional one-line description. */
73
73
  description?: string;
@@ -101,12 +101,12 @@ interface BuildA2AAgentCardInput {
101
101
  * app.get('/.well-known/agent-card', async (c) => {
102
102
  * const data = getAgentScoreData(c);
103
103
  * const card = buildA2AAgentCard({
104
- * name: 'Martin Estate Wine Concierge',
105
- * description: 'Buy regulated wines from Martin Estate via agent payments.',
106
- * url: 'https://agents.martinestate.com',
104
+ * name: 'Example Merchant Concierge',
105
+ * description: 'Buy regulated goods via agent payments.',
106
+ * url: 'https://agents.example.com',
107
107
  * capabilities: {
108
108
  * endpoints: [{ name: 'purchase', path: '/purchase', method: 'POST' }],
109
- * skills: ['wine-purchase', 'regulated-commerce'],
109
+ * skills: ['product-purchase', 'regulated-commerce'],
110
110
  * },
111
111
  * data,
112
112
  * });
@@ -174,7 +174,7 @@ interface UCPCapability {
174
174
  [k: string]: unknown;
175
175
  }
176
176
  interface UCPPaymentHandler {
177
- /** Handler name — `stripe`, `tempo`, `x402-base`, `x402-solana`, etc. */
177
+ /** Handler name — `stripe`, `tempo`, `x402-base`, `solana`, etc. */
178
178
  name: string;
179
179
  /** Handler config — recipient address, profile id, etc. */
180
180
  config?: Record<string, unknown>;
@@ -234,13 +234,13 @@ interface BuildUCPProfileInput {
234
234
  * app.get('/.well-known/ucp', async (c) => {
235
235
  * const data = getAgentScoreData(c);
236
236
  * return c.json(buildUCPProfile({
237
- * name: 'Martin Estate',
238
- * services: [{ type: 'rest', url: 'https://agents.martinestate.com' }],
237
+ * name: 'Example Merchant',
238
+ * services: [{ type: 'rest', url: 'https://agents.example.com' }],
239
239
  * payment_handlers: [
240
240
  * { name: 'tempo', config: { recipient: TEMPO_ADDR } },
241
241
  * { name: 'stripe', config: { profile_id: STRIPE_PROFILE_ID } },
242
242
  * ],
243
- * signing_keys: [{ kid: 'me-2026-04', kty: 'EC', alg: 'ES256', crv: 'P-256', x: '...', y: '...' }],
243
+ * signing_keys: [{ kid: 'merchant-2026-04', kty: 'EC', alg: 'ES256', crv: 'P-256', x: '...', y: '...' }],
244
244
  * data,
245
245
  * }));
246
246
  * });
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AgentScoreData } from './core.js';
2
2
  export { AgentIdentity, AgentMemoryHint, AgentScoreCore, AgentScoreCoreOptions, CreateSessionOnMissing, DenialCode, DenialReason, EvaluateOutcome, VerifyWalletSignerMatchOptions, VerifyWalletSignerResult, buildAgentMemoryHint } from './core.js';
3
- export { P as PaymentSigner, S as SignerNetwork, a as extractPaymentSigner, e as extractPaymentSignerAddress, r as readX402PaymentHeader } from './signer-Cvdwn6Cs.js';
4
- export { F as FIXABLE_DENIAL_REASONS, b as buildContactSupportNextSteps, a as buildSignerMismatchBody, d as denialReasonStatus, c as denialReasonToBody, i as isFixableDenial, v as verificationAgentInstructions } from './_response-RpEB7-vl.js';
3
+ export { P as PaymentSigner, S as SignerNetwork, a as extractPaymentSigner, e as extractPaymentSignerAddress, r as readX402PaymentHeader } from './signer-kCAJUZwp.js';
4
+ export { F as FIXABLE_DENIAL_REASONS, b as buildContactSupportNextSteps, a as buildSignerMismatchBody, d as denialReasonStatus, c as denialReasonToBody, i as isFixableDenial, v as verificationAgentInstructions } from './_response-C2yFQoIA.js';
5
5
  export { EnforcementMode, GateResult, IdentityStatus, PolicyBlock, policyToGateOptions, runGateWithEnforcement, shippingCountryAllowed, shippingStateAllowed } from './identity/policy.js';
6
6
 
7
7
  /**
@@ -27,7 +27,7 @@ interface A2AAgentCardCapabilities {
27
27
  path?: string;
28
28
  method?: string;
29
29
  }[];
30
- /** Free-form skill tags — `["wine-purchase", "regulated-commerce", ...]`. */
30
+ /** Free-form skill tags — `["product-purchase", "regulated-commerce", ...]`. */
31
31
  skills?: string[];
32
32
  }
33
33
  interface A2AAgentCardIdentity {
@@ -67,7 +67,7 @@ interface A2AAgentCard {
67
67
  extras?: Record<string, unknown>;
68
68
  }
69
69
  interface BuildA2AAgentCardInput {
70
- /** Display name for the agent — `"Martin Estate Wine Concierge"`, etc. */
70
+ /** Display name for the agent — e.g. a merchant brand or service name. */
71
71
  name: string;
72
72
  /** Optional one-line description. */
73
73
  description?: string;
@@ -101,12 +101,12 @@ interface BuildA2AAgentCardInput {
101
101
  * app.get('/.well-known/agent-card', async (c) => {
102
102
  * const data = getAgentScoreData(c);
103
103
  * const card = buildA2AAgentCard({
104
- * name: 'Martin Estate Wine Concierge',
105
- * description: 'Buy regulated wines from Martin Estate via agent payments.',
106
- * url: 'https://agents.martinestate.com',
104
+ * name: 'Example Merchant Concierge',
105
+ * description: 'Buy regulated goods via agent payments.',
106
+ * url: 'https://agents.example.com',
107
107
  * capabilities: {
108
108
  * endpoints: [{ name: 'purchase', path: '/purchase', method: 'POST' }],
109
- * skills: ['wine-purchase', 'regulated-commerce'],
109
+ * skills: ['product-purchase', 'regulated-commerce'],
110
110
  * },
111
111
  * data,
112
112
  * });
@@ -174,7 +174,7 @@ interface UCPCapability {
174
174
  [k: string]: unknown;
175
175
  }
176
176
  interface UCPPaymentHandler {
177
- /** Handler name — `stripe`, `tempo`, `x402-base`, `x402-solana`, etc. */
177
+ /** Handler name — `stripe`, `tempo`, `x402-base`, `solana`, etc. */
178
178
  name: string;
179
179
  /** Handler config — recipient address, profile id, etc. */
180
180
  config?: Record<string, unknown>;
@@ -234,13 +234,13 @@ interface BuildUCPProfileInput {
234
234
  * app.get('/.well-known/ucp', async (c) => {
235
235
  * const data = getAgentScoreData(c);
236
236
  * return c.json(buildUCPProfile({
237
- * name: 'Martin Estate',
238
- * services: [{ type: 'rest', url: 'https://agents.martinestate.com' }],
237
+ * name: 'Example Merchant',
238
+ * services: [{ type: 'rest', url: 'https://agents.example.com' }],
239
239
  * payment_handlers: [
240
240
  * { name: 'tempo', config: { recipient: TEMPO_ADDR } },
241
241
  * { name: 'stripe', config: { profile_id: STRIPE_PROFILE_ID } },
242
242
  * ],
243
- * signing_keys: [{ kid: 'me-2026-04', kty: 'EC', alg: 'ES256', crv: 'P-256', x: '...', y: '...' }],
243
+ * signing_keys: [{ kid: 'merchant-2026-04', kty: 'EC', alg: 'ES256', crv: 'P-256', x: '...', y: '...' }],
244
244
  * data,
245
245
  * }));
246
246
  * });
package/dist/index.js CHANGED
@@ -285,6 +285,44 @@ function buildAgentMemoryHint() {
285
285
  }
286
286
 
287
287
  // src/signer.ts
288
+ var TOKEN_PROGRAM = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
289
+ var TOKEN_2022_PROGRAM = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
290
+ var TRANSFER_CHECKED_DISCRIMINATOR = 12;
291
+ async function extractSolanaSignerFromCredential(credential) {
292
+ const payload = credential.payload;
293
+ if (!payload?.transaction || payload.type !== "transaction") return null;
294
+ const moduleName = "@solana/kit";
295
+ const kit = await import(moduleName).catch(() => null);
296
+ if (!kit?.getBase64Codec || !kit.getTransactionDecoder || !kit.getCompiledTransactionMessageDecoder) {
297
+ return null;
298
+ }
299
+ try {
300
+ const txBytes = kit.getBase64Codec().encode(payload.transaction);
301
+ const decoded = kit.getTransactionDecoder().decode(txBytes);
302
+ const message = kit.getCompiledTransactionMessageDecoder().decode(decoded.messageBytes);
303
+ for (const ix of message.instructions) {
304
+ const programId = message.staticAccounts[ix.programAddressIndex];
305
+ if (programId !== TOKEN_PROGRAM && programId !== TOKEN_2022_PROGRAM) continue;
306
+ const data = ix.data;
307
+ if (!data || data.length === 0 || data[0] !== TRANSFER_CHECKED_DISCRIMINATOR) continue;
308
+ const accountIndices = ix.accountIndices ?? [];
309
+ const authorityIndex = accountIndices[3];
310
+ if (authorityIndex === void 0) continue;
311
+ if (authorityIndex >= message.staticAccounts.length) {
312
+ console.warn(
313
+ "[gate] Solana TransferChecked authority resolves through an address lookup table; signer-match recovery requires the static-account form. Skipping."
314
+ );
315
+ continue;
316
+ }
317
+ const authority = message.staticAccounts[authorityIndex];
318
+ if (authority) return authority;
319
+ }
320
+ return null;
321
+ } catch (err) {
322
+ console.warn("[gate] Solana credential decode failed:", err instanceof Error ? err.message : err);
323
+ return null;
324
+ }
325
+ }
288
326
  async function extractPaymentSigner(request, x402PaymentHeader) {
289
327
  const authHeader = request.headers.get("authorization");
290
328
  if (authHeader) {
@@ -294,8 +332,12 @@ async function extractPaymentSigner(request, x402PaymentHeader) {
294
332
  if (mppx?.Credential?.extractPaymentScheme(authHeader)) {
295
333
  const credential = mppx.Credential.fromRequest(request);
296
334
  const source = credential.source;
297
- const match = source?.match(/^did:pkh:eip155:\d+:(0x[0-9a-fA-F]{40})$/);
298
- if (match) return { address: match[1].toLowerCase(), network: "evm" };
335
+ const evmMatch = source?.match(/^did:pkh:eip155:\d+:(0x[0-9a-fA-F]{40})$/);
336
+ if (evmMatch) return { address: evmMatch[1].toLowerCase(), network: "evm" };
337
+ const solMatch = source?.match(/^did:pkh:solana:[1-9A-HJ-NP-Za-km-z]{32,44}:([1-9A-HJ-NP-Za-km-z]{32,44})$/);
338
+ if (solMatch) return { address: solMatch[1], network: "solana" };
339
+ const solanaFromTx = await extractSolanaSignerFromCredential(credential);
340
+ if (solanaFromTx) return { address: solanaFromTx, network: "solana" };
299
341
  }
300
342
  } catch (err) {
301
343
  console.warn("[gate] MPP signer extraction failed:", err instanceof Error ? err.message : err);
@@ -305,28 +347,9 @@ async function extractPaymentSigner(request, x402PaymentHeader) {
305
347
  try {
306
348
  const decoded = atob(x402PaymentHeader);
307
349
  const parsed = JSON.parse(decoded);
308
- const network = parsed?.accepted?.network ?? "";
309
- if (network.startsWith("eip155:")) {
310
- const from = parsed?.payload?.authorization?.from;
311
- if (typeof from === "string" && /^0x[0-9a-fA-F]{40}$/.test(from)) {
312
- return { address: from.toLowerCase(), network: "evm" };
313
- }
314
- } else if (network.startsWith("solana:")) {
315
- const transaction = parsed?.payload?.transaction;
316
- if (typeof transaction === "string") {
317
- const moduleName = "@x402/svm";
318
- const svm = await import(moduleName).catch(() => null);
319
- if (svm?.decodeTransactionFromPayload && svm.getTokenPayerFromTransaction) {
320
- const tx = svm.decodeTransactionFromPayload({ transaction });
321
- const payer = svm.getTokenPayerFromTransaction(tx);
322
- if (typeof payer === "string" && payer.length > 0) return { address: payer, network: "solana" };
323
- }
324
- }
325
- } else {
326
- const from = parsed?.payload?.authorization?.from;
327
- if (typeof from === "string" && /^0x[0-9a-fA-F]{40}$/.test(from)) {
328
- return { address: from.toLowerCase(), network: "evm" };
329
- }
350
+ const from = parsed?.payload?.authorization?.from;
351
+ if (typeof from === "string" && /^0x[0-9a-fA-F]{40}$/.test(from)) {
352
+ return { address: from.toLowerCase(), network: "evm" };
330
353
  }
331
354
  } catch (err) {
332
355
  console.warn("[gate] x402 signer extraction failed:", err instanceof Error ? err.message : err);