@astrasyncai/verification-gateway 3.12.0 → 4.1.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 (134) hide show
  1. package/README.md +106 -29
  2. package/dist/adapter-interface/interface.d.mts +2 -2
  3. package/dist/adapter-interface/interface.d.ts +2 -2
  4. package/dist/adapters/express.d.mts +2 -2
  5. package/dist/adapters/express.d.ts +2 -2
  6. package/dist/adapters/express.js +482 -22
  7. package/dist/adapters/express.js.map +1 -1
  8. package/dist/adapters/express.mjs +482 -22
  9. package/dist/adapters/express.mjs.map +1 -1
  10. package/dist/adapters/http-pdlss.d.mts +3 -3
  11. package/dist/adapters/http-pdlss.d.ts +3 -3
  12. package/dist/adapters/http-pdlss.js.map +1 -1
  13. package/dist/adapters/http-pdlss.mjs.map +1 -1
  14. package/dist/adapters/mcp.d.mts +56 -36
  15. package/dist/adapters/mcp.d.ts +56 -36
  16. package/dist/adapters/mcp.js +309 -10
  17. package/dist/adapters/mcp.js.map +1 -1
  18. package/dist/adapters/mcp.mjs +309 -10
  19. package/dist/adapters/mcp.mjs.map +1 -1
  20. package/dist/adapters/nextjs.d.mts +2 -2
  21. package/dist/adapters/nextjs.d.ts +2 -2
  22. package/dist/adapters/nextjs.js +518 -25
  23. package/dist/adapters/nextjs.js.map +1 -1
  24. package/dist/adapters/nextjs.mjs +518 -25
  25. package/dist/adapters/nextjs.mjs.map +1 -1
  26. package/dist/adapters/sdk.d.mts +2 -2
  27. package/dist/adapters/sdk.d.ts +2 -2
  28. package/dist/adapters/sdk.js +72 -9
  29. package/dist/adapters/sdk.js.map +1 -1
  30. package/dist/adapters/sdk.mjs +72 -9
  31. package/dist/adapters/sdk.mjs.map +1 -1
  32. package/dist/agent/index.d.mts +2 -2
  33. package/dist/agent/index.d.ts +2 -2
  34. package/dist/agent/index.js.map +1 -1
  35. package/dist/agent/index.mjs.map +1 -1
  36. package/dist/bin/astrasync-claude-hook.js +83 -20
  37. package/dist/bin/astrasync-codex-hook.js +83 -20
  38. package/dist/bin/astrasync-guard.js +83 -20
  39. package/dist/bin/astrasync.js +150 -33
  40. package/dist/browser/background.js +83 -20
  41. package/dist/browser/background.js.map +1 -1
  42. package/dist/browser/background.mjs +83 -20
  43. package/dist/browser/background.mjs.map +1 -1
  44. package/dist/browser/browser-adapter.d.mts +2 -2
  45. package/dist/browser/browser-adapter.d.ts +2 -2
  46. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  47. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  48. package/dist/cli/index.d.mts +2 -2
  49. package/dist/cli/index.d.ts +2 -2
  50. package/dist/codex/index.d.mts +3 -3
  51. package/dist/codex/index.d.ts +3 -3
  52. package/dist/codex/index.js +83 -20
  53. package/dist/codex/index.js.map +1 -1
  54. package/dist/codex/index.mjs +83 -20
  55. package/dist/codex/index.mjs.map +1 -1
  56. package/dist/cursor/cursor-adapter.d.mts +2 -2
  57. package/dist/cursor/cursor-adapter.d.ts +2 -2
  58. package/dist/cursor/extension.d.mts +2 -2
  59. package/dist/cursor/extension.d.ts +2 -2
  60. package/dist/cursor/extension.js +83 -20
  61. package/dist/cursor/extension.js.map +1 -1
  62. package/dist/cursor/extension.mjs +83 -20
  63. package/dist/cursor/extension.mjs.map +1 -1
  64. package/dist/edge-config.d.mts +22 -7
  65. package/dist/edge-config.d.ts +22 -7
  66. package/dist/edge-config.js.map +1 -1
  67. package/dist/edge-config.mjs.map +1 -1
  68. package/dist/edge-core/index.d.mts +425 -0
  69. package/dist/edge-core/index.d.ts +425 -0
  70. package/dist/edge-core/index.js +1482 -0
  71. package/dist/edge-core/index.js.map +1 -0
  72. package/dist/edge-core/index.mjs +1437 -0
  73. package/dist/edge-core/index.mjs.map +1 -0
  74. package/dist/{express-B39o89gf.d.mts → express-BVd1_3FE.d.ts} +9 -7
  75. package/dist/{express-BuxKNO_q.d.ts → express-D_4hTn5Z.d.mts} +9 -7
  76. package/dist/gateway/gateway.d.mts +2 -2
  77. package/dist/gateway/gateway.d.ts +2 -2
  78. package/dist/gateway/gateway.js +83 -20
  79. package/dist/gateway/gateway.js.map +1 -1
  80. package/dist/gateway/gateway.mjs +83 -20
  81. package/dist/gateway/gateway.mjs.map +1 -1
  82. package/dist/git-trigger/git-hooks.d.mts +2 -2
  83. package/dist/git-trigger/git-hooks.d.ts +2 -2
  84. package/dist/{index-CLHdqs2M.d.ts → index-B0YHu_SP.d.ts} +30 -27
  85. package/dist/{index-DME3w3lf.d.mts → index-BPEBlOsE.d.mts} +30 -27
  86. package/dist/{index-CqydB4ks.d.mts → index-DQb5-_1X.d.mts} +1 -1
  87. package/dist/{index-BG62SXso.d.ts → index-T1aBoUcc.d.ts} +1 -1
  88. package/dist/index.d.mts +11 -11
  89. package/dist/index.d.ts +11 -11
  90. package/dist/index.js +595 -272
  91. package/dist/index.js.map +1 -1
  92. package/dist/index.mjs +592 -272
  93. package/dist/index.mjs.map +1 -1
  94. package/dist/local-evaluator/evaluator.d.mts +2 -2
  95. package/dist/local-evaluator/evaluator.d.ts +2 -2
  96. package/dist/metadata-capture.d.mts +63 -4
  97. package/dist/metadata-capture.d.ts +63 -4
  98. package/dist/metadata-capture.js +67 -0
  99. package/dist/metadata-capture.js.map +1 -1
  100. package/dist/metadata-capture.mjs +64 -0
  101. package/dist/metadata-capture.mjs.map +1 -1
  102. package/dist/{nextjs-D74W7wt-.d.mts → nextjs-WyeVr2Kp.d.mts} +3 -3
  103. package/dist/{nextjs-Ddlw_J1J.d.ts → nextjs-w7RTbP1P.d.ts} +3 -3
  104. package/dist/platform-signatures.d.mts +5 -6
  105. package/dist/platform-signatures.d.ts +5 -6
  106. package/dist/platform-signatures.js.map +1 -1
  107. package/dist/platform-signatures.mjs.map +1 -1
  108. package/dist/registration/index.d.mts +10 -11
  109. package/dist/registration/index.d.ts +10 -11
  110. package/dist/registration/index.js.map +1 -1
  111. package/dist/registration/index.mjs.map +1 -1
  112. package/dist/{sdk-CT7gdkfR.d.ts → sdk-CbTNIkAa.d.mts} +4 -4
  113. package/dist/{sdk-Bn6bj7kt.d.mts → sdk-QeX0Z8Ho.d.ts} +4 -4
  114. package/dist/transport/index.d.mts +2 -2
  115. package/dist/transport/index.d.ts +2 -2
  116. package/dist/transport/index.js.map +1 -1
  117. package/dist/transport/index.mjs.map +1 -1
  118. package/dist/{types-DHu7m9HI.d.ts → types-BLUx92FJ.d.ts} +1 -1
  119. package/dist/{types-Djw4GLtz.d.mts → types-DqfPU5Bl.d.mts} +1 -1
  120. package/dist/{types-BntuzEEn.d.mts → types-r850cOt0.d.mts} +121 -88
  121. package/dist/{types-SDu4Llbe.d.ts → types-sMxBT-nM.d.ts} +121 -88
  122. package/dist/ui/index.d.mts +11 -7
  123. package/dist/ui/index.d.ts +11 -7
  124. package/dist/ui/index.js +13 -9
  125. package/dist/ui/index.js.map +1 -1
  126. package/dist/ui/index.mjs +10 -8
  127. package/dist/ui/index.mjs.map +1 -1
  128. package/dist/verify.d.mts +11 -8
  129. package/dist/verify.d.ts +11 -8
  130. package/dist/verify.js +76 -8
  131. package/dist/verify.js.map +1 -1
  132. package/dist/verify.mjs +75 -8
  133. package/dist/verify.mjs.map +1 -1
  134. package/package.json +8 -2
@@ -3672,7 +3672,7 @@ function getTrustLevel(score) {
3672
3672
  }
3673
3673
 
3674
3674
  // src/version.ts
3675
- var SDK_VERSION = "3.12.0";
3675
+ var SDK_VERSION = "4.1.0";
3676
3676
 
3677
3677
  // src/well-known.ts
3678
3678
  var CACHE_TTL_MS = 60 * 60 * 1e3;
@@ -3698,7 +3698,7 @@ var DEFAULT_CONFIG = {
3698
3698
  };
3699
3699
  var initCheckPerformed = false;
3700
3700
  var deprecationWarningShown = false;
3701
- async function performInitCheck(apiBaseUrl, debug, strictInit) {
3701
+ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
3702
3702
  initCheckPerformed = true;
3703
3703
  try {
3704
3704
  const probeUrl = `${apiBaseUrl}/agents/verify-access`;
@@ -3715,6 +3715,28 @@ async function performInitCheck(apiBaseUrl, debug, strictInit) {
3715
3715
  `[VerificationGateway] init check passed for ${apiBaseUrl} (content-type: ${contentType})`
3716
3716
  );
3717
3717
  }
3718
+ if (apiKey) {
3719
+ const selfCheck = await fetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
3720
+ headers: { Authorization: `Bearer ${apiKey}` }
3721
+ });
3722
+ if (selfCheck.status === 401) {
3723
+ const body = await selfCheck.json().catch(() => ({}));
3724
+ const message = `[VerificationGateway] the configured AstraSync API key was REJECTED at startup (${body.code ?? "api_key_invalid"}: ${body.message ?? "invalid key"}). Every inbound agent will be turned away until the key is rotated` + (body.remediation?.manageUrl ? ` at ${body.remediation.manageUrl}` : "") + `.`;
3725
+ if (strictInit) {
3726
+ throw new Error(`${message} (strictInit=true)`);
3727
+ }
3728
+ console.error(message);
3729
+ } else if (selfCheck.ok) {
3730
+ const body = await selfCheck.json().catch(() => ({}));
3731
+ if (typeof body.daysToExpiry === "number" && body.daysToExpiry <= 7) {
3732
+ console.warn(
3733
+ `[VerificationGateway] the configured AstraSync API key expires in ${body.daysToExpiry} day(s) \u2014 rotate it at Settings \u2192 Developer Tools before integrations start failing.`
3734
+ );
3735
+ } else if (debug) {
3736
+ console.log("[VerificationGateway] API key self-check passed");
3737
+ }
3738
+ }
3739
+ }
3718
3740
  } catch (err) {
3719
3741
  if (strictInit) {
3720
3742
  throw err;
@@ -3792,8 +3814,17 @@ function cacheResult(request, result, configuredTtl, counterpartyId) {
3792
3814
  function createGuidanceResponse(_config, reason, options = {}) {
3793
3815
  const source = options.source ?? "no_credentials";
3794
3816
  const isApiError = source === "api_error";
3817
+ const isMisconfig = source === "merchant_misconfig";
3795
3818
  const urls = options.urls;
3796
- const guidance = isApiError ? {
3819
+ const guidance = isMisconfig ? {
3820
+ message: "This site's AstraSync integration is misconfigured (its API key was revoked, expired, or rotated). Your identity and the AstraSync platform are fine \u2014 contact the site operator. Retrying will not help.",
3821
+ registrationUrl: urls?.registrationUrl ?? "",
3822
+ documentationUrl: options.remediation?.docsUrl ?? urls?.documentationUrl ?? "",
3823
+ steps: [
3824
+ "Report the failure to the site operator \u2014 their AstraSync API key needs rotating",
3825
+ "Do not retry: the failure is deterministic until the operator updates their key"
3826
+ ]
3827
+ } : isApiError ? {
3797
3828
  message: "Verification is temporarily unavailable. Retry with exponential backoff; if the issue persists, contact support with the correlationId.",
3798
3829
  registrationUrl: urls?.registrationUrl ?? "",
3799
3830
  documentationUrl: urls?.documentationUrl ?? "",
@@ -3831,13 +3862,22 @@ function createGuidanceResponse(_config, reason, options = {}) {
3831
3862
  // partners (and their custom onDenied handlers) can branch on
3832
3863
  // dimension. Without this, the synthesised stub was indistinguishable
3833
3864
  // from a real policy deny.
3834
- failures: isApiError ? [
3865
+ failures: isMisconfig ? [
3866
+ {
3867
+ dimension: "verify_access.merchant_misconfigured",
3868
+ message: reason ?? "The integration API key was rejected by AstraSync",
3869
+ guidance: guidance.message
3870
+ }
3871
+ ] : isApiError ? [
3835
3872
  {
3836
3873
  dimension: "verify_access.api_error",
3837
3874
  message: reason ?? "Verification temporarily unavailable",
3838
3875
  guidance: guidance.message
3839
3876
  }
3840
3877
  ] : void 0,
3878
+ // 4.0.0: typed marker so adapters render the misconfig envelope (503 +
3879
+ // MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
3880
+ ...isMisconfig && { misconfigured: true },
3841
3881
  correlationId: options.correlationId,
3842
3882
  attemptId: options.attemptId,
3843
3883
  verifiedAt: /* @__PURE__ */ new Date()
@@ -3892,7 +3932,8 @@ async function callVerifyAccessAPI(config, request) {
3892
3932
  const response = await fetch(`${config.apiBaseUrl}/agents/verify-access`, {
3893
3933
  method: "POST",
3894
3934
  headers,
3895
- body: JSON.stringify(body)
3935
+ body: JSON.stringify(body),
3936
+ signal: AbortSignal.timeout(config.verifyTimeoutMs ?? 1e4)
3896
3937
  });
3897
3938
  const data = await response.json();
3898
3939
  if (response.status === 410) {
@@ -3916,6 +3957,17 @@ async function callVerifyAccessAPI(config, request) {
3916
3957
  };
3917
3958
  }
3918
3959
  if (!response.ok) {
3960
+ if (response.status === 401) {
3961
+ return {
3962
+ success: false,
3963
+ error: data.message || data.error || "Integration API key rejected",
3964
+ misconfig: true,
3965
+ misconfigCode: typeof data?.code === "string" ? data.code : void 0,
3966
+ remediation: data?.remediation && typeof data.remediation === "object" ? data.remediation : void 0,
3967
+ correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
3968
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
3969
+ };
3970
+ }
3919
3971
  return {
3920
3972
  success: false,
3921
3973
  error: data.message || data.error || `API returned ${response.status}`,
@@ -3937,9 +3989,19 @@ async function verify(config, request, options) {
3937
3989
  const urls = mergedConfig.apiBaseUrl ? getCachedWellKnownUrls(mergedConfig.apiBaseUrl) : void 0;
3938
3990
  if (!initCheckPerformed && !mergedConfig.disableInitChecks && mergedConfig.apiBaseUrl) {
3939
3991
  if (mergedConfig.strictInit) {
3940
- await performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, true);
3992
+ await performInitCheck(
3993
+ mergedConfig.apiBaseUrl,
3994
+ mergedConfig.debug,
3995
+ true,
3996
+ mergedConfig.apiKey
3997
+ );
3941
3998
  } else {
3942
- void performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, false);
3999
+ void performInitCheck(
4000
+ mergedConfig.apiBaseUrl,
4001
+ mergedConfig.debug,
4002
+ false,
4003
+ mergedConfig.apiKey
4004
+ );
3943
4005
  }
3944
4006
  }
3945
4007
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
@@ -3978,9 +4040,10 @@ async function verify(config, request, options) {
3978
4040
  const serverDenialReasons = Array.isArray(rawServerDenialReasons) && rawServerDenialReasons.length > 0 ? rawServerDenialReasons : void 0;
3979
4041
  if (!apiResponse.success) {
3980
4042
  return createGuidanceResponse(mergedConfig, apiResponse.error, {
3981
- source: "api_error",
4043
+ source: apiResponse.misconfig ? "merchant_misconfig" : "api_error",
3982
4044
  correlationId: apiResponse.correlationId,
3983
4045
  attemptId: apiResponse.attemptId,
4046
+ remediation: apiResponse.remediation,
3984
4047
  urls
3985
4048
  });
3986
4049
  }
@@ -4110,6 +4173,18 @@ var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
4110
4173
  // src/metadata-capture.ts
4111
4174
  var MAX_TOTAL_BYTES = 16 * 1024;
4112
4175
 
4176
+ // src/edge-config.ts
4177
+ var DEFAULT_EDGE_CONFIG = Object.freeze({
4178
+ version: 1,
4179
+ mode: "observe",
4180
+ depth: "classify",
4181
+ pathRules: [],
4182
+ sampling: Object.freeze({ anonymousBeaconRate: 0.1 }),
4183
+ failurePosture: "open"
4184
+ });
4185
+ var DEFAULT_TTL_MS = 60 * 1e3;
4186
+ var DEFAULT_MAX_STALE_MS = 24 * 60 * 60 * 1e3;
4187
+
4113
4188
  // src/adapters/express.ts
4114
4189
  var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4115
4190
 
@@ -4181,18 +4256,6 @@ import { createHash as createHash3, webcrypto } from "crypto";
4181
4256
  // src/transport/registry/visa.ts
4182
4257
  import { createRemoteJWKSet } from "jose";
4183
4258
 
4184
- // src/edge-config.ts
4185
- var DEFAULT_EDGE_CONFIG = Object.freeze({
4186
- version: 1,
4187
- mode: "observe",
4188
- depth: "classify",
4189
- pathRules: [],
4190
- sampling: Object.freeze({ anonymousBeaconRate: 0.1 }),
4191
- failurePosture: "open"
4192
- });
4193
- var DEFAULT_TTL_MS = 60 * 1e3;
4194
- var DEFAULT_MAX_STALE_MS = 24 * 60 * 60 * 1e3;
4195
-
4196
4259
  // src/gateway/modes/online.ts
4197
4260
  function toGatewayConfig(config) {
4198
4261
  return {