@agent-score/commerce 1.7.0 → 1.8.1

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 +3 -3
  2. package/dist/{_response-DpB-cm2c.d.mts → _response-9yp6Fit2.d.mts} +13 -11
  3. package/dist/{_response-C2yFQoIA.d.ts → _response-CC6jNb8q.d.ts} +13 -11
  4. package/dist/challenge/index.d.mts +6 -5
  5. package/dist/challenge/index.d.ts +6 -5
  6. package/dist/challenge/index.js.map +1 -1
  7. package/dist/challenge/index.mjs.map +1 -1
  8. package/dist/core.d.mts +36 -27
  9. package/dist/core.d.ts +36 -27
  10. package/dist/core.js +21 -101
  11. package/dist/core.js.map +1 -1
  12. package/dist/core.mjs +21 -101
  13. package/dist/core.mjs.map +1 -1
  14. package/dist/identity/express.d.mts +12 -13
  15. package/dist/identity/express.d.ts +12 -13
  16. package/dist/identity/express.js +38 -121
  17. package/dist/identity/express.js.map +1 -1
  18. package/dist/identity/express.mjs +36 -118
  19. package/dist/identity/express.mjs.map +1 -1
  20. package/dist/identity/fastify.d.mts +12 -11
  21. package/dist/identity/fastify.d.ts +12 -11
  22. package/dist/identity/fastify.js +38 -121
  23. package/dist/identity/fastify.js.map +1 -1
  24. package/dist/identity/fastify.mjs +36 -118
  25. package/dist/identity/fastify.mjs.map +1 -1
  26. package/dist/identity/hono.d.mts +13 -28
  27. package/dist/identity/hono.d.ts +13 -28
  28. package/dist/identity/hono.js +31 -123
  29. package/dist/identity/hono.js.map +1 -1
  30. package/dist/identity/hono.mjs +29 -120
  31. package/dist/identity/hono.mjs.map +1 -1
  32. package/dist/identity/nextjs.d.mts +8 -7
  33. package/dist/identity/nextjs.d.ts +8 -7
  34. package/dist/identity/nextjs.js +27 -119
  35. package/dist/identity/nextjs.js.map +1 -1
  36. package/dist/identity/nextjs.mjs +27 -118
  37. package/dist/identity/nextjs.mjs.map +1 -1
  38. package/dist/identity/policy.d.mts +1 -0
  39. package/dist/identity/policy.d.ts +1 -0
  40. package/dist/identity/web.d.mts +12 -14
  41. package/dist/identity/web.d.ts +12 -14
  42. package/dist/identity/web.js +27 -119
  43. package/dist/identity/web.js.map +1 -1
  44. package/dist/identity/web.mjs +27 -118
  45. package/dist/identity/web.mjs.map +1 -1
  46. package/dist/index.d.mts +3 -3
  47. package/dist/index.d.ts +3 -3
  48. package/dist/index.js +1 -7
  49. package/dist/index.js.map +1 -1
  50. package/dist/index.mjs +1 -6
  51. package/dist/index.mjs.map +1 -1
  52. package/dist/payment/index.d.mts +2 -2
  53. package/dist/payment/index.d.ts +2 -2
  54. package/dist/payment/index.js.map +1 -1
  55. package/dist/payment/index.mjs.map +1 -1
  56. package/dist/{signer-kCAJUZwp.d.mts → signer-CFVQsWjL.d.mts} +1 -6
  57. package/dist/{signer-kCAJUZwp.d.ts → signer-CFVQsWjL.d.ts} +1 -6
  58. package/dist/stripe-multichain/index.d.mts +1 -1
  59. package/dist/stripe-multichain/index.d.ts +1 -1
  60. package/dist/stripe-multichain/index.js.map +1 -1
  61. package/dist/stripe-multichain/index.mjs.map +1 -1
  62. package/package.json +11 -9
@@ -15,7 +15,7 @@ function denialReasonStatus(reason) {
15
15
  }
16
16
  function buildSignerMismatchBody(input) {
17
17
  const { result } = input;
18
- if (result.kind === "pass" || result.kind === "api_error") return null;
18
+ if (result.kind === "pass") return null;
19
19
  const learnMoreUrl = input.learnMoreUrl ?? "https://docs.agentscore.sh/guides/agent-identity";
20
20
  if (result.kind === "wallet_signer_mismatch") {
21
21
  const linkedWallets = result.linkedWallets ?? [];
@@ -332,7 +332,7 @@ function createAgentScoreCore(options) {
332
332
  } = options;
333
333
  const baseUrl = stripTrailingSlashes(rawBaseUrl);
334
334
  const agentMemoryHint = buildAgentMemoryHint();
335
- const defaultUa = `@agent-score/commerce@${"1.7.0"}`;
335
+ const defaultUa = `@agent-score/commerce@${"1.8.1"}`;
336
336
  const userAgentHeader = userAgent ? `${userAgent} (${defaultUa})` : defaultUa;
337
337
  const sdk = new AgentScore({ apiKey, baseUrl, userAgent: userAgentHeader });
338
338
  const sessionSdkCache = /* @__PURE__ */ new Map();
@@ -406,7 +406,7 @@ function createAgentScoreCore(options) {
406
406
  return void 0;
407
407
  }
408
408
  }
409
- async function evaluate(identity, ctx) {
409
+ async function evaluate(identity, ctx, signer) {
410
410
  if (!identity || !identity.address && !identity.operatorToken) {
411
411
  if (failOpen) return { kind: "allow" };
412
412
  const sessionReason = await tryMintSessionDenial(ctx);
@@ -466,7 +466,12 @@ function createAgentScoreCore(options) {
466
466
  try {
467
467
  const opts = {
468
468
  chain: gateChain,
469
- ...Object.keys(policy).length > 0 ? { policy } : {}
469
+ ...Object.keys(policy).length > 0 ? { policy } : {},
470
+ // Pre-extracted payment signer (by the adapter middleware). When present, the API
471
+ // composes BOTH signer_match (wallet-binding) and signer_sanctions (OFAC SDN wallet
472
+ // check) verdicts on the response in one round trip. Under
473
+ // policy.require_sanctions_clear, a signer_sanctions hit flips decision -> deny inline.
474
+ ...signer && { signer: { address: signer.address, network: signer.network } }
470
475
  };
471
476
  const result = identity.address ? await sdk.assess(identity.address, { ...opts, operatorToken: identity.operatorToken }) : await sdk.assess(null, { ...opts, operatorToken: identity.operatorToken });
472
477
  data = result;
@@ -574,36 +579,6 @@ function createAgentScoreCore(options) {
574
579
  console.warn("[agentscore-commerce] captureWallet failed:", err instanceof Error ? err.message : err);
575
580
  }
576
581
  }
577
- async function resolveWalletToOperator(walletAddress) {
578
- const wallet = normalizeAddress(walletAddress);
579
- const extractFromCached = (raw) => {
580
- const op = raw.resolved_operator;
581
- const links = raw.linked_wallets;
582
- return {
583
- operator: typeof op === "string" ? op : null,
584
- linkedWallets: Array.isArray(links) ? links.filter((w) => typeof w === "string") : []
585
- };
586
- };
587
- const plainCached = cache.get(wallet);
588
- if (plainCached?.raw) {
589
- return { ok: true, ...extractFromCached(plainCached.raw) };
590
- }
591
- const resolveCached = cache.get(`resolve:${wallet}`);
592
- if (resolveCached?.raw) {
593
- return { ok: true, ...extractFromCached(resolveCached.raw) };
594
- }
595
- try {
596
- const data = await sdk.assess(walletAddress);
597
- cache.set(`resolve:${wallet}`, { allow: true, raw: data });
598
- return { ok: true, ...extractFromCached(data) };
599
- } catch (err) {
600
- console.warn("[gate] resolveWalletToOperator failed \u2014 returning { ok:false }:", err instanceof Error ? err.message : err);
601
- return { ok: false };
602
- }
603
- }
604
- function reportSignerEvent(kind) {
605
- void sdk.telemetrySignerMatch({ kind });
606
- }
607
582
  function projectSignerMatch(sm, claimedNorm, signerNorm) {
608
583
  const kind = sm.kind;
609
584
  if (kind === "pass") {
@@ -631,77 +606,22 @@ function createAgentScoreCore(options) {
631
606
  agentInstructions: sm.agent_instructions ?? WALLET_SIGNER_MISMATCH_INSTRUCTIONS
632
607
  };
633
608
  }
634
- async function verifyWalletSignerMatch2(options2) {
635
- const { claimedWallet, signer, network } = options2;
636
- if (!signer) {
637
- reportSignerEvent("wallet_auth_requires_wallet_signing");
638
- return {
639
- kind: "wallet_auth_requires_wallet_signing",
640
- claimedWallet,
641
- agentInstructions: WALLET_AUTH_REQUIRES_WALLET_SIGNING_INSTRUCTIONS
642
- };
643
- }
644
- const claimedNorm = normalizeAddress(claimedWallet);
645
- const signerNorm = normalizeAddress(signer);
646
- if (claimedNorm === signerNorm) {
647
- reportSignerEvent("pass");
648
- return { kind: "pass", claimedOperator: null, signerOperator: null };
649
- }
650
- const cachedEntry = cache.get(claimedNorm);
651
- const cachedMatch = cachedEntry?.signerMatchBySigner?.get(signerNorm);
652
- if (cachedMatch) {
653
- return projectSignerMatch(cachedMatch, claimedNorm, signerNorm);
654
- }
655
- const inferredNetwork = network ?? (signerNorm.startsWith("0x") ? "evm" : "solana");
656
- let assessResponse;
657
- try {
658
- assessResponse = await sdk.assess(claimedNorm, {
659
- resolveSigner: { address: signerNorm, network: inferredNetwork }
660
- });
661
- } catch (err) {
662
- console.warn("[gate] verifyWalletSignerMatch assess failed:", err instanceof Error ? err.message : err);
663
- reportSignerEvent("api_error");
664
- return { kind: "api_error", claimedWallet: claimedNorm };
665
- }
666
- const signerMatch = assessResponse.signer_match;
667
- if (signerMatch && typeof signerMatch === "object") {
668
- if (cachedEntry) {
669
- const map = cachedEntry.signerMatchBySigner ?? /* @__PURE__ */ new Map();
670
- map.set(signerNorm, signerMatch);
671
- cachedEntry.signerMatchBySigner = map;
672
- } else {
673
- const entry = { allow: true, raw: assessResponse };
674
- entry.signerMatchBySigner = /* @__PURE__ */ new Map([[signerNorm, signerMatch]]);
675
- cache.set(claimedNorm, entry);
676
- }
677
- return projectSignerMatch(signerMatch, claimedNorm, signerNorm);
678
- }
679
- const [claimedResolve, signerResolve] = await Promise.all([
680
- resolveWalletToOperator(claimedNorm),
681
- resolveWalletToOperator(signerNorm)
682
- ]);
683
- if (!claimedResolve.ok || !signerResolve.ok) {
684
- reportSignerEvent("api_error");
685
- return { kind: "api_error", claimedWallet: claimedNorm };
686
- }
687
- const claimedOperator = claimedResolve.operator;
688
- const signerOperator = signerResolve.operator;
689
- if (claimedOperator && signerOperator && claimedOperator === signerOperator) {
690
- reportSignerEvent("pass");
691
- return { kind: "pass", claimedOperator, signerOperator };
692
- }
693
- reportSignerEvent("wallet_signer_mismatch");
609
+ function getSignerVerdict2(claimedAddress) {
610
+ const claimedNorm = normalizeAddress(claimedAddress);
611
+ const cached = cache.get(claimedNorm);
612
+ if (!cached) return void 0;
613
+ const raw = cached.raw;
614
+ if (!raw) return void 0;
615
+ const rawMatch = raw.signer_match;
616
+ const rawSanctions = raw.signer_sanctions;
617
+ if (!rawMatch && !rawSanctions) return void 0;
618
+ const signerNorm = rawMatch?.actual_signer ?? claimedNorm;
694
619
  return {
695
- kind: "wallet_signer_mismatch",
696
- claimedOperator,
697
- actualSignerOperator: signerOperator,
698
- expectedSigner: claimedNorm,
699
- actualSigner: signerNorm,
700
- linkedWallets: claimedResolve.linkedWallets,
701
- agentInstructions: WALLET_SIGNER_MISMATCH_INSTRUCTIONS
620
+ signer_match: rawMatch ? projectSignerMatch(rawMatch, claimedNorm, signerNorm) : null,
621
+ signer_sanctions: rawSanctions ?? null
702
622
  };
703
623
  }
704
- return { evaluate, captureWallet: captureWallet2, verifyWalletSignerMatch: verifyWalletSignerMatch2 };
624
+ return { evaluate, captureWallet: captureWallet2, getSignerVerdict: getSignerVerdict2 };
705
625
  }
706
626
 
707
627
  // src/signer.ts
@@ -777,9 +697,11 @@ async function extractPaymentSigner(request, x402PaymentHeader) {
777
697
  }
778
698
  return null;
779
699
  }
780
- async function extractPaymentSignerAddress(request, x402PaymentHeader) {
781
- const result = await extractPaymentSigner(request, x402PaymentHeader);
782
- return result?.address ?? null;
700
+ async function extractPaymentSignerFromAuth(authHeader, x402PaymentHeader) {
701
+ const request = new Request("http://internal.gate/", {
702
+ headers: authHeader ? { authorization: authHeader } : {}
703
+ });
704
+ return extractPaymentSigner(request, x402PaymentHeader);
783
705
  }
784
706
  function readX402PaymentHeader(request) {
785
707
  return request.headers.get("payment-signature") ?? request.headers.get("x-payment") ?? void 0;
@@ -809,7 +731,10 @@ function agentscoreGate(options) {
809
731
  operatorToken: identity?.operatorToken,
810
732
  walletAddress: identity?.address
811
733
  };
812
- const outcome = await core.evaluate(identity, req);
734
+ const authHeader = req.headers.authorization ?? null;
735
+ const x402Header = req.headers["payment-signature"] ?? req.headers["x-payment"];
736
+ const signer = await extractPaymentSignerFromAuth(authHeader, x402Header);
737
+ const outcome = await core.evaluate(identity, req, signer);
813
738
  if (outcome.kind === "allow") {
814
739
  const state = req[GATE_STATE_KEY];
815
740
  if (state) {
@@ -847,16 +772,10 @@ async function captureWallet(req, options) {
847
772
  idempotencyKey: options.idempotencyKey
848
773
  });
849
774
  }
850
- async function verifyWalletSignerMatch(req, options) {
775
+ function getSignerVerdict(req) {
851
776
  const state = req[GATE_STATE_KEY];
852
- if (!state?.walletAddress || state.operatorToken) {
853
- return { kind: "pass", claimedOperator: null, signerOperator: null };
854
- }
855
- return state.core.verifyWalletSignerMatch({
856
- claimedWallet: state.walletAddress,
857
- signer: options.signer,
858
- network: options.network
859
- });
777
+ if (!state?.walletAddress) return void 0;
778
+ return state.core.getSignerVerdict(state.walletAddress);
860
779
  }
861
780
  export {
862
781
  FIXABLE_DENIAL_REASONS,
@@ -866,13 +785,12 @@ export {
866
785
  captureWallet,
867
786
  denialReasonStatus,
868
787
  denialReasonToBody,
869
- extractPaymentSignerAddress,
870
788
  getAgentScoreData,
871
789
  getGateDegradedState,
872
790
  getGateQuotaInfo,
791
+ getSignerVerdict,
873
792
  isFixableDenial,
874
793
  readX402PaymentHeader,
875
- verificationAgentInstructions,
876
- verifyWalletSignerMatch
794
+ verificationAgentInstructions
877
795
  };
878
796
  //# sourceMappingURL=express.mjs.map