@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
@@ -3722,7 +3722,7 @@ function getTrustLevel(score) {
3722
3722
  }
3723
3723
 
3724
3724
  // src/version.ts
3725
- var SDK_VERSION = "5.18.1";
3725
+ var SDK_VERSION = "5.20.0";
3726
3726
 
3727
3727
  // src/http.ts
3728
3728
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -3877,7 +3877,12 @@ function getCacheKey(request, counterpartyId) {
3877
3877
  // its start_checkout quote was served the cached quote-leg grant (no
3878
3878
  // settlementOutcome) and never reached the backend. Same F-A1-07 bug class.
3879
3879
  request.commercePhase || "",
3880
- request.checkoutSessionId || ""
3880
+ request.checkoutSessionId || "",
3881
+ // 5.19.0: a route_config purpose claim is checked server-side against
3882
+ // the stored rule for this method + path, so it changes the verdict.
3883
+ request.purposeSource || "",
3884
+ request.requestMethod || "",
3885
+ request.requestPath || ""
3881
3886
  ].join("|");
3882
3887
  }
3883
3888
  function getCachedResult(request, counterpartyId) {
@@ -4035,6 +4040,9 @@ async function callVerifyAccessAPI(config, request) {
4035
4040
  if (requestData.enableRuntimeChallenge)
4036
4041
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
4037
4042
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
4043
+ if (config.actingProof?.connectorToken) {
4044
+ body.actingProof = { connectorToken: config.actingProof.connectorToken };
4045
+ }
4038
4046
  if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
4039
4047
  if (requestData.createSession) body.createSession = requestData.createSession;
4040
4048
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
@@ -4051,6 +4059,11 @@ async function callVerifyAccessAPI(config, request) {
4051
4059
  if (requestData.buyerEmail) body.buyerEmail = requestData.buyerEmail;
4052
4060
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
4053
4061
  if (requestData.attemptId) body.attemptId = requestData.attemptId;
4062
+ if (requestData.purposeSource) body.purposeSource = requestData.purposeSource;
4063
+ if (requestData.agentArtifacts) body.agentArtifacts = requestData.agentArtifacts;
4064
+ if (requestData.metadata) body.metadata = requestData.metadata;
4065
+ if (requestData.requestMethod) body.requestMethod = requestData.requestMethod;
4066
+ if (requestData.requestPath) body.requestPath = requestData.requestPath;
4054
4067
  if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
4055
4068
  body.sdkVersion = SDK_VERSION;
4056
4069
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
@@ -4197,22 +4210,43 @@ async function verify(config, request, options) {
4197
4210
  "[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."
4198
4211
  );
4199
4212
  }
4200
- const uncacheable = Boolean(request.commerceArtifacts);
4213
+ const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
4201
4214
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4202
4215
  const cached = getCachedResult(request, mergedConfig.counterpartyId);
4203
4216
  if (cached) {
4204
4217
  if (mergedConfig.debug) {
4205
4218
  console.log("[VerificationGateway] Returning cached result");
4206
4219
  }
4207
- const hit = { ...cached };
4208
- if (request.attemptId) {
4209
- hit.attemptId = request.attemptId;
4210
- } else {
4211
- delete hit.attemptId;
4212
- }
4213
- return hit;
4220
+ return sharedVerdict(cached, request);
4221
+ }
4222
+ }
4223
+ if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4224
+ const key = getCacheKey(request, mergedConfig.counterpartyId);
4225
+ const pending = inflightVerifies.get(key);
4226
+ if (pending) return sharedVerdict(await pending, request);
4227
+ const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
4228
+ inflightVerifies.set(key, flight);
4229
+ try {
4230
+ return await flight;
4231
+ } finally {
4232
+ inflightVerifies.delete(key);
4214
4233
  }
4215
4234
  }
4235
+ return verifyViaApi(mergedConfig, request, urls, uncacheable);
4236
+ }
4237
+ var inflightVerifies = /* @__PURE__ */ new Map();
4238
+ var sharedVerdicts = /* @__PURE__ */ new WeakSet();
4239
+ function sharedVerdict(source, request) {
4240
+ const hit = { ...source };
4241
+ if (request.attemptId) {
4242
+ hit.attemptId = request.attemptId;
4243
+ } else {
4244
+ delete hit.attemptId;
4245
+ }
4246
+ sharedVerdicts.add(hit);
4247
+ return hit;
4248
+ }
4249
+ async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
4216
4250
  const enrichedRequest = { ...request };
4217
4251
  if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
4218
4252
  enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
@@ -4240,9 +4274,18 @@ async function verify(config, request, options) {
4240
4274
  if (!apiResponse.access?.allowed) {
4241
4275
  const aggregatedFailures = apiResponse.access?.failures;
4242
4276
  const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
4277
+ const denyAgent = idVerifiedFromBackend && apiResponse.agent ? {
4278
+ astraId: apiResponse.agent.astraId,
4279
+ name: apiResponse.agent.name,
4280
+ trustScore: apiResponse.agent.trustScore,
4281
+ trustLevel: getTrustLevel(apiResponse.agent.trustScore),
4282
+ blockchainAnchored: apiResponse.agent.blockchainStatus === "anchored",
4283
+ status: apiResponse.agent.agentStatus
4284
+ } : void 0;
4243
4285
  const result2 = {
4244
4286
  identityVerified: idVerifiedFromBackend,
4245
4287
  policyAllowed: false,
4288
+ ...denyAgent && { agent: denyAgent },
4246
4289
  // 3.6.0: the server now emits top-level denialReasons on every deny
4247
4290
  // path — prefer it verbatim; the failure-message reconstruction remains
4248
4291
  // as the fallback for older backends.
@@ -4282,7 +4325,9 @@ async function verify(config, request, options) {
4282
4325
  fulfilment: apiResponse.fulfilment,
4283
4326
  mandates: apiResponse.mandates,
4284
4327
  kyaToken: apiResponse.kyaToken,
4285
- aep: apiResponse.aep
4328
+ aep: apiResponse.aep,
4329
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4330
+ warnings: apiResponse.warnings
4286
4331
  };
4287
4332
  return result2;
4288
4333
  }
@@ -4350,7 +4395,9 @@ async function verify(config, request, options) {
4350
4395
  // 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
4351
4396
  mandates: apiResponse.mandates,
4352
4397
  kyaToken: apiResponse.kyaToken,
4353
- aep: apiResponse.aep
4398
+ aep: apiResponse.aep,
4399
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4400
+ warnings: apiResponse.warnings
4354
4401
  };
4355
4402
  if (result.recommendation === "deny") {
4356
4403
  result.policyAllowed = false;
@@ -4376,8 +4423,18 @@ async function verify(config, request, options) {
4376
4423
  cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
4377
4424
  }
4378
4425
  }
4426
+ notifyVerificationListeners(request, result);
4379
4427
  return result;
4380
4428
  }
4429
+ var verificationListeners = /* @__PURE__ */ new Set();
4430
+ function notifyVerificationListeners(request, result) {
4431
+ for (const listener of verificationListeners) {
4432
+ try {
4433
+ listener(result, request);
4434
+ } catch {
4435
+ }
4436
+ }
4437
+ }
4381
4438
 
4382
4439
  // src/adapters/stepup-poll.ts
4383
4440
  var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
@@ -4388,6 +4445,9 @@ var MAX_TOTAL_BYTES = 16 * 1024;
4388
4445
  // src/adapters/commerce-detect.ts
4389
4446
  var MAX_BODY_BYTES = 64 * 1024;
4390
4447
 
4448
+ // src/adapters/routes-cache.ts
4449
+ var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4450
+
4391
4451
  // src/edge-config.ts
4392
4452
  var DEFAULT_EDGE_CONFIG = Object.freeze({
4393
4453
  version: 1,
@@ -4629,9 +4689,6 @@ var BeaconBuffer = class {
4629
4689
  };
4630
4690
  var beaconBuffer = new BeaconBuffer();
4631
4691
 
4632
- // src/adapters/express.ts
4633
- var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4634
-
4635
4692
  // src/adapters/nextjs.ts
4636
4693
  var DEFAULT_ROUTES_REFRESH_MS2 = 5 * 60 * 1e3;
4637
4694
 
@@ -4725,6 +4782,25 @@ import {
4725
4782
  // src/idempotency/index.ts
4726
4783
  var DEFAULT_IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1e3;
4727
4784
 
4785
+ // src/ucp/approval-events.ts
4786
+ var MemorySeenEvents = class {
4787
+ constructor(max = 1e4) {
4788
+ this.max = max;
4789
+ this.ids = /* @__PURE__ */ new Set();
4790
+ }
4791
+ async has(eventId) {
4792
+ return this.ids.has(eventId);
4793
+ }
4794
+ async add(eventId) {
4795
+ if (this.ids.size >= this.max) {
4796
+ const first = this.ids.values().next().value;
4797
+ if (first !== void 0) this.ids.delete(first);
4798
+ }
4799
+ this.ids.add(eventId);
4800
+ }
4801
+ };
4802
+ var defaultSeen = new MemorySeenEvents();
4803
+
4728
4804
  // src/payments/kyapay.ts
4729
4805
  import {
4730
4806
  createLocalJWKSet,
@@ -4769,7 +4845,9 @@ function toDecision(result) {
4769
4845
  if (result.identityVerified && result.policyAllowed) {
4770
4846
  return {
4771
4847
  recommendation: "ALLOW",
4772
- reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
4848
+ // 5.19.0: the score is on `trustScore` for the merchant; `reason` is
4849
+ // text a merchant may relay to the agent, so it never embeds the number.
4850
+ reason: "Verified",
4773
4851
  trustScore: result.agent?.trustScore,
4774
4852
  sessionId: "sessionId" in result ? result.sessionId : void 0
4775
4853
  };