@astrasyncai/verification-gateway 3.12.0 → 4.0.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 (99) hide show
  1. package/dist/adapter-interface/interface.d.mts +2 -2
  2. package/dist/adapter-interface/interface.d.ts +2 -2
  3. package/dist/adapters/express.d.mts +2 -2
  4. package/dist/adapters/express.d.ts +2 -2
  5. package/dist/adapters/express.js +85 -8
  6. package/dist/adapters/express.js.map +1 -1
  7. package/dist/adapters/express.mjs +85 -8
  8. package/dist/adapters/express.mjs.map +1 -1
  9. package/dist/adapters/mcp.d.mts +1 -1
  10. package/dist/adapters/mcp.d.ts +1 -1
  11. package/dist/adapters/mcp.js +90 -8
  12. package/dist/adapters/mcp.js.map +1 -1
  13. package/dist/adapters/mcp.mjs +90 -8
  14. package/dist/adapters/mcp.mjs.map +1 -1
  15. package/dist/adapters/nextjs.d.mts +2 -2
  16. package/dist/adapters/nextjs.d.ts +2 -2
  17. package/dist/adapters/nextjs.js +86 -8
  18. package/dist/adapters/nextjs.js.map +1 -1
  19. package/dist/adapters/nextjs.mjs +86 -8
  20. package/dist/adapters/nextjs.mjs.map +1 -1
  21. package/dist/adapters/sdk.d.mts +2 -2
  22. package/dist/adapters/sdk.d.ts +2 -2
  23. package/dist/adapters/sdk.js +71 -8
  24. package/dist/adapters/sdk.js.map +1 -1
  25. package/dist/adapters/sdk.mjs +71 -8
  26. package/dist/adapters/sdk.mjs.map +1 -1
  27. package/dist/agent/index.d.mts +2 -2
  28. package/dist/agent/index.d.ts +2 -2
  29. package/dist/bin/astrasync-claude-hook.js +71 -8
  30. package/dist/bin/astrasync-codex-hook.js +71 -8
  31. package/dist/bin/astrasync-guard.js +71 -8
  32. package/dist/bin/astrasync.js +71 -8
  33. package/dist/browser/background.js +71 -8
  34. package/dist/browser/background.js.map +1 -1
  35. package/dist/browser/background.mjs +71 -8
  36. package/dist/browser/background.mjs.map +1 -1
  37. package/dist/browser/browser-adapter.d.mts +2 -2
  38. package/dist/browser/browser-adapter.d.ts +2 -2
  39. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  40. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  41. package/dist/cli/index.d.mts +2 -2
  42. package/dist/cli/index.d.ts +2 -2
  43. package/dist/codex/index.d.mts +2 -2
  44. package/dist/codex/index.d.ts +2 -2
  45. package/dist/codex/index.js +71 -8
  46. package/dist/codex/index.js.map +1 -1
  47. package/dist/codex/index.mjs +71 -8
  48. package/dist/codex/index.mjs.map +1 -1
  49. package/dist/cursor/cursor-adapter.d.mts +2 -2
  50. package/dist/cursor/cursor-adapter.d.ts +2 -2
  51. package/dist/cursor/extension.d.mts +2 -2
  52. package/dist/cursor/extension.d.ts +2 -2
  53. package/dist/cursor/extension.js +71 -8
  54. package/dist/cursor/extension.js.map +1 -1
  55. package/dist/cursor/extension.mjs +71 -8
  56. package/dist/cursor/extension.mjs.map +1 -1
  57. package/dist/edge-config.d.mts +1 -1
  58. package/dist/edge-config.d.ts +1 -1
  59. package/dist/{express-B39o89gf.d.mts → express-BZajRs4i.d.mts} +1 -1
  60. package/dist/{express-BuxKNO_q.d.ts → express-CjCUB1k7.d.ts} +1 -1
  61. package/dist/gateway/gateway.d.mts +2 -2
  62. package/dist/gateway/gateway.d.ts +2 -2
  63. package/dist/gateway/gateway.js +71 -8
  64. package/dist/gateway/gateway.js.map +1 -1
  65. package/dist/gateway/gateway.mjs +71 -8
  66. package/dist/gateway/gateway.mjs.map +1 -1
  67. package/dist/git-trigger/git-hooks.d.mts +2 -2
  68. package/dist/git-trigger/git-hooks.d.ts +2 -2
  69. package/dist/{index-DME3w3lf.d.mts → index-B0cyMZDL.d.mts} +1 -1
  70. package/dist/{index-CqydB4ks.d.mts → index-BRYteOqO.d.mts} +1 -1
  71. package/dist/{index-BG62SXso.d.ts → index-BZQdVqNw.d.ts} +1 -1
  72. package/dist/{index-CLHdqs2M.d.ts → index-adgKhujR.d.ts} +1 -1
  73. package/dist/index.d.mts +8 -8
  74. package/dist/index.d.ts +8 -8
  75. package/dist/index.js +119 -8
  76. package/dist/index.js.map +1 -1
  77. package/dist/index.mjs +119 -8
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/local-evaluator/evaluator.d.mts +2 -2
  80. package/dist/local-evaluator/evaluator.d.ts +2 -2
  81. package/dist/{nextjs-Ddlw_J1J.d.ts → nextjs-D_iFf5k-.d.ts} +1 -1
  82. package/dist/{nextjs-D74W7wt-.d.mts → nextjs-DeUTnOBd.d.mts} +1 -1
  83. package/dist/{sdk-CT7gdkfR.d.ts → sdk-BM3mwEAq.d.ts} +1 -1
  84. package/dist/{sdk-Bn6bj7kt.d.mts → sdk-_il1Q41f.d.mts} +1 -1
  85. package/dist/transport/index.d.mts +2 -2
  86. package/dist/transport/index.d.ts +2 -2
  87. package/dist/{types-BntuzEEn.d.mts → types-BcDf9Kk0.d.mts} +15 -0
  88. package/dist/{types-DHu7m9HI.d.ts → types-CHKCgDFC.d.ts} +1 -1
  89. package/dist/{types-Djw4GLtz.d.mts → types-DfnP7JiM.d.mts} +1 -1
  90. package/dist/{types-SDu4Llbe.d.ts → types-fTQD448H.d.ts} +15 -0
  91. package/dist/ui/index.d.mts +1 -1
  92. package/dist/ui/index.d.ts +1 -1
  93. package/dist/verify.d.mts +4 -2
  94. package/dist/verify.d.ts +4 -2
  95. package/dist/verify.js +76 -8
  96. package/dist/verify.js.map +1 -1
  97. package/dist/verify.mjs +75 -8
  98. package/dist/verify.mjs.map +1 -1
  99. package/package.json +1 -1
@@ -3938,7 +3938,7 @@ function getTrustLevel(score) {
3938
3938
  }
3939
3939
 
3940
3940
  // src/version.ts
3941
- var SDK_VERSION = "3.12.0";
3941
+ var SDK_VERSION = "4.0.0";
3942
3942
 
3943
3943
  // src/well-known.ts
3944
3944
  var CACHE_TTL_MS = 60 * 60 * 1e3;
@@ -3964,7 +3964,7 @@ var DEFAULT_CONFIG = {
3964
3964
  };
3965
3965
  var initCheckPerformed = false;
3966
3966
  var deprecationWarningShown = false;
3967
- async function performInitCheck(apiBaseUrl, debug, strictInit) {
3967
+ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
3968
3968
  initCheckPerformed = true;
3969
3969
  try {
3970
3970
  const probeUrl = `${apiBaseUrl}/agents/verify-access`;
@@ -3981,6 +3981,28 @@ async function performInitCheck(apiBaseUrl, debug, strictInit) {
3981
3981
  `[VerificationGateway] init check passed for ${apiBaseUrl} (content-type: ${contentType})`
3982
3982
  );
3983
3983
  }
3984
+ if (apiKey) {
3985
+ const selfCheck = await fetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
3986
+ headers: { Authorization: `Bearer ${apiKey}` }
3987
+ });
3988
+ if (selfCheck.status === 401) {
3989
+ const body = await selfCheck.json().catch(() => ({}));
3990
+ 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}` : "") + `.`;
3991
+ if (strictInit) {
3992
+ throw new Error(`${message} (strictInit=true)`);
3993
+ }
3994
+ console.error(message);
3995
+ } else if (selfCheck.ok) {
3996
+ const body = await selfCheck.json().catch(() => ({}));
3997
+ if (typeof body.daysToExpiry === "number" && body.daysToExpiry <= 7) {
3998
+ console.warn(
3999
+ `[VerificationGateway] the configured AstraSync API key expires in ${body.daysToExpiry} day(s) \u2014 rotate it at Settings \u2192 Developer Tools before integrations start failing.`
4000
+ );
4001
+ } else if (debug) {
4002
+ console.log("[VerificationGateway] API key self-check passed");
4003
+ }
4004
+ }
4005
+ }
3984
4006
  } catch (err) {
3985
4007
  if (strictInit) {
3986
4008
  throw err;
@@ -4058,8 +4080,17 @@ function cacheResult(request, result, configuredTtl, counterpartyId) {
4058
4080
  function createGuidanceResponse(_config, reason, options = {}) {
4059
4081
  const source = options.source ?? "no_credentials";
4060
4082
  const isApiError = source === "api_error";
4083
+ const isMisconfig = source === "merchant_misconfig";
4061
4084
  const urls = options.urls;
4062
- const guidance = isApiError ? {
4085
+ const guidance = isMisconfig ? {
4086
+ 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.",
4087
+ registrationUrl: urls?.registrationUrl ?? "",
4088
+ documentationUrl: options.remediation?.docsUrl ?? urls?.documentationUrl ?? "",
4089
+ steps: [
4090
+ "Report the failure to the site operator \u2014 their AstraSync API key needs rotating",
4091
+ "Do not retry: the failure is deterministic until the operator updates their key"
4092
+ ]
4093
+ } : isApiError ? {
4063
4094
  message: "Verification is temporarily unavailable. Retry with exponential backoff; if the issue persists, contact support with the correlationId.",
4064
4095
  registrationUrl: urls?.registrationUrl ?? "",
4065
4096
  documentationUrl: urls?.documentationUrl ?? "",
@@ -4097,13 +4128,22 @@ function createGuidanceResponse(_config, reason, options = {}) {
4097
4128
  // partners (and their custom onDenied handlers) can branch on
4098
4129
  // dimension. Without this, the synthesised stub was indistinguishable
4099
4130
  // from a real policy deny.
4100
- failures: isApiError ? [
4131
+ failures: isMisconfig ? [
4132
+ {
4133
+ dimension: "verify_access.merchant_misconfigured",
4134
+ message: reason ?? "The integration API key was rejected by AstraSync",
4135
+ guidance: guidance.message
4136
+ }
4137
+ ] : isApiError ? [
4101
4138
  {
4102
4139
  dimension: "verify_access.api_error",
4103
4140
  message: reason ?? "Verification temporarily unavailable",
4104
4141
  guidance: guidance.message
4105
4142
  }
4106
4143
  ] : void 0,
4144
+ // 4.0.0: typed marker so adapters render the misconfig envelope (503 +
4145
+ // MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
4146
+ ...isMisconfig && { misconfigured: true },
4107
4147
  correlationId: options.correlationId,
4108
4148
  attemptId: options.attemptId,
4109
4149
  verifiedAt: /* @__PURE__ */ new Date()
@@ -4158,7 +4198,8 @@ async function callVerifyAccessAPI(config, request) {
4158
4198
  const response = await fetch(`${config.apiBaseUrl}/agents/verify-access`, {
4159
4199
  method: "POST",
4160
4200
  headers,
4161
- body: JSON.stringify(body)
4201
+ body: JSON.stringify(body),
4202
+ signal: AbortSignal.timeout(config.verifyTimeoutMs ?? 1e4)
4162
4203
  });
4163
4204
  const data = await response.json();
4164
4205
  if (response.status === 410) {
@@ -4182,6 +4223,17 @@ async function callVerifyAccessAPI(config, request) {
4182
4223
  };
4183
4224
  }
4184
4225
  if (!response.ok) {
4226
+ if (response.status === 401) {
4227
+ return {
4228
+ success: false,
4229
+ error: data.message || data.error || "Integration API key rejected",
4230
+ misconfig: true,
4231
+ misconfigCode: typeof data?.code === "string" ? data.code : void 0,
4232
+ remediation: data?.remediation && typeof data.remediation === "object" ? data.remediation : void 0,
4233
+ correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
4234
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
4235
+ };
4236
+ }
4185
4237
  return {
4186
4238
  success: false,
4187
4239
  error: data.message || data.error || `API returned ${response.status}`,
@@ -4203,9 +4255,19 @@ async function verify(config, request, options) {
4203
4255
  const urls = mergedConfig.apiBaseUrl ? getCachedWellKnownUrls(mergedConfig.apiBaseUrl) : void 0;
4204
4256
  if (!initCheckPerformed && !mergedConfig.disableInitChecks && mergedConfig.apiBaseUrl) {
4205
4257
  if (mergedConfig.strictInit) {
4206
- await performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, true);
4258
+ await performInitCheck(
4259
+ mergedConfig.apiBaseUrl,
4260
+ mergedConfig.debug,
4261
+ true,
4262
+ mergedConfig.apiKey
4263
+ );
4207
4264
  } else {
4208
- void performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, false);
4265
+ void performInitCheck(
4266
+ mergedConfig.apiBaseUrl,
4267
+ mergedConfig.debug,
4268
+ false,
4269
+ mergedConfig.apiKey
4270
+ );
4209
4271
  }
4210
4272
  }
4211
4273
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
@@ -4244,9 +4306,10 @@ async function verify(config, request, options) {
4244
4306
  const serverDenialReasons = Array.isArray(rawServerDenialReasons) && rawServerDenialReasons.length > 0 ? rawServerDenialReasons : void 0;
4245
4307
  if (!apiResponse.success) {
4246
4308
  return createGuidanceResponse(mergedConfig, apiResponse.error, {
4247
- source: "api_error",
4309
+ source: apiResponse.misconfig ? "merchant_misconfig" : "api_error",
4248
4310
  correlationId: apiResponse.correlationId,
4249
4311
  attemptId: apiResponse.attemptId,
4312
+ remediation: apiResponse.remediation,
4250
4313
  urls
4251
4314
  });
4252
4315
  }