@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
@@ -3969,7 +3969,7 @@ function getTrustLevel(score) {
3969
3969
  }
3970
3970
 
3971
3971
  // src/version.ts
3972
- var SDK_VERSION = "5.18.1";
3972
+ var SDK_VERSION = "5.20.0";
3973
3973
 
3974
3974
  // src/http.ts
3975
3975
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -4124,7 +4124,12 @@ function getCacheKey(request, counterpartyId) {
4124
4124
  // its start_checkout quote was served the cached quote-leg grant (no
4125
4125
  // settlementOutcome) and never reached the backend. Same F-A1-07 bug class.
4126
4126
  request.commercePhase || "",
4127
- request.checkoutSessionId || ""
4127
+ request.checkoutSessionId || "",
4128
+ // 5.19.0: a route_config purpose claim is checked server-side against
4129
+ // the stored rule for this method + path, so it changes the verdict.
4130
+ request.purposeSource || "",
4131
+ request.requestMethod || "",
4132
+ request.requestPath || ""
4128
4133
  ].join("|");
4129
4134
  }
4130
4135
  function getCachedResult(request, counterpartyId) {
@@ -4282,6 +4287,9 @@ async function callVerifyAccessAPI(config, request) {
4282
4287
  if (requestData.enableRuntimeChallenge)
4283
4288
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
4284
4289
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
4290
+ if (config.actingProof?.connectorToken) {
4291
+ body.actingProof = { connectorToken: config.actingProof.connectorToken };
4292
+ }
4285
4293
  if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
4286
4294
  if (requestData.createSession) body.createSession = requestData.createSession;
4287
4295
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
@@ -4298,6 +4306,11 @@ async function callVerifyAccessAPI(config, request) {
4298
4306
  if (requestData.buyerEmail) body.buyerEmail = requestData.buyerEmail;
4299
4307
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
4300
4308
  if (requestData.attemptId) body.attemptId = requestData.attemptId;
4309
+ if (requestData.purposeSource) body.purposeSource = requestData.purposeSource;
4310
+ if (requestData.agentArtifacts) body.agentArtifacts = requestData.agentArtifacts;
4311
+ if (requestData.metadata) body.metadata = requestData.metadata;
4312
+ if (requestData.requestMethod) body.requestMethod = requestData.requestMethod;
4313
+ if (requestData.requestPath) body.requestPath = requestData.requestPath;
4301
4314
  if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
4302
4315
  body.sdkVersion = SDK_VERSION;
4303
4316
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
@@ -4444,22 +4457,43 @@ async function verify(config, request, options) {
4444
4457
  "[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."
4445
4458
  );
4446
4459
  }
4447
- const uncacheable = Boolean(request.commerceArtifacts);
4460
+ const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
4448
4461
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4449
4462
  const cached = getCachedResult(request, mergedConfig.counterpartyId);
4450
4463
  if (cached) {
4451
4464
  if (mergedConfig.debug) {
4452
4465
  console.log("[VerificationGateway] Returning cached result");
4453
4466
  }
4454
- const hit = { ...cached };
4455
- if (request.attemptId) {
4456
- hit.attemptId = request.attemptId;
4457
- } else {
4458
- delete hit.attemptId;
4459
- }
4460
- return hit;
4467
+ return sharedVerdict(cached, request);
4468
+ }
4469
+ }
4470
+ if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4471
+ const key = getCacheKey(request, mergedConfig.counterpartyId);
4472
+ const pending = inflightVerifies.get(key);
4473
+ if (pending) return sharedVerdict(await pending, request);
4474
+ const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
4475
+ inflightVerifies.set(key, flight);
4476
+ try {
4477
+ return await flight;
4478
+ } finally {
4479
+ inflightVerifies.delete(key);
4461
4480
  }
4462
4481
  }
4482
+ return verifyViaApi(mergedConfig, request, urls, uncacheable);
4483
+ }
4484
+ var inflightVerifies = /* @__PURE__ */ new Map();
4485
+ var sharedVerdicts = /* @__PURE__ */ new WeakSet();
4486
+ function sharedVerdict(source, request) {
4487
+ const hit = { ...source };
4488
+ if (request.attemptId) {
4489
+ hit.attemptId = request.attemptId;
4490
+ } else {
4491
+ delete hit.attemptId;
4492
+ }
4493
+ sharedVerdicts.add(hit);
4494
+ return hit;
4495
+ }
4496
+ async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
4463
4497
  const enrichedRequest = { ...request };
4464
4498
  if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
4465
4499
  enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
@@ -4487,9 +4521,18 @@ async function verify(config, request, options) {
4487
4521
  if (!apiResponse.access?.allowed) {
4488
4522
  const aggregatedFailures = apiResponse.access?.failures;
4489
4523
  const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
4524
+ const denyAgent = idVerifiedFromBackend && apiResponse.agent ? {
4525
+ astraId: apiResponse.agent.astraId,
4526
+ name: apiResponse.agent.name,
4527
+ trustScore: apiResponse.agent.trustScore,
4528
+ trustLevel: getTrustLevel(apiResponse.agent.trustScore),
4529
+ blockchainAnchored: apiResponse.agent.blockchainStatus === "anchored",
4530
+ status: apiResponse.agent.agentStatus
4531
+ } : void 0;
4490
4532
  const result2 = {
4491
4533
  identityVerified: idVerifiedFromBackend,
4492
4534
  policyAllowed: false,
4535
+ ...denyAgent && { agent: denyAgent },
4493
4536
  // 3.6.0: the server now emits top-level denialReasons on every deny
4494
4537
  // path — prefer it verbatim; the failure-message reconstruction remains
4495
4538
  // as the fallback for older backends.
@@ -4529,7 +4572,9 @@ async function verify(config, request, options) {
4529
4572
  fulfilment: apiResponse.fulfilment,
4530
4573
  mandates: apiResponse.mandates,
4531
4574
  kyaToken: apiResponse.kyaToken,
4532
- aep: apiResponse.aep
4575
+ aep: apiResponse.aep,
4576
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4577
+ warnings: apiResponse.warnings
4533
4578
  };
4534
4579
  return result2;
4535
4580
  }
@@ -4597,7 +4642,9 @@ async function verify(config, request, options) {
4597
4642
  // 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
4598
4643
  mandates: apiResponse.mandates,
4599
4644
  kyaToken: apiResponse.kyaToken,
4600
- aep: apiResponse.aep
4645
+ aep: apiResponse.aep,
4646
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4647
+ warnings: apiResponse.warnings
4601
4648
  };
4602
4649
  if (result.recommendation === "deny") {
4603
4650
  result.policyAllowed = false;
@@ -4623,8 +4670,18 @@ async function verify(config, request, options) {
4623
4670
  cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
4624
4671
  }
4625
4672
  }
4673
+ notifyVerificationListeners(request, result);
4626
4674
  return result;
4627
4675
  }
4676
+ var verificationListeners = /* @__PURE__ */ new Set();
4677
+ function notifyVerificationListeners(request, result) {
4678
+ for (const listener of verificationListeners) {
4679
+ try {
4680
+ listener(result, request);
4681
+ } catch {
4682
+ }
4683
+ }
4684
+ }
4628
4685
 
4629
4686
  // src/adapters/stepup-poll.ts
4630
4687
  var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
@@ -4635,6 +4692,9 @@ var MAX_TOTAL_BYTES = 16 * 1024;
4635
4692
  // src/adapters/commerce-detect.ts
4636
4693
  var MAX_BODY_BYTES = 64 * 1024;
4637
4694
 
4695
+ // src/adapters/routes-cache.ts
4696
+ var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4697
+
4638
4698
  // src/edge-config.ts
4639
4699
  var DEFAULT_EDGE_CONFIG = Object.freeze({
4640
4700
  version: 1,
@@ -4876,9 +4936,6 @@ var BeaconBuffer = class {
4876
4936
  };
4877
4937
  var beaconBuffer = new BeaconBuffer();
4878
4938
 
4879
- // src/adapters/express.ts
4880
- var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4881
-
4882
4939
  // src/adapters/nextjs.ts
4883
4940
  var DEFAULT_ROUTES_REFRESH_MS2 = 5 * 60 * 1e3;
4884
4941
 
@@ -4972,6 +5029,25 @@ import {
4972
5029
  // src/idempotency/index.ts
4973
5030
  var DEFAULT_IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1e3;
4974
5031
 
5032
+ // src/ucp/approval-events.ts
5033
+ var MemorySeenEvents = class {
5034
+ constructor(max = 1e4) {
5035
+ this.max = max;
5036
+ this.ids = /* @__PURE__ */ new Set();
5037
+ }
5038
+ async has(eventId) {
5039
+ return this.ids.has(eventId);
5040
+ }
5041
+ async add(eventId) {
5042
+ if (this.ids.size >= this.max) {
5043
+ const first = this.ids.values().next().value;
5044
+ if (first !== void 0) this.ids.delete(first);
5045
+ }
5046
+ this.ids.add(eventId);
5047
+ }
5048
+ };
5049
+ var defaultSeen = new MemorySeenEvents();
5050
+
4975
5051
  // src/payments/kyapay.ts
4976
5052
  import {
4977
5053
  createLocalJWKSet,
@@ -5016,7 +5092,9 @@ function toDecision(result) {
5016
5092
  if (result.identityVerified && result.policyAllowed) {
5017
5093
  return {
5018
5094
  recommendation: "ALLOW",
5019
- reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
5095
+ // 5.19.0: the score is on `trustScore` for the merchant; `reason` is
5096
+ // text a merchant may relay to the agent, so it never embeds the number.
5097
+ reason: "Verified",
5020
5098
  trustScore: result.agent?.trustScore,
5021
5099
  sessionId: "sessionId" in result ? result.sessionId : void 0
5022
5100
  };