@astrasyncai/verification-gateway 5.19.0 → 5.21.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 (111) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/README.md +53 -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 +1 -1
  6. package/dist/adapters/express.d.ts +1 -1
  7. package/dist/adapters/express.js +65 -16
  8. package/dist/adapters/express.js.map +1 -1
  9. package/dist/adapters/express.mjs +65 -16
  10. package/dist/adapters/express.mjs.map +1 -1
  11. package/dist/adapters/mcp.d.mts +23 -1
  12. package/dist/adapters/mcp.d.ts +23 -1
  13. package/dist/adapters/mcp.js +91 -16
  14. package/dist/adapters/mcp.js.map +1 -1
  15. package/dist/adapters/mcp.mjs +91 -16
  16. package/dist/adapters/mcp.mjs.map +1 -1
  17. package/dist/adapters/nextjs.d.mts +1 -1
  18. package/dist/adapters/nextjs.d.ts +1 -1
  19. package/dist/adapters/nextjs.js +57 -11
  20. package/dist/adapters/nextjs.js.map +1 -1
  21. package/dist/adapters/nextjs.mjs +57 -11
  22. package/dist/adapters/nextjs.mjs.map +1 -1
  23. package/dist/adapters/sdk.d.mts +35 -2
  24. package/dist/adapters/sdk.d.ts +35 -2
  25. package/dist/adapters/sdk.js +110 -11
  26. package/dist/adapters/sdk.js.map +1 -1
  27. package/dist/adapters/sdk.mjs +110 -11
  28. package/dist/adapters/sdk.mjs.map +1 -1
  29. package/dist/agent/index.d.mts +1 -1
  30. package/dist/agent/index.d.ts +1 -1
  31. package/dist/agent/index.js +1 -1
  32. package/dist/agent/index.js.map +1 -1
  33. package/dist/agent/index.mjs +1 -1
  34. package/dist/agent/index.mjs.map +1 -1
  35. package/dist/bin/astrasync-claude-hook.js +50 -12
  36. package/dist/bin/astrasync-codex-hook.js +50 -12
  37. package/dist/bin/astrasync-guard.js +50 -12
  38. package/dist/bin/astrasync.js +65 -13
  39. package/dist/browser/background.js +50 -12
  40. package/dist/browser/background.js.map +1 -1
  41. package/dist/browser/background.mjs +50 -12
  42. package/dist/browser/background.mjs.map +1 -1
  43. package/dist/cli/index.js +1 -1
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/cli/index.mjs +1 -1
  46. package/dist/cli/index.mjs.map +1 -1
  47. package/dist/codex/index.js +50 -12
  48. package/dist/codex/index.js.map +1 -1
  49. package/dist/codex/index.mjs +50 -12
  50. package/dist/codex/index.mjs.map +1 -1
  51. package/dist/cursor/extension.js +50 -12
  52. package/dist/cursor/extension.js.map +1 -1
  53. package/dist/cursor/extension.mjs +50 -12
  54. package/dist/cursor/extension.mjs.map +1 -1
  55. package/dist/edge-config.d.mts +1 -1
  56. package/dist/edge-config.d.ts +1 -1
  57. package/dist/edge-config.js +1 -1
  58. package/dist/edge-config.js.map +1 -1
  59. package/dist/edge-config.mjs +1 -1
  60. package/dist/edge-config.mjs.map +1 -1
  61. package/dist/edge-core/index.d.mts +1 -1
  62. package/dist/edge-core/index.d.ts +1 -1
  63. package/dist/edge-core/index.js +49 -11
  64. package/dist/edge-core/index.js.map +1 -1
  65. package/dist/edge-core/index.mjs +49 -11
  66. package/dist/edge-core/index.mjs.map +1 -1
  67. package/dist/gateway/gateway.d.mts +2 -2
  68. package/dist/gateway/gateway.d.ts +2 -2
  69. package/dist/gateway/gateway.js +50 -12
  70. package/dist/gateway/gateway.js.map +1 -1
  71. package/dist/gateway/gateway.mjs +50 -12
  72. package/dist/gateway/gateway.mjs.map +1 -1
  73. package/dist/git-trigger/git-hooks.d.mts +1 -1
  74. package/dist/git-trigger/git-hooks.d.ts +1 -1
  75. package/dist/index.d.mts +286 -8
  76. package/dist/index.d.ts +286 -8
  77. package/dist/index.js +532 -49
  78. package/dist/index.js.map +1 -1
  79. package/dist/index.mjs +522 -49
  80. package/dist/index.mjs.map +1 -1
  81. package/dist/local-evaluator/evaluator.d.mts +2 -2
  82. package/dist/local-evaluator/evaluator.d.ts +2 -2
  83. package/dist/registration/index.d.mts +11 -2
  84. package/dist/registration/index.d.ts +11 -2
  85. package/dist/registration/index.js +1 -1
  86. package/dist/registration/index.js.map +1 -1
  87. package/dist/registration/index.mjs +1 -1
  88. package/dist/registration/index.mjs.map +1 -1
  89. package/dist/transport/index.d.mts +1 -1
  90. package/dist/transport/index.d.ts +1 -1
  91. package/dist/transport/index.js +1 -1
  92. package/dist/transport/index.js.map +1 -1
  93. package/dist/transport/index.mjs +1 -1
  94. package/dist/transport/index.mjs.map +1 -1
  95. package/dist/{types-BoGjyon0.d.mts → types-B4zhOAlq.d.mts} +30 -1
  96. package/dist/{types-BRz2U0Pn.d.ts → types-B_HLhZ9n.d.ts} +1 -1
  97. package/dist/{types-BfILnheI.d.mts → types-CU17R4Nr.d.mts} +11 -0
  98. package/dist/{types-BfILnheI.d.ts → types-CU17R4Nr.d.ts} +11 -0
  99. package/dist/{types-eWyZuz-3.d.ts → types-CtBXnWuV.d.ts} +30 -1
  100. package/dist/{types-DqWPkiYl.d.mts → types-DHHyXtuZ.d.mts} +30 -1
  101. package/dist/{types-DqWPkiYl.d.ts → types-DHHyXtuZ.d.ts} +30 -1
  102. package/dist/{types-CfBpm3w5.d.mts → types-Djpz-L0w.d.mts} +1 -1
  103. package/dist/ui/index.d.mts +1 -1
  104. package/dist/ui/index.d.ts +1 -1
  105. package/dist/verify.d.mts +28 -3
  106. package/dist/verify.d.ts +28 -3
  107. package/dist/verify.js +71 -11
  108. package/dist/verify.js.map +1 -1
  109. package/dist/verify.mjs +69 -11
  110. package/dist/verify.mjs.map +1 -1
  111. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { T as TrustLevel, S as SDKOptions, e as VerificationResult, d as VerificationRequest, A as AgentArtifacts, C as CheckoutMetadata } from '../types-DqWPkiYl.mjs';
1
+ import { T as TrustLevel, S as SDKOptions, e as VerificationResult, d as VerificationRequest, A as AgentArtifacts, C as CheckoutMetadata } from '../types-DHHyXtuZ.mjs';
2
2
 
3
3
  /**
4
4
  * AstraSync Universal Verification Gateway — Trust Level helpers.
@@ -199,6 +199,25 @@ declare class VerificationGatewayClient {
199
199
  status: string;
200
200
  alreadySettled?: boolean;
201
201
  }>;
202
+ /**
203
+ * 5.20.0 (round 29.1): ask AstraSync to send ONE signed step-up event to the
204
+ * endpoint's Events URL now — `POST /api/endpoints/:id/events/test`.
205
+ * Delivered synchronously, outside the event outbox (random `eventId`, no
206
+ * retries), signed with the endpoint's webhook secret like a real event.
207
+ * The payload is synthetic (`approvalId: "test_…"`); a kit acknowledges and
208
+ * ignores it.
209
+ *
210
+ * 5.21.0 (shops' item 48): synthetic only. Sending a real held approval's
211
+ * payload (which releases or re-drives that checkout) is dashboard-only, so
212
+ * a leaked API key can't do it.
213
+ *
214
+ * Resolves even when your endpoint refused the event (`delivered: false`,
215
+ * with `responseCode` / `error`).
216
+ */
217
+ sendTestEvent(endpointId: string | undefined, options: {
218
+ type: TestEventType;
219
+ }): Promise<TestEventResult>;
220
+ private endpointCall;
202
221
  /**
203
222
  * Quick verification — checks credentials and policy in one call.
204
223
  *
@@ -238,6 +257,20 @@ declare class VerificationGatewayClient {
238
257
  */
239
258
  private executeWithRetry;
240
259
  }
260
+ /** 5.20.0: the step-up event types `sendTestEvent` can send. */
261
+ type TestEventType = 'step_up.approved' | 'step_up.denied' | 'step_up.expired' | 'step_up.lapsed';
262
+ /** 5.20.0: what `sendTestEvent` reports. */
263
+ interface TestEventResult {
264
+ delivered: boolean;
265
+ /** delivered | failed (bad answer / unreachable) | not_configured (no Events URL or secret). */
266
+ status: 'delivered' | 'failed' | 'not_configured';
267
+ /** Your endpoint's HTTP status, or null when nothing answered. */
268
+ responseCode: number | null;
269
+ error: string | null;
270
+ eventId: string;
271
+ type: TestEventType;
272
+ approvalId: string | null;
273
+ }
241
274
  /**
242
275
  * Create a new SDK client
243
276
  */
@@ -253,4 +286,4 @@ declare function verifyOnce(options: SDKOptions & {
253
286
  action?: string;
254
287
  }): Promise<VerificationResult>;
255
288
 
256
- export { VerificationGatewayClient, createClient, getTrustLevel, verifyOnce };
289
+ export { type TestEventResult, type TestEventType, VerificationGatewayClient, createClient, getTrustLevel, verifyOnce };
@@ -1,4 +1,4 @@
1
- import { T as TrustLevel, S as SDKOptions, e as VerificationResult, d as VerificationRequest, A as AgentArtifacts, C as CheckoutMetadata } from '../types-DqWPkiYl.js';
1
+ import { T as TrustLevel, S as SDKOptions, e as VerificationResult, d as VerificationRequest, A as AgentArtifacts, C as CheckoutMetadata } from '../types-DHHyXtuZ.js';
2
2
 
3
3
  /**
4
4
  * AstraSync Universal Verification Gateway — Trust Level helpers.
@@ -199,6 +199,25 @@ declare class VerificationGatewayClient {
199
199
  status: string;
200
200
  alreadySettled?: boolean;
201
201
  }>;
202
+ /**
203
+ * 5.20.0 (round 29.1): ask AstraSync to send ONE signed step-up event to the
204
+ * endpoint's Events URL now — `POST /api/endpoints/:id/events/test`.
205
+ * Delivered synchronously, outside the event outbox (random `eventId`, no
206
+ * retries), signed with the endpoint's webhook secret like a real event.
207
+ * The payload is synthetic (`approvalId: "test_…"`); a kit acknowledges and
208
+ * ignores it.
209
+ *
210
+ * 5.21.0 (shops' item 48): synthetic only. Sending a real held approval's
211
+ * payload (which releases or re-drives that checkout) is dashboard-only, so
212
+ * a leaked API key can't do it.
213
+ *
214
+ * Resolves even when your endpoint refused the event (`delivered: false`,
215
+ * with `responseCode` / `error`).
216
+ */
217
+ sendTestEvent(endpointId: string | undefined, options: {
218
+ type: TestEventType;
219
+ }): Promise<TestEventResult>;
220
+ private endpointCall;
202
221
  /**
203
222
  * Quick verification — checks credentials and policy in one call.
204
223
  *
@@ -238,6 +257,20 @@ declare class VerificationGatewayClient {
238
257
  */
239
258
  private executeWithRetry;
240
259
  }
260
+ /** 5.20.0: the step-up event types `sendTestEvent` can send. */
261
+ type TestEventType = 'step_up.approved' | 'step_up.denied' | 'step_up.expired' | 'step_up.lapsed';
262
+ /** 5.20.0: what `sendTestEvent` reports. */
263
+ interface TestEventResult {
264
+ delivered: boolean;
265
+ /** delivered | failed (bad answer / unreachable) | not_configured (no Events URL or secret). */
266
+ status: 'delivered' | 'failed' | 'not_configured';
267
+ /** Your endpoint's HTTP status, or null when nothing answered. */
268
+ responseCode: number | null;
269
+ error: string | null;
270
+ eventId: string;
271
+ type: TestEventType;
272
+ approvalId: string | null;
273
+ }
241
274
  /**
242
275
  * Create a new SDK client
243
276
  */
@@ -253,4 +286,4 @@ declare function verifyOnce(options: SDKOptions & {
253
286
  action?: string;
254
287
  }): Promise<VerificationResult>;
255
288
 
256
- export { VerificationGatewayClient, createClient, getTrustLevel, verifyOnce };
289
+ export { type TestEventResult, type TestEventType, VerificationGatewayClient, createClient, getTrustLevel, verifyOnce };
@@ -28,7 +28,7 @@ __export(sdk_exports, {
28
28
  module.exports = __toCommonJS(sdk_exports);
29
29
 
30
30
  // src/version.ts
31
- var SDK_VERSION = "5.19.0";
31
+ var SDK_VERSION = "5.21.0";
32
32
 
33
33
  // src/http.ts
34
34
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -236,6 +236,7 @@ function cacheResult(request, result, configuredTtl, counterpartyId) {
236
236
  }
237
237
  function clearCache() {
238
238
  verificationCache.clear();
239
+ inflightVerifies.clear();
239
240
  }
240
241
  function mcpGuidance(urls) {
241
242
  if (!urls?.mcpEndpoint) return void 0;
@@ -372,6 +373,9 @@ async function callVerifyAccessAPI(config, request) {
372
373
  if (requestData.enableRuntimeChallenge)
373
374
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
374
375
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
376
+ if (config.actingProof?.connectorToken) {
377
+ body.actingProof = { connectorToken: config.actingProof.connectorToken };
378
+ }
375
379
  if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
376
380
  if (requestData.createSession) body.createSession = requestData.createSession;
377
381
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
@@ -539,22 +543,43 @@ async function verify(config, request, options) {
539
543
  "[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."
540
544
  );
541
545
  }
542
- const uncacheable = Boolean(request.commerceArtifacts);
546
+ const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
543
547
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
544
548
  const cached = getCachedResult(request, mergedConfig.counterpartyId);
545
549
  if (cached) {
546
550
  if (mergedConfig.debug) {
547
551
  console.log("[VerificationGateway] Returning cached result");
548
552
  }
549
- const hit = { ...cached };
550
- if (request.attemptId) {
551
- hit.attemptId = request.attemptId;
552
- } else {
553
- delete hit.attemptId;
554
- }
555
- return hit;
553
+ return sharedVerdict(cached, request);
554
+ }
555
+ }
556
+ if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
557
+ const key = getCacheKey(request, mergedConfig.counterpartyId);
558
+ const pending = inflightVerifies.get(key);
559
+ if (pending) return sharedVerdict(await pending, request);
560
+ const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
561
+ inflightVerifies.set(key, flight);
562
+ try {
563
+ return await flight;
564
+ } finally {
565
+ inflightVerifies.delete(key);
556
566
  }
557
567
  }
568
+ return verifyViaApi(mergedConfig, request, urls, uncacheable);
569
+ }
570
+ var inflightVerifies = /* @__PURE__ */ new Map();
571
+ var sharedVerdicts = /* @__PURE__ */ new WeakSet();
572
+ function sharedVerdict(source, request) {
573
+ const hit = { ...source };
574
+ if (request.attemptId) {
575
+ hit.attemptId = request.attemptId;
576
+ } else {
577
+ delete hit.attemptId;
578
+ }
579
+ sharedVerdicts.add(hit);
580
+ return hit;
581
+ }
582
+ async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
558
583
  const enrichedRequest = { ...request };
559
584
  if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
560
585
  enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
@@ -633,7 +658,9 @@ async function verify(config, request, options) {
633
658
  fulfilment: apiResponse.fulfilment,
634
659
  mandates: apiResponse.mandates,
635
660
  kyaToken: apiResponse.kyaToken,
636
- aep: apiResponse.aep
661
+ aep: apiResponse.aep,
662
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
663
+ warnings: apiResponse.warnings
637
664
  };
638
665
  return result2;
639
666
  }
@@ -701,7 +728,9 @@ async function verify(config, request, options) {
701
728
  // 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
702
729
  mandates: apiResponse.mandates,
703
730
  kyaToken: apiResponse.kyaToken,
704
- aep: apiResponse.aep
731
+ aep: apiResponse.aep,
732
+ // 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
733
+ warnings: apiResponse.warnings
705
734
  };
706
735
  if (result.recommendation === "deny") {
707
736
  result.policyAllowed = false;
@@ -727,8 +756,18 @@ async function verify(config, request, options) {
727
756
  cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
728
757
  }
729
758
  }
759
+ notifyVerificationListeners(request, result);
730
760
  return result;
731
761
  }
762
+ var verificationListeners = /* @__PURE__ */ new Set();
763
+ function notifyVerificationListeners(request, result) {
764
+ for (const listener of verificationListeners) {
765
+ try {
766
+ listener(result, request);
767
+ } catch {
768
+ }
769
+ }
770
+ }
732
771
  async function quickVerify(config, credentials) {
733
772
  const result = await verify(config, {
734
773
  credentials,
@@ -988,6 +1027,66 @@ var VerificationGatewayClient = class {
988
1027
  }
989
1028
  return json.data;
990
1029
  }
1030
+ /**
1031
+ * 5.20.0 (round 29.1): ask AstraSync to send ONE signed step-up event to the
1032
+ * endpoint's Events URL now — `POST /api/endpoints/:id/events/test`.
1033
+ * Delivered synchronously, outside the event outbox (random `eventId`, no
1034
+ * retries), signed with the endpoint's webhook secret like a real event.
1035
+ * The payload is synthetic (`approvalId: "test_…"`); a kit acknowledges and
1036
+ * ignores it.
1037
+ *
1038
+ * 5.21.0 (shops' item 48): synthetic only. Sending a real held approval's
1039
+ * payload (which releases or re-drives that checkout) is dashboard-only, so
1040
+ * a leaked API key can't do it.
1041
+ *
1042
+ * Resolves even when your endpoint refused the event (`delivered: false`,
1043
+ * with `responseCode` / `error`).
1044
+ */
1045
+ async sendTestEvent(endpointId, options) {
1046
+ return this.endpointCall("POST", endpointId, "/events/test", { type: options.type });
1047
+ }
1048
+ async endpointCall(method, endpointId, suffix, body) {
1049
+ const id = endpointId ?? this.config.counterpartyId;
1050
+ if (!id) {
1051
+ throw new AstraSyncError(
1052
+ "An endpoint id (ASTRAE-\u2026) is required: pass it, or set counterpartyId on the client",
1053
+ 400,
1054
+ "VALIDATION"
1055
+ );
1056
+ }
1057
+ if (!this.config.apiKey) {
1058
+ throw new AstraSyncError("This call needs the client apiKey", 401, "AUTH_REQUIRED");
1059
+ }
1060
+ const base = this.config.apiBaseUrl.replace(/\/+$/, "");
1061
+ const url = `${base}/endpoints/${encodeURIComponent(id)}${suffix}`;
1062
+ let res;
1063
+ try {
1064
+ res = await sdkFetch(url, {
1065
+ method,
1066
+ headers: {
1067
+ "Content-Type": "application/json",
1068
+ Authorization: `Bearer ${this.config.apiKey}`,
1069
+ "X-API-Key": this.config.apiKey
1070
+ },
1071
+ body: JSON.stringify(body),
1072
+ signal: AbortSignal.timeout(Math.max(this.timeout, 15e3))
1073
+ });
1074
+ } catch (err) {
1075
+ throw new AstraSyncError(
1076
+ `${method} ${suffix || "/endpoints/:id"} failed: ${err instanceof Error ? err.message : String(err)}`,
1077
+ 0,
1078
+ "network_error"
1079
+ );
1080
+ }
1081
+ const json = await res.json().catch(() => ({}));
1082
+ if (!res.ok || json.success === false || json.data === void 0) {
1083
+ const errObj = typeof json.error === "object" ? json.error : void 0;
1084
+ const code = json.code ?? errObj?.code ?? (typeof json.error === "string" ? json.error : "unknown_error");
1085
+ const message = json.message ?? errObj?.message ?? `HTTP ${res.status}`;
1086
+ throw new AstraSyncError(`${message} (${code})`, res.status, code);
1087
+ }
1088
+ return json.data;
1089
+ }
991
1090
  /**
992
1091
  * Quick verification — checks credentials and policy in one call.
993
1092
  *