@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
@@ -4036,7 +4036,7 @@ function getTrustLevel(score) {
4036
4036
  }
4037
4037
 
4038
4038
  // src/version.ts
4039
- var SDK_VERSION = "5.18.1";
4039
+ var SDK_VERSION = "5.20.0";
4040
4040
 
4041
4041
  // src/http.ts
4042
4042
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -4191,7 +4191,12 @@ function getCacheKey(request, counterpartyId) {
4191
4191
  // its start_checkout quote was served the cached quote-leg grant (no
4192
4192
  // settlementOutcome) and never reached the backend. Same F-A1-07 bug class.
4193
4193
  request.commercePhase || "",
4194
- request.checkoutSessionId || ""
4194
+ request.checkoutSessionId || "",
4195
+ // 5.19.0: a route_config purpose claim is checked server-side against
4196
+ // the stored rule for this method + path, so it changes the verdict.
4197
+ request.purposeSource || "",
4198
+ request.requestMethod || "",
4199
+ request.requestPath || ""
4195
4200
  ].join("|");
4196
4201
  }
4197
4202
  function getCachedResult(request, counterpartyId) {
@@ -4349,6 +4354,9 @@ async function callVerifyAccessAPI(config, request) {
4349
4354
  if (requestData.enableRuntimeChallenge)
4350
4355
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
4351
4356
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
4357
+ if (config.actingProof?.connectorToken) {
4358
+ body.actingProof = { connectorToken: config.actingProof.connectorToken };
4359
+ }
4352
4360
  if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
4353
4361
  if (requestData.createSession) body.createSession = requestData.createSession;
4354
4362
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
@@ -4365,6 +4373,11 @@ async function callVerifyAccessAPI(config, request) {
4365
4373
  if (requestData.buyerEmail) body.buyerEmail = requestData.buyerEmail;
4366
4374
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
4367
4375
  if (requestData.attemptId) body.attemptId = requestData.attemptId;
4376
+ if (requestData.purposeSource) body.purposeSource = requestData.purposeSource;
4377
+ if (requestData.agentArtifacts) body.agentArtifacts = requestData.agentArtifacts;
4378
+ if (requestData.metadata) body.metadata = requestData.metadata;
4379
+ if (requestData.requestMethod) body.requestMethod = requestData.requestMethod;
4380
+ if (requestData.requestPath) body.requestPath = requestData.requestPath;
4368
4381
  if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
4369
4382
  body.sdkVersion = SDK_VERSION;
4370
4383
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
@@ -4511,22 +4524,43 @@ async function verify(config, request, options) {
4511
4524
  "[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."
4512
4525
  );
4513
4526
  }
4514
- const uncacheable = Boolean(request.commerceArtifacts);
4527
+ const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
4515
4528
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4516
4529
  const cached = getCachedResult(request, mergedConfig.counterpartyId);
4517
4530
  if (cached) {
4518
4531
  if (mergedConfig.debug) {
4519
4532
  console.log("[VerificationGateway] Returning cached result");
4520
4533
  }
4521
- const hit = { ...cached };
4522
- if (request.attemptId) {
4523
- hit.attemptId = request.attemptId;
4524
- } else {
4525
- delete hit.attemptId;
4526
- }
4527
- return hit;
4534
+ return sharedVerdict(cached, request);
4535
+ }
4536
+ }
4537
+ if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
4538
+ const key = getCacheKey(request, mergedConfig.counterpartyId);
4539
+ const pending = inflightVerifies.get(key);
4540
+ if (pending) return sharedVerdict(await pending, request);
4541
+ const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
4542
+ inflightVerifies.set(key, flight);
4543
+ try {
4544
+ return await flight;
4545
+ } finally {
4546
+ inflightVerifies.delete(key);
4528
4547
  }
4529
4548
  }
4549
+ return verifyViaApi(mergedConfig, request, urls, uncacheable);
4550
+ }
4551
+ var inflightVerifies = /* @__PURE__ */ new Map();
4552
+ var sharedVerdicts = /* @__PURE__ */ new WeakSet();
4553
+ function sharedVerdict(source, request) {
4554
+ const hit = { ...source };
4555
+ if (request.attemptId) {
4556
+ hit.attemptId = request.attemptId;
4557
+ } else {
4558
+ delete hit.attemptId;
4559
+ }
4560
+ sharedVerdicts.add(hit);
4561
+ return hit;
4562
+ }
4563
+ async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
4530
4564
  const enrichedRequest = { ...request };
4531
4565
  if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
4532
4566
  enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
@@ -4554,9 +4588,18 @@ async function verify(config, request, options) {
4554
4588
  if (!apiResponse.access?.allowed) {
4555
4589
  const aggregatedFailures = apiResponse.access?.failures;
4556
4590
  const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
4591
+ const denyAgent = idVerifiedFromBackend && apiResponse.agent ? {
4592
+ astraId: apiResponse.agent.astraId,
4593
+ name: apiResponse.agent.name,
4594
+ trustScore: apiResponse.agent.trustScore,
4595
+ trustLevel: getTrustLevel(apiResponse.agent.trustScore),
4596
+ blockchainAnchored: apiResponse.agent.blockchainStatus === "anchored",
4597
+ status: apiResponse.agent.agentStatus
4598
+ } : void 0;
4557
4599
  const result2 = {
4558
4600
  identityVerified: idVerifiedFromBackend,
4559
4601
  policyAllowed: false,
4602
+ ...denyAgent && { agent: denyAgent },
4560
4603
  // 3.6.0: the server now emits top-level denialReasons on every deny
4561
4604
  // path — prefer it verbatim; the failure-message reconstruction remains
4562
4605
  // as the fallback for older backends.
@@ -4596,7 +4639,9 @@ async function verify(config, request, options) {
4596
4639
  fulfilment: apiResponse.fulfilment,
4597
4640
  mandates: apiResponse.mandates,
4598
4641
  kyaToken: apiResponse.kyaToken,
4599
- aep: apiResponse.aep
4642
+ aep: apiResponse.aep,
4643
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4644
+ warnings: apiResponse.warnings
4600
4645
  };
4601
4646
  return result2;
4602
4647
  }
@@ -4664,7 +4709,9 @@ async function verify(config, request, options) {
4664
4709
  // 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
4665
4710
  mandates: apiResponse.mandates,
4666
4711
  kyaToken: apiResponse.kyaToken,
4667
- aep: apiResponse.aep
4712
+ aep: apiResponse.aep,
4713
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
4714
+ warnings: apiResponse.warnings
4668
4715
  };
4669
4716
  if (result.recommendation === "deny") {
4670
4717
  result.policyAllowed = false;
@@ -4690,8 +4737,18 @@ async function verify(config, request, options) {
4690
4737
  cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
4691
4738
  }
4692
4739
  }
4740
+ notifyVerificationListeners(request, result);
4693
4741
  return result;
4694
4742
  }
4743
+ var verificationListeners = /* @__PURE__ */ new Set();
4744
+ function notifyVerificationListeners(request, result) {
4745
+ for (const listener of verificationListeners) {
4746
+ try {
4747
+ listener(result, request);
4748
+ } catch {
4749
+ }
4750
+ }
4751
+ }
4695
4752
 
4696
4753
  // src/adapters/stepup-poll.ts
4697
4754
  var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
@@ -4702,6 +4759,9 @@ var MAX_TOTAL_BYTES = 16 * 1024;
4702
4759
  // src/adapters/commerce-detect.ts
4703
4760
  var MAX_BODY_BYTES = 64 * 1024;
4704
4761
 
4762
+ // src/adapters/routes-cache.ts
4763
+ var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4764
+
4705
4765
  // src/edge-config.ts
4706
4766
  var DEFAULT_EDGE_CONFIG = Object.freeze({
4707
4767
  version: 1,
@@ -4943,9 +5003,6 @@ var BeaconBuffer = class {
4943
5003
  };
4944
5004
  var beaconBuffer = new BeaconBuffer();
4945
5005
 
4946
- // src/adapters/express.ts
4947
- var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4948
-
4949
5006
  // src/adapters/nextjs.ts
4950
5007
  var DEFAULT_ROUTES_REFRESH_MS2 = 5 * 60 * 1e3;
4951
5008
 
@@ -5031,6 +5088,25 @@ var import_jose2 = require("jose");
5031
5088
  // src/idempotency/index.ts
5032
5089
  var DEFAULT_IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1e3;
5033
5090
 
5091
+ // src/ucp/approval-events.ts
5092
+ var MemorySeenEvents = class {
5093
+ constructor(max = 1e4) {
5094
+ this.max = max;
5095
+ this.ids = /* @__PURE__ */ new Set();
5096
+ }
5097
+ async has(eventId) {
5098
+ return this.ids.has(eventId);
5099
+ }
5100
+ async add(eventId) {
5101
+ if (this.ids.size >= this.max) {
5102
+ const first = this.ids.values().next().value;
5103
+ if (first !== void 0) this.ids.delete(first);
5104
+ }
5105
+ this.ids.add(eventId);
5106
+ }
5107
+ };
5108
+ var defaultSeen = new MemorySeenEvents();
5109
+
5034
5110
  // src/payments/kyapay.ts
5035
5111
  var import_jose4 = require("jose");
5036
5112
 
@@ -5070,7 +5146,9 @@ function toDecision(result) {
5070
5146
  if (result.identityVerified && result.policyAllowed) {
5071
5147
  return {
5072
5148
  recommendation: "ALLOW",
5073
- reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
5149
+ // 5.19.0: the score is on `trustScore` for the merchant; `reason` is
5150
+ // text a merchant may relay to the agent, so it never embeds the number.
5151
+ reason: "Verified",
5074
5152
  trustScore: result.agent?.trustScore,
5075
5153
  sessionId: "sessionId" in result ? result.sessionId : void 0
5076
5154
  };