@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
@@ -3994,7 +3994,7 @@ function getTrustLevel(score) {
3994
3994
  }
3995
3995
 
3996
3996
  // src/version.ts
3997
- var SDK_VERSION = "5.18.1";
3997
+ var SDK_VERSION = "5.20.0";
3998
3998
 
3999
3999
  // src/http.ts
4000
4000
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -4149,7 +4149,12 @@ function getCacheKey(request, counterpartyId) {
4149
4149
  // its start_checkout quote was served the cached quote-leg grant (no
4150
4150
  // settlementOutcome) and never reached the backend. Same F-A1-07 bug class.
4151
4151
  request.commercePhase || "",
4152
- request.checkoutSessionId || ""
4152
+ request.checkoutSessionId || "",
4153
+ // 5.19.0: a route_config purpose claim is checked server-side against
4154
+ // the stored rule for this method + path, so it changes the verdict.
4155
+ request.purposeSource || "",
4156
+ request.requestMethod || "",
4157
+ request.requestPath || ""
4153
4158
  ].join("|");
4154
4159
  }
4155
4160
  function getCachedResult(request, counterpartyId) {
@@ -4307,6 +4312,9 @@ async function callVerifyAccessAPI(config, request) {
4307
4312
  if (requestData.enableRuntimeChallenge)
4308
4313
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
4309
4314
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
4315
+ if (config.actingProof?.connectorToken) {
4316
+ body.actingProof = { connectorToken: config.actingProof.connectorToken };
4317
+ }
4310
4318
  if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
4311
4319
  if (requestData.createSession) body.createSession = requestData.createSession;
4312
4320
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
@@ -4323,6 +4331,11 @@ async function callVerifyAccessAPI(config, request) {
4323
4331
  if (requestData.buyerEmail) body.buyerEmail = requestData.buyerEmail;
4324
4332
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
4325
4333
  if (requestData.attemptId) body.attemptId = requestData.attemptId;
4334
+ if (requestData.purposeSource) body.purposeSource = requestData.purposeSource;
4335
+ if (requestData.agentArtifacts) body.agentArtifacts = requestData.agentArtifacts;
4336
+ if (requestData.metadata) body.metadata = requestData.metadata;
4337
+ if (requestData.requestMethod) body.requestMethod = requestData.requestMethod;
4338
+ if (requestData.requestPath) body.requestPath = requestData.requestPath;
4326
4339
  if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
4327
4340
  body.sdkVersion = SDK_VERSION;
4328
4341
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
@@ -4469,22 +4482,43 @@ async function verify(config, request, options) {
4469
4482
  "[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."
4470
4483
  );
4471
4484
  }
4472
- const uncacheable = Boolean(request.commerceArtifacts);
4485
+ const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
4473
4486
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4474
4487
  const cached = getCachedResult(request, mergedConfig.counterpartyId);
4475
4488
  if (cached) {
4476
4489
  if (mergedConfig.debug) {
4477
4490
  console.log("[VerificationGateway] Returning cached result");
4478
4491
  }
4479
- const hit = { ...cached };
4480
- if (request.attemptId) {
4481
- hit.attemptId = request.attemptId;
4482
- } else {
4483
- delete hit.attemptId;
4484
- }
4485
- return hit;
4492
+ return sharedVerdict(cached, request);
4493
+ }
4494
+ }
4495
+ if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4496
+ const key = getCacheKey(request, mergedConfig.counterpartyId);
4497
+ const pending = inflightVerifies.get(key);
4498
+ if (pending) return sharedVerdict(await pending, request);
4499
+ const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
4500
+ inflightVerifies.set(key, flight);
4501
+ try {
4502
+ return await flight;
4503
+ } finally {
4504
+ inflightVerifies.delete(key);
4486
4505
  }
4487
4506
  }
4507
+ return verifyViaApi(mergedConfig, request, urls, uncacheable);
4508
+ }
4509
+ var inflightVerifies = /* @__PURE__ */ new Map();
4510
+ var sharedVerdicts = /* @__PURE__ */ new WeakSet();
4511
+ function sharedVerdict(source, request) {
4512
+ const hit = { ...source };
4513
+ if (request.attemptId) {
4514
+ hit.attemptId = request.attemptId;
4515
+ } else {
4516
+ delete hit.attemptId;
4517
+ }
4518
+ sharedVerdicts.add(hit);
4519
+ return hit;
4520
+ }
4521
+ async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
4488
4522
  const enrichedRequest = { ...request };
4489
4523
  if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
4490
4524
  enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
@@ -4512,9 +4546,18 @@ async function verify(config, request, options) {
4512
4546
  if (!apiResponse.access?.allowed) {
4513
4547
  const aggregatedFailures = apiResponse.access?.failures;
4514
4548
  const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
4549
+ const denyAgent = idVerifiedFromBackend && apiResponse.agent ? {
4550
+ astraId: apiResponse.agent.astraId,
4551
+ name: apiResponse.agent.name,
4552
+ trustScore: apiResponse.agent.trustScore,
4553
+ trustLevel: getTrustLevel(apiResponse.agent.trustScore),
4554
+ blockchainAnchored: apiResponse.agent.blockchainStatus === "anchored",
4555
+ status: apiResponse.agent.agentStatus
4556
+ } : void 0;
4515
4557
  const result2 = {
4516
4558
  identityVerified: idVerifiedFromBackend,
4517
4559
  policyAllowed: false,
4560
+ ...denyAgent && { agent: denyAgent },
4518
4561
  // 3.6.0: the server now emits top-level denialReasons on every deny
4519
4562
  // path — prefer it verbatim; the failure-message reconstruction remains
4520
4563
  // as the fallback for older backends.
@@ -4554,7 +4597,9 @@ async function verify(config, request, options) {
4554
4597
  fulfilment: apiResponse.fulfilment,
4555
4598
  mandates: apiResponse.mandates,
4556
4599
  kyaToken: apiResponse.kyaToken,
4557
- aep: apiResponse.aep
4600
+ aep: apiResponse.aep,
4601
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4602
+ warnings: apiResponse.warnings
4558
4603
  };
4559
4604
  return result2;
4560
4605
  }
@@ -4622,7 +4667,9 @@ async function verify(config, request, options) {
4622
4667
  // 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
4623
4668
  mandates: apiResponse.mandates,
4624
4669
  kyaToken: apiResponse.kyaToken,
4625
- aep: apiResponse.aep
4670
+ aep: apiResponse.aep,
4671
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4672
+ warnings: apiResponse.warnings
4626
4673
  };
4627
4674
  if (result.recommendation === "deny") {
4628
4675
  result.policyAllowed = false;
@@ -4648,8 +4695,18 @@ async function verify(config, request, options) {
4648
4695
  cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
4649
4696
  }
4650
4697
  }
4698
+ notifyVerificationListeners(request, result);
4651
4699
  return result;
4652
4700
  }
4701
+ var verificationListeners = /* @__PURE__ */ new Set();
4702
+ function notifyVerificationListeners(request, result) {
4703
+ for (const listener of verificationListeners) {
4704
+ try {
4705
+ listener(result, request);
4706
+ } catch {
4707
+ }
4708
+ }
4709
+ }
4653
4710
 
4654
4711
  // src/adapters/stepup-poll.ts
4655
4712
  var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
@@ -4660,6 +4717,9 @@ var MAX_TOTAL_BYTES = 16 * 1024;
4660
4717
  // src/adapters/commerce-detect.ts
4661
4718
  var MAX_BODY_BYTES = 64 * 1024;
4662
4719
 
4720
+ // src/adapters/routes-cache.ts
4721
+ var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4722
+
4663
4723
  // src/edge-config.ts
4664
4724
  var DEFAULT_EDGE_CONFIG = Object.freeze({
4665
4725
  version: 1,
@@ -4901,9 +4961,6 @@ var BeaconBuffer = class {
4901
4961
  };
4902
4962
  var beaconBuffer = new BeaconBuffer();
4903
4963
 
4904
- // src/adapters/express.ts
4905
- var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4906
-
4907
4964
  // src/adapters/nextjs.ts
4908
4965
  var DEFAULT_ROUTES_REFRESH_MS2 = 5 * 60 * 1e3;
4909
4966
 
@@ -4989,6 +5046,25 @@ var import_jose2 = require("jose");
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
  var import_jose4 = require("jose");
4994
5070
 
@@ -5028,7 +5104,9 @@ function toDecision(result) {
5028
5104
  if (result.identityVerified && result.policyAllowed) {
5029
5105
  return {
5030
5106
  recommendation: "ALLOW",
5031
- reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
5107
+ // 5.19.0: the score is on `trustScore` for the merchant; `reason` is
5108
+ // text a merchant may relay to the agent, so it never embeds the number.
5109
+ reason: "Verified",
5032
5110
  trustScore: result.agent?.trustScore,
5033
5111
  sessionId: "sessionId" in result ? result.sessionId : void 0
5034
5112
  };