@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
@@ -3915,7 +3915,7 @@ function getTrustLevel(score) {
3915
3915
  }
3916
3916
 
3917
3917
  // src/version.ts
3918
- var SDK_VERSION = "3.12.0";
3918
+ var SDK_VERSION = "4.1.0";
3919
3919
 
3920
3920
  // src/well-known.ts
3921
3921
  var CACHE_TTL_MS = 60 * 60 * 1e3;
@@ -3941,7 +3941,7 @@ var DEFAULT_CONFIG = {
3941
3941
  };
3942
3942
  var initCheckPerformed = false;
3943
3943
  var deprecationWarningShown = false;
3944
- async function performInitCheck(apiBaseUrl, debug, strictInit) {
3944
+ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
3945
3945
  initCheckPerformed = true;
3946
3946
  try {
3947
3947
  const probeUrl = `${apiBaseUrl}/agents/verify-access`;
@@ -3958,6 +3958,28 @@ async function performInitCheck(apiBaseUrl, debug, strictInit) {
3958
3958
  `[VerificationGateway] init check passed for ${apiBaseUrl} (content-type: ${contentType})`
3959
3959
  );
3960
3960
  }
3961
+ if (apiKey) {
3962
+ const selfCheck = await fetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
3963
+ headers: { Authorization: `Bearer ${apiKey}` }
3964
+ });
3965
+ if (selfCheck.status === 401) {
3966
+ const body = await selfCheck.json().catch(() => ({}));
3967
+ 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}` : "") + `.`;
3968
+ if (strictInit) {
3969
+ throw new Error(`${message} (strictInit=true)`);
3970
+ }
3971
+ console.error(message);
3972
+ } else if (selfCheck.ok) {
3973
+ const body = await selfCheck.json().catch(() => ({}));
3974
+ if (typeof body.daysToExpiry === "number" && body.daysToExpiry <= 7) {
3975
+ console.warn(
3976
+ `[VerificationGateway] the configured AstraSync API key expires in ${body.daysToExpiry} day(s) \u2014 rotate it at Settings \u2192 Developer Tools before integrations start failing.`
3977
+ );
3978
+ } else if (debug) {
3979
+ console.log("[VerificationGateway] API key self-check passed");
3980
+ }
3981
+ }
3982
+ }
3961
3983
  } catch (err) {
3962
3984
  if (strictInit) {
3963
3985
  throw err;
@@ -4035,8 +4057,17 @@ function cacheResult(request, result, configuredTtl, counterpartyId) {
4035
4057
  function createGuidanceResponse(_config, reason, options = {}) {
4036
4058
  const source = options.source ?? "no_credentials";
4037
4059
  const isApiError = source === "api_error";
4060
+ const isMisconfig = source === "merchant_misconfig";
4038
4061
  const urls = options.urls;
4039
- const guidance = isApiError ? {
4062
+ const guidance = isMisconfig ? {
4063
+ 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.",
4064
+ registrationUrl: urls?.registrationUrl ?? "",
4065
+ documentationUrl: options.remediation?.docsUrl ?? urls?.documentationUrl ?? "",
4066
+ steps: [
4067
+ "Report the failure to the site operator \u2014 their AstraSync API key needs rotating",
4068
+ "Do not retry: the failure is deterministic until the operator updates their key"
4069
+ ]
4070
+ } : isApiError ? {
4040
4071
  message: "Verification is temporarily unavailable. Retry with exponential backoff; if the issue persists, contact support with the correlationId.",
4041
4072
  registrationUrl: urls?.registrationUrl ?? "",
4042
4073
  documentationUrl: urls?.documentationUrl ?? "",
@@ -4074,13 +4105,22 @@ function createGuidanceResponse(_config, reason, options = {}) {
4074
4105
  // partners (and their custom onDenied handlers) can branch on
4075
4106
  // dimension. Without this, the synthesised stub was indistinguishable
4076
4107
  // from a real policy deny.
4077
- failures: isApiError ? [
4108
+ failures: isMisconfig ? [
4109
+ {
4110
+ dimension: "verify_access.merchant_misconfigured",
4111
+ message: reason ?? "The integration API key was rejected by AstraSync",
4112
+ guidance: guidance.message
4113
+ }
4114
+ ] : isApiError ? [
4078
4115
  {
4079
4116
  dimension: "verify_access.api_error",
4080
4117
  message: reason ?? "Verification temporarily unavailable",
4081
4118
  guidance: guidance.message
4082
4119
  }
4083
4120
  ] : void 0,
4121
+ // 4.0.0: typed marker so adapters render the misconfig envelope (503 +
4122
+ // MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
4123
+ ...isMisconfig && { misconfigured: true },
4084
4124
  correlationId: options.correlationId,
4085
4125
  attemptId: options.attemptId,
4086
4126
  verifiedAt: /* @__PURE__ */ new Date()
@@ -4135,7 +4175,8 @@ async function callVerifyAccessAPI(config, request) {
4135
4175
  const response = await fetch(`${config.apiBaseUrl}/agents/verify-access`, {
4136
4176
  method: "POST",
4137
4177
  headers,
4138
- body: JSON.stringify(body)
4178
+ body: JSON.stringify(body),
4179
+ signal: AbortSignal.timeout(config.verifyTimeoutMs ?? 1e4)
4139
4180
  });
4140
4181
  const data = await response.json();
4141
4182
  if (response.status === 410) {
@@ -4159,6 +4200,17 @@ async function callVerifyAccessAPI(config, request) {
4159
4200
  };
4160
4201
  }
4161
4202
  if (!response.ok) {
4203
+ if (response.status === 401) {
4204
+ return {
4205
+ success: false,
4206
+ error: data.message || data.error || "Integration API key rejected",
4207
+ misconfig: true,
4208
+ misconfigCode: typeof data?.code === "string" ? data.code : void 0,
4209
+ remediation: data?.remediation && typeof data.remediation === "object" ? data.remediation : void 0,
4210
+ correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
4211
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
4212
+ };
4213
+ }
4162
4214
  return {
4163
4215
  success: false,
4164
4216
  error: data.message || data.error || `API returned ${response.status}`,
@@ -4180,9 +4232,19 @@ async function verify(config, request, options) {
4180
4232
  const urls = mergedConfig.apiBaseUrl ? getCachedWellKnownUrls(mergedConfig.apiBaseUrl) : void 0;
4181
4233
  if (!initCheckPerformed && !mergedConfig.disableInitChecks && mergedConfig.apiBaseUrl) {
4182
4234
  if (mergedConfig.strictInit) {
4183
- await performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, true);
4235
+ await performInitCheck(
4236
+ mergedConfig.apiBaseUrl,
4237
+ mergedConfig.debug,
4238
+ true,
4239
+ mergedConfig.apiKey
4240
+ );
4184
4241
  } else {
4185
- void performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, false);
4242
+ void performInitCheck(
4243
+ mergedConfig.apiBaseUrl,
4244
+ mergedConfig.debug,
4245
+ false,
4246
+ mergedConfig.apiKey
4247
+ );
4186
4248
  }
4187
4249
  }
4188
4250
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
@@ -4221,9 +4283,10 @@ async function verify(config, request, options) {
4221
4283
  const serverDenialReasons = Array.isArray(rawServerDenialReasons) && rawServerDenialReasons.length > 0 ? rawServerDenialReasons : void 0;
4222
4284
  if (!apiResponse.success) {
4223
4285
  return createGuidanceResponse(mergedConfig, apiResponse.error, {
4224
- source: "api_error",
4286
+ source: apiResponse.misconfig ? "merchant_misconfig" : "api_error",
4225
4287
  correlationId: apiResponse.correlationId,
4226
4288
  attemptId: apiResponse.attemptId,
4289
+ remediation: apiResponse.remediation,
4227
4290
  urls
4228
4291
  });
4229
4292
  }
@@ -4353,6 +4416,18 @@ var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
4353
4416
  // src/metadata-capture.ts
4354
4417
  var MAX_TOTAL_BYTES = 16 * 1024;
4355
4418
 
4419
+ // src/edge-config.ts
4420
+ var DEFAULT_EDGE_CONFIG = Object.freeze({
4421
+ version: 1,
4422
+ mode: "observe",
4423
+ depth: "classify",
4424
+ pathRules: [],
4425
+ sampling: Object.freeze({ anonymousBeaconRate: 0.1 }),
4426
+ failurePosture: "open"
4427
+ });
4428
+ var DEFAULT_TTL_MS = 60 * 1e3;
4429
+ var DEFAULT_MAX_STALE_MS = 24 * 60 * 60 * 1e3;
4430
+
4356
4431
  // src/adapters/express.ts
4357
4432
  var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
4358
4433
 
@@ -4424,18 +4499,6 @@ import { createHash as createHash3, webcrypto } from "crypto";
4424
4499
  // src/transport/registry/visa.ts
4425
4500
  import { createRemoteJWKSet } from "jose";
4426
4501
 
4427
- // src/edge-config.ts
4428
- var DEFAULT_EDGE_CONFIG = Object.freeze({
4429
- version: 1,
4430
- mode: "observe",
4431
- depth: "classify",
4432
- pathRules: [],
4433
- sampling: Object.freeze({ anonymousBeaconRate: 0.1 }),
4434
- failurePosture: "open"
4435
- });
4436
- var DEFAULT_TTL_MS = 60 * 1e3;
4437
- var DEFAULT_MAX_STALE_MS = 24 * 60 * 60 * 1e3;
4438
-
4439
4502
  // src/gateway/modes/online.ts
4440
4503
  function toGatewayConfig(config) {
4441
4504
  return {