@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
@@ -3986,7 +3986,7 @@ function getTrustLevel(score) {
3986
3986
  }
3987
3987
 
3988
3988
  // src/version.ts
3989
- var SDK_VERSION = "5.18.1";
3989
+ var SDK_VERSION = "5.20.0";
3990
3990
 
3991
3991
  // src/http.ts
3992
3992
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -4141,7 +4141,12 @@ function getCacheKey(request, counterpartyId) {
4141
4141
  // its start_checkout quote was served the cached quote-leg grant (no
4142
4142
  // settlementOutcome) and never reached the backend. Same F-A1-07 bug class.
4143
4143
  request.commercePhase || "",
4144
- request.checkoutSessionId || ""
4144
+ request.checkoutSessionId || "",
4145
+ // 5.19.0: a route_config purpose claim is checked server-side against
4146
+ // the stored rule for this method + path, so it changes the verdict.
4147
+ request.purposeSource || "",
4148
+ request.requestMethod || "",
4149
+ request.requestPath || ""
4145
4150
  ].join("|");
4146
4151
  }
4147
4152
  function getCachedResult(request, counterpartyId) {
@@ -4299,6 +4304,9 @@ async function callVerifyAccessAPI(config, request) {
4299
4304
  if (requestData.enableRuntimeChallenge)
4300
4305
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
4301
4306
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
4307
+ if (config.actingProof?.connectorToken) {
4308
+ body.actingProof = { connectorToken: config.actingProof.connectorToken };
4309
+ }
4302
4310
  if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
4303
4311
  if (requestData.createSession) body.createSession = requestData.createSession;
4304
4312
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
@@ -4315,6 +4323,11 @@ async function callVerifyAccessAPI(config, request) {
4315
4323
  if (requestData.buyerEmail) body.buyerEmail = requestData.buyerEmail;
4316
4324
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
4317
4325
  if (requestData.attemptId) body.attemptId = requestData.attemptId;
4326
+ if (requestData.purposeSource) body.purposeSource = requestData.purposeSource;
4327
+ if (requestData.agentArtifacts) body.agentArtifacts = requestData.agentArtifacts;
4328
+ if (requestData.metadata) body.metadata = requestData.metadata;
4329
+ if (requestData.requestMethod) body.requestMethod = requestData.requestMethod;
4330
+ if (requestData.requestPath) body.requestPath = requestData.requestPath;
4318
4331
  if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
4319
4332
  body.sdkVersion = SDK_VERSION;
4320
4333
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
@@ -4461,22 +4474,43 @@ async function verify(config, request, options) {
4461
4474
  "[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."
4462
4475
  );
4463
4476
  }
4464
- const uncacheable = Boolean(request.commerceArtifacts);
4477
+ const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
4465
4478
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4466
4479
  const cached = getCachedResult(request, mergedConfig.counterpartyId);
4467
4480
  if (cached) {
4468
4481
  if (mergedConfig.debug) {
4469
4482
  console.log("[VerificationGateway] Returning cached result");
4470
4483
  }
4471
- const hit = { ...cached };
4472
- if (request.attemptId) {
4473
- hit.attemptId = request.attemptId;
4474
- } else {
4475
- delete hit.attemptId;
4476
- }
4477
- return hit;
4484
+ return sharedVerdict(cached, request);
4485
+ }
4486
+ }
4487
+ if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4488
+ const key = getCacheKey(request, mergedConfig.counterpartyId);
4489
+ const pending = inflightVerifies.get(key);
4490
+ if (pending) return sharedVerdict(await pending, request);
4491
+ const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
4492
+ inflightVerifies.set(key, flight);
4493
+ try {
4494
+ return await flight;
4495
+ } finally {
4496
+ inflightVerifies.delete(key);
4478
4497
  }
4479
4498
  }
4499
+ return verifyViaApi(mergedConfig, request, urls, uncacheable);
4500
+ }
4501
+ var inflightVerifies = /* @__PURE__ */ new Map();
4502
+ var sharedVerdicts = /* @__PURE__ */ new WeakSet();
4503
+ function sharedVerdict(source, request) {
4504
+ const hit = { ...source };
4505
+ if (request.attemptId) {
4506
+ hit.attemptId = request.attemptId;
4507
+ } else {
4508
+ delete hit.attemptId;
4509
+ }
4510
+ sharedVerdicts.add(hit);
4511
+ return hit;
4512
+ }
4513
+ async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
4480
4514
  const enrichedRequest = { ...request };
4481
4515
  if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
4482
4516
  enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
@@ -4504,9 +4538,18 @@ async function verify(config, request, options) {
4504
4538
  if (!apiResponse.access?.allowed) {
4505
4539
  const aggregatedFailures = apiResponse.access?.failures;
4506
4540
  const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
4541
+ const denyAgent = idVerifiedFromBackend && apiResponse.agent ? {
4542
+ astraId: apiResponse.agent.astraId,
4543
+ name: apiResponse.agent.name,
4544
+ trustScore: apiResponse.agent.trustScore,
4545
+ trustLevel: getTrustLevel(apiResponse.agent.trustScore),
4546
+ blockchainAnchored: apiResponse.agent.blockchainStatus === "anchored",
4547
+ status: apiResponse.agent.agentStatus
4548
+ } : void 0;
4507
4549
  const result2 = {
4508
4550
  identityVerified: idVerifiedFromBackend,
4509
4551
  policyAllowed: false,
4552
+ ...denyAgent && { agent: denyAgent },
4510
4553
  // 3.6.0: the server now emits top-level denialReasons on every deny
4511
4554
  // path — prefer it verbatim; the failure-message reconstruction remains
4512
4555
  // as the fallback for older backends.
@@ -4546,7 +4589,9 @@ async function verify(config, request, options) {
4546
4589
  fulfilment: apiResponse.fulfilment,
4547
4590
  mandates: apiResponse.mandates,
4548
4591
  kyaToken: apiResponse.kyaToken,
4549
- aep: apiResponse.aep
4592
+ aep: apiResponse.aep,
4593
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4594
+ warnings: apiResponse.warnings
4550
4595
  };
4551
4596
  return result2;
4552
4597
  }
@@ -4614,7 +4659,9 @@ async function verify(config, request, options) {
4614
4659
  // 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
4615
4660
  mandates: apiResponse.mandates,
4616
4661
  kyaToken: apiResponse.kyaToken,
4617
- aep: apiResponse.aep
4662
+ aep: apiResponse.aep,
4663
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4664
+ warnings: apiResponse.warnings
4618
4665
  };
4619
4666
  if (result.recommendation === "deny") {
4620
4667
  result.policyAllowed = false;
@@ -4640,8 +4687,18 @@ async function verify(config, request, options) {
4640
4687
  cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
4641
4688
  }
4642
4689
  }
4690
+ notifyVerificationListeners(request, result);
4643
4691
  return result;
4644
4692
  }
4693
+ var verificationListeners = /* @__PURE__ */ new Set();
4694
+ function notifyVerificationListeners(request, result) {
4695
+ for (const listener of verificationListeners) {
4696
+ try {
4697
+ listener(result, request);
4698
+ } catch {
4699
+ }
4700
+ }
4701
+ }
4645
4702
 
4646
4703
  // src/adapters/stepup-poll.ts
4647
4704
  var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
@@ -4652,6 +4709,9 @@ var MAX_TOTAL_BYTES = 16 * 1024;
4652
4709
  // src/adapters/commerce-detect.ts
4653
4710
  var MAX_BODY_BYTES = 64 * 1024;
4654
4711
 
4712
+ // src/adapters/routes-cache.ts
4713
+ var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4714
+
4655
4715
  // src/edge-config.ts
4656
4716
  var DEFAULT_EDGE_CONFIG = Object.freeze({
4657
4717
  version: 1,
@@ -4893,9 +4953,6 @@ var BeaconBuffer = class {
4893
4953
  };
4894
4954
  var beaconBuffer = new BeaconBuffer();
4895
4955
 
4896
- // src/adapters/express.ts
4897
- var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4898
-
4899
4956
  // src/adapters/nextjs.ts
4900
4957
  var DEFAULT_ROUTES_REFRESH_MS2 = 5 * 60 * 1e3;
4901
4958
 
@@ -4989,6 +5046,25 @@ import {
4989
5046
  // src/idempotency/index.ts
4990
5047
  var DEFAULT_IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1e3;
4991
5048
 
5049
+ // src/ucp/approval-events.ts
5050
+ var MemorySeenEvents = class {
5051
+ constructor(max = 1e4) {
5052
+ this.max = max;
5053
+ this.ids = /* @__PURE__ */ new Set();
5054
+ }
5055
+ async has(eventId) {
5056
+ return this.ids.has(eventId);
5057
+ }
5058
+ async add(eventId) {
5059
+ if (this.ids.size >= this.max) {
5060
+ const first = this.ids.values().next().value;
5061
+ if (first !== void 0) this.ids.delete(first);
5062
+ }
5063
+ this.ids.add(eventId);
5064
+ }
5065
+ };
5066
+ var defaultSeen = new MemorySeenEvents();
5067
+
4992
5068
  // src/payments/kyapay.ts
4993
5069
  import {
4994
5070
  createLocalJWKSet,
@@ -5033,7 +5109,9 @@ function toDecision(result) {
5033
5109
  if (result.identityVerified && result.policyAllowed) {
5034
5110
  return {
5035
5111
  recommendation: "ALLOW",
5036
- reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
5112
+ // 5.19.0: the score is on `trustScore` for the merchant; `reason` is
5113
+ // text a merchant may relay to the agent, so it never embeds the number.
5114
+ reason: "Verified",
5037
5115
  trustScore: result.agent?.trustScore,
5038
5116
  sessionId: "sessionId" in result ? result.sessionId : void 0
5039
5117
  };