@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
@@ -65,7 +65,7 @@ function getTrustLevel(score) {
65
65
  }
66
66
 
67
67
  // src/version.ts
68
- var SDK_VERSION = "3.12.0";
68
+ var SDK_VERSION = "4.0.0";
69
69
 
70
70
  // src/well-known.ts
71
71
  var CACHE_TTL_MS = 60 * 60 * 1e3;
@@ -91,7 +91,7 @@ var DEFAULT_CONFIG = {
91
91
  };
92
92
  var initCheckPerformed = false;
93
93
  var deprecationWarningShown = false;
94
- async function performInitCheck(apiBaseUrl, debug, strictInit) {
94
+ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
95
95
  initCheckPerformed = true;
96
96
  try {
97
97
  const probeUrl = `${apiBaseUrl}/agents/verify-access`;
@@ -108,6 +108,28 @@ async function performInitCheck(apiBaseUrl, debug, strictInit) {
108
108
  `[VerificationGateway] init check passed for ${apiBaseUrl} (content-type: ${contentType})`
109
109
  );
110
110
  }
111
+ if (apiKey) {
112
+ const selfCheck = await fetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
113
+ headers: { Authorization: `Bearer ${apiKey}` }
114
+ });
115
+ if (selfCheck.status === 401) {
116
+ const body = await selfCheck.json().catch(() => ({}));
117
+ 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}` : "") + `.`;
118
+ if (strictInit) {
119
+ throw new Error(`${message} (strictInit=true)`);
120
+ }
121
+ console.error(message);
122
+ } else if (selfCheck.ok) {
123
+ const body = await selfCheck.json().catch(() => ({}));
124
+ if (typeof body.daysToExpiry === "number" && body.daysToExpiry <= 7) {
125
+ console.warn(
126
+ `[VerificationGateway] the configured AstraSync API key expires in ${body.daysToExpiry} day(s) \u2014 rotate it at Settings \u2192 Developer Tools before integrations start failing.`
127
+ );
128
+ } else if (debug) {
129
+ console.log("[VerificationGateway] API key self-check passed");
130
+ }
131
+ }
132
+ }
111
133
  } catch (err) {
112
134
  if (strictInit) {
113
135
  throw err;
@@ -185,8 +207,17 @@ function cacheResult(request, result, configuredTtl, counterpartyId) {
185
207
  function createGuidanceResponse(_config, reason, options = {}) {
186
208
  const source = options.source ?? "no_credentials";
187
209
  const isApiError = source === "api_error";
210
+ const isMisconfig = source === "merchant_misconfig";
188
211
  const urls = options.urls;
189
- const guidance = isApiError ? {
212
+ const guidance = isMisconfig ? {
213
+ 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.",
214
+ registrationUrl: urls?.registrationUrl ?? "",
215
+ documentationUrl: options.remediation?.docsUrl ?? urls?.documentationUrl ?? "",
216
+ steps: [
217
+ "Report the failure to the site operator \u2014 their AstraSync API key needs rotating",
218
+ "Do not retry: the failure is deterministic until the operator updates their key"
219
+ ]
220
+ } : isApiError ? {
190
221
  message: "Verification is temporarily unavailable. Retry with exponential backoff; if the issue persists, contact support with the correlationId.",
191
222
  registrationUrl: urls?.registrationUrl ?? "",
192
223
  documentationUrl: urls?.documentationUrl ?? "",
@@ -224,13 +255,22 @@ function createGuidanceResponse(_config, reason, options = {}) {
224
255
  // partners (and their custom onDenied handlers) can branch on
225
256
  // dimension. Without this, the synthesised stub was indistinguishable
226
257
  // from a real policy deny.
227
- failures: isApiError ? [
258
+ failures: isMisconfig ? [
259
+ {
260
+ dimension: "verify_access.merchant_misconfigured",
261
+ message: reason ?? "The integration API key was rejected by AstraSync",
262
+ guidance: guidance.message
263
+ }
264
+ ] : isApiError ? [
228
265
  {
229
266
  dimension: "verify_access.api_error",
230
267
  message: reason ?? "Verification temporarily unavailable",
231
268
  guidance: guidance.message
232
269
  }
233
270
  ] : void 0,
271
+ // 4.0.0: typed marker so adapters render the misconfig envelope (503 +
272
+ // MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
273
+ ...isMisconfig && { misconfigured: true },
234
274
  correlationId: options.correlationId,
235
275
  attemptId: options.attemptId,
236
276
  verifiedAt: /* @__PURE__ */ new Date()
@@ -285,7 +325,8 @@ async function callVerifyAccessAPI(config, request) {
285
325
  const response = await fetch(`${config.apiBaseUrl}/agents/verify-access`, {
286
326
  method: "POST",
287
327
  headers,
288
- body: JSON.stringify(body)
328
+ body: JSON.stringify(body),
329
+ signal: AbortSignal.timeout(config.verifyTimeoutMs ?? 1e4)
289
330
  });
290
331
  const data = await response.json();
291
332
  if (response.status === 410) {
@@ -309,6 +350,17 @@ async function callVerifyAccessAPI(config, request) {
309
350
  };
310
351
  }
311
352
  if (!response.ok) {
353
+ if (response.status === 401) {
354
+ return {
355
+ success: false,
356
+ error: data.message || data.error || "Integration API key rejected",
357
+ misconfig: true,
358
+ misconfigCode: typeof data?.code === "string" ? data.code : void 0,
359
+ remediation: data?.remediation && typeof data.remediation === "object" ? data.remediation : void 0,
360
+ correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
361
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
362
+ };
363
+ }
312
364
  return {
313
365
  success: false,
314
366
  error: data.message || data.error || `API returned ${response.status}`,
@@ -330,9 +382,19 @@ async function verify(config, request, options) {
330
382
  const urls = mergedConfig.apiBaseUrl ? getCachedWellKnownUrls(mergedConfig.apiBaseUrl) : void 0;
331
383
  if (!initCheckPerformed && !mergedConfig.disableInitChecks && mergedConfig.apiBaseUrl) {
332
384
  if (mergedConfig.strictInit) {
333
- await performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, true);
385
+ await performInitCheck(
386
+ mergedConfig.apiBaseUrl,
387
+ mergedConfig.debug,
388
+ true,
389
+ mergedConfig.apiKey
390
+ );
334
391
  } else {
335
- void performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, false);
392
+ void performInitCheck(
393
+ mergedConfig.apiBaseUrl,
394
+ mergedConfig.debug,
395
+ false,
396
+ mergedConfig.apiKey
397
+ );
336
398
  }
337
399
  }
338
400
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
@@ -371,9 +433,10 @@ async function verify(config, request, options) {
371
433
  const serverDenialReasons = Array.isArray(rawServerDenialReasons) && rawServerDenialReasons.length > 0 ? rawServerDenialReasons : void 0;
372
434
  if (!apiResponse.success) {
373
435
  return createGuidanceResponse(mergedConfig, apiResponse.error, {
374
- source: "api_error",
436
+ source: apiResponse.misconfig ? "merchant_misconfig" : "api_error",
375
437
  correlationId: apiResponse.correlationId,
376
438
  attemptId: apiResponse.attemptId,
439
+ remediation: apiResponse.remediation,
377
440
  urls
378
441
  });
379
442
  }
@@ -1232,6 +1295,21 @@ function createMiddleware(options) {
1232
1295
  const approvalRequired = result.identityVerified && result.policyAllowed && requiresHumanApproval(result);
1233
1296
  if (approvalRequired) annotateApprovalRequired(result);
1234
1297
  if (!result.identityVerified || !result.policyAllowed || approvalRequired) {
1298
+ if (result.misconfigured && pathname.startsWith("/api/")) {
1299
+ return NextResponse.json(
1300
+ {
1301
+ success: false,
1302
+ error: {
1303
+ code: "MERCHANT_VERIFICATION_MISCONFIGURED",
1304
+ message: result.denialReasons?.[0] || "This site's AstraSync integration is misconfigured",
1305
+ guidance: result.guidance,
1306
+ failures: result.failures,
1307
+ correlationId: result.correlationId
1308
+ }
1309
+ },
1310
+ { status: 503 }
1311
+ );
1312
+ }
1235
1313
  if (pathname.startsWith("/api/")) {
1236
1314
  return NextResponse.json(
1237
1315
  {