@astrasyncai/verification-gateway 5.18.1 → 5.20.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 (129) hide show
  1. package/CHANGELOG.md +232 -0
  2. package/README.md +217 -4
  3. package/dist/adapter-interface/interface.d.mts +2 -2
  4. package/dist/adapter-interface/interface.d.ts +2 -2
  5. package/dist/adapters/express.d.mts +9 -1
  6. package/dist/adapters/express.d.ts +9 -1
  7. package/dist/adapters/express.js +160 -52
  8. package/dist/adapters/express.js.map +1 -1
  9. package/dist/adapters/express.mjs +160 -52
  10. package/dist/adapters/express.mjs.map +1 -1
  11. package/dist/adapters/http-pdlss.d.mts +7 -1
  12. package/dist/adapters/http-pdlss.d.ts +7 -1
  13. package/dist/adapters/http-pdlss.js +18 -2
  14. package/dist/adapters/http-pdlss.js.map +1 -1
  15. package/dist/adapters/http-pdlss.mjs +16 -1
  16. package/dist/adapters/http-pdlss.mjs.map +1 -1
  17. package/dist/adapters/kit-express.d.mts +93 -1
  18. package/dist/adapters/kit-express.d.ts +93 -1
  19. package/dist/adapters/kit-express.js +181 -2
  20. package/dist/adapters/kit-express.js.map +1 -1
  21. package/dist/adapters/kit-express.mjs +180 -2
  22. package/dist/adapters/kit-express.mjs.map +1 -1
  23. package/dist/adapters/mcp.d.mts +102 -9
  24. package/dist/adapters/mcp.d.ts +102 -9
  25. package/dist/adapters/mcp.js +242 -19
  26. package/dist/adapters/mcp.js.map +1 -1
  27. package/dist/adapters/mcp.mjs +240 -19
  28. package/dist/adapters/mcp.mjs.map +1 -1
  29. package/dist/adapters/nextjs.d.mts +1 -1
  30. package/dist/adapters/nextjs.d.ts +1 -1
  31. package/dist/adapters/nextjs.js +97 -14
  32. package/dist/adapters/nextjs.js.map +1 -1
  33. package/dist/adapters/nextjs.mjs +97 -14
  34. package/dist/adapters/nextjs.mjs.map +1 -1
  35. package/dist/adapters/sdk.d.mts +101 -2
  36. package/dist/adapters/sdk.d.ts +101 -2
  37. package/dist/adapters/sdk.js +199 -12
  38. package/dist/adapters/sdk.js.map +1 -1
  39. package/dist/adapters/sdk.mjs +199 -12
  40. package/dist/adapters/sdk.mjs.map +1 -1
  41. package/dist/agent/index.d.mts +1 -1
  42. package/dist/agent/index.d.ts +1 -1
  43. package/dist/agent/index.js +1 -1
  44. package/dist/agent/index.js.map +1 -1
  45. package/dist/agent/index.mjs +1 -1
  46. package/dist/agent/index.mjs.map +1 -1
  47. package/dist/bin/astrasync-claude-hook.js +94 -16
  48. package/dist/bin/astrasync-codex-hook.js +94 -16
  49. package/dist/bin/astrasync-guard.js +94 -16
  50. package/dist/bin/astrasync.js +127 -16
  51. package/dist/browser/background.js +94 -16
  52. package/dist/browser/background.js.map +1 -1
  53. package/dist/browser/background.mjs +94 -16
  54. package/dist/browser/background.mjs.map +1 -1
  55. package/dist/cli/index.js +1 -1
  56. package/dist/cli/index.js.map +1 -1
  57. package/dist/cli/index.mjs +1 -1
  58. package/dist/cli/index.mjs.map +1 -1
  59. package/dist/codex/index.js +94 -16
  60. package/dist/codex/index.js.map +1 -1
  61. package/dist/codex/index.mjs +94 -16
  62. package/dist/codex/index.mjs.map +1 -1
  63. package/dist/cursor/extension.js +94 -16
  64. package/dist/cursor/extension.js.map +1 -1
  65. package/dist/cursor/extension.mjs +94 -16
  66. package/dist/cursor/extension.mjs.map +1 -1
  67. package/dist/edge-config.d.mts +1 -1
  68. package/dist/edge-config.d.ts +1 -1
  69. package/dist/edge-config.js +1 -1
  70. package/dist/edge-config.js.map +1 -1
  71. package/dist/edge-config.mjs +1 -1
  72. package/dist/edge-config.mjs.map +1 -1
  73. package/dist/edge-core/index.d.mts +1 -1
  74. package/dist/edge-core/index.d.ts +1 -1
  75. package/dist/edge-core/index.js +69 -12
  76. package/dist/edge-core/index.js.map +1 -1
  77. package/dist/edge-core/index.mjs +69 -12
  78. package/dist/edge-core/index.mjs.map +1 -1
  79. package/dist/gateway/gateway.d.mts +2 -2
  80. package/dist/gateway/gateway.d.ts +2 -2
  81. package/dist/gateway/gateway.js +94 -16
  82. package/dist/gateway/gateway.js.map +1 -1
  83. package/dist/gateway/gateway.mjs +94 -16
  84. package/dist/gateway/gateway.mjs.map +1 -1
  85. package/dist/git-trigger/git-hooks.d.mts +1 -1
  86. package/dist/git-trigger/git-hooks.d.ts +1 -1
  87. package/dist/index.d.mts +706 -34
  88. package/dist/index.d.ts +706 -34
  89. package/dist/index.js +1391 -205
  90. package/dist/index.js.map +1 -1
  91. package/dist/index.mjs +1374 -195
  92. package/dist/index.mjs.map +1 -1
  93. package/dist/local-evaluator/evaluator.d.mts +2 -2
  94. package/dist/local-evaluator/evaluator.d.ts +2 -2
  95. package/dist/registration/index.d.mts +11 -2
  96. package/dist/registration/index.d.ts +11 -2
  97. package/dist/registration/index.js +1 -1
  98. package/dist/registration/index.js.map +1 -1
  99. package/dist/registration/index.mjs +1 -1
  100. package/dist/registration/index.mjs.map +1 -1
  101. package/dist/transport/index.d.mts +1 -1
  102. package/dist/transport/index.d.ts +1 -1
  103. package/dist/transport/index.js +3 -2
  104. package/dist/transport/index.js.map +1 -1
  105. package/dist/transport/index.mjs +3 -2
  106. package/dist/transport/index.mjs.map +1 -1
  107. package/dist/{types-BRz2U0Pn.d.ts → types-B_HLhZ9n.d.ts} +1 -1
  108. package/dist/{types-BfILnheI.d.mts → types-CU17R4Nr.d.mts} +11 -0
  109. package/dist/{types-BfILnheI.d.ts → types-CU17R4Nr.d.ts} +11 -0
  110. package/dist/{types-Cns4l8gX.d.mts → types-CxjqmPl-.d.mts} +115 -13
  111. package/dist/{types-Cns4l8gX.d.ts → types-CxjqmPl-.d.ts} +115 -13
  112. package/dist/{types-3ObBpsnf.d.mts → types-D37aSQ9c.d.mts} +106 -3
  113. package/dist/{types-CfBpm3w5.d.mts → types-Djpz-L0w.d.mts} +1 -1
  114. package/dist/{types-BoxZEYPS.d.ts → types-Dn8tXnei.d.ts} +106 -3
  115. package/dist/ui/index.d.mts +1 -1
  116. package/dist/ui/index.d.ts +1 -1
  117. package/dist/verify.d.mts +50 -4
  118. package/dist/verify.d.ts +50 -4
  119. package/dist/verify.js +93 -14
  120. package/dist/verify.js.map +1 -1
  121. package/dist/verify.mjs +91 -14
  122. package/dist/verify.mjs.map +1 -1
  123. package/dist/webhooks.d.mts +16 -3
  124. package/dist/webhooks.d.ts +16 -3
  125. package/dist/webhooks.js +24 -13
  126. package/dist/webhooks.js.map +1 -1
  127. package/dist/webhooks.mjs +24 -13
  128. package/dist/webhooks.mjs.map +1 -1
  129. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var SDK_VERSION = "5.18.1";
2
+ var SDK_VERSION = "5.20.0";
3
3
 
4
4
  // src/http.ts
5
5
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -507,7 +507,12 @@ function getCacheKey(request, counterpartyId) {
507
507
  // its start_checkout quote was served the cached quote-leg grant (no
508
508
  // settlementOutcome) and never reached the backend. Same F-A1-07 bug class.
509
509
  request.commercePhase || "",
510
- request.checkoutSessionId || ""
510
+ request.checkoutSessionId || "",
511
+ // 5.19.0: a route_config purpose claim is checked server-side against
512
+ // the stored rule for this method + path, so it changes the verdict.
513
+ request.purposeSource || "",
514
+ request.requestMethod || "",
515
+ request.requestPath || ""
511
516
  ].join("|");
512
517
  }
513
518
  function getCachedResult(request, counterpartyId) {
@@ -699,6 +704,9 @@ async function callVerifyAccessAPI(config, request) {
699
704
  if (requestData.enableRuntimeChallenge)
700
705
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
701
706
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
707
+ if (config.actingProof?.connectorToken) {
708
+ body.actingProof = { connectorToken: config.actingProof.connectorToken };
709
+ }
702
710
  if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
703
711
  if (requestData.createSession) body.createSession = requestData.createSession;
704
712
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
@@ -715,6 +723,11 @@ async function callVerifyAccessAPI(config, request) {
715
723
  if (requestData.buyerEmail) body.buyerEmail = requestData.buyerEmail;
716
724
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
717
725
  if (requestData.attemptId) body.attemptId = requestData.attemptId;
726
+ if (requestData.purposeSource) body.purposeSource = requestData.purposeSource;
727
+ if (requestData.agentArtifacts) body.agentArtifacts = requestData.agentArtifacts;
728
+ if (requestData.metadata) body.metadata = requestData.metadata;
729
+ if (requestData.requestMethod) body.requestMethod = requestData.requestMethod;
730
+ if (requestData.requestPath) body.requestPath = requestData.requestPath;
718
731
  if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
719
732
  body.sdkVersion = SDK_VERSION;
720
733
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
@@ -861,22 +874,43 @@ async function verify(config, request, options) {
861
874
  "[VerificationGateway] minTrustScore / minTrustScoreForFull are deprecated in v2.3.0 and have no effect. Server is now the single source of truth for access decisions (verified ID + runtime challenge + PDLSS + trust score). To gate access to an endpoint, configure the endpoint's trust_score_requirement server-side."
862
875
  );
863
876
  }
864
- const uncacheable = Boolean(request.commerceArtifacts);
877
+ const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
865
878
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
866
879
  const cached = getCachedResult(request, mergedConfig.counterpartyId);
867
880
  if (cached) {
868
881
  if (mergedConfig.debug) {
869
882
  console.log("[VerificationGateway] Returning cached result");
870
883
  }
871
- const hit = { ...cached };
872
- if (request.attemptId) {
873
- hit.attemptId = request.attemptId;
874
- } else {
875
- delete hit.attemptId;
876
- }
877
- return hit;
884
+ return sharedVerdict(cached, request);
885
+ }
886
+ }
887
+ if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
888
+ const key = getCacheKey(request, mergedConfig.counterpartyId);
889
+ const pending = inflightVerifies.get(key);
890
+ if (pending) return sharedVerdict(await pending, request);
891
+ const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
892
+ inflightVerifies.set(key, flight);
893
+ try {
894
+ return await flight;
895
+ } finally {
896
+ inflightVerifies.delete(key);
878
897
  }
879
898
  }
899
+ return verifyViaApi(mergedConfig, request, urls, uncacheable);
900
+ }
901
+ var inflightVerifies = /* @__PURE__ */ new Map();
902
+ var sharedVerdicts = /* @__PURE__ */ new WeakSet();
903
+ function sharedVerdict(source, request) {
904
+ const hit = { ...source };
905
+ if (request.attemptId) {
906
+ hit.attemptId = request.attemptId;
907
+ } else {
908
+ delete hit.attemptId;
909
+ }
910
+ sharedVerdicts.add(hit);
911
+ return hit;
912
+ }
913
+ async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
880
914
  const enrichedRequest = { ...request };
881
915
  if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
882
916
  enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
@@ -904,9 +938,18 @@ async function verify(config, request, options) {
904
938
  if (!apiResponse.access?.allowed) {
905
939
  const aggregatedFailures = apiResponse.access?.failures;
906
940
  const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
941
+ const denyAgent = idVerifiedFromBackend && apiResponse.agent ? {
942
+ astraId: apiResponse.agent.astraId,
943
+ name: apiResponse.agent.name,
944
+ trustScore: apiResponse.agent.trustScore,
945
+ trustLevel: getTrustLevel(apiResponse.agent.trustScore),
946
+ blockchainAnchored: apiResponse.agent.blockchainStatus === "anchored",
947
+ status: apiResponse.agent.agentStatus
948
+ } : void 0;
907
949
  const result2 = {
908
950
  identityVerified: idVerifiedFromBackend,
909
951
  policyAllowed: false,
952
+ ...denyAgent && { agent: denyAgent },
910
953
  // 3.6.0: the server now emits top-level denialReasons on every deny
911
954
  // path — prefer it verbatim; the failure-message reconstruction remains
912
955
  // as the fallback for older backends.
@@ -946,7 +989,9 @@ async function verify(config, request, options) {
946
989
  fulfilment: apiResponse.fulfilment,
947
990
  mandates: apiResponse.mandates,
948
991
  kyaToken: apiResponse.kyaToken,
949
- aep: apiResponse.aep
992
+ aep: apiResponse.aep,
993
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
994
+ warnings: apiResponse.warnings
950
995
  };
951
996
  return result2;
952
997
  }
@@ -1014,7 +1059,9 @@ async function verify(config, request, options) {
1014
1059
  // 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
1015
1060
  mandates: apiResponse.mandates,
1016
1061
  kyaToken: apiResponse.kyaToken,
1017
- aep: apiResponse.aep
1062
+ aep: apiResponse.aep,
1063
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
1064
+ warnings: apiResponse.warnings
1018
1065
  };
1019
1066
  if (result.recommendation === "deny") {
1020
1067
  result.policyAllowed = false;
@@ -1040,8 +1087,18 @@ async function verify(config, request, options) {
1040
1087
  cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
1041
1088
  }
1042
1089
  }
1090
+ notifyVerificationListeners(request, result);
1043
1091
  return result;
1044
1092
  }
1093
+ var verificationListeners = /* @__PURE__ */ new Set();
1094
+ function notifyVerificationListeners(request, result) {
1095
+ for (const listener of verificationListeners) {
1096
+ try {
1097
+ listener(result, request);
1098
+ } catch {
1099
+ }
1100
+ }
1101
+ }
1045
1102
 
1046
1103
  // src/edge-core/request.ts
1047
1104
  function headerValue(req, name) {