@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
@@ -4006,7 +4006,7 @@ function getTrustLevel(score) {
4006
4006
  }
4007
4007
 
4008
4008
  // src/version.ts
4009
- var SDK_VERSION = "5.18.1";
4009
+ var SDK_VERSION = "5.20.0";
4010
4010
 
4011
4011
  // src/http.ts
4012
4012
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -4161,7 +4161,12 @@ function getCacheKey(request, counterpartyId) {
4161
4161
  // its start_checkout quote was served the cached quote-leg grant (no
4162
4162
  // settlementOutcome) and never reached the backend. Same F-A1-07 bug class.
4163
4163
  request.commercePhase || "",
4164
- request.checkoutSessionId || ""
4164
+ request.checkoutSessionId || "",
4165
+ // 5.19.0: a route_config purpose claim is checked server-side against
4166
+ // the stored rule for this method + path, so it changes the verdict.
4167
+ request.purposeSource || "",
4168
+ request.requestMethod || "",
4169
+ request.requestPath || ""
4165
4170
  ].join("|");
4166
4171
  }
4167
4172
  function getCachedResult(request, counterpartyId) {
@@ -4319,6 +4324,9 @@ async function callVerifyAccessAPI(config, request) {
4319
4324
  if (requestData.enableRuntimeChallenge)
4320
4325
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
4321
4326
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
4327
+ if (config.actingProof?.connectorToken) {
4328
+ body.actingProof = { connectorToken: config.actingProof.connectorToken };
4329
+ }
4322
4330
  if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
4323
4331
  if (requestData.createSession) body.createSession = requestData.createSession;
4324
4332
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
@@ -4335,6 +4343,11 @@ async function callVerifyAccessAPI(config, request) {
4335
4343
  if (requestData.buyerEmail) body.buyerEmail = requestData.buyerEmail;
4336
4344
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
4337
4345
  if (requestData.attemptId) body.attemptId = requestData.attemptId;
4346
+ if (requestData.purposeSource) body.purposeSource = requestData.purposeSource;
4347
+ if (requestData.agentArtifacts) body.agentArtifacts = requestData.agentArtifacts;
4348
+ if (requestData.metadata) body.metadata = requestData.metadata;
4349
+ if (requestData.requestMethod) body.requestMethod = requestData.requestMethod;
4350
+ if (requestData.requestPath) body.requestPath = requestData.requestPath;
4338
4351
  if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
4339
4352
  body.sdkVersion = SDK_VERSION;
4340
4353
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
@@ -4481,22 +4494,43 @@ async function verify(config, request, options) {
4481
4494
  "[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."
4482
4495
  );
4483
4496
  }
4484
- const uncacheable = Boolean(request.commerceArtifacts);
4497
+ const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
4485
4498
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4486
4499
  const cached = getCachedResult(request, mergedConfig.counterpartyId);
4487
4500
  if (cached) {
4488
4501
  if (mergedConfig.debug) {
4489
4502
  console.log("[VerificationGateway] Returning cached result");
4490
4503
  }
4491
- const hit = { ...cached };
4492
- if (request.attemptId) {
4493
- hit.attemptId = request.attemptId;
4494
- } else {
4495
- delete hit.attemptId;
4496
- }
4497
- return hit;
4504
+ return sharedVerdict(cached, request);
4505
+ }
4506
+ }
4507
+ if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4508
+ const key = getCacheKey(request, mergedConfig.counterpartyId);
4509
+ const pending = inflightVerifies.get(key);
4510
+ if (pending) return sharedVerdict(await pending, request);
4511
+ const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
4512
+ inflightVerifies.set(key, flight);
4513
+ try {
4514
+ return await flight;
4515
+ } finally {
4516
+ inflightVerifies.delete(key);
4498
4517
  }
4499
4518
  }
4519
+ return verifyViaApi(mergedConfig, request, urls, uncacheable);
4520
+ }
4521
+ var inflightVerifies = /* @__PURE__ */ new Map();
4522
+ var sharedVerdicts = /* @__PURE__ */ new WeakSet();
4523
+ function sharedVerdict(source, request) {
4524
+ const hit = { ...source };
4525
+ if (request.attemptId) {
4526
+ hit.attemptId = request.attemptId;
4527
+ } else {
4528
+ delete hit.attemptId;
4529
+ }
4530
+ sharedVerdicts.add(hit);
4531
+ return hit;
4532
+ }
4533
+ async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
4500
4534
  const enrichedRequest = { ...request };
4501
4535
  if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
4502
4536
  enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
@@ -4524,9 +4558,18 @@ async function verify(config, request, options) {
4524
4558
  if (!apiResponse.access?.allowed) {
4525
4559
  const aggregatedFailures = apiResponse.access?.failures;
4526
4560
  const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
4561
+ const denyAgent = idVerifiedFromBackend && apiResponse.agent ? {
4562
+ astraId: apiResponse.agent.astraId,
4563
+ name: apiResponse.agent.name,
4564
+ trustScore: apiResponse.agent.trustScore,
4565
+ trustLevel: getTrustLevel(apiResponse.agent.trustScore),
4566
+ blockchainAnchored: apiResponse.agent.blockchainStatus === "anchored",
4567
+ status: apiResponse.agent.agentStatus
4568
+ } : void 0;
4527
4569
  const result2 = {
4528
4570
  identityVerified: idVerifiedFromBackend,
4529
4571
  policyAllowed: false,
4572
+ ...denyAgent && { agent: denyAgent },
4530
4573
  // 3.6.0: the server now emits top-level denialReasons on every deny
4531
4574
  // path — prefer it verbatim; the failure-message reconstruction remains
4532
4575
  // as the fallback for older backends.
@@ -4566,7 +4609,9 @@ async function verify(config, request, options) {
4566
4609
  fulfilment: apiResponse.fulfilment,
4567
4610
  mandates: apiResponse.mandates,
4568
4611
  kyaToken: apiResponse.kyaToken,
4569
- aep: apiResponse.aep
4612
+ aep: apiResponse.aep,
4613
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4614
+ warnings: apiResponse.warnings
4570
4615
  };
4571
4616
  return result2;
4572
4617
  }
@@ -4634,7 +4679,9 @@ async function verify(config, request, options) {
4634
4679
  // 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
4635
4680
  mandates: apiResponse.mandates,
4636
4681
  kyaToken: apiResponse.kyaToken,
4637
- aep: apiResponse.aep
4682
+ aep: apiResponse.aep,
4683
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4684
+ warnings: apiResponse.warnings
4638
4685
  };
4639
4686
  if (result.recommendation === "deny") {
4640
4687
  result.policyAllowed = false;
@@ -4660,8 +4707,18 @@ async function verify(config, request, options) {
4660
4707
  cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
4661
4708
  }
4662
4709
  }
4710
+ notifyVerificationListeners(request, result);
4663
4711
  return result;
4664
4712
  }
4713
+ var verificationListeners = /* @__PURE__ */ new Set();
4714
+ function notifyVerificationListeners(request, result) {
4715
+ for (const listener of verificationListeners) {
4716
+ try {
4717
+ listener(result, request);
4718
+ } catch {
4719
+ }
4720
+ }
4721
+ }
4665
4722
 
4666
4723
  // src/adapters/stepup-poll.ts
4667
4724
  var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
@@ -4672,6 +4729,9 @@ var MAX_TOTAL_BYTES = 16 * 1024;
4672
4729
  // src/adapters/commerce-detect.ts
4673
4730
  var MAX_BODY_BYTES = 64 * 1024;
4674
4731
 
4732
+ // src/adapters/routes-cache.ts
4733
+ var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4734
+
4675
4735
  // src/edge-config.ts
4676
4736
  var DEFAULT_EDGE_CONFIG = Object.freeze({
4677
4737
  version: 1,
@@ -4913,9 +4973,6 @@ var BeaconBuffer = class {
4913
4973
  };
4914
4974
  var beaconBuffer = new BeaconBuffer();
4915
4975
 
4916
- // src/adapters/express.ts
4917
- var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4918
-
4919
4976
  // src/adapters/nextjs.ts
4920
4977
  var DEFAULT_ROUTES_REFRESH_MS2 = 5 * 60 * 1e3;
4921
4978
 
@@ -5009,6 +5066,25 @@ import {
5009
5066
  // src/idempotency/index.ts
5010
5067
  var DEFAULT_IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1e3;
5011
5068
 
5069
+ // src/ucp/approval-events.ts
5070
+ var MemorySeenEvents = class {
5071
+ constructor(max = 1e4) {
5072
+ this.max = max;
5073
+ this.ids = /* @__PURE__ */ new Set();
5074
+ }
5075
+ async has(eventId) {
5076
+ return this.ids.has(eventId);
5077
+ }
5078
+ async add(eventId) {
5079
+ if (this.ids.size >= this.max) {
5080
+ const first = this.ids.values().next().value;
5081
+ if (first !== void 0) this.ids.delete(first);
5082
+ }
5083
+ this.ids.add(eventId);
5084
+ }
5085
+ };
5086
+ var defaultSeen = new MemorySeenEvents();
5087
+
5012
5088
  // src/payments/kyapay.ts
5013
5089
  import {
5014
5090
  createLocalJWKSet,
@@ -5053,7 +5129,9 @@ function toDecision(result) {
5053
5129
  if (result.identityVerified && result.policyAllowed) {
5054
5130
  return {
5055
5131
  recommendation: "ALLOW",
5056
- reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
5132
+ // 5.19.0: the score is on `trustScore` for the merchant; `reason` is
5133
+ // text a merchant may relay to the agent, so it never embeds the number.
5134
+ reason: "Verified",
5057
5135
  trustScore: result.agent?.trustScore,
5058
5136
  sessionId: "sessionId" in result ? result.sessionId : void 0
5059
5137
  };